diff options
| author | Mitja Felicijan <mitja.felicijan@gmail.com> | 2019-02-17 22:44:22 +0100 |
|---|---|---|
| committer | Mitja Felicijan <mitja.felicijan@gmail.com> | 2019-02-17 22:44:22 +0100 |
| commit | bb3fdcd40fe3c297f01afcc446ab33bf0ba3d986 (patch) | |
| tree | 765b85eea1862f0bec1b005e3de062a15bb6a16b /source/assets/prism.js | |
| parent | bcc96b81e29a920d9d75f3e5d59c9b07608346de (diff) | |
| download | mitjafelicijan.com-bb3fdcd40fe3c297f01afcc446ab33bf0ba3d986.tar.gz | |
update
Diffstat (limited to 'source/assets/prism.js')
| -rw-r--r-- | source/assets/prism.js | 1071 |
1 files changed, 1071 insertions, 0 deletions
diff --git a/source/assets/prism.js b/source/assets/prism.js new file mode 100644 index 0000000..304be1e --- /dev/null +++ b/source/assets/prism.js | |||
| @@ -0,0 +1,1071 @@ | |||
| 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 | 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, '&').replace(/</g, '<').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, '"') + '"'; | ||
| 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 | |||
| 540 | if (typeof module !== 'undefined' && module.exports) { | ||
| 541 | module.exports = Prism; | ||
| 542 | } | ||
| 543 | |||
| 544 | // hack for components to work correctly in node.js | ||
| 545 | if (typeof global !== 'undefined') { | ||
| 546 | global.Prism = Prism; | ||
| 547 | } | ||
| 548 | |||
| 549 | |||
| 550 | /* ********************************************** | ||
| 551 | Begin prism-markup.js | ||
| 552 | ********************************************** */ | ||
| 553 | |||
| 554 | Prism.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 | |||
| 595 | Prism.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 | ||
| 599 | Prism.hooks.add('wrap', function (env) { | ||
| 600 | |||
| 601 | if (env.type === 'entity') { | ||
| 602 | env.attributes['title'] = env.content.replace(/&/, '&'); | ||
| 603 | } | ||
| 604 | }); | ||
| 605 | |||
| 606 | Prism.languages.xml = Prism.languages.extend('markup', {}); | ||
| 607 | Prism.languages.html = Prism.languages.markup; | ||
| 608 | Prism.languages.mathml = Prism.languages.markup; | ||
| 609 | Prism.languages.svg = Prism.languages.markup; | ||
| 610 | |||
| 611 | |||
| 612 | /* ********************************************** | ||
| 613 | Begin prism-css.js | ||
| 614 | ********************************************** */ | ||
| 615 | |||
| 616 | Prism.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 | |||
| 637 | Prism.languages.css['atrule'].inside.rest = Prism.languages.css; | ||
| 638 | |||
| 639 | if (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 | |||
| 674 | Prism.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 | |||
| 710 | Prism.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 | |||
| 731 | Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/ | ||
| 732 | |||
| 733 | Prism.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 | |||
| 768 | Prism.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 | |||
| 788 | if (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 | |||
| 800 | Prism.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 | }()); | ||
