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