Autoloader: Improved component path guessing (#1928) This changes the behavior of how the Autoloader handles `data-autoloader-path` attributes and guesses the components path. The CDN example on the front page was also updated.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
diff --git a/index.html b/index.html
index 1691012..62797b1 100644
--- a/index.html
+++ b/index.html
@@ -167,8 +167,7 @@
<body>
...</code>
<code class="highlight" style="display: inline-block; outline-offset: .2em; margin-bottom: .2em;"> <script src="https://myCDN.com/prism@v1.x/components/prism-core.min.js"></script>
- <script src="https://myCDN.com/prism@v1.x/plugins/autoloader/prism-autoloader.min.js"></script>
- <script>Prism.plugins.autoloader.languages_path = 'https://myCDN.com/prism@v1.x/components/'</script></code>
+ <script src="https://myCDN.com/prism@v1.x/plugins/autoloader/prism-autoloader.min.js"></script></code>
<code></body>
</html></code></pre>
diff --git a/plugins/autoloader/index.html b/plugins/autoloader/index.html
index c45ea87..3e6331e 100644
--- a/plugins/autoloader/index.html
+++ b/plugins/autoloader/index.html
@@ -123,7 +123,7 @@
<footer data-src="templates/footer.html" data-type="text/html"></footer>
<script src="components/prism-core.js"></script>
-<script src="plugins/autoloader/prism-autoloader.js" data-autoloader-path="components"></script>
+<script src="plugins/autoloader/prism-autoloader.js"></script>
<script src="scripts/utopia.js"></script>
<script src="components.js"></script>
<script src="scripts/code.js"></script>
diff --git a/plugins/autoloader/prism-autoloader.js b/plugins/autoloader/prism-autoloader.js
index a7db119..2618c19 100644
--- a/plugins/autoloader/prism-autoloader.js
+++ b/plugins/autoloader/prism-autoloader.js
@@ -168,17 +168,27 @@
var ignored_language = 'none';
- var script = document.getElementsByTagName('script');
- script = script[script.length - 1];
+ var scripts = document.getElementsByTagName('script');
+ var script = scripts[scripts.length - 1];
var languages_path = 'components/';
- if(script.hasAttribute('data-autoloader-path')) {
- var path = script.getAttribute('data-autoloader-path').trim();
- if(path.length > 0 && !/^[a-z]+:\/\//i.test(script.src)) {
- languages_path = path.replace(/\/?$/, '/');
+
+ 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/');
}
- } else if (/[\w-]+\.js$/.test(script.src)) {
- languages_path = script.src.replace(/[\w-]+\.js$/, 'components/');
}
+
var config = Prism.plugins.autoloader = {
languages_path: languages_path,
use_minified: true
@@ -229,8 +239,9 @@
// 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) {
diff --git a/plugins/autoloader/prism-autoloader.min.js b/plugins/autoloader/prism-autoloader.min.js
index 3bb07d0..28f928b 100644
--- a/plugins/autoloader/prism-autoloader.min.js
+++ b/plugins/autoloader/prism-autoloader.min.js
@@ -1 +1 @@
-!function(){if("undefined"!=typeof self&&self.Prism&&self.document&&document.createElement){var r={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"],erb:["ruby","markup-templating"],fsharp:"clike",flow:"javascript",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",jsonp:"json",json5:"json",kotlin:"clike",less:"css",lilypond:"scheme",markdown:"markup","markup-templating":"markup",n4js:"javascript",nginx:"clike",objectivec:"c",opencl:"cpp",parser:"markup",php:["clike","markup-templating"],phpdoc:["php","javadoclike"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:["markup","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",soy:"markup-templating",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"},n={html:"markup",xml:"markup",svg:"markup",mathml:"markup",js:"javascript",adoc:"asciidoc",shell:"bash",rbnf:"bnf",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",n4jsd:"n4js",objectpascal:"pascal",px:"pcaxis",py:"python",rb:"ruby",ts:"typescript",t4:"t4-cs",vb:"visual-basic",xeoracube:"xeora",yml:"yaml"},l={},a=document.getElementsByTagName("script"),e="components/";if((a=a[a.length-1]).hasAttribute("data-autoloader-path")){var t=a.getAttribute("data-autoloader-path").trim();0<t.length&&!/^[a-z]+:\/\//i.test(a.src)&&(e=t.replace(/\/?$/,"/"))}else/[\w-]+\.js$/.test(a.src)&&(e=a.src.replace(/[\w-]+\.js$/,"components/"));var p=Prism.plugins.autoloader={languages_path:e,use_minified:!0},o=function(a,e,t){"string"==typeof a&&(a=[a]);var s=0,i=a.length,c=function(){s<i?m(a[s],function(){s++,c()},function(){t&&t(a[s])}):s===i&&e&&e(a)};c()},m=function(e,t,s){var i=0<=e.indexOf("!");e=e.replace("!","");var a=function(){var a=l[e];if(a||(a=l[e]={callbacks:[]}),a.callbacks.push({success:t,error:s}),!i&&Prism.languages[e])u(e);else if(!i&&a.error)k(e);else if(i||!a.loading){a.loading=!0,function(a,e,t){var s=document.createElement("script");s.src=a,s.async=!0,s.onload=function(){document.body.removeChild(s),e&&e()},s.onerror=function(){document.body.removeChild(s),t&&t()},document.body.appendChild(s)}(function(a){return p.languages_path+"prism-"+a+(p.use_minified?".min":"")+".js"}(e),function(){a.loading=!1,u(e)},function(){a.loading=!1,a.error=!0,k(e)})}},c=r[e=n[e]||e];c&&c.length?o(c,a):a()},u=function(a){if(l[a])for(var e=l[a].callbacks;e.length;){var t=e.shift().success;t&&t()}},k=function(a){if(l[a])for(var e=l[a].callbacks;e.length;){var t=e.shift().error;t&&t()}};Prism.hooks.add("complete",function(a){a.element&&a.language&&!a.grammar&&"none"!==a.language&&function(a,e){a in n&&(a=n[a]);var t=e.getAttribute("data-dependencies");!t&&e.parentNode&&"pre"===e.parentNode.tagName.toLowerCase()&&(t=e.parentNode.getAttribute("data-dependencies")),t=t?t.split(/\s*,\s*/g):[],o(t,function(){m(a,function(){Prism.highlightElement(e)})})}(a.language,a.element)})}}();
\ No newline at end of file
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document&&document.createElement){var r={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"],erb:["ruby","markup-templating"],fsharp:"clike",flow:"javascript",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",jsonp:"json",json5:"json",kotlin:"clike",less:"css",lilypond:"scheme",markdown:"markup","markup-templating":"markup",n4js:"javascript",nginx:"clike",objectivec:"c",opencl:"cpp",parser:"markup",php:["clike","markup-templating"],phpdoc:["php","javadoclike"],"php-extras":"php",plsql:"sql",processing:"clike",protobuf:"clike",pug:["markup","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",soy:"markup-templating",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"},n={html:"markup",xml:"markup",svg:"markup",mathml:"markup",js:"javascript",adoc:"asciidoc",shell:"bash",rbnf:"bnf",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",n4jsd:"n4js",objectpascal:"pascal",px:"pcaxis",py:"python",rb:"ruby",ts:"typescript",t4:"t4-cs",vb:"visual-basic",xeoracube:"xeora",yml:"yaml"},l={},a=document.getElementsByTagName("script"),e=a[a.length-1],t="components/",s=/\bplugins\/autoloader\/prism-autoloader\.(?:min\.)js$/i,i=/[\w-]+\.(?:min\.)js$/i;if(e.hasAttribute("data-autoloader-path"))t=e.getAttribute("data-autoloader-path").trim().replace(/\/?$/,"/");else{var c=e.src;s.test(c)?t=c.replace(s,"components/"):i.test(c)&&(t=c.replace(i,"components/"))}var p=Prism.plugins.autoloader={languages_path:t,use_minified:!0},o=function(a,e,t){"string"==typeof a&&(a=[a]);var s=0,i=a.length,c=function(){s<i?m(a[s],function(){s++,c()},function(){t&&t(a[s])}):s===i&&e&&e(a)};c()},m=function(e,t,s){var i=0<=e.indexOf("!");e=e.replace("!","");var a=function(){var a=l[e];if(a||(a=l[e]={callbacks:[]}),a.callbacks.push({success:t,error:s}),!i&&Prism.languages[e])u(e);else if(!i&&a.error)k(e);else if(i||!a.loading){a.loading=!0,function(a,e,t){var s=document.createElement("script");s.src=a,s.async=!0,s.onload=function(){document.body.removeChild(s),e&&e()},s.onerror=function(){document.body.removeChild(s),t&&t()},document.body.appendChild(s)}(function(a){return p.languages_path+"prism-"+a+(p.use_minified?".min":"")+".js"}(e),function(){a.loading=!1,u(e)},function(){a.loading=!1,a.error=!0,k(e)})}},c=r[e=n[e]||e];c&&c.length?o(c,a):a()},u=function(a){if(l[a])for(var e=l[a].callbacks;e.length;){var t=e.shift().success;t&&t()}},k=function(a){if(l[a])for(var e=l[a].callbacks;e.length;){var t=e.shift().error;t&&t()}};Prism.hooks.add("complete",function(a){a.element&&a.language&&!a.grammar&&"none"!==a.language&&function(a,e){a in n&&(a=n[a]);var t=e.getAttribute("data-dependencies"),s=e.parentElement;!t&&s&&"pre"===s.tagName.toLowerCase()&&(t=s.getAttribute("data-dependencies")),t=t?t.split(/\s*,\s*/g):[],o(t,function(){m(a,function(){Prism.highlightElement(e)})})}(a.language,a.element)})}}();
\ No newline at end of file