aboutsummaryrefslogtreecommitdiff
path: root/source/prism.js
diff options
context:
space:
mode:
Diffstat (limited to 'source/prism.js')
-rw-r--r--source/prism.js1071
1 files changed, 0 insertions, 1071 deletions
diff --git a/source/prism.js b/source/prism.js
deleted file mode 100644
index 304be1e..0000000
--- a/source/prism.js
+++ /dev/null
@@ -1,1071 +0,0 @@
1
2/* **********************************************
3 Begin prism-core.js
4********************************************** */
5
6var _self = (typeof window !== 'undefined')
7 ? window // if in browser
8 : (
9 (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
10 ? self // if in worker
11 : {} // if in node js
12 );
13
14/**
15 * Prism: Lightweight, robust, elegant syntax highlighting
16 * MIT license http://www.opensource.org/licenses/mit-license.php/
17 * @author Lea Verou http://lea.verou.me
18 */
19
20var Prism = (function () {
21
22 // Private helper vars
23 var lang = /\blang(?:uage)?-([\w-]+)\b/i;
24 var uniqueId = 0;
25
26 var _ = _self.Prism = {
27 manual: _self.Prism && _self.Prism.manual,
28 disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,
29 util: {
30 encode: function (tokens) {
31 if (tokens instanceof Token) {
32 return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
33 } else if (_.util.type(tokens) === 'Array') {
34 return tokens.map(_.util.encode);
35 } else {
36 return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
37 }
38 },
39
40 type: function (o) {
41 return Object.prototype.toString.call(o).slice(8, -1);
42 },
43
44 objId: function (obj) {
45 if (!obj['__id']) {
46 Object.defineProperty(obj, '__id', { value: ++uniqueId });
47 }
48 return obj['__id'];
49 },
50
51 // Deep clone a language definition (e.g. to extend it)
52 clone: function (o, visited) {
53 var type = _.util.type(o);
54 visited = visited || {};
55
56 switch (type) {
57 case 'Object':
58 if (visited[_.util.objId(o)]) {
59 return visited[_.util.objId(o)];
60 }
61 var clone = {};
62 visited[_.util.objId(o)] = clone;
63
64 for (var key in o) {
65 if (o.hasOwnProperty(key)) {
66 clone[key] = _.util.clone(o[key], visited);
67 }
68 }
69
70 return clone;
71
72 case 'Array':
73 if (visited[_.util.objId(o)]) {
74 return visited[_.util.objId(o)];
75 }
76 var clone = [];
77 visited[_.util.objId(o)] = clone;
78
79 o.forEach(function (v, i) {
80 clone[i] = _.util.clone(v, visited);
81 });
82
83 return clone;
84 }
85
86 return o;
87 }
88 },
89
90 languages: {
91 extend: function (id, redef) {
92 var lang = _.util.clone(_.languages[id]);
93
94 for (var key in redef) {
95 lang[key] = redef[key];
96 }
97
98 return lang;
99 },
100
101 /**
102 * Insert a token before another token in a language literal
103 * As this needs to recreate the object (we cannot actually insert before keys in object literals),
104 * we cannot just provide an object, we need an object and a key.
105 * @param inside The key (or language id) of the parent
106 * @param before The key to insert before.
107 * @param insert Object with the key/value pairs to insert
108 * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
109 */
110 insertBefore: function (inside, before, insert, root) {
111 root = root || _.languages;
112 var grammar = root[inside];
113 var ret = {};
114
115 for (var token in grammar) {
116 if (grammar.hasOwnProperty(token)) {
117
118 if (token == before) {
119 for (var newToken in insert) {
120 if (insert.hasOwnProperty(newToken)) {
121 ret[newToken] = insert[newToken];
122 }
123 }
124 }
125
126 // Do not insert token which also occur in insert. See #1525
127 if (!insert.hasOwnProperty(token)) {
128 ret[token] = grammar[token];
129 }
130 }
131 }
132
133 var old = root[inside];
134 root[inside] = ret;
135
136 // Update references in other language definitions
137 _.languages.DFS(_.languages, function (key, value) {
138 if (value === old && key != inside) {
139 this[key] = ret;
140 }
141 });
142
143 return ret;
144 },
145
146 // Traverse a language definition with Depth First Search
147 DFS: function (o, callback, type, visited) {
148 visited = visited || {};
149 for (var i in o) {
150 if (o.hasOwnProperty(i)) {
151 callback.call(o, i, o[i], type || i);
152
153 if (_.util.type(o[i]) === 'Object' && !visited[_.util.objId(o[i])]) {
154 visited[_.util.objId(o[i])] = true;
155 _.languages.DFS(o[i], callback, null, visited);
156 }
157 else if (_.util.type(o[i]) === 'Array' && !visited[_.util.objId(o[i])]) {
158 visited[_.util.objId(o[i])] = true;
159 _.languages.DFS(o[i], callback, i, visited);
160 }
161 }
162 }
163 }
164 },
165 plugins: {},
166
167 highlightAll: function (async, callback) {
168 _.highlightAllUnder(document, async, callback);
169 },
170
171 highlightAllUnder: function (container, async, callback) {
172 var env = {
173 callback: callback,
174 selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
175 };
176
177 _.hooks.run("before-highlightall", env);
178
179 var elements = env.elements || container.querySelectorAll(env.selector);
180
181 for (var i = 0, element; element = elements[i++];) {
182 _.highlightElement(element, async === true, env.callback);
183 }
184 },
185
186 highlightElement: function (element, async, callback) {
187 // Find language
188 var language, grammar, parent = element;
189
190 while (parent && !lang.test(parent.className)) {
191 parent = parent.parentNode;
192 }
193
194 if (parent) {
195 language = (parent.className.match(lang) || [, ''])[1].toLowerCase();
196 grammar = _.languages[language];
197 }
198
199 // Set language on the element, if not present
200 element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
201
202 if (element.parentNode) {
203 // Set language on the parent, for styling
204 parent = element.parentNode;
205
206 if (/pre/i.test(parent.nodeName)) {
207 parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
208 }
209 }
210
211 var code = element.textContent;
212
213 var env = {
214 element: element,
215 language: language,
216 grammar: grammar,
217 code: code
218 };
219
220 var insertHighlightedCode = function (highlightedCode) {
221 env.highlightedCode = highlightedCode;
222
223 _.hooks.run('before-insert', env);
224
225 env.element.innerHTML = env.highlightedCode;
226
227 _.hooks.run('after-highlight', env);
228 _.hooks.run('complete', env);
229 callback && callback.call(env.element);
230 }
231
232 _.hooks.run('before-sanity-check', env);
233
234 if (!env.code) {
235 _.hooks.run('complete', env);
236 return;
237 }
238
239 _.hooks.run('before-highlight', env);
240
241 if (!env.grammar) {
242 insertHighlightedCode(_.util.encode(env.code));
243 return;
244 }
245
246 if (async && _self.Worker) {
247 var worker = new Worker(_.filename);
248
249 worker.onmessage = function (evt) {
250 insertHighlightedCode(evt.data);
251 };
252
253 worker.postMessage(JSON.stringify({
254 language: env.language,
255 code: env.code,
256 immediateClose: true
257 }));
258 }
259 else {
260 insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
261 }
262 },
263
264 highlight: function (text, grammar, language) {
265 var env = {
266 code: text,
267 grammar: grammar,
268 language: language
269 };
270 _.hooks.run('before-tokenize', env);
271 env.tokens = _.tokenize(env.code, env.grammar);
272 _.hooks.run('after-tokenize', env);
273 return Token.stringify(_.util.encode(env.tokens), env.language);
274 },
275
276 matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) {
277 var Token = _.Token;
278
279 for (var token in grammar) {
280 if (!grammar.hasOwnProperty(token) || !grammar[token]) {
281 continue;
282 }
283
284 if (token == target) {
285 return;
286 }
287
288 var patterns = grammar[token];
289 patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns];
290
291 for (var j = 0; j < patterns.length; ++j) {
292 var pattern = patterns[j],
293 inside = pattern.inside,
294 lookbehind = !!pattern.lookbehind,
295 greedy = !!pattern.greedy,
296 lookbehindLength = 0,
297 alias = pattern.alias;
298
299 if (greedy && !pattern.pattern.global) {
300 // Without the global flag, lastIndex won't work
301 var flags = pattern.pattern.toString().match(/[imuy]*$/)[0];
302 pattern.pattern = RegExp(pattern.pattern.source, flags + "g");
303 }
304
305 pattern = pattern.pattern || pattern;
306
307 // Don’t cache length as it changes during the loop
308 for (var i = index, pos = startPos; i < strarr.length; pos += strarr[i].length, ++i) {
309
310 var str = strarr[i];
311
312 if (strarr.length > text.length) {
313 // Something went terribly wrong, ABORT, ABORT!
314 return;
315 }
316
317 if (str instanceof Token) {
318 continue;
319 }
320
321 if (greedy && i != strarr.length - 1) {
322 pattern.lastIndex = pos;
323 var match = pattern.exec(text);
324 if (!match) {
325 break;
326 }
327
328 var from = match.index + (lookbehind ? match[1].length : 0),
329 to = match.index + match[0].length,
330 k = i,
331 p = pos;
332
333 for (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) {
334 p += strarr[k].length;
335 // Move the index i to the element in strarr that is closest to from
336 if (from >= p) {
337 ++i;
338 pos = p;
339 }
340 }
341
342 // If strarr[i] is a Token, then the match starts inside another Token, which is invalid
343 if (strarr[i] instanceof Token) {
344 continue;
345 }
346
347 // Number of tokens to delete and replace with the new match
348 delNum = k - i;
349 str = text.slice(pos, p);
350 match.index -= pos;
351 } else {
352 pattern.lastIndex = 0;
353
354 var match = pattern.exec(str),
355 delNum = 1;
356 }
357
358 if (!match) {
359 if (oneshot) {
360 break;
361 }
362
363 continue;
364 }
365
366 if (lookbehind) {
367 lookbehindLength = match[1] ? match[1].length : 0;
368 }
369
370 var from = match.index + lookbehindLength,
371 match = match[0].slice(lookbehindLength),
372 to = from + match.length,
373 before = str.slice(0, from),
374 after = str.slice(to);
375
376 var args = [i, delNum];
377
378 if (before) {
379 ++i;
380 pos += before.length;
381 args.push(before);
382 }
383
384 var wrapped = new Token(token, inside ? _.tokenize(match, inside) : match, alias, match, greedy);
385
386 args.push(wrapped);
387
388 if (after) {
389 args.push(after);
390 }
391
392 Array.prototype.splice.apply(strarr, args);
393
394 if (delNum != 1)
395 _.matchGrammar(text, strarr, grammar, i, pos, true, token);
396
397 if (oneshot)
398 break;
399 }
400 }
401 }
402 },
403
404 tokenize: function (text, grammar) {
405 var strarr = [text];
406
407 var rest = grammar.rest;
408
409 if (rest) {
410 for (var token in rest) {
411 grammar[token] = rest[token];
412 }
413
414 delete grammar.rest;
415 }
416
417 _.matchGrammar(text, strarr, grammar, 0, 0, false);
418
419 return strarr;
420 },
421
422 hooks: {
423 all: {},
424
425 add: function (name, callback) {
426 var hooks = _.hooks.all;
427
428 hooks[name] = hooks[name] || [];
429
430 hooks[name].push(callback);
431 },
432
433 run: function (name, env) {
434 var callbacks = _.hooks.all[name];
435
436 if (!callbacks || !callbacks.length) {
437 return;
438 }
439
440 for (var i = 0, callback; callback = callbacks[i++];) {
441 callback(env);
442 }
443 }
444 }
445 };
446
447 var Token = _.Token = function (type, content, alias, matchedStr, greedy) {
448 this.type = type;
449 this.content = content;
450 this.alias = alias;
451 // Copy of the full string this token was created from
452 this.length = (matchedStr || "").length | 0;
453 this.greedy = !!greedy;
454 };
455
456 Token.stringify = function (o, language, parent) {
457 if (typeof o == 'string') {
458 return o;
459 }
460
461 if (_.util.type(o) === 'Array') {
462 return o.map(function (element) {
463 return Token.stringify(element, language, o);
464 }).join('');
465 }
466
467 var env = {
468 type: o.type,
469 content: Token.stringify(o.content, language, parent),
470 tag: 'span',
471 classes: ['token', o.type],
472 attributes: {},
473 language: language,
474 parent: parent
475 };
476
477 if (o.alias) {
478 var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];
479 Array.prototype.push.apply(env.classes, aliases);
480 }
481
482 _.hooks.run('wrap', env);
483
484 var attributes = Object.keys(env.attributes).map(function (name) {
485 return name + '="' + (env.attributes[name] || '').replace(/"/g, '&quot;') + '"';
486 }).join(' ');
487
488 return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + '</' + env.tag + '>';
489
490 };
491
492 if (!_self.document) {
493 if (!_self.addEventListener) {
494 // in Node.js
495 return _self.Prism;
496 }
497
498 if (!_.disableWorkerMessageHandler) {
499 // In worker
500 _self.addEventListener('message', function (evt) {
501 var message = JSON.parse(evt.data),
502 lang = message.language,
503 code = message.code,
504 immediateClose = message.immediateClose;
505
506 _self.postMessage(_.highlight(code, _.languages[lang], lang));
507 if (immediateClose) {
508 _self.close();
509 }
510 }, false);
511 }
512
513 return _self.Prism;
514 }
515
516 //Get current script and highlight
517 var script = document.currentScript || [].slice.call(document.getElementsByTagName("script")).pop();
518
519 if (script) {
520 _.filename = script.src;
521
522 if (!_.manual && !script.hasAttribute('data-manual')) {
523 if (document.readyState !== "loading") {
524 if (window.requestAnimationFrame) {
525 window.requestAnimationFrame(_.highlightAll);
526 } else {
527 window.setTimeout(_.highlightAll, 16);
528 }
529 }
530 else {
531 document.addEventListener('DOMContentLoaded', _.highlightAll);
532 }
533 }
534 }
535
536 return _self.Prism;
537
538})();
539
540if (typeof module !== 'undefined' && module.exports) {
541 module.exports = Prism;
542}
543
544// hack for components to work correctly in node.js
545if (typeof global !== 'undefined') {
546 global.Prism = Prism;
547}
548
549
550/* **********************************************
551 Begin prism-markup.js
552********************************************** */
553
554Prism.languages.markup = {
555 'comment': /<!--[\s\S]*?-->/,
556 'prolog': /<\?[\s\S]+?\?>/,
557 'doctype': /<!DOCTYPE[\s\S]+?>/i,
558 'cdata': /<!\[CDATA\[[\s\S]*?]]>/i,
559 'tag': {
560 pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,
561 greedy: true,
562 inside: {
563 'tag': {
564 pattern: /^<\/?[^\s>\/]+/i,
565 inside: {
566 'punctuation': /^<\/?/,
567 'namespace': /^[^\s>\/:]+:/
568 }
569 },
570 'attr-value': {
571 pattern: /=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,
572 inside: {
573 'punctuation': [
574 /^=/,
575 {
576 pattern: /(^|[^\\])["']/,
577 lookbehind: true
578 }
579 ]
580 }
581 },
582 'punctuation': /\/?>/,
583 'attr-name': {
584 pattern: /[^\s>\/]+/,
585 inside: {
586 'namespace': /^[^\s>\/:]+:/
587 }
588 }
589
590 }
591 },
592 'entity': /&#?[\da-z]{1,8};/i
593};
594
595Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] =
596 Prism.languages.markup['entity'];
597
598// Plugin to make entity title show the real entity, idea by Roman Komarov
599Prism.hooks.add('wrap', function (env) {
600
601 if (env.type === 'entity') {
602 env.attributes['title'] = env.content.replace(/&amp;/, '&');
603 }
604});
605
606Prism.languages.xml = Prism.languages.extend('markup', {});
607Prism.languages.html = Prism.languages.markup;
608Prism.languages.mathml = Prism.languages.markup;
609Prism.languages.svg = Prism.languages.markup;
610
611
612/* **********************************************
613 Begin prism-css.js
614********************************************** */
615
616Prism.languages.css = {
617 'comment': /\/\*[\s\S]*?\*\//,
618 'atrule': {
619 pattern: /@[\w-]+?[\s\S]*?(?:;|(?=\s*\{))/i,
620 inside: {
621 'rule': /@[\w-]+/
622 // See rest below
623 }
624 },
625 'url': /url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,
626 'selector': /[^{}\s][^{};]*?(?=\s*\{)/,
627 'string': {
628 pattern: /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
629 greedy: true
630 },
631 'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,
632 'important': /!important\b/i,
633 'function': /[-a-z0-9]+(?=\()/i,
634 'punctuation': /[(){};:,]/
635};
636
637Prism.languages.css['atrule'].inside.rest = Prism.languages.css;
638
639if (Prism.languages.markup) {
640 Prism.languages.insertBefore('markup', 'tag', {
641 'style': {
642 pattern: /(<style[\s\S]*?>)[\s\S]*?(?=<\/style>)/i,
643 lookbehind: true,
644 inside: Prism.languages.css,
645 alias: 'language-css',
646 greedy: true
647 }
648 });
649
650 Prism.languages.insertBefore('inside', 'attr-value', {
651 'style-attr': {
652 pattern: /\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,
653 inside: {
654 'attr-name': {
655 pattern: /^\s*style/i,
656 inside: Prism.languages.markup.tag.inside
657 },
658 'punctuation': /^\s*=\s*['"]|['"]\s*$/,
659 'attr-value': {
660 pattern: /.+/i,
661 inside: Prism.languages.css
662 }
663 },
664 alias: 'language-css'
665 }
666 }, Prism.languages.markup.tag);
667}
668
669
670/* **********************************************
671 Begin prism-clike.js
672********************************************** */
673
674Prism.languages.clike = {
675 'comment': [
676 {
677 pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
678 lookbehind: true
679 },
680 {
681 pattern: /(^|[^\\:])\/\/.*/,
682 lookbehind: true,
683 greedy: true
684 }
685 ],
686 'string': {
687 pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
688 greedy: true
689 },
690 'class-name': {
691 pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,
692 lookbehind: true,
693 inside: {
694 punctuation: /[.\\]/
695 }
696 },
697 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
698 'boolean': /\b(?:true|false)\b/,
699 'function': /\w+(?=\()/,
700 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,
701 'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
702 'punctuation': /[{}[\];(),.:]/
703};
704
705
706/* **********************************************
707 Begin prism-javascript.js
708********************************************** */
709
710Prism.languages.javascript = Prism.languages.extend('clike', {
711 'class-name': [
712 Prism.languages.clike['class-name'],
713 {
714 pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,
715 lookbehind: true
716 }
717 ],
718 'keyword': [
719 {
720 pattern: /((?:^|})\s*)(?:catch|finally)\b/,
721 lookbehind: true
722 },
723 /\b(?:as|async|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/
724 ],
725 'number': /\b(?:(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+)n?|\d+n|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,
726 // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
727 'function': /[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\(|\.(?:apply|bind|call)\()/,
728 'operator': /-[-=]?|\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/
729});
730
731Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/
732
733Prism.languages.insertBefore('javascript', 'keyword', {
734 'regex': {
735 pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,
736 lookbehind: true,
737 greedy: true
738 },
739 // This must be declared before keyword because we use "function" inside the look-forward
740 'function-variable': {
741 pattern: /[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,
742 alias: 'function'
743 },
744 'parameter': [
745 {
746 pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,
747 lookbehind: true,
748 inside: Prism.languages.javascript
749 },
750 {
751 pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,
752 inside: Prism.languages.javascript
753 },
754 {
755 pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,
756 lookbehind: true,
757 inside: Prism.languages.javascript
758 },
759 {
760 pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,
761 lookbehind: true,
762 inside: Prism.languages.javascript
763 }
764 ],
765 'constant': /\b[A-Z][A-Z\d_]*\b/
766});
767
768Prism.languages.insertBefore('javascript', 'string', {
769 'template-string': {
770 pattern: /`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,
771 greedy: true,
772 inside: {
773 'interpolation': {
774 pattern: /\${[^}]+}/,
775 inside: {
776 'interpolation-punctuation': {
777 pattern: /^\${|}$/,
778 alias: 'punctuation'
779 },
780 rest: Prism.languages.javascript
781 }
782 },
783 'string': /[\s\S]+/
784 }
785 }
786});
787
788if (Prism.languages.markup) {
789 Prism.languages.insertBefore('markup', 'tag', {
790 'script': {
791 pattern: /(<script[\s\S]*?>)[\s\S]*?(?=<\/script>)/i,
792 lookbehind: true,
793 inside: Prism.languages.javascript,
794 alias: 'language-javascript',
795 greedy: true
796 }
797 });
798}
799
800Prism.languages.js = Prism.languages.javascript;
801
802
803/* **********************************************
804 Begin prism-file-highlight.js
805********************************************** */
806
807(function () {
808 if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) {
809 return;
810 }
811
812 /**
813 * @param {Element} [container=document]
814 */
815 self.Prism.fileHighlight = function (container) {
816 container = container || document;
817
818 var Extensions = {
819 'js': 'javascript',
820 'py': 'python',
821 'rb': 'ruby',
822 'ps1': 'powershell',
823 'psm1': 'powershell',
824 'sh': 'bash',
825 'bat': 'batch',
826 'h': 'c',
827 'tex': 'latex'
828 };
829
830 Array.prototype.slice.call(container.querySelectorAll('pre[data-src]')).forEach(function (pre) {
831 // ignore if already loaded
832 if (pre.hasAttribute('data-src-loaded')) {
833 return;
834 }
835
836 // load current
837 var src = pre.getAttribute('data-src');
838
839 var language, parent = pre;
840 var lang = /\blang(?:uage)?-([\w-]+)\b/i;
841 while (parent && !lang.test(parent.className)) {
842 parent = parent.parentNode;
843 }
844
845 if (parent) {
846 language = (pre.className.match(lang) || [, ''])[1];
847 }
848
849 if (!language) {
850 var extension = (src.match(/\.(\w+)$/) || [, ''])[1];
851 language = Extensions[extension] || extension;
852 }
853
854 var code = document.createElement('code');
855 code.className = 'language-' + language;
856
857 pre.textContent = '';
858
859 code.textContent = 'Loading…';
860
861 pre.appendChild(code);
862
863 var xhr = new XMLHttpRequest();
864
865 xhr.open('GET', src, true);
866
867 xhr.onreadystatechange = function () {
868 if (xhr.readyState == 4) {
869
870 if (xhr.status < 400 && xhr.responseText) {
871 code.textContent = xhr.responseText;
872
873 Prism.highlightElement(code);
874 // mark as loaded
875 pre.setAttribute('data-src-loaded', '');
876 }
877 else if (xhr.status >= 400) {
878 code.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText;
879 }
880 else {
881 code.textContent = '✖ Error: File does not exist or is empty';
882 }
883 }
884 };
885
886 xhr.send(null);
887 });
888
889 if (Prism.plugins.toolbar) {
890 Prism.plugins.toolbar.registerButton('download-file', function (env) {
891 var pre = env.element.parentNode;
892 if (!pre || !/pre/i.test(pre.nodeName) || !pre.hasAttribute('data-src') || !pre.hasAttribute('data-download-link')) {
893 return;
894 }
895 var src = pre.getAttribute('data-src');
896 var a = document.createElement('a');
897 a.textContent = pre.getAttribute('data-download-link-label') || 'Download';
898 a.setAttribute('download', '');
899 a.href = src;
900 return a;
901 });
902 }
903
904 };
905
906 document.addEventListener('DOMContentLoaded', function () {
907 // execute inside handler, for dropping Event as argumnet
908 self.Prism.fileHighlight();
909 });
910
911})();
912
913(function () {
914
915 if (typeof self === 'undefined' || !self.Prism || !self.document) {
916 return;
917 }
918
919 /**
920 * Plugin name which is used as a class name for <pre> which is activating the plugin
921 * @type {String}
922 */
923 var PLUGIN_NAME = 'line-numbers';
924
925 /**
926 * Regular expression used for determining line breaks
927 * @type {RegExp}
928 */
929 var NEW_LINE_EXP = /\n(?!$)/g;
930
931 /**
932 * Resizes line numbers spans according to height of line of code
933 * @param {Element} element <pre> element
934 */
935 var _resizeElement = function (element) {
936 var codeStyles = getStyles(element);
937 var whiteSpace = codeStyles['white-space'];
938
939 if (whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line') {
940 var codeElement = element.querySelector('code');
941 var lineNumbersWrapper = element.querySelector('.line-numbers-rows');
942 var lineNumberSizer = element.querySelector('.line-numbers-sizer');
943 var codeLines = codeElement.textContent.split(NEW_LINE_EXP);
944
945 if (!lineNumberSizer) {
946 lineNumberSizer = document.createElement('span');
947 lineNumberSizer.className = 'line-numbers-sizer';
948
949 codeElement.appendChild(lineNumberSizer);
950 }
951
952 lineNumberSizer.style.display = 'block';
953
954 codeLines.forEach(function (line, lineNumber) {
955 lineNumberSizer.textContent = line || '\n';
956 var lineSize = lineNumberSizer.getBoundingClientRect().height;
957 lineNumbersWrapper.children[lineNumber].style.height = lineSize + 'px';
958 });
959
960 lineNumberSizer.textContent = '';
961 lineNumberSizer.style.display = 'none';
962 }
963 };
964
965 /**
966 * Returns style declarations for the element
967 * @param {Element} element
968 */
969 var getStyles = function (element) {
970 if (!element) {
971 return null;
972 }
973
974 return window.getComputedStyle ? getComputedStyle(element) : (element.currentStyle || null);
975 };
976
977 window.addEventListener('resize', function () {
978 Array.prototype.forEach.call(document.querySelectorAll('pre.' + PLUGIN_NAME), _resizeElement);
979 });
980
981 Prism.hooks.add('complete', function (env) {
982 if (!env.code) {
983 return;
984 }
985
986 // works only for <code> wrapped inside <pre> (not inline)
987 var pre = env.element.parentNode;
988 var clsReg = /\s*\bline-numbers\b\s*/;
989 if (
990 !pre || !/pre/i.test(pre.nodeName) ||
991 // Abort only if nor the <pre> nor the <code> have the class
992 (!clsReg.test(pre.className) && !clsReg.test(env.element.className))
993 ) {
994 return;
995 }
996
997 if (env.element.querySelector('.line-numbers-rows')) {
998 // Abort if line numbers already exists
999 return;
1000 }
1001
1002 if (clsReg.test(env.element.className)) {
1003 // Remove the class 'line-numbers' from the <code>
1004 env.element.className = env.element.className.replace(clsReg, ' ');
1005 }
1006 if (!clsReg.test(pre.className)) {
1007 // Add the class 'line-numbers' to the <pre>
1008 pre.className += ' line-numbers';
1009 }
1010
1011 var match = env.code.match(NEW_LINE_EXP);
1012 var linesNum = match ? match.length + 1 : 1;
1013 var lineNumbersWrapper;
1014
1015 var lines = new Array(linesNum + 1);
1016 lines = lines.join('<span></span>');
1017
1018 lineNumbersWrapper = document.createElement('span');
1019 lineNumbersWrapper.setAttribute('aria-hidden', 'true');
1020 lineNumbersWrapper.className = 'line-numbers-rows';
1021 lineNumbersWrapper.innerHTML = lines;
1022
1023 if (pre.hasAttribute('data-start')) {
1024 pre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1);
1025 }
1026
1027 env.element.appendChild(lineNumbersWrapper);
1028
1029 _resizeElement(pre);
1030
1031 Prism.hooks.run('line-numbers', env);
1032 });
1033
1034 Prism.hooks.add('line-numbers', function (env) {
1035 env.plugins = env.plugins || {};
1036 env.plugins.lineNumbers = true;
1037 });
1038
1039 /**
1040 * Global exports
1041 */
1042 Prism.plugins.lineNumbers = {
1043 /**
1044 * Get node for provided line number
1045 * @param {Element} element pre element
1046 * @param {Number} number line number
1047 * @return {Element|undefined}
1048 */
1049 getLine: function (element, number) {
1050 if (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {
1051 return;
1052 }
1053
1054 var lineNumberRows = element.querySelector('.line-numbers-rows');
1055 var lineNumberStart = parseInt(element.getAttribute('data-start'), 10) || 1;
1056 var lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);
1057
1058 if (number < lineNumberStart) {
1059 number = lineNumberStart;
1060 }
1061 if (number > lineNumberEnd) {
1062 number = lineNumberEnd;
1063 }
1064
1065 var lineIndex = number - lineNumberStart;
1066
1067 return lineNumberRows.children[lineIndex];
1068 }
1069 };
1070
1071}());