UNPKG

2.47 kBJavaScriptView Raw
1(function (Prism) {
2 var stringPattern = /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;
3 var numberPattern = /\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;
4
5 Prism.languages.soy = {
6 'comment': [
7 /\/\*[\s\S]*?\*\//,
8 {
9 pattern: /(\s)\/\/.*/,
10 lookbehind: true,
11 greedy: true
12 }
13 ],
14 'command-arg': {
15 pattern: /({+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,
16 lookbehind: true,
17 alias: 'string',
18 inside: {
19 'punctuation': /\./
20 }
21 },
22 'parameter': {
23 pattern: /({+\/?\s*@?param\??\s+)\.?[\w.]+/,
24 lookbehind: true,
25 alias: 'variable'
26 },
27 'keyword': [
28 {
29 pattern: /({+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,
30 lookbehind: true
31 },
32 /\b(?:any|as|attributes|bool|css|float|in|int|js|html|list|map|null|number|string|uri)\b/
33 ],
34 'delimiter': {
35 pattern: /^{+\/?|\/?}+$/,
36 alias: 'punctuation'
37 },
38 'property': /\w+(?==)/,
39 'variable': {
40 pattern: /\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+]))*/,
41 inside: {
42 'string': {
43 pattern: stringPattern,
44 greedy: true
45 },
46 'number': numberPattern,
47 'punctuation': /[\[\].?]/
48 }
49 },
50 'string': {
51 pattern: stringPattern,
52 greedy: true
53 },
54 'function': [
55 /\w+(?=\()/,
56 {
57 pattern: /(\|[^\S\r\n]*)\w+/,
58 lookbehind: true
59 }
60 ],
61 'boolean': /\b(?:true|false)\b/,
62 'number': numberPattern,
63 'operator': /\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,
64 'punctuation': /[{}()\[\]|.,:]/
65 };
66
67 // Tokenize all inline Soy expressions
68 Prism.hooks.add('before-tokenize', function (env) {
69 var soyPattern = /{{.+?}}|{.+?}|\s\/\/.*|\/\*[\s\S]*?\*\//g;
70 var soyLitteralStart = '{literal}';
71 var soyLitteralEnd = '{/literal}';
72 var soyLitteralMode = false;
73
74 Prism.languages['markup-templating'].buildPlaceholders(env, 'soy', soyPattern, function (match) {
75 // Soy tags inside {literal} block are ignored
76 if (match === soyLitteralEnd) {
77 soyLitteralMode = false;
78 }
79
80 if (!soyLitteralMode) {
81 if (match === soyLitteralStart) {
82 soyLitteralMode = true;
83 }
84
85 return true;
86 }
87 return false;
88 });
89 });
90
91 // Re-insert the tokens after tokenizing
92 Prism.hooks.add('after-tokenize', function (env) {
93 Prism.languages['markup-templating'].tokenizePlaceholders(env, 'soy');
94 });
95
96}(Prism));
\No newline at end of file