prism-autoloader.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. (function () {
  2. if (typeof Prism === 'undefined' || typeof document === 'undefined') {
  3. return;
  4. }
  5. /* eslint-disable */
  6. /**
  7. * The dependencies map is built automatically with gulp.
  8. *
  9. * @type {Object<string, string | string[]>}
  10. */
  11. var lang_dependencies = /*dependencies_placeholder[*/{
  12. "javascript": "clike",
  13. "actionscript": "javascript",
  14. "apex": [
  15. "clike",
  16. "sql"
  17. ],
  18. "arduino": "cpp",
  19. "aspnet": [
  20. "markup",
  21. "csharp"
  22. ],
  23. "birb": "clike",
  24. "bison": "c",
  25. "c": "clike",
  26. "csharp": "clike",
  27. "cpp": "c",
  28. "cfscript": "clike",
  29. "chaiscript": [
  30. "clike",
  31. "cpp"
  32. ],
  33. "coffeescript": "javascript",
  34. "crystal": "ruby",
  35. "css-extras": "css",
  36. "d": "clike",
  37. "dart": "clike",
  38. "django": "markup-templating",
  39. "ejs": [
  40. "javascript",
  41. "markup-templating"
  42. ],
  43. "etlua": [
  44. "lua",
  45. "markup-templating"
  46. ],
  47. "erb": [
  48. "ruby",
  49. "markup-templating"
  50. ],
  51. "fsharp": "clike",
  52. "firestore-security-rules": "clike",
  53. "flow": "javascript",
  54. "ftl": "markup-templating",
  55. "gml": "clike",
  56. "glsl": "c",
  57. "go": "clike",
  58. "groovy": "clike",
  59. "haml": "ruby",
  60. "handlebars": "markup-templating",
  61. "haxe": "clike",
  62. "hlsl": "c",
  63. "idris": "haskell",
  64. "java": "clike",
  65. "javadoc": [
  66. "markup",
  67. "java",
  68. "javadoclike"
  69. ],
  70. "jolie": "clike",
  71. "jsdoc": [
  72. "javascript",
  73. "javadoclike",
  74. "typescript"
  75. ],
  76. "js-extras": "javascript",
  77. "json5": "json",
  78. "jsonp": "json",
  79. "js-templates": "javascript",
  80. "kotlin": "clike",
  81. "latte": [
  82. "clike",
  83. "markup-templating",
  84. "php"
  85. ],
  86. "less": "css",
  87. "lilypond": "scheme",
  88. "liquid": "markup-templating",
  89. "markdown": "markup",
  90. "markup-templating": "markup",
  91. "mongodb": "javascript",
  92. "n4js": "javascript",
  93. "objectivec": "c",
  94. "opencl": "c",
  95. "parser": "markup",
  96. "php": "markup-templating",
  97. "phpdoc": [
  98. "php",
  99. "javadoclike"
  100. ],
  101. "php-extras": "php",
  102. "plsql": "sql",
  103. "processing": "clike",
  104. "protobuf": "clike",
  105. "pug": [
  106. "markup",
  107. "javascript"
  108. ],
  109. "purebasic": "clike",
  110. "purescript": "haskell",
  111. "qsharp": "clike",
  112. "qml": "javascript",
  113. "qore": "clike",
  114. "racket": "scheme",
  115. "cshtml": [
  116. "markup",
  117. "csharp"
  118. ],
  119. "jsx": [
  120. "markup",
  121. "javascript"
  122. ],
  123. "tsx": [
  124. "jsx",
  125. "typescript"
  126. ],
  127. "reason": "clike",
  128. "ruby": "clike",
  129. "sass": "css",
  130. "scss": "css",
  131. "scala": "java",
  132. "shell-session": "bash",
  133. "smarty": "markup-templating",
  134. "solidity": "clike",
  135. "soy": "markup-templating",
  136. "sparql": "turtle",
  137. "sqf": "clike",
  138. "squirrel": "clike",
  139. "stata": [
  140. "mata",
  141. "java",
  142. "python"
  143. ],
  144. "t4-cs": [
  145. "t4-templating",
  146. "csharp"
  147. ],
  148. "t4-vb": [
  149. "t4-templating",
  150. "vbnet"
  151. ],
  152. "tap": "yaml",
  153. "tt2": [
  154. "clike",
  155. "markup-templating"
  156. ],
  157. "textile": "markup",
  158. "twig": "markup-templating",
  159. "typescript": "javascript",
  160. "v": "clike",
  161. "vala": "clike",
  162. "vbnet": "basic",
  163. "velocity": "markup",
  164. "wiki": "markup",
  165. "xeora": "markup",
  166. "xml-doc": "markup",
  167. "xquery": "markup"
  168. }/*]*/;
  169. var lang_aliases = /*aliases_placeholder[*/{
  170. "html": "markup",
  171. "xml": "markup",
  172. "svg": "markup",
  173. "mathml": "markup",
  174. "ssml": "markup",
  175. "atom": "markup",
  176. "rss": "markup",
  177. "js": "javascript",
  178. "g4": "antlr4",
  179. "ino": "arduino",
  180. "arm-asm": "armasm",
  181. "art": "arturo",
  182. "adoc": "asciidoc",
  183. "avs": "avisynth",
  184. "avdl": "avro-idl",
  185. "gawk": "awk",
  186. "shell": "bash",
  187. "shortcode": "bbcode",
  188. "rbnf": "bnf",
  189. "oscript": "bsl",
  190. "cs": "csharp",
  191. "dotnet": "csharp",
  192. "cfc": "cfscript",
  193. "coffee": "coffeescript",
  194. "conc": "concurnas",
  195. "jinja2": "django",
  196. "dns-zone": "dns-zone-file",
  197. "dockerfile": "docker",
  198. "gv": "dot",
  199. "eta": "ejs",
  200. "xlsx": "excel-formula",
  201. "xls": "excel-formula",
  202. "gamemakerlanguage": "gml",
  203. "po": "gettext",
  204. "gni": "gn",
  205. "ld": "linker-script",
  206. "go-mod": "go-module",
  207. "hbs": "handlebars",
  208. "mustache": "handlebars",
  209. "hs": "haskell",
  210. "idr": "idris",
  211. "gitignore": "ignore",
  212. "hgignore": "ignore",
  213. "npmignore": "ignore",
  214. "webmanifest": "json",
  215. "kt": "kotlin",
  216. "kts": "kotlin",
  217. "kum": "kumir",
  218. "tex": "latex",
  219. "context": "latex",
  220. "ly": "lilypond",
  221. "emacs": "lisp",
  222. "elisp": "lisp",
  223. "emacs-lisp": "lisp",
  224. "md": "markdown",
  225. "moon": "moonscript",
  226. "n4jsd": "n4js",
  227. "nani": "naniscript",
  228. "objc": "objectivec",
  229. "qasm": "openqasm",
  230. "objectpascal": "pascal",
  231. "px": "pcaxis",
  232. "pcode": "peoplecode",
  233. "plantuml": "plant-uml",
  234. "pq": "powerquery",
  235. "mscript": "powerquery",
  236. "pbfasm": "purebasic",
  237. "purs": "purescript",
  238. "py": "python",
  239. "qs": "qsharp",
  240. "rkt": "racket",
  241. "razor": "cshtml",
  242. "rpy": "renpy",
  243. "res": "rescript",
  244. "robot": "robotframework",
  245. "rb": "ruby",
  246. "sh-session": "shell-session",
  247. "shellsession": "shell-session",
  248. "smlnj": "sml",
  249. "sol": "solidity",
  250. "sln": "solution-file",
  251. "rq": "sparql",
  252. "sclang": "supercollider",
  253. "t4": "t4-cs",
  254. "trickle": "tremor",
  255. "troy": "tremor",
  256. "trig": "turtle",
  257. "ts": "typescript",
  258. "tsconfig": "typoscript",
  259. "uscript": "unrealscript",
  260. "uc": "unrealscript",
  261. "url": "uri",
  262. "vb": "visual-basic",
  263. "vba": "visual-basic",
  264. "webidl": "web-idl",
  265. "mathematica": "wolfram",
  266. "nb": "wolfram",
  267. "wl": "wolfram",
  268. "xeoracube": "xeora",
  269. "yml": "yaml"
  270. }/*]*/;
  271. /* eslint-enable */
  272. /**
  273. * @typedef LangDataItem
  274. * @property {{ success?: () => void, error?: () => void }[]} callbacks
  275. * @property {boolean} [error]
  276. * @property {boolean} [loading]
  277. */
  278. /** @type {Object<string, LangDataItem>} */
  279. var lang_data = {};
  280. var ignored_language = 'none';
  281. var languages_path = 'components/';
  282. var script = Prism.util.currentScript();
  283. if (script) {
  284. var autoloaderFile = /\bplugins\/autoloader\/prism-autoloader\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i;
  285. var prismFile = /(^|\/)[\w-]+\.(?:min\.)?js(?:\?[^\r\n/]*)?$/i;
  286. var autoloaderPath = script.getAttribute('data-autoloader-path');
  287. if (autoloaderPath != null) {
  288. // data-autoloader-path is set, so just use it
  289. languages_path = autoloaderPath.trim().replace(/\/?$/, '/');
  290. } else {
  291. var src = script.src;
  292. if (autoloaderFile.test(src)) {
  293. // the script is the original autoloader script in the usual Prism project structure
  294. languages_path = src.replace(autoloaderFile, 'components/');
  295. } else if (prismFile.test(src)) {
  296. // the script is part of a bundle like a custom prism.js from the download page
  297. languages_path = src.replace(prismFile, '$1components/');
  298. }
  299. }
  300. }
  301. var config = Prism.plugins.autoloader = {
  302. languages_path: languages_path,
  303. use_minified: true,
  304. loadLanguages: loadLanguages
  305. };
  306. /**
  307. * Lazily loads an external script.
  308. *
  309. * @param {string} src
  310. * @param {() => void} [success]
  311. * @param {() => void} [error]
  312. */
  313. function addScript(src, success, error) {
  314. var s = document.createElement('script');
  315. s.src = src;
  316. s.async = true;
  317. s.onload = function () {
  318. document.body.removeChild(s);
  319. success && success();
  320. };
  321. s.onerror = function () {
  322. document.body.removeChild(s);
  323. error && error();
  324. };
  325. document.body.appendChild(s);
  326. }
  327. /**
  328. * Returns all additional dependencies of the given element defined by the `data-dependencies` attribute.
  329. *
  330. * @param {Element} element
  331. * @returns {string[]}
  332. */
  333. function getDependencies(element) {
  334. var deps = (element.getAttribute('data-dependencies') || '').trim();
  335. if (!deps) {
  336. var parent = element.parentElement;
  337. if (parent && parent.tagName.toLowerCase() === 'pre') {
  338. deps = (parent.getAttribute('data-dependencies') || '').trim();
  339. }
  340. }
  341. return deps ? deps.split(/\s*,\s*/g) : [];
  342. }
  343. /**
  344. * Returns whether the given language is currently loaded.
  345. *
  346. * @param {string} lang
  347. * @returns {boolean}
  348. */
  349. function isLoaded(lang) {
  350. if (lang.indexOf('!') >= 0) {
  351. // forced reload
  352. return false;
  353. }
  354. lang = lang_aliases[lang] || lang; // resolve alias
  355. if (lang in Prism.languages) {
  356. // the given language is already loaded
  357. return true;
  358. }
  359. // this will catch extensions like CSS extras that don't add a grammar to Prism.languages
  360. var data = lang_data[lang];
  361. return data && !data.error && data.loading === false;
  362. }
  363. /**
  364. * Returns the path to a grammar, using the language_path and use_minified config keys.
  365. *
  366. * @param {string} lang
  367. * @returns {string}
  368. */
  369. function getLanguagePath(lang) {
  370. return config.languages_path + 'prism-' + lang + (config.use_minified ? '.min' : '') + '.js';
  371. }
  372. /**
  373. * Loads all given grammars concurrently.
  374. *
  375. * @param {string[]|string} languages
  376. * @param {(languages: string[]) => void} [success]
  377. * @param {(language: string) => void} [error] This callback will be invoked on the first language to fail.
  378. */
  379. function loadLanguages(languages, success, error) {
  380. if (typeof languages === 'string') {
  381. languages = [languages];
  382. }
  383. var total = languages.length;
  384. var completed = 0;
  385. var failed = false;
  386. if (total === 0) {
  387. if (success) {
  388. setTimeout(success, 0);
  389. }
  390. return;
  391. }
  392. function successCallback() {
  393. if (failed) {
  394. return;
  395. }
  396. completed++;
  397. if (completed === total) {
  398. success && success(languages);
  399. }
  400. }
  401. languages.forEach(function (lang) {
  402. loadLanguage(lang, successCallback, function () {
  403. if (failed) {
  404. return;
  405. }
  406. failed = true;
  407. error && error(lang);
  408. });
  409. });
  410. }
  411. /**
  412. * Loads a grammar with its dependencies.
  413. *
  414. * @param {string} lang
  415. * @param {() => void} [success]
  416. * @param {() => void} [error]
  417. */
  418. function loadLanguage(lang, success, error) {
  419. var force = lang.indexOf('!') >= 0;
  420. lang = lang.replace('!', '');
  421. lang = lang_aliases[lang] || lang;
  422. function load() {
  423. var data = lang_data[lang];
  424. if (!data) {
  425. data = lang_data[lang] = {
  426. callbacks: []
  427. };
  428. }
  429. data.callbacks.push({
  430. success: success,
  431. error: error
  432. });
  433. if (!force && isLoaded(lang)) {
  434. // the language is already loaded and we aren't forced to reload
  435. languageCallback(lang, 'success');
  436. } else if (!force && data.error) {
  437. // the language failed to load before and we don't reload
  438. languageCallback(lang, 'error');
  439. } else if (force || !data.loading) {
  440. // the language isn't currently loading and/or we are forced to reload
  441. data.loading = true;
  442. data.error = false;
  443. addScript(getLanguagePath(lang), function () {
  444. data.loading = false;
  445. languageCallback(lang, 'success');
  446. }, function () {
  447. data.loading = false;
  448. data.error = true;
  449. languageCallback(lang, 'error');
  450. });
  451. }
  452. }
  453. var dependencies = lang_dependencies[lang];
  454. if (dependencies && dependencies.length) {
  455. loadLanguages(dependencies, load, error);
  456. } else {
  457. load();
  458. }
  459. }
  460. /**
  461. * Runs all callbacks of the given type for the given language.
  462. *
  463. * @param {string} lang
  464. * @param {"success" | "error"} type
  465. */
  466. function languageCallback(lang, type) {
  467. if (lang_data[lang]) {
  468. var callbacks = lang_data[lang].callbacks;
  469. for (var i = 0, l = callbacks.length; i < l; i++) {
  470. var callback = callbacks[i][type];
  471. if (callback) {
  472. setTimeout(callback, 0);
  473. }
  474. }
  475. callbacks.length = 0;
  476. }
  477. }
  478. Prism.hooks.add('complete', function (env) {
  479. var element = env.element;
  480. var language = env.language;
  481. if (!element || !language || language === ignored_language) {
  482. return;
  483. }
  484. var deps = getDependencies(element);
  485. if (/^diff-./i.test(language)) {
  486. // the "diff-xxxx" format is used by the Diff Highlight plugin
  487. deps.push('diff');
  488. deps.push(language.substr('diff-'.length));
  489. } else {
  490. deps.push(language);
  491. }
  492. if (!deps.every(isLoaded)) {
  493. // the language or some dependencies aren't loaded
  494. loadLanguages(deps, function () {
  495. Prism.highlightElement(element);
  496. });
  497. }
  498. });
  499. }());