source: node_modules/refractor/lang/pug.js

main
Last change on this file was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 5.8 KB
RevLine 
[d24f17c]1'use strict'
2
3module.exports = pug
4pug.displayName = 'pug'
5pug.aliases = []
6function 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}
Note: See TracBrowser for help on using the repository browser.