-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
highlighter.ts
65 lines (36 loc) · 1.45 KB
/
highlighter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/* IMPORT */
import * as _ from 'lodash';
import {AllHtmlEntities as entities} from 'html-entities';
import * as Prism from 'prismjs';
import {languages} from 'prismjs/components.js';
/* HIGHLIGHTER */
const Highlighter = {
languageRe: /language-([^\s"']*)/i,
languagesAliases: { // language => language to use instead
sh: 'bash',
shell: 'bash',
zsh: 'bash'
},
inferLanguage ( str: string ): string | undefined {
if ( !str ) return;
const match = str.match ( Highlighter.languageRe );
if ( !match ) return;
return match[1];
},
initLanguage ( language: string ): boolean { // Loading needed languages dynamically, for performance and because WebPack complains about the included `loadLanguages` function //TODO: Add support for peerDependencies
if ( Prism.languages[language] ) return true;
const lang = languages[language];
if ( !lang ) return false;
if ( lang.require && !_.castArray ( lang.require ).every ( Highlighter.initLanguage ) ) return false;
require ( `prismjs/components/prism-${language}.min.js` );
return true;
},
highlight ( str: string, language?: string ): string {
if ( !language ) return str;
const lang = Highlighter.languagesAliases[language] || language;
if ( !Highlighter.initLanguage ( lang ) ) return str;
return Prism.highlight ( entities.decode ( str ), Prism.languages[language], language );
}
};
/* EXPORT */
export default Highlighter;