X-Git-Url: https://git.cweiske.de/phorkie.git/blobdiff_plain/2b4b34a76f42841e964a549fc64c02ba4f60a3f4..52de444faa10f37c4174e9fe2c75e77484342549:/src/phorkie/File.php diff --git a/src/phorkie/File.php b/src/phorkie/File.php index bad21e6..7f5b5b4 100644 --- a/src/phorkie/File.php +++ b/src/phorkie/File.php @@ -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,37 @@ class File public function getContent() { - return file_get_contents($this->path); + if ($this->repo->hash) { + //quick hack until https://pear.php.net/bugs/bug.php?id=19385 is fixed + $cmd = new GitCommandBinary($this->repo->getVc()); + $cmd->setSubCommand('show'); + return //$this->repo->getVc()->getCommand('show') + $cmd + ->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 ($this->isText()) { + $class = '\\phorkie\\Renderer_Geshi'; + } else if (isset($GLOBALS['phorkie']['languages'][$ext]['mime'])) { + $type = $GLOBALS['phorkie']['languages'][$ext]['mime']; + if (substr($type, 0, 6) == 'image/') { + $class = '\\phorkie\\Renderer_Image'; + } + } + + $rend = new $class(); + return $rend->toHtml($this, $res); } /** @@ -76,41 +98,74 @@ 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(); + 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(); } throw new Exception('Unknown type'); } /** - * Returns the type of the file, as used by Geshi - * - * @return string + * @return string Mime type of file */ - 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 array Array of Tool_Info objects + */ + public function getToolInfos() + { + if ($this->repo->hash !== null) { + return array(); } - return $ext; + $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 ($ext == '') { + //no file extension? then consider the size + $size = filesize($this->getFullPath()); + //files <= 4kiB are considered to be text + return $size <= 4096; } - return $GLOBALS['phorkie']['languages'][$ext]['mime']; + + if (!isset($GLOBALS['phorkie']['languages'][$ext]['mime'])) { + return false; + } + + $type = $GLOBALS['phorkie']['languages'][$ext]['mime']; + return substr($type, 0, 5) === 'text/' + || $type == 'application/javascript'; } } -?> \ No newline at end of file +?>