JSONP highlight: Fixed minified adapter names (#1793) This fixes that the Uglify minified functions names made the pre-defined adapters un-removable.
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
diff --git a/plugins/jsonp-highlight/prism-jsonp-highlight.js b/plugins/jsonp-highlight/prism-jsonp-highlight.js
index 14ac205..8b6f65e 100644
--- a/plugins/jsonp-highlight/prism-jsonp-highlight.js
+++ b/plugins/jsonp-highlight/prism-jsonp-highlight.js
@@ -2,53 +2,71 @@
if (!self.Prism || !self.document || !document.querySelectorAll || ![].filter) return;
/**
+ * @callback Adapter
+ * @param {any} response
+ * @param {HTMLPreElement} [pre]
+ * @returns {string}
+ */
+
+ /**
* The list of adapter which will be used if `data-adapter` is not specified.
*
- * @type {Array.<(response: any, pre?: HTMLPreElement) => string>}
+ * @type {Array.<{adapter: Adapter, name: string}>}
*/
var adapters = [];
/**
* Adds a new function to the list of adapters.
*
- * If the given adapter is already registered or not a function, nothing will happen.
+ * If the given adapter is already registered or not a function or there is an adapter with the given name already,
+ * nothing will happen.
*
- * @param {(response: any, pre?: HTMLPreElement) => string} adapter The adapter to be registered.
+ * @param {Adapter} adapter The adapter to be registered.
+ * @param {string} [name] The name of the adapter. Defaults to the function name of `adapter`.
*/
- function registerAdapter(adapter) {
- if (typeof adapter === "function" && !getAdapter(adapter)) {
- adapters.push(adapter);
+ function registerAdapter(adapter, name) {
+ name = name || adapter.name;
+ if (typeof adapter === "function" && !getAdapter(adapter) && !getAdapter(name)) {
+ adapters.push({ adapter: adapter, name: name });
}
}
/**
- * Returns the given adapter itself, if registered, or a registered adapter with the given function name.
+ * Returns the given adapter itself, if registered, or a registered adapter with the given name.
*
* If no fitting adapter is registered, `null` will be returned.
*
- * @param {string|Function} adapter The adapter itself or the function name of an adapter.
- * @returns {(response: any, pre?: HTMLPreElement) => string} A registered adapter or `null`.
+ * @param {string|Function} adapter The adapter itself or the name of an adapter.
+ * @returns {Adapter} A registered adapter or `null`.
*/
function getAdapter(adapter) {
if (typeof adapter === "function") {
- return adapters.filter(function (fn) { return fn.valueOf() === adapter.valueOf(); })[0];
+ for (var i = 0, item; item = adapters[i++];) {
+ if (item.adapter.valueOf() === adapter.valueOf()) {
+ return item.adapter;
+ }
+ }
}
- else if (typeof adapter === "string" && adapter.length > 0) {
- return adapters.filter(function (fn) { return fn.name === adapter; })[0];
+ else if (typeof adapter === "string") {
+ for (var i = 0, item; item = adapters[i++];) {
+ if (item.name === adapter) {
+ return item.adapter;
+ }
+ }
}
return null;
}
/**
- * Remove the given adapter or the first registered adapter with the given function name from the list of
+ * Remove the given adapter or the first registered adapter with the given name from the list of
* registered adapters.
*
- * @param {string|Function} adapter The adapter itself or the function name of an adapter.
+ * @param {string|Function} adapter The adapter itself or the name of an adapter.
*/
function removeAdapter(adapter) {
if (typeof adapter === "string") {
adapter = getAdapter(adapter);
}
if (typeof adapter === "function") {
- var index = adapters.indexOf(adapter);
+ var index = adapters.map(function (item) { return item.adapter; }).indexOf(adapter);
if (index >= 0) {
adapters.splice(index, 1);
}
@@ -67,7 +85,7 @@
}
}
return null;
- });
+ }, 'github');
registerAdapter(function gist(rsp, el) {
if (rsp && rsp.meta && rsp.data && rsp.data.files) {
if (rsp.meta.status && rsp.meta.status >= 400) {
@@ -94,13 +112,13 @@
return "Error: unknown or missing gist file " + filename;
}
return null;
- });
+ }, 'gist');
registerAdapter(function bitbucket(rsp, el) {
if (rsp && rsp.node && typeof (rsp.data) === "string") {
return rsp.data;
}
return null;
- });
+ }, 'bitbucket');
var jsonpcb = 0,
loadMsg = "Loading\u2026";
@@ -158,7 +176,7 @@
}
else {
for (var p in adapters) {
- data = adapters[p](rsp, pre);
+ data = adapters[p].adapter(rsp, pre);
if (data !== null) {
break;
}
@@ -185,4 +203,4 @@
};
highlight();
-})();
\ No newline at end of file
+})();
diff --git a/plugins/jsonp-highlight/prism-jsonp-highlight.min.js b/plugins/jsonp-highlight/prism-jsonp-highlight.min.js
index ba49d4d..4dad217 100644
--- a/plugins/jsonp-highlight/prism-jsonp-highlight.min.js
+++ b/plugins/jsonp-highlight/prism-jsonp-highlight.min.js
@@ -1 +1 @@
-!function(){function t(t){"function"!=typeof t||e(t)||r.push(t)}function e(t){return"function"==typeof t?r.filter(function(e){return e.valueOf()===t.valueOf()})[0]:"string"==typeof t&&t.length>0?r.filter(function(e){return e.name===t})[0]:null}function n(t){if("string"==typeof t&&(t=e(t)),"function"==typeof t){var n=r.indexOf(t);n>=0&&r.splice(n,1)}}function a(){Array.prototype.slice.call(document.querySelectorAll("pre[data-jsonp]")).forEach(function(t){t.textContent="";var e=document.createElement("code");e.textContent=i,t.appendChild(e);var n=t.getAttribute("data-adapter"),a=null;if(n){if("function"!=typeof window[n])return e.textContent="JSONP adapter function '"+n+"' doesn't exist",void 0;a=window[n]}var u="prismjsonp"+o++,f=document.createElement("a"),l=f.href=t.getAttribute("data-jsonp");f.href+=(f.search?"&":"?")+(t.getAttribute("data-callback")||"callback")+"="+u;var s=setTimeout(function(){e.textContent===i&&(e.textContent="Timeout loading '"+l+"'")},5e3),c=document.createElement("script");c.src=f.href,window[u]=function(n){document.head.removeChild(c),clearTimeout(s),delete window[u];var o="";if(a)o=a(n,t);else for(var i in r)if(o=r[i](n,t),null!==o)break;null===o?e.textContent="Cannot parse response (perhaps you need an adapter function?)":(e.textContent=o,Prism.highlightElement(e))},document.head.appendChild(c)})}if(self.Prism&&self.document&&document.querySelectorAll&&[].filter){var r=[];t(function(t){if(t&&t.meta&&t.data){if(t.meta.status&&t.meta.status>=400)return"Error: "+(t.data.message||t.meta.status);if("string"==typeof t.data.content)return"function"==typeof atob?atob(t.data.content.replace(/\s/g,"")):"Your browser cannot decode base64"}return null}),t(function(t,e){if(t&&t.meta&&t.data&&t.data.files){if(t.meta.status&&t.meta.status>=400)return"Error: "+(t.data.message||t.meta.status);var n=t.data.files,a=e.getAttribute("data-filename");if(null==a)for(var r in n)if(n.hasOwnProperty(r)){a=r;break}return void 0!==n[a]?n[a].content:"Error: unknown or missing gist file "+a}return null}),t(function(t){return t&&t.node&&"string"==typeof t.data?t.data:null});var o=0,i="Loading…";Prism.plugins.jsonphighlight={registerAdapter:t,removeAdapter:n,highlight:a},a()}}();
\ No newline at end of file
+!function(){function t(t,n){n=n||t.name,"function"!=typeof t||e(t)||e(n)||r.push({adapter:t,name:n})}function e(t){if("function"==typeof t){for(var e,n=0;e=r[n++];)if(e.adapter.valueOf()===t.valueOf())return e.adapter}else if("string"==typeof t)for(var e,n=0;e=r[n++];)if(e.name===t)return e.adapter;return null}function n(t){if("string"==typeof t&&(t=e(t)),"function"==typeof t){var n=r.map(function(t){return t.adapter}).indexOf(t);n>=0&&r.splice(n,1)}}function a(){Array.prototype.slice.call(document.querySelectorAll("pre[data-jsonp]")).forEach(function(t){t.textContent="";var e=document.createElement("code");e.textContent=i,t.appendChild(e);var n=t.getAttribute("data-adapter"),a=null;if(n){if("function"!=typeof window[n])return e.textContent="JSONP adapter function '"+n+"' doesn't exist",void 0;a=window[n]}var u="prismjsonp"+o++,f=document.createElement("a"),d=f.href=t.getAttribute("data-jsonp");f.href+=(f.search?"&":"?")+(t.getAttribute("data-callback")||"callback")+"="+u;var s=setTimeout(function(){e.textContent===i&&(e.textContent="Timeout loading '"+d+"'")},5e3),l=document.createElement("script");l.src=f.href,window[u]=function(n){document.head.removeChild(l),clearTimeout(s),delete window[u];var o="";if(a)o=a(n,t);else for(var i in r)if(o=r[i].adapter(n,t),null!==o)break;null===o?e.textContent="Cannot parse response (perhaps you need an adapter function?)":(e.textContent=o,Prism.highlightElement(e))},document.head.appendChild(l)})}if(self.Prism&&self.document&&document.querySelectorAll&&[].filter){var r=[];t(function(t){if(t&&t.meta&&t.data){if(t.meta.status&&t.meta.status>=400)return"Error: "+(t.data.message||t.meta.status);if("string"==typeof t.data.content)return"function"==typeof atob?atob(t.data.content.replace(/\s/g,"")):"Your browser cannot decode base64"}return null},"github"),t(function(t,e){if(t&&t.meta&&t.data&&t.data.files){if(t.meta.status&&t.meta.status>=400)return"Error: "+(t.data.message||t.meta.status);var n=t.data.files,a=e.getAttribute("data-filename");if(null==a)for(var r in n)if(n.hasOwnProperty(r)){a=r;break}return void 0!==n[a]?n[a].content:"Error: unknown or missing gist file "+a}return null},"gist"),t(function(t){return t&&t.node&&"string"==typeof t.data?t.data:null},"bitbucket");var o=0,i="Loading…";Prism.plugins.jsonphighlight={registerAdapter:t,removeAdapter:n,highlight:a},a()}}();
\ No newline at end of file