UNPKG

4.65 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: {
26 rest: Prism.languages.javascript
27 }
28 },
29
30 // See at the end of the file for known filters
31 'filter': {
32 pattern: /(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ]+.+|\s*?(?=\r?\n|\r)))+/m,
33 lookbehind: true,
34 inside: {
35 'filter-name': {
36 pattern: /^:[\w-]+/,
37 alias: 'variable'
38 }
39 }
40 },
41
42 'multiline-plain-text': {
43 pattern: /(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ]+.+|\s*?(?=\r?\n|\r)))+/m,
44 lookbehind: true
45 },
46 'markup': {
47 pattern: /(^[\t ]*)<.+/m,
48 lookbehind: true,
49 inside: {
50 rest: Prism.languages.markup
51 }
52 },
53 'doctype': {
54 pattern: /((?:^|\n)[\t ]*)doctype(?: .+)?/,
55 lookbehind: true
56 },
57
58 // This handle all conditional and loop keywords
59 'flow-control': {
60 pattern: /(^[\t ]*)(?:if|unless|else|case|when|default|each|while)\b(?: .+)?/m,
61 lookbehind: true,
62 inside: {
63 'each': {
64 pattern: /^each .+? in\b/,
65 inside: {
66 'keyword': /\b(?:each|in)\b/,
67 'punctuation': /,/
68 }
69 },
70 'branch': {
71 pattern: /^(?:if|unless|else|case|when|default|while)\b/,
72 alias: 'keyword'
73 },
74 rest: Prism.languages.javascript
75 }
76 },
77 'keyword': {
78 pattern: /(^[\t ]*)(?:block|extends|include|append|prepend)\b.+/m,
79 lookbehind: true
80 },
81 'mixin': [
82 // Declaration
83 {
84 pattern: /(^[\t ]*)mixin .+/m,
85 lookbehind: true,
86 inside: {
87 'keyword': /^mixin/,
88 'function': /\w+(?=\s*\(|\s*$)/,
89 'punctuation': /[(),.]/
90 }
91 },
92 // Usage
93 {
94 pattern: /(^[\t ]*)\+.+/m,
95 lookbehind: true,
96 inside: {
97 'name': {
98 pattern: /^\+\w+/,
99 alias: 'function'
100 },
101 'rest': Prism.languages.javascript
102 }
103 }
104 ],
105 'script': {
106 pattern: /(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]+).+/m,
107 lookbehind: true,
108 inside: {
109 rest: Prism.languages.javascript
110 }
111 },
112
113 'plain-text': {
114 pattern: /(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]+).+/m,
115 lookbehind: true
116 },
117 'tag': {
118 pattern: /(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,
119 lookbehind: true,
120 inside: {
121 'attributes': [
122 {
123 pattern: /&[^(]+\([^)]+\)/,
124 inside: {
125 rest: Prism.languages.javascript
126 }
127 },
128 {
129 pattern: /\([^)]+\)/,
130 inside: {
131 'attr-value': {
132 pattern: /(=\s*)(?:\{[^}]*\}|[^,)\r\n]+)/,
133 lookbehind: true,
134 inside: {
135 rest: Prism.languages.javascript
136 }
137 },
138 'attr-name': /[\w-]+(?=\s*!?=|\s*[,)])/,
139 'punctuation': /[!=(),]+/
140 }
141 }
142 ],
143 'punctuation': /:/
144 }
145 },
146 'code': [
147 {
148 pattern: /(^[\t ]*(?:-|!?=)).+/m,
149 lookbehind: true,
150 inside: {
151 rest: Prism.languages.javascript
152 }
153 }
154 ],
155 'punctuation': /[.\-!=|]+/
156 };
157
158 var filter_pattern = '(^([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ]+.+|\\s*?(?=\\r?\\n|\\r)))+';
159
160 // Non exhaustive list of available filters and associated languages
161 var filters = [
162 {filter:'atpl',language:'twig'},
163 {filter:'coffee',language:'coffeescript'},
164 'ejs',
165 'handlebars',
166 'hogan',
167 'less',
168 'livescript',
169 'markdown',
170 'mustache',
171 'plates',
172 {filter:'sass',language:'scss'},
173 'stylus',
174 'swig'
175
176 ];
177 var all_filters = {};
178 for (var i = 0, l = filters.length; i < l; i++) {
179 var filter = filters[i];
180 filter = typeof filter === 'string' ? {filter: filter, language: filter} : filter;
181 if (Prism.languages[filter.language]) {
182 all_filters['filter-' + filter.filter] = {
183 pattern: RegExp(filter_pattern.replace('{{filter_name}}', filter.filter), 'm'),
184 lookbehind: true,
185 inside: {
186 'filter-name': {
187 pattern: /^:[\w-]+/,
188 alias: 'variable'
189 },
190 rest: Prism.languages[filter.language]
191 }
192 }
193 }
194 }
195
196 Prism.languages.insertBefore('pug', 'filter', all_filters);
197
198}(Prism));