Path: blob/master/src/infrastructure/markup/syntax/engine/PhutilDefaultSyntaxHighlighterEngine.php
12242 views
<?php12final class PhutilDefaultSyntaxHighlighterEngine3extends PhutilSyntaxHighlighterEngine {45private $config = array();67public function setConfig($key, $value) {8$this->config[$key] = $value;9return $this;10}1112public function getLanguageFromFilename($filename) {13static $default_map = array(14// All files which have file extensions that we haven't already matched15// map to their extensions.16'@\\.([^./]+)$@' => 1,17);1819$maps = array();20if (!empty($this->config['filename.map'])) {21$maps[] = $this->config['filename.map'];22}23$maps[] = $default_map;2425foreach ($maps as $map) {26foreach ($map as $regexp => $lang) {27$matches = null;28if (preg_match($regexp, $filename, $matches)) {29if (is_numeric($lang)) {30return idx($matches, $lang);31} else {32return $lang;33}34}35}36}3738return null;39}4041public function getHighlightFuture($language, $source) {42if ($language === null) {43$language = PhutilLanguageGuesser::guessLanguage($source);44}4546$have_pygments = !empty($this->config['pygments.enabled']);4748if ($language == 'php' && PhutilXHPASTBinary::isAvailable()) {49return id(new PhutilXHPASTSyntaxHighlighter())50->getHighlightFuture($source);51}5253if ($language == 'console') {54return id(new PhutilConsoleSyntaxHighlighter())55->getHighlightFuture($source);56}5758if ($language == 'diviner' || $language == 'remarkup') {59return id(new PhutilDivinerSyntaxHighlighter())60->getHighlightFuture($source);61}6263if ($language == 'rainbow') {64return id(new PhutilRainbowSyntaxHighlighter())65->getHighlightFuture($source);66}6768if ($language == 'php') {69return id(new PhutilLexerSyntaxHighlighter())70->setConfig('lexer', new PhutilPHPFragmentLexer())71->setConfig('language', 'php')72->getHighlightFuture($source);73}7475if ($language == 'py' || $language == 'python') {76return id(new PhutilLexerSyntaxHighlighter())77->setConfig('lexer', new PhutilPythonFragmentLexer())78->setConfig('language', 'py')79->getHighlightFuture($source);80}8182if ($language == 'java') {83return id(new PhutilLexerSyntaxHighlighter())84->setConfig('lexer', new PhutilJavaFragmentLexer())85->setConfig('language', 'java')86->getHighlightFuture($source);87}8889if ($language == 'json') {90return id(new PhutilLexerSyntaxHighlighter())91->setConfig('lexer', new PhutilJSONFragmentLexer())92->getHighlightFuture($source);93}9495if ($language == 'invisible') {96return id(new PhutilInvisibleSyntaxHighlighter())97->getHighlightFuture($source);98}99100// Don't invoke Pygments for plain text, since it's expensive and has101// no effect.102if ($language !== 'text' && $language !== 'txt') {103if ($have_pygments) {104return id(new PhutilPygmentsSyntaxHighlighter())105->setConfig('language', $language)106->getHighlightFuture($source);107}108}109110return id(new PhutilDefaultSyntaxHighlighter())111->getHighlightFuture($source);112}113114}115116117