| 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 |