revision display support
[phorkie.git] / src / phorkie / File.php
index bad21e6edba1db40a1a147e60579aa96b7f696c6..3c6c56d7e432912d00c47db9546fd7aed9cc62ee 100644 (file)
@@ -4,7 +4,7 @@ namespace phorkie;
 class File
 {
     /**
-     * Full path to the file
+     * Path to the file, relative to repository work directory
      *
      * @var string
      */
@@ -17,6 +17,11 @@ class File
      */
     public $repo;
 
+    /**
+     * Commit revision this file is at
+     */
+    public $hash;
+
     public function __construct($path, Repository $repo = null)
     {
         $this->path = $path;
@@ -30,7 +35,7 @@ class File
      */
     public function getFilename()
     {
-        return basename($this->path);
+        return $this->path;
     }
 
     /**
@@ -38,9 +43,9 @@ class File
      *
      * @return string
      */
-    public function getPath()
+    public function getFullPath()
     {
-        return $this->path;
+        return $this->repo->workDir . '/' . $this->path;
     }
 
     /**
@@ -55,20 +60,33 @@ class File
 
     public function getContent()
     {
-        return file_get_contents($this->path);
+        if ($this->repo->hash) {
+            return $this->repo->getVc()->getCommand('show')
+                ->addArgument($this->repo->hash . ':' . $this->path)
+                ->execute();
+        }
+
+        return file_get_contents($this->getFullPath());
     }
 
-    public function getHighlightedContent()
+    public function getRenderedContent(Tool_Result $res = null)
     {
-        /**
-         * Yes, geshi needs to be in your include path
-         * We use the mediawiki geshi extension package.
-         */
-        require_once 'MediaWiki/geshi/geshi/geshi.php';
-        $geshi = new \GeSHi($this->getContent(), $this->getGeshiType());
-        $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
-        $geshi->set_header_type(GESHI_HEADER_DIV);
-        return $geshi->parse_code();
+        $ext   = $this->getExt();
+        $class = '\\phorkie\\Renderer_Unknown';
+
+        if (isset($GLOBALS['phorkie']['languages'][$ext]['renderer'])) {
+            $class = $GLOBALS['phorkie']['languages'][$ext]['renderer'];
+        } 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/') {
+                $class = '\\phorkie\\Renderer_Image';
+            }
+        }
+
+        $rend = new $class();
+        return $rend->toHtml($this, $res);
     }
 
     /**
@@ -76,40 +94,53 @@ class File
      *
      * @param string $type Link type. Supported are:
      *                     - "raw"
-     *                     - "display"
+     *                     - "tool"
+     * @param string $option
      *
      * @return string
      */
-    public function getLink($type)
+    public function getLink($type, $option = null)
     {
         if ($type == 'raw') {
             return '/' . $this->repo->id . '/raw/' . $this->getFilename();
+        } else if ($type == 'tool') {
+            return '/' . $this->repo->id . '/tool/' . $option . '/' . $this->getFilename();
         }
         throw new Exception('Unknown type');
     }
 
-    /**
-     * Returns the type of the file, as used by Geshi
-     *
-     * @return string
-     */
-    public function getGeshiType()
+    public function getMimeType()
     {
         $ext = $this->getExt();
-        if (isset($GLOBALS['phorkie']['languages'][$ext]['geshi'])) {
-            $ext = $GLOBALS['phorkie']['languages'][$ext]['geshi'];
+        if (!isset($GLOBALS['phorkie']['languages'][$ext])) {
+            return null;
         }
+        return $GLOBALS['phorkie']['languages'][$ext]['mime'];
+    }
 
-        return $ext;
+    /**
+     * @return array Array of Tool_Info objects
+     */
+    public function getToolInfos()
+    {
+        $tm = new Tool_Manager();
+        return $tm->getSuitable($this);
     }
 
-    public function getMimeType()
+    /**
+     * Tells if the file contains textual content and is editable.
+     *
+     * @return boolean
+     */
+    public function isText()
     {
         $ext = $this->getExt();
-        if (!isset($GLOBALS['phorkie']['languages'][$ext])) {
-            return null;
+        if (!isset($GLOBALS['phorkie']['languages'][$ext]['mime'])) {
+            return false;
         }
-        return $GLOBALS['phorkie']['languages'][$ext]['mime'];
+
+        $type = $GLOBALS['phorkie']['languages'][$ext]['mime'];
+        return substr($type, 0, 5) === 'text/';
     }
 }