Advertisement
Guest User

Untitled

a guest
Jan 20th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. /* **********************************************
  3.      Begin prism-core.js
  4. ********************************************** */
  5.  
  6. var _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.  
  20. var 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.     util: {
  28.         encode: function (tokens) {
  29.             if (tokens instanceof Token) {
  30.                 return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
  31.             } else if (_.util.type(tokens) === 'Array') {
  32.                 return tokens.map(_.util.encode);
  33.             } else {
  34.                 return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
  35.             }
  36.         },
  37.  
  38.         type: function (o) {
  39.             return Object.prototype.toString.call(o).match(/\[object (\w+)\]/)[1];
  40.         },
  41.  
  42.         objId: function (obj) {
  43.             if (!obj['__id']) {
  44.                 Object.defineProperty(obj, '__id', { value: ++uniqueId });
  45.             }
  46.             return obj['__id'];
  47.         },
  48.  
  49.         // Deep clone a language definition (e.g. to extend it)
  50.         clone: function (o) {
  51.             var type = _.util.type(o);
  52.  
  53.             switch (type) {
  54.                 case 'Object':
  55.                     var clone = {};
  56.  
  57.                     for (var key in o) {
  58.                         if (o.hasOwnProperty(key)) {
  59.                             clone[key] = _.util.clone(o[key]);
  60.                         }
  61.                     }
  62.  
  63.                     return clone;
  64.  
  65.                 case 'Array':
  66.                     // Check for existence for IE8
  67.                     return o.map && o.map(function(v) { return _.util.clone(v); });
  68.             }
  69.  
  70.             return o;
  71.         }
  72.     },
  73.  
  74.     languages: {
  75.         extend: function (id, redef) {
  76.             var lang = _.util.clone(_.languages[id]);
  77.  
  78.             for (var key in redef) {
  79.                 lang[key] = redef[key];
  80.             }
  81.  
  82.             return lang;
  83.         },
  84.  
  85.         /**
  86.          * Insert a token before another token in a language literal
  87.          * As this needs to recreate the object (we cannot actually insert before keys in object literals),
  88.          * we cannot just provide an object, we need anobject and a key.
  89.          * @param inside The key (or language id) of the parent
  90.          * @param before The key to insert before. If not provided, the function appends instead.
  91.          * @param insert Object with the key/value pairs to insert
  92.          * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
  93.          */
  94.         insertBefore: function (inside, before, insert, root) {
  95.             root = root || _.languages;
  96.             var grammar = root[inside];
  97.  
  98.             if (arguments.length == 2) {
  99.                 insert = arguments[1];
  100.  
  101.                 for (var newToken in insert) {
  102.                     if (insert.hasOwnProperty(newToken)) {
  103.                         grammar[newToken] = insert[newToken];
  104.                     }
  105.                 }
  106.  
  107.                 return grammar;
  108.             }
  109.  
  110.             var ret = {};
  111.  
  112.             for (var token in grammar) {
  113.  
  114.                 if (grammar.hasOwnProperty(token)) {
  115.  
  116.                     if (token == before) {
  117.  
  118.                         for (var newToken in insert) {
  119.  
  120.                             if (insert.hasOwnProperty(newToken)) {
  121.                                 ret[newToken] = insert[newToken];
  122.                             }
  123.                         }
  124.                     }
  125.  
  126.                     ret[token] = grammar[token];
  127.                 }
  128.             }
  129.  
  130.             // Update references in other language definitions
  131.             _.languages.DFS(_.languages, function(key, value) {
  132.                 if (value === root[inside] && key != inside) {
  133.                     this[key] = ret;
  134.                 }
  135.             });
  136.  
  137.             return root[inside] = ret;
  138.         },
  139.  
  140.         // Traverse a language definition with Depth First Search
  141.         DFS: function(o, callback, type, visited) {
  142.             visited = visited || {};
  143.             for (var i in o) {
  144.                 if (o.hasOwnProperty(i)) {
  145.                     callback.call(o, i, o[i], type || i);
  146.  
  147.                     if (_.util.type(o[i]) === 'Object' && !visited[_.util.objId(o[i])]) {
  148.                         visited[_.util.objId(o[i])] = true;
  149.                         _.languages.DFS(o[i], callback, null, visited);
  150.                     }
  151.                     else if (_.util.type(o[i]) === 'Array' && !visited[_.util.objId(o[i])]) {
  152.                         visited[_.util.objId(o[i])] = true;
  153.                         _.languages.DFS(o[i], callback, i, visited);
  154.                     }
  155.                 }
  156.             }
  157.         }
  158.     },
  159.     plugins: {},
  160.  
  161.     highlightAll: function(async, callback) {
  162.         var env = {
  163.             callback: callback,
  164.             selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
  165.         };
  166.  
  167.         _.hooks.run("before-highlightall", env);
  168.  
  169.         var elements = env.elements || document.querySelectorAll(env.selector);
  170.  
  171.         for (var i=0, element; element = elements[i++];) {
  172.             _.highlightElement(element, async === true, env.callback);
  173.         }
  174.     },
  175.  
  176.     highlightElement: function(element, async, callback) {
  177.         // Find language
  178.         var language, grammar, parent = element;
  179.  
  180.         while (parent && !lang.test(parent.className)) {
  181.             parent = parent.parentNode;
  182.         }
  183.  
  184.         if (parent) {
  185.             language = (parent.className.match(lang) || [,''])[1];
  186.             grammar = _.languages[language];
  187.         }
  188.  
  189.         // Set language on the element, if not present
  190.         element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
  191.  
  192.         // Set language on the parent, for styling
  193.         parent = element.parentNode;
  194.  
  195.         if (/pre/i.test(parent.nodeName)) {
  196.             parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
  197.         }
  198.  
  199.         var code = element.textContent;
  200.  
  201.         var env = {
  202.             element: element,
  203.             language: language,
  204.             grammar: grammar,
  205.             code: code
  206.         };
  207.  
  208.         _.hooks.run('before-sanity-check', env);
  209.  
  210.         if (!env.code || !env.grammar) {
  211.             _.hooks.run('complete', env);
  212.             return;
  213.         }
  214.  
  215.         _.hooks.run('before-highlight', env);
  216.  
  217.         if (async && _self.Worker) {
  218.             var worker = new Worker(_.filename);
  219.  
  220.             worker.onmessage = function(evt) {
  221.                 env.highlightedCode = evt.data;
  222.  
  223.                 _.hooks.run('before-insert', env);
  224.  
  225.                 env.element.innerHTML = env.highlightedCode;
  226.  
  227.                 callback && callback.call(env.element);
  228.                 _.hooks.run('after-highlight', env);
  229.                 _.hooks.run('complete', env);
  230.             };
  231.  
  232.             worker.postMessage(JSON.stringify({
  233.                 language: env.language,
  234.                 code: env.code,
  235.                 immediateClose: true
  236.             }));
  237.         }
  238.         else {
  239.             env.highlightedCode = _.highlight(env.code, env.grammar, env.language);
  240.  
  241.             _.hooks.run('before-insert', env);
  242.  
  243.             env.element.innerHTML = env.highlightedCode;
  244.  
  245.             callback && callback.call(element);
  246.  
  247.             _.hooks.run('after-highlight', env);
  248.             _.hooks.run('complete', env);
  249.         }
  250.     },
  251.  
  252.     highlight: function (text, grammar, language) {
  253.         var tokens = _.tokenize(text, grammar);
  254.         return Token.stringify(_.util.encode(tokens), language);
  255.     },
  256.  
  257.     tokenize: function(text, grammar, language) {
  258.         var Token = _.Token;
  259.  
  260.         var strarr = [text];
  261.  
  262.         var rest = grammar.rest;
  263.  
  264.         if (rest) {
  265.             for (var token in rest) {
  266.                 grammar[token] = rest[token];
  267.             }
  268.  
  269.             delete grammar.rest;
  270.         }
  271.  
  272.         tokenloop: for (var token in grammar) {
  273.             if(!grammar.hasOwnProperty(token) || !grammar[token]) {
  274.                 continue;
  275.             }
  276.  
  277.             var patterns = grammar[token];
  278.             patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns];
  279.  
  280.             for (var j = 0; j < patterns.length; ++j) {
  281.                 var pattern = patterns[j],
  282.                     inside = pattern.inside,
  283.                     lookbehind = !!pattern.lookbehind,
  284.                     greedy = !!pattern.greedy,
  285.                     lookbehindLength = 0,
  286.                     alias = pattern.alias;
  287.  
  288.                 pattern = pattern.pattern || pattern;
  289.  
  290.                 for (var i=0; i<strarr.length; i++) { // Don’t cache length as it changes during the loop
  291.  
  292.                     var str = strarr[i];
  293.  
  294.                     if (strarr.length > text.length) {
  295.                         // Something went terribly wrong, ABORT, ABORT!
  296.                         break tokenloop;
  297.                     }
  298.  
  299.                     if (str instanceof Token) {
  300.                         continue;
  301.                     }
  302.  
  303.                     pattern.lastIndex = 0;
  304.  
  305.                     var match = pattern.exec(str),
  306.                         delNum = 1;
  307.  
  308.                     // Greedy patterns can override/remove up to two previously matched tokens
  309.                     if (!match && greedy && i != strarr.length - 1) {
  310.                         // Reconstruct the original text using the next two tokens
  311.                         var nextToken = strarr[i + 1].matchedStr || strarr[i + 1],
  312.                             combStr = str + nextToken;
  313.  
  314.                         if (i < strarr.length - 2) {
  315.                             combStr += strarr[i + 2].matchedStr || strarr[i + 2];
  316.                         }
  317.  
  318.                         // Try the pattern again on the reconstructed text
  319.                         pattern.lastIndex = 0;
  320.                         match = pattern.exec(combStr);
  321.                         if (!match) {
  322.                             continue;
  323.                         }
  324.  
  325.                         var from = match.index + (lookbehind ? match[1].length : 0);
  326.                         // To be a valid candidate, the new match has to start inside of str
  327.                         if (from >= str.length) {
  328.                             continue;
  329.                         }
  330.                         var to = match.index + match[0].length,
  331.                             len = str.length + nextToken.length;
  332.  
  333.                         // Number of tokens to delete and replace with the new match
  334.                         delNum = 3;
  335.  
  336.                         if (to <= len) {
  337.                             if (strarr[i + 1].greedy) {
  338.                                 continue;
  339.                             }
  340.                             delNum = 2;
  341.                             combStr = combStr.slice(0, len);
  342.                         }
  343.                         str = combStr;
  344.                     }
  345.  
  346.                     if (!match) {
  347.                         continue;
  348.                     }
  349.  
  350.                     if(lookbehind) {
  351.                         lookbehindLength = match[1].length;
  352.                     }
  353.  
  354.                     var from = match.index + lookbehindLength,
  355.                         match = match[0].slice(lookbehindLength),
  356.                         to = from + match.length,
  357.                         before = str.slice(0, from),
  358.                         after = str.slice(to);
  359.  
  360.                     var args = [i, delNum];
  361.  
  362.                     if (before) {
  363.                         args.push(before);
  364.                     }
  365.  
  366.                     var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy);
  367.  
  368.                     args.push(wrapped);
  369.  
  370.                     if (after) {
  371.                         args.push(after);
  372.                     }
  373.  
  374.                     Array.prototype.splice.apply(strarr, args);
  375.                 }
  376.             }
  377.         }
  378.  
  379.         return strarr;
  380.     },
  381.  
  382.     hooks: {
  383.         all: {},
  384.  
  385.         add: function (name, callback) {
  386.             var hooks = _.hooks.all;
  387.  
  388.             hooks[name] = hooks[name] || [];
  389.  
  390.             hooks[name].push(callback);
  391.         },
  392.  
  393.         run: function (name, env) {
  394.             var callbacks = _.hooks.all[name];
  395.  
  396.             if (!callbacks || !callbacks.length) {
  397.                 return;
  398.             }
  399.  
  400.             for (var i=0, callback; callback = callbacks[i++];) {
  401.                 callback(env);
  402.             }
  403.         }
  404.     }
  405. };
  406.  
  407. var Token = _.Token = function(type, content, alias, matchedStr, greedy) {
  408.     this.type = type;
  409.     this.content = content;
  410.     this.alias = alias;
  411.     // Copy of the full string this token was created from
  412.     this.matchedStr = matchedStr || null;
  413.     this.greedy = !!greedy;
  414. };
  415.  
  416. Token.stringify = function(o, language, parent) {
  417.     if (typeof o == 'string') {
  418.         return o;
  419.     }
  420.  
  421.     if (_.util.type(o) === 'Array') {
  422.         return o.map(function(element) {
  423.             return Token.stringify(element, language, o);
  424.         }).join('');
  425.     }
  426.  
  427.     var env = {
  428.         type: o.type,
  429.         content: Token.stringify(o.content, language, parent),
  430.         tag: 'span',
  431.         classes: ['token', o.type],
  432.         attributes: {},
  433.         language: language,
  434.         parent: parent
  435.     };
  436.  
  437.     if (env.type == 'comment') {
  438.         env.attributes['spellcheck'] = 'true';
  439.     }
  440.  
  441.     if (o.alias) {
  442.         var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];
  443.         Array.prototype.push.apply(env.classes, aliases);
  444.     }
  445.  
  446.     _.hooks.run('wrap', env);
  447.  
  448.     var attributes = '';
  449.  
  450.     for (var name in env.attributes) {
  451.         attributes += (attributes ? ' ' : '') + name + '="' + (env.attributes[name] || '') + '"';
  452.     }
  453.  
  454.     return '<' + env.tag + ' class="' + env.classes.join(' ') + '" ' + attributes + '>' + env.content + '</' + env.tag + '>';
  455.  
  456. };
  457.  
  458. if (!_self.document) {
  459.     if (!_self.addEventListener) {
  460.         // in Node.js
  461.         return _self.Prism;
  462.     }
  463.     // In worker
  464.     _self.addEventListener('message', function(evt) {
  465.         var message = JSON.parse(evt.data),
  466.             lang = message.language,
  467.             code = message.code,
  468.             immediateClose = message.immediateClose;
  469.  
  470.         _self.postMessage(_.highlight(code, _.languages[lang], lang));
  471.         if (immediateClose) {
  472.             _self.close();
  473.         }
  474.     }, false);
  475.  
  476.     return _self.Prism;
  477. }
  478.  
  479. //Get current script and highlight
  480. var script = document.currentScript || [].slice.call(document.getElementsByTagName("script")).pop();
  481.  
  482. if (script) {
  483.     _.filename = script.src;
  484.  
  485.     if (document.addEventListener && !script.hasAttribute('data-manual')) {
  486.         document.addEventListener('DOMContentLoaded', _.highlightAll);
  487.     }
  488. }
  489.  
  490. return _self.Prism;
  491.  
  492. })();
  493.  
  494. if (typeof module !== 'undefined' && module.exports) {
  495.     module.exports = Prism;
  496. }
  497.  
  498. // hack for components to work correctly in node.js
  499. if (typeof global !== 'undefined') {
  500.     global.Prism = Prism;
  501. }
  502.  
  503.  
  504. /* **********************************************
  505.      Begin prism-markup.js
  506. ********************************************** */
  507.  
  508. Prism.languages.markup = {
  509.     'comment': /<!--[\w\W]*?-->/,
  510.     'prolog': /<\?[\w\W]+?\?>/,
  511.     'doctype': /<!DOCTYPE[\w\W]+?>/,
  512.     'cdata': /<!\[CDATA\[[\w\W]*?]]>/i,
  513.     'tag': {
  514.         pattern: /<\/?(?!\d)[^\s>\/=.$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,
  515.         inside: {
  516.             'tag': {
  517.                 pattern: /^<\/?[^\s>\/]+/i,
  518.                 inside: {
  519.                     'punctuation': /^<\/?/,
  520.                     'namespace': /^[^\s>\/:]+:/
  521.                 }
  522.             },
  523.             'attr-value': {
  524.                 pattern: /=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,
  525.                 inside: {
  526.                     'punctuation': /[=>"']/
  527.                 }
  528.             },
  529.             'punctuation': /\/?>/,
  530.             'attr-name': {
  531.                 pattern: /[^\s>\/]+/,
  532.                 inside: {
  533.                     'namespace': /^[^\s>\/:]+:/
  534.                 }
  535.             }
  536.  
  537.         }
  538.     },
  539.     'entity': /&#?[\da-z]{1,8};/i
  540. };
  541.  
  542. // Plugin to make entity title show the real entity, idea by Roman Komarov
  543. Prism.hooks.add('wrap', function(env) {
  544.  
  545.     if (env.type === 'entity') {
  546.         env.attributes['title'] = env.content.replace(/&amp;/, '&');
  547.     }
  548. });
  549.  
  550. Prism.languages.xml = Prism.languages.markup;
  551. Prism.languages.html = Prism.languages.markup;
  552. Prism.languages.mathml = Prism.languages.markup;
  553. Prism.languages.svg = Prism.languages.markup;
  554.  
  555.  
  556. /* **********************************************
  557.      Begin prism-css.js
  558. ********************************************** */
  559.  
  560. Prism.languages.css = {
  561.     'comment': /\/\*[\w\W]*?\*\//,
  562.     'atrule': {
  563.         pattern: /@[\w-]+?.*?(;|(?=\s*\{))/i,
  564.         inside: {
  565.             'rule': /@[\w-]+/
  566.             // See rest below
  567.         }
  568.     },
  569.     'url': /url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,
  570.     'selector': /[^\{\}\s][^\{\};]*?(?=\s*\{)/,
  571.     'string': /("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,
  572.     'property': /(\b|\B)[\w-]+(?=\s*:)/i,
  573.     'important': /\B!important\b/i,
  574.     'function': /[-a-z0-9]+(?=\()/i,
  575.     'punctuation': /[(){};:]/
  576. };
  577.  
  578. Prism.languages.css['atrule'].inside.rest = Prism.util.clone(Prism.languages.css);
  579.  
  580. if (Prism.languages.markup) {
  581.     Prism.languages.insertBefore('markup', 'tag', {
  582.         'style': {
  583.             pattern: /(<style[\w\W]*?>)[\w\W]*?(?=<\/style>)/i,
  584.             lookbehind: true,
  585.             inside: Prism.languages.css,
  586.             alias: 'language-css'
  587.         }
  588.     });
  589.    
  590.     Prism.languages.insertBefore('inside', 'attr-value', {
  591.         'style-attr': {
  592.             pattern: /\s*style=("|').*?\1/i,
  593.             inside: {
  594.                 'attr-name': {
  595.                     pattern: /^\s*style/i,
  596.                     inside: Prism.languages.markup.tag.inside
  597.                 },
  598.                 'punctuation': /^\s*=\s*['"]|['"]\s*$/,
  599.                 'attr-value': {
  600.                     pattern: /.+/i,
  601.                     inside: Prism.languages.css
  602.                 }
  603.             },
  604.             alias: 'language-css'
  605.         }
  606.     }, Prism.languages.markup.tag);
  607. }
  608.  
  609. /* **********************************************
  610.      Begin prism-clike.js
  611. ********************************************** */
  612.  
  613. Prism.languages.clike = {
  614.     'comment': [
  615.         {
  616.             pattern: /(^|[^\\])\/\*[\w\W]*?\*\//,
  617.             lookbehind: true
  618.         },
  619.         {
  620.             pattern: /(^|[^\\:])\/\/.*/,
  621.             lookbehind: true
  622.         }
  623.     ],
  624.     'string': {
  625.         pattern: /(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
  626.         greedy: true
  627.     },
  628.     'class-name': {
  629.         pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,
  630.         lookbehind: true,
  631.         inside: {
  632.             punctuation: /(\.|\\)/
  633.         }
  634.     },
  635.     'keyword': /\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
  636.     'boolean': /\b(true|false)\b/,
  637.     'function': /[a-z0-9_]+(?=\()/i,
  638.     'number': /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,
  639.     'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
  640.     'punctuation': /[{}[\];(),.:]/
  641. };
  642.  
  643.  
  644. /* **********************************************
  645.      Begin prism-javascript.js
  646. ********************************************** */
  647.  
  648. Prism.languages.javascript = Prism.languages.extend('clike', {
  649.     'keyword': /\b(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|var|void|while|with|yield)\b/,
  650.     'number': /\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,
  651.     // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
  652.     'function': /[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i
  653. });
  654.  
  655. Prism.languages.insertBefore('javascript', 'keyword', {
  656.     'regex': {
  657.         pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,
  658.         lookbehind: true,
  659.         greedy: true
  660.     }
  661. });
  662.  
  663. Prism.languages.insertBefore('javascript', 'class-name', {
  664.     'template-string': {
  665.         pattern: /`(?:\\\\|\\?[^\\])*?`/,
  666.         greedy: true,
  667.         inside: {
  668.             'interpolation': {
  669.                 pattern: /\$\{[^}]+\}/,
  670.                 inside: {
  671.                     'interpolation-punctuation': {
  672.                         pattern: /^\$\{|\}$/,
  673.                         alias: 'punctuation'
  674.                     },
  675.                     rest: Prism.languages.javascript
  676.                 }
  677.             },
  678.             'string': /[\s\S]+/
  679.         }
  680.     }
  681. });
  682.  
  683. if (Prism.languages.markup) {
  684.     Prism.languages.insertBefore('markup', 'tag', {
  685.         'script': {
  686.             pattern: /(<script[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,
  687.             lookbehind: true,
  688.             inside: Prism.languages.javascript,
  689.             alias: 'language-javascript'
  690.         }
  691.     });
  692. }
  693.  
  694. Prism.languages.js = Prism.languages.javascript;
  695.  
  696. /* **********************************************
  697.      Begin prism-file-highlight.js
  698. ********************************************** */
  699.  
  700. (function () {
  701.     if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) {
  702.         return;
  703.     }
  704.  
  705.     self.Prism.fileHighlight = function() {
  706.  
  707.         var Extensions = {
  708.             'js': 'javascript',
  709.             'py': 'python',
  710.             'rb': 'ruby',
  711.             'ps1': 'powershell',
  712.             'psm1': 'powershell',
  713.             'sh': 'bash',
  714.             'bat': 'batch',
  715.             'h': 'c',
  716.             'tex': 'latex'
  717.         };
  718.  
  719.         if(Array.prototype.forEach) { // Check to prevent error in IE8
  720.             Array.prototype.slice.call(document.querySelectorAll('pre[data-src]')).forEach(function (pre) {
  721.                 var src = pre.getAttribute('data-src');
  722.  
  723.                 var language, parent = pre;
  724.                 var lang = /\blang(?:uage)?-(?!\*)(\w+)\b/i;
  725.                 while (parent && !lang.test(parent.className)) {
  726.                     parent = parent.parentNode;
  727.                 }
  728.  
  729.                 if (parent) {
  730.                     language = (pre.className.match(lang) || [, ''])[1];
  731.                 }
  732.  
  733.                 if (!language) {
  734.                     var extension = (src.match(/\.(\w+)$/) || [, ''])[1];
  735.                     language = Extensions[extension] || extension;
  736.                 }
  737.  
  738.                 var code = document.createElement('code');
  739.                 code.className = 'language-' + language;
  740.  
  741.                 pre.textContent = '';
  742.  
  743.                 code.textContent = 'Loading…';
  744.  
  745.                 pre.appendChild(code);
  746.  
  747.                 var xhr = new XMLHttpRequest();
  748.  
  749.                 xhr.open('GET', src, true);
  750.  
  751.                 xhr.onreadystatechange = function () {
  752.                     if (xhr.readyState == 4) {
  753.  
  754.                         if (xhr.status < 400 && xhr.responseText) {
  755.                             code.textContent = xhr.responseText;
  756.  
  757.                             Prism.highlightElement(code);
  758.                         }
  759.                         else if (xhr.status >= 400) {
  760.                             code.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText;
  761.                         }
  762.                         else {
  763.                             code.textContent = '✖ Error: File does not exist or is empty';
  764.                         }
  765.                     }
  766.                 };
  767.  
  768.                 xhr.send(null);
  769.             });
  770.         }
  771.  
  772.     };
  773.  
  774.     document.addEventListener('DOMContentLoaded', self.Prism.fileHighlight);
  775.  
  776. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement