Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/infrastructure/markup/syntax/engine/PhutilDefaultSyntaxHighlighterEngine.php
12242 views
1
<?php
2
3
final 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
}
116
117