| Index: lib/src/prism/plugins/jsonp-highlight/prism-jsonp-highlight.js
|
| diff --git a/lib/src/prism/plugins/jsonp-highlight/prism-jsonp-highlight.js b/lib/src/prism/plugins/jsonp-highlight/prism-jsonp-highlight.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..06a9e68c09f1174f533fab0ab7ea830e3db21e54
|
| --- /dev/null
|
| +++ b/lib/src/prism/plugins/jsonp-highlight/prism-jsonp-highlight.js
|
| @@ -0,0 +1,151 @@
|
| +(function() {
|
| + if ( !self.Prism || !self.document || !document.querySelectorAll ) return;
|
| +
|
| + var adapters = [];
|
| + function registerAdapter(adapter) {
|
| + if (typeof adapter === "function" && !getAdapter(adapter)) {
|
| + adapters.push(adapter);
|
| + }
|
| + }
|
| + function getAdapter(adapter) {
|
| + if (typeof adapter === "function") {
|
| + return adapters.filter(function(fn) { return fn.valueOf() === adapter.valueOf()})[0];
|
| + }
|
| + else if (typeof adapter === "string" && adapter.length > 0) {
|
| + return adapters.filter(function(fn) { return fn.name === adapter})[0];
|
| + }
|
| + return null;
|
| + }
|
| + function removeAdapter(adapter) {
|
| + if (typeof adapter === "string")
|
| + adapter = getAdapter(adapter);
|
| + if (typeof adapter === "function") {
|
| + var index = adapters.indexOf(adapter);
|
| + if (index >=0) {
|
| + adapters.splice(index,1);
|
| + }
|
| + }
|
| + }
|
| +
|
| + Prism.plugins.jsonphighlight = {
|
| + registerAdapter: registerAdapter,
|
| + removeAdapter: removeAdapter,
|
| + highlight: highlight
|
| + };
|
| + registerAdapter(function github(rsp, el) {
|
| + if ( rsp && rsp.meta && rsp.data ) {
|
| + if ( rsp.meta.status && rsp.meta.status >= 400 ) {
|
| + return "Error: " + ( rsp.data.message || rsp.meta.status );
|
| + }
|
| + else if ( typeof(rsp.data.content) === "string" ) {
|
| + return typeof(atob) === "function"
|
| + ? atob(rsp.data.content.replace(/\s/g, ""))
|
| + : "Your browser cannot decode base64";
|
| + }
|
| + }
|
| + return null;
|
| + });
|
| + registerAdapter(function gist(rsp, el) {
|
| + if ( rsp && rsp.meta && rsp.data && rsp.data.files ) {
|
| + if ( rsp.meta.status && rsp.meta.status >= 400 ) {
|
| + return "Error: " + ( rsp.data.message || rsp.meta.status );
|
| + }
|
| + else {
|
| + var filename = el.getAttribute("data-filename");
|
| + if (filename == null) {
|
| + // Maybe in the future we can somehow render all files
|
| + // But the standard <script> include for gists does that nicely already,
|
| + // so that might be getting beyond the scope of this plugin
|
| + for (var key in rsp.data.files) {
|
| + if (rsp.data.files.hasOwnProperty(key)) {
|
| + filename = key;
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + if (rsp.data.files[filename] !== undefined) {
|
| + return rsp.data.files[filename].content;
|
| + }
|
| + else {
|
| + return "Error: unknown or missing gist file " + filename;
|
| + }
|
| + }
|
| + }
|
| + return null;
|
| + });
|
| + registerAdapter(function bitbucket(rsp, el) {
|
| + return rsp && rsp.node && typeof(rsp.data) === "string"
|
| + ? rsp.data
|
| + : null;
|
| + });
|
| +
|
| + var jsonpcb = 0,
|
| + loadstr = "Loading…";
|
| +
|
| + function highlight() {
|
| + Array.prototype.slice.call(document.querySelectorAll("pre[data-jsonp]")).forEach(function(pre) {
|
| + pre.textContent = "";
|
| +
|
| + var code = document.createElement("code");
|
| + code.textContent = loadstr;
|
| + pre.appendChild(code);
|
| +
|
| + var adapterfn = pre.getAttribute("data-adapter");
|
| + var adapter = null;
|
| + if ( adapterfn ) {
|
| + if ( typeof(window[adapterfn]) === "function" ) {
|
| + adapter = window[adapterfn];
|
| + }
|
| + else {
|
| + code.textContent = "JSONP adapter function '" + adapterfn + "' doesn't exist";
|
| + return;
|
| + }
|
| + }
|
| +
|
| + var cb = "prismjsonp" + ( jsonpcb++ );
|
| +
|
| + var uri = document.createElement("a");
|
| + var src = uri.href = pre.getAttribute("data-jsonp");
|
| + uri.href += ( uri.search ? "&" : "?" ) + ( pre.getAttribute("data-callback") || "callback" ) + "=" + cb;
|
| +
|
| + var timeout = setTimeout(function() {
|
| + // we could clean up window[cb], but if the request finally succeeds, keeping it around is a good thing
|
| + if ( code.textContent === loadstr )
|
| + code.textContent = "Timeout loading '" + src + "'";
|
| + }, 5000);
|
| +
|
| + var script = document.createElement("script");
|
| + script.src = uri.href;
|
| +
|
| + window[cb] = function(rsp) {
|
| + document.head.removeChild(script);
|
| + clearTimeout(timeout);
|
| + delete window[cb];
|
| +
|
| + var data = "";
|
| +
|
| + if ( adapter ) {
|
| + data = adapter(rsp, pre);
|
| + }
|
| + else {
|
| + for ( var p in adapters ) {
|
| + data = adapters[p](rsp, pre);
|
| + if ( data !== null ) break;
|
| + }
|
| + }
|
| +
|
| + if (data === null) {
|
| + code.textContent = "Cannot parse response (perhaps you need an adapter function?)";
|
| + }
|
| + else {
|
| + code.textContent = data;
|
| + Prism.highlightElement(code);
|
| + }
|
| + };
|
| +
|
| + document.head.appendChild(script);
|
| + });
|
| + }
|
| +
|
| + highlight();
|
| +})();
|
|
|