UNPKG

4.72 kBJavaScriptView Raw
1(function (Prism) {
2 // TODO:
3 // - Add CSS highlighting inside <style> tags
4 // - Add support for multi-line code blocks
5 // - Add support for interpolation #{} and !{}
6 // - Add support for tag interpolation #[]
7 // - Add explicit support for plain text using |
8 // - Add support for markup embedded in plain text
9
10 Prism.languages.pug = {
11
12 // Multiline stuff should appear before the rest
13
14 // This handles both single-line and multi-line comments
15 'comment': {
16 pattern: /(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,
17 lookbehind: true
18 },
19
20 // All the tag-related part is in lookbehind
21 // so that it can be highlighted by the "tag" pattern
22 'multiline-script': {
23 pattern: /(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
24 lookbehind: true,
25 inside: Prism.languages.javascript
26 },
27
28 // See at the end of the file for known filters
29 'filter': {
30 pattern: /(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
31 lookbehind: true,
32 inside: {
33 'filter-name': {
34 pattern: /^:[\w-]+/,
35 alias: 'variable'
36 },
37 'text': /\S[\s\S]*/,
38 }
39 },
40
41 'multiline-plain-text': {
42 pattern: /(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
43 lookbehind: true
44 },
45 'markup': {
46 pattern: /(^[\t ]*)<.+/m,
47 lookbehind: true,
48 inside: Prism.languages.markup
49 },
50 'doctype': {
51 pattern: /((?:^|\n)[\t ]*)doctype(?: .+)?/,
52 lookbehind: true
53 },
54
55 // This handle all conditional and loop keywords
56 'flow-control': {
57 pattern: /(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,
58 lookbehind: true,
59 inside: {
60 'each': {
61 pattern: /^each .+? in\b/,
62 inside: {
63 'keyword': /\b(?:each|in)\b/,
64 'punctuation': /,/
65 }
66 },
67 'branch': {
68 pattern: /^(?:case|default|else|if|unless|when|while)\b/,
69 alias: 'keyword'
70 },
71 rest: Prism.languages.javascript
72 }
73 },
74 'keyword': {
75 pattern: /(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,
76 lookbehind: true
77 },
78 'mixin': [
79 // Declaration
80 {
81 pattern: /(^[\t ]*)mixin .+/m,
82 lookbehind: true,
83 inside: {
84 'keyword': /^mixin/,
85 'function': /\w+(?=\s*\(|\s*$)/,
86 'punctuation': /[(),.]/
87 }
88 },
89 // Usage
90 {
91 pattern: /(^[\t ]*)\+.+/m,
92 lookbehind: true,
93 inside: {
94 'name': {
95 pattern: /^\+\w+/,
96 alias: 'function'
97 },
98 rest: Prism.languages.javascript
99 }
100 }
101 ],
102 'script': {
103 pattern: /(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,
104 lookbehind: true,
105 inside: Prism.languages.javascript
106 },
107
108 'plain-text': {
109 pattern: /(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,
110 lookbehind: true
111 },
112 'tag': {
113 pattern: /(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,
114 lookbehind: true,
115 inside: {
116 'attributes': [
117 {
118 pattern: /&[^(]+\([^)]+\)/,
119 inside: Prism.languages.javascript
120 },
121 {
122 pattern: /\([^)]+\)/,
123 inside: {
124 'attr-value': {
125 pattern: /(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,
126 lookbehind: true,
127 inside: Prism.languages.javascript
128 },
129 'attr-name': /[\w-]+(?=\s*!?=|\s*[,)])/,
130 'punctuation': /[!=(),]+/
131 }
132 }
133 ],
134 'punctuation': /:/,
135 'attr-id': /#[\w\-]+/,
136 'attr-class': /\.[\w\-]+/
137 }
138 },
139 'code': [
140 {
141 pattern: /(^[\t ]*(?:-|!?=)).+/m,
142 lookbehind: true,
143 inside: Prism.languages.javascript
144 }
145 ],
146 'punctuation': /[.\-!=|]+/
147 };
148
149 var filter_pattern = /(^([\t ]*)):<filter_name>(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/.source;
150
151 // Non exhaustive list of available filters and associated languages
152 var filters = [
153 { filter: 'atpl', language: 'twig' },
154 { filter: 'coffee', language: 'coffeescript' },
155 'ejs',
156 'handlebars',
157 'less',
158 'livescript',
159 'markdown',
160 { filter: 'sass', language: 'scss' },
161 'stylus'
162 ];
163 var all_filters = {};
164 for (var i = 0, l = filters.length; i < l; i++) {
165 var filter = filters[i];
166 filter = typeof filter === 'string' ? { filter: filter, language: filter } : filter;
167 if (Prism.languages[filter.language]) {
168 all_filters['filter-' + filter.filter] = {
169 pattern: RegExp(filter_pattern.replace('<filter_name>', function () { return filter.filter; }), 'm'),
170 lookbehind: true,
171 inside: {
172 'filter-name': {
173 pattern: /^:[\w-]+/,
174 alias: 'variable'
175 },
176 'text': {
177 pattern: /\S[\s\S]*/,
178 alias: [filter.language, 'language-' + filter.language],
179 inside: Prism.languages[filter.language]
180 }
181 }
182 };
183 }
184 }
185
186 Prism.languages.insertBefore('pug', 'filter', all_filters);
187
188}(Prism));