detect xml and json as text
[phorkie.git] / src / phorkie / File.php
index bc0950fce26f1c1d583649f2e6440b5b1b5db904..dc90d9bc096747ef93ddfb5f8c52a1a45dd3c774 100644 (file)
@@ -61,7 +61,10 @@ class File
     public function getContent()
     {
         if ($this->repo->hash) {
-            return $this->repo->getVc()->getCommand('show')
+            //quick hack until https://pear.php.net/bugs/bug.php?id=19385 is fixed
+            $cmd = new GitCommandBinary($this->repo->getVc());
+            $cmd->setSubCommand('show');
+            return $cmd
                 ->addArgument($this->repo->hash . ':' . $this->path)
                 ->execute();
         }
@@ -76,11 +79,11 @@ class File
 
         if (isset($GLOBALS['phorkie']['languages'][$ext]['renderer'])) {
             $class = $GLOBALS['phorkie']['languages'][$ext]['renderer'];
+        } else if ($this->isText()) {
+            $class = '\\phorkie\\Renderer_Geshi';
         } else if (isset($GLOBALS['phorkie']['languages'][$ext]['mime'])) {
             $type = $GLOBALS['phorkie']['languages'][$ext]['mime'];
-            if (substr($type, 0, 5) == 'text/') {
-                $class = '\\phorkie\\Renderer_Geshi';
-            } else if (substr($type, 0, 6) == 'image/') {
+            if (substr($type, 0, 6) == 'image/') {
                 $class = '\\phorkie\\Renderer_Image';
             }
         }
@@ -92,23 +95,33 @@ class File
     /**
      * Get a link to the file
      *
-     * @param string $type Link type. Supported are:
-     *                     - "raw"
-     *                     - "tool"
-     * @param string $option
+     * @param string $type   Link type. Supported are:
+     *                       - "raw"
+     *                       - "tool"
+     * @param string $option Additional option, e.g. tool name
      *
      * @return string
      */
     public function getLink($type, $option = null)
     {
         if ($type == 'raw') {
-            return '/' . $this->repo->id . '/raw/' . $this->getFilename();
+            if ($this->repo->hash === null) {
+                return $this->repo->id . '/raw/' . $this->getFilename();
+            } else {
+                return $this->repo->id . '/rev-raw/' . $this->repo->hash
+                    . '/' . $this->getFilename();
+            }
         } else if ($type == 'tool') {
-            return '/' . $this->repo->id . '/tool/' . $option . '/' . $this->getFilename();
+            return $this->repo->id
+                . '/tool/' . $option
+                . '/' . $this->getFilename();
         }
         throw new Exception('Unknown type');
     }
 
+    /**
+     * @return string Mime type of file
+     */
     public function getMimeType()
     {
         $ext = $this->getExt();
@@ -139,13 +152,23 @@ class File
     public function isText()
     {
         $ext = $this->getExt();
+        if ($ext == '') {
+            //no file extension? then consider the size
+            $size = filesize($this->getFullPath());
+            //files <= 4kiB are considered to be text
+            return $size <= 4096;
+        }
+
         if (!isset($GLOBALS['phorkie']['languages'][$ext]['mime'])) {
             return false;
         }
 
         $type = $GLOBALS['phorkie']['languages'][$ext]['mime'];
-        return substr($type, 0, 5) === 'text/';
+        return substr($type, 0, 5) === 'text/'
+            || $type == 'application/javascript'
+            || substr($type, -4) == '+xml'
+            || substr($type, -5) == '+json';
     }
 }
 
-?>
\ No newline at end of file
+?>