Differential D20977 Diff 49988 src/infrastructure/markup/syntax/engine/PhutilDefaultSyntaxHighlighterEngine.php
Changeset View
Changeset View
Standalone View
Standalone View
src/infrastructure/markup/syntax/engine/PhutilDefaultSyntaxHighlighterEngine.php
- This file was added.
| <?php | |||||
| final class PhutilDefaultSyntaxHighlighterEngine | |||||
| extends PhutilSyntaxHighlighterEngine { | |||||
| private $config = array(); | |||||
| public function setConfig($key, $value) { | |||||
| $this->config[$key] = $value; | |||||
| return $this; | |||||
| } | |||||
| public function getLanguageFromFilename($filename) { | |||||
| static $default_map = array( | |||||
| // All files which have file extensions that we haven't already matched | |||||
| // map to their extensions. | |||||
| '@\\.([^./]+)$@' => 1, | |||||
| ); | |||||
| $maps = array(); | |||||
| if (!empty($this->config['filename.map'])) { | |||||
| $maps[] = $this->config['filename.map']; | |||||
| } | |||||
| $maps[] = $default_map; | |||||
| foreach ($maps as $map) { | |||||
| foreach ($map as $regexp => $lang) { | |||||
| $matches = null; | |||||
| if (preg_match($regexp, $filename, $matches)) { | |||||
| if (is_numeric($lang)) { | |||||
| return idx($matches, $lang); | |||||
| } else { | |||||
| return $lang; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| return null; | |||||
| } | |||||
| public function getHighlightFuture($language, $source) { | |||||
| if ($language === null) { | |||||
| $language = PhutilLanguageGuesser::guessLanguage($source); | |||||
| } | |||||
| $have_pygments = !empty($this->config['pygments.enabled']); | |||||
| if ($language == 'php' && PhutilXHPASTBinary::isAvailable()) { | |||||
| return id(new PhutilXHPASTSyntaxHighlighter()) | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| if ($language == 'console') { | |||||
| return id(new PhutilConsoleSyntaxHighlighter()) | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| if ($language == 'diviner' || $language == 'remarkup') { | |||||
| return id(new PhutilDivinerSyntaxHighlighter()) | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| if ($language == 'rainbow') { | |||||
| return id(new PhutilRainbowSyntaxHighlighter()) | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| if ($language == 'php') { | |||||
| return id(new PhutilLexerSyntaxHighlighter()) | |||||
| ->setConfig('lexer', new PhutilPHPFragmentLexer()) | |||||
| ->setConfig('language', 'php') | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| if ($language == 'py' || $language == 'python') { | |||||
| return id(new PhutilLexerSyntaxHighlighter()) | |||||
| ->setConfig('lexer', new PhutilPythonFragmentLexer()) | |||||
| ->setConfig('language', 'py') | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| if ($language == 'java') { | |||||
| return id(new PhutilLexerSyntaxHighlighter()) | |||||
| ->setConfig('lexer', new PhutilJavaFragmentLexer()) | |||||
| ->setConfig('language', 'java') | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| if ($language == 'json') { | |||||
| return id(new PhutilLexerSyntaxHighlighter()) | |||||
| ->setConfig('lexer', new PhutilJSONFragmentLexer()) | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| if ($language == 'invisible') { | |||||
| return id(new PhutilInvisibleSyntaxHighlighter()) | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| // Don't invoke Pygments for plain text, since it's expensive and has | |||||
| // no effect. | |||||
| if ($language !== 'text' && $language !== 'txt') { | |||||
| if ($have_pygments) { | |||||
| return id(new PhutilPygmentsSyntaxHighlighter()) | |||||
| ->setConfig('language', $language) | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| } | |||||
| return id(new PhutilDefaultSyntaxHighlighter()) | |||||
| ->getHighlightFuture($source); | |||||
| } | |||||
| } | |||||