@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at upstream/main 115 lines 3.2 kB view raw
1<?php 2 3final class PhutilDefaultSyntaxHighlighterEngine 4 extends PhutilSyntaxHighlighterEngine { 5 6 private $config = array(); 7 8 public function setConfig($key, $value) { 9 $this->config[$key] = $value; 10 return $this; 11 } 12 13 public function getLanguageFromFilename($filename) { 14 static $default_map = array( 15 // All files which have file extensions that we haven't already matched 16 // map to their extensions. 17 '@\\.([^./]+)$@' => 1, 18 ); 19 20 $maps = array(); 21 if (!empty($this->config['filename.map'])) { 22 $maps[] = $this->config['filename.map']; 23 } 24 $maps[] = $default_map; 25 26 foreach ($maps as $map) { 27 foreach ($map as $regexp => $lang) { 28 $matches = null; 29 if (preg_match($regexp, $filename, $matches)) { 30 if (is_numeric($lang)) { 31 return idx($matches, $lang); 32 } else { 33 return $lang; 34 } 35 } 36 } 37 } 38 39 return null; 40 } 41 42 public function getHighlightFuture($language, $source) { 43 if ($language === null) { 44 $language = PhutilLanguageGuesser::guessLanguage($source); 45 } 46 47 $have_pygments = !empty($this->config['pygments.enabled']); 48 49 if ($language == 'php' && PhutilXHPASTBinary::isAvailable()) { 50 return id(new PhutilXHPASTSyntaxHighlighter()) 51 ->getHighlightFuture($source); 52 } 53 54 if ($language == 'console') { 55 return id(new PhutilConsoleSyntaxHighlighter()) 56 ->getHighlightFuture($source); 57 } 58 59 if ($language == 'diviner' || $language == 'remarkup') { 60 return id(new PhutilDivinerSyntaxHighlighter()) 61 ->getHighlightFuture($source); 62 } 63 64 if ($language == 'rainbow') { 65 return id(new PhutilRainbowSyntaxHighlighter()) 66 ->getHighlightFuture($source); 67 } 68 69 if ($language == 'php') { 70 return id(new PhutilLexerSyntaxHighlighter()) 71 ->setConfig('lexer', new PhutilPHPFragmentLexer()) 72 ->setConfig('language', 'php') 73 ->getHighlightFuture($source); 74 } 75 76 if ($language == 'py' || $language == 'python') { 77 return id(new PhutilLexerSyntaxHighlighter()) 78 ->setConfig('lexer', new PhutilPythonFragmentLexer()) 79 ->setConfig('language', 'py') 80 ->getHighlightFuture($source); 81 } 82 83 if ($language == 'java') { 84 return id(new PhutilLexerSyntaxHighlighter()) 85 ->setConfig('lexer', new PhutilJavaFragmentLexer()) 86 ->setConfig('language', 'java') 87 ->getHighlightFuture($source); 88 } 89 90 if ($language == 'json') { 91 return id(new PhutilLexerSyntaxHighlighter()) 92 ->setConfig('lexer', new PhutilJSONFragmentLexer()) 93 ->getHighlightFuture($source); 94 } 95 96 if ($language == 'invisible') { 97 return id(new PhutilInvisibleSyntaxHighlighter()) 98 ->getHighlightFuture($source); 99 } 100 101 // Don't invoke Pygments for plain text, since it's expensive and has 102 // no effect. 103 if ($language !== 'text' && $language !== 'txt') { 104 if ($have_pygments) { 105 return id(new PhutilPygmentsSyntaxHighlighter()) 106 ->setConfig('language', $language) 107 ->getHighlightFuture($source); 108 } 109 } 110 111 return id(new PhutilDefaultSyntaxHighlighter()) 112 ->getHighlightFuture($source); 113 } 114 115}