first tool supported: xmllint
[phorkie.git] / src / phorkie / Tool / Xmllint.php
diff --git a/src/phorkie/Tool/Xmllint.php b/src/phorkie/Tool/Xmllint.php
new file mode 100644 (file)
index 0000000..b9917f5
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+namespace phorkie;
+
+class Tool_Xmllint
+{
+    public static $arSupportedExtensions = array(
+        'htm', 'html', 'xml'
+    );
+
+    public function run(File $file)
+    {
+        $fpath = $file->getPath();
+        $fpathlen = strlen($fpath);
+
+        $res = new Tool_Result();
+        $cmd = 'xmllint --noout ' . escapeshellarg($fpath) . ' 2>&1';
+        exec($cmd, $output, $retval);
+        if ($retval == 0) {
+            $res->annotations['general'][] = new Tool_Result_Line(
+                'XML is well-formed', 'ok'
+            );
+            return $res;
+        }
+
+        for ($i = 0; $i < count($output); $i += 3) {
+            $line = $output[$i];
+            if (substr($line, 0, $fpathlen) != $fpath) {
+                throw new Exception('xmllint does not behave as expected: ' . $line);
+            }
+            list($line, $msg) = explode(':', substr($line, $fpathlen + 1), 2);
+            $res->annotations[$line][] = new Tool_Result_Line(
+                $msg, 'error'
+            );
+        }
+
+        $res->annotations['general'][] = new Tool_Result_Line(
+            'XML is not well-formed', 'error'
+        );
+
+        return $res;
+    }
+}
+
+?>
\ No newline at end of file