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