vendor/assets/javascripts/prism-plugin/prism-autoloader.js in prism-rails-1.6.0.3 vs vendor/assets/javascripts/prism-plugin/prism-autoloader.js in prism-rails-1.19.0
- old
+ new
@@ -2,69 +2,274 @@
if (typeof self === 'undefined' || !self.Prism || !self.document || !document.createElement) {
return;
}
// The dependencies map is built automatically with gulp
- 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","haxe":"clike","jade":"javascript","java":"clike","jolie":"clike","kotlin":"clike","less":"css","markdown":"markup","nginx":"clike","objectivec":"c","parser":"markup","php":"clike","php-extras":"php","processing":"clike","protobuf":"clike","qore":"clike","jsx":["markup","javascript"],"reason":"clike","ruby":"clike","sass":"css","scss":"css","scala":"java","smarty":"markup","swift":"clike","textile":"markup","twig":"markup","typescript":"javascript","wiki":"markup"}/*]*/;
+ var lang_dependencies = /*dependencies_placeholder[*/{
+ "javascript": "clike",
+ "actionscript": "javascript",
+ "arduino": "cpp",
+ "aspnet": [
+ "markup",
+ "csharp"
+ ],
+ "bison": "c",
+ "c": "clike",
+ "csharp": "clike",
+ "cpp": "c",
+ "coffeescript": "javascript",
+ "crystal": "ruby",
+ "css-extras": "css",
+ "d": "clike",
+ "dart": "clike",
+ "django": "markup-templating",
+ "ejs": [
+ "javascript",
+ "markup-templating"
+ ],
+ "etlua": [
+ "lua",
+ "markup-templating"
+ ],
+ "erb": [
+ "ruby",
+ "markup-templating"
+ ],
+ "fsharp": "clike",
+ "firestore-security-rules": "clike",
+ "flow": "javascript",
+ "ftl": "markup-templating",
+ "glsl": "clike",
+ "gml": "clike",
+ "go": "clike",
+ "groovy": "clike",
+ "haml": "ruby",
+ "handlebars": "markup-templating",
+ "haxe": "clike",
+ "java": "clike",
+ "javadoc": [
+ "markup",
+ "java",
+ "javadoclike"
+ ],
+ "jolie": "clike",
+ "jsdoc": [
+ "javascript",
+ "javadoclike"
+ ],
+ "js-extras": "javascript",
+ "js-templates": "javascript",
+ "jsonp": "json",
+ "json5": "json",
+ "kotlin": "clike",
+ "latte": [
+ "clike",
+ "markup-templating",
+ "php"
+ ],
+ "less": "css",
+ "lilypond": "scheme",
+ "markdown": "markup",
+ "markup-templating": "markup",
+ "n4js": "javascript",
+ "nginx": "clike",
+ "objectivec": "c",
+ "opencl": "c",
+ "parser": "markup",
+ "php": [
+ "clike",
+ "markup-templating"
+ ],
+ "phpdoc": [
+ "php",
+ "javadoclike"
+ ],
+ "php-extras": "php",
+ "plsql": "sql",
+ "processing": "clike",
+ "protobuf": "clike",
+ "pug": [
+ "markup",
+ "javascript"
+ ],
+ "qml": "javascript",
+ "qore": "clike",
+ "jsx": [
+ "markup",
+ "javascript"
+ ],
+ "tsx": [
+ "jsx",
+ "typescript"
+ ],
+ "reason": "clike",
+ "ruby": "clike",
+ "sass": "css",
+ "scss": "css",
+ "scala": "java",
+ "shell-session": "bash",
+ "smarty": "markup-templating",
+ "solidity": "clike",
+ "soy": "markup-templating",
+ "sparql": "turtle",
+ "sqf": "clike",
+ "swift": "clike",
+ "tap": "yaml",
+ "textile": "markup",
+ "tt2": [
+ "clike",
+ "markup-templating"
+ ],
+ "twig": "markup",
+ "typescript": "javascript",
+ "t4-cs": [
+ "t4-templating",
+ "csharp"
+ ],
+ "t4-vb": [
+ "t4-templating",
+ "visual-basic"
+ ],
+ "vala": "clike",
+ "vbnet": "basic",
+ "velocity": "markup",
+ "wiki": "markup",
+ "xeora": "markup",
+ "xquery": "markup"
+ }/*]*/;
+ var lang_aliases = /*aliases_placeholder[*/{
+ "html": "markup",
+ "xml": "markup",
+ "svg": "markup",
+ "mathml": "markup",
+ "js": "javascript",
+ "g4": "antlr4",
+ "adoc": "asciidoc",
+ "shell": "bash",
+ "rbnf": "bnf",
+ "conc": "concurnas",
+ "cs": "csharp",
+ "dotnet": "csharp",
+ "coffee": "coffeescript",
+ "jinja2": "django",
+ "dns-zone": "dns-zone-file",
+ "dockerfile": "docker",
+ "gamemakerlanguage": "gml",
+ "hs": "haskell",
+ "tex": "latex",
+ "context": "latex",
+ "ly": "lilypond",
+ "emacs": "lisp",
+ "elisp": "lisp",
+ "emacs-lisp": "lisp",
+ "md": "markdown",
+ "moon": "moonscript",
+ "n4jsd": "n4js",
+ "objectpascal": "pascal",
+ "px": "pcaxis",
+ "py": "python",
+ "robot": "robotframework",
+ "rb": "ruby",
+ "sln": "solution-file",
+ "rq": "sparql",
+ "trig": "turtle",
+ "ts": "typescript",
+ "t4": "t4-cs",
+ "vb": "visual-basic",
+ "xeoracube": "xeora",
+ "yml": "yaml"
+ }/*]*/;
+
+ /**
+ * @typedef LangDataItem
+ * @property {{ success?: () => void, error?: () => void }[]} callbacks
+ * @property {boolean} [error]
+ * @property {boolean} [loading]
+ */
+ /** @type {Object<string, LangDataItem>} */
var lang_data = {};
var ignored_language = 'none';
+ var languages_path = 'components/';
+ var script = Prism.util.currentScript();
+ if (script) {
+ var autoloaderFile = /\bplugins\/autoloader\/prism-autoloader\.(?:min\.)js$/i;
+ var prismFile = /[\w-]+\.(?:min\.)js$/i;
+ if (script.hasAttribute('data-autoloader-path')) {
+ // data-autoloader-path is set, so just use it
+ languages_path = script.getAttribute('data-autoloader-path').trim().replace(/\/?$/, '/');
+ } else {
+ var src = script.src;
+ if (autoloaderFile.test(src)) {
+ // the script is the original autoloader script in the usual Prism project structure
+ languages_path = src.replace(autoloaderFile, 'components/');
+ } else if (prismFile.test(src)) {
+ // the script is part of a bundle like a custom prism.js from the download page
+ languages_path = src.replace(prismFile, 'components/');
+ }
+ }
+ }
+
var config = Prism.plugins.autoloader = {
- languages_path: 'components/',
- use_minified: true
+ languages_path: languages_path,
+ use_minified: true,
+ loadLanguages: loadLanguages
};
+
/**
- * Lazy loads an external script
+ * Lazily loads an external script.
+ *
* @param {string} src
- * @param {function=} success
- * @param {function=} error
+ * @param {() => void} [success]
+ * @param {() => void} [error]
*/
- var script = function (src, success, error) {
+ function addScript(src, success, error) {
var s = document.createElement('script');
s.src = src;
s.async = true;
- s.onload = function() {
+ s.onload = function () {
document.body.removeChild(s);
success && success();
};
- s.onerror = function() {
+ s.onerror = function () {
document.body.removeChild(s);
error && error();
};
document.body.appendChild(s);
- };
+ }
/**
* Returns the path to a grammar, using the language_path and use_minified config keys.
+ *
* @param {string} lang
* @returns {string}
*/
- var getLanguagePath = function (lang) {
+ function getLanguagePath(lang) {
return config.languages_path +
'prism-' + lang
+ (config.use_minified ? '.min' : '') + '.js'
- };
+ }
/**
- * Tries to load a grammar and
- * highlight again the given element once loaded.
+ * Tries to load the grammar(s) and once loaded, highlights the given element again.
+ *
* @param {string} lang
* @param {HTMLElement} elt
*/
- var registerElement = function (lang, elt) {
- var data = lang_data[lang];
- if (!data) {
- data = lang_data[lang] = {};
+ function registerElement(lang, elt) {
+ if (lang in lang_aliases) {
+ lang = lang_aliases[lang];
}
// Look for additional dependencies defined on the <code> or <pre> tags
var deps = elt.getAttribute('data-dependencies');
- if (!deps && elt.parentNode && elt.parentNode.tagName.toLowerCase() === 'pre') {
- deps = elt.parentNode.getAttribute('data-dependencies');
+ var parent = elt.parentElement;
+ if (!deps && parent && parent.tagName.toLowerCase() === 'pre') {
+ deps = parent.getAttribute('data-dependencies');
}
if (deps) {
deps = deps.split(/\s*,\s*/g);
} else {
@@ -74,125 +279,131 @@
loadLanguages(deps, function () {
loadLanguage(lang, function () {
Prism.highlightElement(elt);
});
});
- };
+ }
/**
- * Sequentially loads an array of grammars.
- * @param {string[]|string} langs
- * @param {function=} success
- * @param {function=} error
+ * Loads all given grammars concurrently.
+ *
+ * @param {string[]|string} languages
+ * @param {(languages: string[]) => void} [success]
+ * @param {(language: string) => void} [error] This callback will be invoked on the first language to fail.
*/
- var loadLanguages = function (langs, success, error) {
- if (typeof langs === 'string') {
- langs = [langs];
+ function loadLanguages(languages, success, error) {
+ if (typeof languages === 'string') {
+ languages = [languages];
}
- var i = 0;
- var l = langs.length;
- var f = function () {
- if (i < l) {
- loadLanguage(langs[i], function () {
- i++;
- f();
- }, function () {
- error && error(langs[i]);
- });
- } else if (i === l) {
- success && success(langs);
+
+ var total = languages.length;
+ var completed = 0;
+ var failed = false;
+
+ if (total === 0) {
+ if (success) {
+ setTimeout(success, 0);
}
- };
- f();
- };
+ return;
+ }
+ function successCallback() {
+ if (failed) {
+ return;
+ }
+ completed++;
+ if (completed === total) {
+ success && success(languages);
+ }
+ }
+
+ languages.forEach(function (lang) {
+ loadLanguage(lang, successCallback, function () {
+ if (failed) {
+ return;
+ }
+ failed = true;
+ error && error(lang);
+ });
+ });
+ }
+
/**
- * Load a grammar with its dependencies
+ * Loads a grammar with its dependencies.
+ *
* @param {string} lang
- * @param {function=} success
- * @param {function=} error
+ * @param {() => void} [success]
+ * @param {() => void} [error]
*/
- var loadLanguage = function (lang, success, error) {
- var load = function () {
- var force = false;
- // Do we want to force reload the grammar?
- if (lang.indexOf('!') >= 0) {
- force = true;
- lang = lang.replace('!', '');
- }
+ function loadLanguage(lang, success, error) {
+ var force = lang.indexOf('!') >= 0;
+ lang = lang.replace('!', '');
+ lang = lang_aliases[lang] || lang;
+
+ var load = function () {
var data = lang_data[lang];
if (!data) {
- data = lang_data[lang] = {};
+ data = lang_data[lang] = {
+ callbacks: []
+ };
}
- if (success) {
- if (!data.success_callbacks) {
- data.success_callbacks = [];
- }
- data.success_callbacks.push(success);
- }
- if (error) {
- if (!data.error_callbacks) {
- data.error_callbacks = [];
- }
- data.error_callbacks.push(error);
- }
+ data.callbacks.push({
+ success: success,
+ error: error
+ });
if (!force && Prism.languages[lang]) {
- languageSuccess(lang);
+ languageCallback(lang, "success");
} else if (!force && data.error) {
- languageError(lang);
+ languageCallback(lang, "error");
} else if (force || !data.loading) {
data.loading = true;
var src = getLanguagePath(lang);
- script(src, function () {
+ addScript(src, function () {
data.loading = false;
- languageSuccess(lang);
+ languageCallback(lang, "success");
}, function () {
data.loading = false;
data.error = true;
- languageError(lang);
+ languageCallback(lang, "error");
});
}
};
+
var dependencies = lang_dependencies[lang];
- if(dependencies && dependencies.length) {
- loadLanguages(dependencies, load);
+ if (dependencies && dependencies.length) {
+ loadLanguages(dependencies, load, error);
} else {
load();
}
- };
+ }
/**
- * Runs all success callbacks for this language.
+ * Runs all callbacks of the given type for the given language.
+ *
* @param {string} lang
+ * @param {"success" | "error"} type
*/
- var languageSuccess = function (lang) {
- if (lang_data[lang] && lang_data[lang].success_callbacks && lang_data[lang].success_callbacks.length) {
- lang_data[lang].success_callbacks.forEach(function (f) {
- f(lang);
- });
+ function languageCallback(lang, type) {
+ if (lang_data[lang]) {
+ var callbacks = lang_data[lang].callbacks;
+ for (var i = 0, l = callbacks.length; i < l; i++) {
+ var callback = callbacks[i][type];
+ if (callback) {
+ setTimeout(callback, 0);
+ }
+ }
+ callbacks.length = 0;
}
- };
+ }
- /**
- * Runs all error callbacks for this language.
- * @param {string} lang
- */
- var languageError = function (lang) {
- if (lang_data[lang] && lang_data[lang].error_callbacks && lang_data[lang].error_callbacks.length) {
- lang_data[lang].error_callbacks.forEach(function (f) {
- f(lang);
- });
- }
- };
-
Prism.hooks.add('complete', function (env) {
if (env.element && env.language && !env.grammar) {
if (env.language !== ignored_language) {
registerElement(env.language, env.element);
}
}
});
-}());
\ No newline at end of file
+}());