1 | (function (Prism) {
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | Prism.languages.pug = {
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | 'comment': {
|
16 | pattern: /(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,
|
17 | lookbehind: true
|
18 | },
|
19 |
|
20 |
|
21 |
|
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 |
|
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 |
|
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 |
|
80 | {
|
81 | pattern: /(^[\t ]*)mixin .+/m,
|
82 | lookbehind: true,
|
83 | inside: {
|
84 | 'keyword': /^mixin/,
|
85 | 'function': /\w+(?=\s*\(|\s*$)/,
|
86 | 'punctuation': /[(),.]/
|
87 | }
|
88 | },
|
89 |
|
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 |
|
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));
|