@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
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}