OLD | NEW |
(Empty) | |
| 1 (function () { |
| 2 if (typeof self === 'undefined' || !self.Prism || !self.document || !doc
ument.createElement) { |
| 3 return; |
| 4 } |
| 5 |
| 6 // The dependencies map is built automatically with gulp |
| 7 var lang_dependencies = /*languages_placeholder[*/{"javascript":"clike",
"actionscript":"javascript","aspnet":"markup","bison":"c","c":"clike","csharp":"
clike","cpp":"c","coffeescript":"javascript","crystal":"ruby","css-extras":"css"
,"d":"clike","dart":"clike","fsharp":"clike","glsl":"clike","go":"clike","groovy
":"clike","haml":"ruby","handlebars":"markup","jade":"javascript","java":"clike"
,"less":"css","markdown":"markup","nginx":"clike","objectivec":"c","php":"clike"
,"php-extras":"php","processing":"clike","qore":"clike","jsx":["markup","javascr
ipt"],"ruby":"clike","sass":"css","scss":"css","scala":"java","smarty":"markup",
"swift":"clike","textile":"markup","twig":"markup","typescript":"javascript","wi
ki":"markup"}/*]*/; |
| 8 |
| 9 var lang_data = {}; |
| 10 |
| 11 var config = Prism.plugins.autoloader = { |
| 12 languages_path: 'components/', |
| 13 use_minified: true |
| 14 }; |
| 15 |
| 16 /** |
| 17 * Lazy loads an external script |
| 18 * @param {string} src |
| 19 * @param {function=} success |
| 20 * @param {function=} error |
| 21 */ |
| 22 var script = function (src, success, error) { |
| 23 var s = document.createElement('script'); |
| 24 s.src = src; |
| 25 s.async = true; |
| 26 s.onload = function() { |
| 27 document.body.removeChild(s); |
| 28 success && success(); |
| 29 }; |
| 30 s.onerror = function() { |
| 31 document.body.removeChild(s); |
| 32 error && error(); |
| 33 }; |
| 34 document.body.appendChild(s); |
| 35 }; |
| 36 |
| 37 /** |
| 38 * Returns the path to a grammar, using the language_path and use_minifi
ed config keys. |
| 39 * @param {string} lang |
| 40 * @returns {string} |
| 41 */ |
| 42 var getLanguagePath = function (lang) { |
| 43 return config.languages_path + |
| 44 'prism-' + lang |
| 45 + (config.use_minified ? '.min' : '') + '.js' |
| 46 }; |
| 47 |
| 48 /** |
| 49 * Tries to load a grammar and |
| 50 * highlight again the given element once loaded. |
| 51 * @param {string} lang |
| 52 * @param {HTMLElement} elt |
| 53 */ |
| 54 var registerElement = function (lang, elt) { |
| 55 var data = lang_data[lang]; |
| 56 if (!data) { |
| 57 data = lang_data[lang] = {}; |
| 58 } |
| 59 |
| 60 // Look for additional dependencies defined on the <code> or <pr
e> tags |
| 61 var deps = elt.getAttribute('data-dependencies'); |
| 62 if (!deps && elt.parentNode && elt.parentNode.tagName.toLowerCas
e() === 'pre') { |
| 63 deps = elt.parentNode.getAttribute('data-dependencies'); |
| 64 } |
| 65 |
| 66 if (deps) { |
| 67 deps = deps.split(/\s*,\s*/g); |
| 68 } else { |
| 69 deps = []; |
| 70 } |
| 71 |
| 72 loadLanguages(deps, function () { |
| 73 loadLanguage(lang, function () { |
| 74 Prism.highlightElement(elt); |
| 75 }); |
| 76 }); |
| 77 }; |
| 78 |
| 79 /** |
| 80 * Sequentially loads an array of grammars. |
| 81 * @param {string[]|string} langs |
| 82 * @param {function=} success |
| 83 * @param {function=} error |
| 84 */ |
| 85 var loadLanguages = function (langs, success, error) { |
| 86 if (typeof langs === 'string') { |
| 87 langs = [langs]; |
| 88 } |
| 89 var i = 0; |
| 90 var l = langs.length; |
| 91 var f = function () { |
| 92 if (i < l) { |
| 93 loadLanguage(langs[i], function () { |
| 94 i++; |
| 95 f(); |
| 96 }, function () { |
| 97 error && error(langs[i]); |
| 98 }); |
| 99 } else if (i === l) { |
| 100 success && success(langs); |
| 101 } |
| 102 }; |
| 103 f(); |
| 104 }; |
| 105 |
| 106 /** |
| 107 * Load a grammar with its dependencies |
| 108 * @param {string} lang |
| 109 * @param {function=} success |
| 110 * @param {function=} error |
| 111 */ |
| 112 var loadLanguage = function (lang, success, error) { |
| 113 var load = function () { |
| 114 var force = false; |
| 115 // Do we want to force reload the grammar? |
| 116 if (lang.indexOf('!') >= 0) { |
| 117 force = true; |
| 118 lang = lang.replace('!', ''); |
| 119 } |
| 120 |
| 121 var data = lang_data[lang]; |
| 122 if (!data) { |
| 123 data = lang_data[lang] = {}; |
| 124 } |
| 125 if (success) { |
| 126 if (!data.success_callbacks) { |
| 127 data.success_callbacks = []; |
| 128 } |
| 129 data.success_callbacks.push(success); |
| 130 } |
| 131 if (error) { |
| 132 if (!data.error_callbacks) { |
| 133 data.error_callbacks = []; |
| 134 } |
| 135 data.error_callbacks.push(error); |
| 136 } |
| 137 |
| 138 if (!force && Prism.languages[lang]) { |
| 139 languageSuccess(lang); |
| 140 } else if (!force && data.error) { |
| 141 languageError(lang); |
| 142 } else if (force || !data.loading) { |
| 143 data.loading = true; |
| 144 var src = getLanguagePath(lang); |
| 145 script(src, function () { |
| 146 data.loading = false; |
| 147 languageSuccess(lang); |
| 148 |
| 149 }, function () { |
| 150 data.loading = false; |
| 151 data.error = true; |
| 152 languageError(lang); |
| 153 }); |
| 154 } |
| 155 }; |
| 156 var dependencies = lang_dependencies[lang]; |
| 157 if(dependencies && dependencies.length) { |
| 158 loadLanguages(dependencies, load); |
| 159 } else { |
| 160 load(); |
| 161 } |
| 162 }; |
| 163 |
| 164 /** |
| 165 * Runs all success callbacks for this language. |
| 166 * @param {string} lang |
| 167 */ |
| 168 var languageSuccess = function (lang) { |
| 169 if (lang_data[lang] && lang_data[lang].success_callbacks && lang
_data[lang].success_callbacks.length) { |
| 170 lang_data[lang].success_callbacks.forEach(function (f) { |
| 171 f(lang); |
| 172 }); |
| 173 } |
| 174 }; |
| 175 |
| 176 /** |
| 177 * Runs all error callbacks for this language. |
| 178 * @param {string} lang |
| 179 */ |
| 180 var languageError = function (lang) { |
| 181 if (lang_data[lang] && lang_data[lang].error_callbacks && lang_d
ata[lang].error_callbacks.length) { |
| 182 lang_data[lang].error_callbacks.forEach(function (f) { |
| 183 f(lang); |
| 184 }); |
| 185 } |
| 186 }; |
| 187 |
| 188 Prism.hooks.add('complete', function (env) { |
| 189 if (env.element && env.language && !env.grammar) { |
| 190 registerElement(env.language, env.element); |
| 191 } |
| 192 }); |
| 193 |
| 194 }()); |
OLD | NEW |