(function() { "use strict"; function getQuery(s) { s = s === undefined ? window.location.search : s; if (s[0] === '?' ) { s = s.substring(1); } var query = {}; s.split('&').forEach(function(pair) { var parts = pair.split('=').map(decodeURIComponent); query[parts[0]] = parts[1]; }); return query; } function getSearch(url) { // yea I know this is not perfect but whatever var s = url.indexOf('?'); return s < 0 ? {} : getQuery(url.substring(s)); } const getFQUrl = (function() { const a = document.createElement("a"); return function getFQUrl(url) { a.href = url; return a.href; }; }()); function getHTML(url, callback) { var req = new XMLHttpRequest(); req.open("GET", url, true); req.addEventListener('load', function() { var success = req.status === 200 || req.status === 0; callback(success ? null : 'could not load: ' + url, req.responseText); }); req.addEventListener('timeout', function() { callback("timeout get: " + url); }); req.addEventListener('error', function() { callback("error getting: " + url); }); req.send(""); } function fixSourceLinks(url, source) { var srcRE = /(src=)"(.*?)"/g; var linkRE = /(href=)"(.*?")/g; var imageSrcRE = /((?:image|img)\.src = )"(.*?)"/g; var loaderLoadRE = /(loader\.load)\(('|")(.*?)('|")/g; var u = new URL(window.location.origin + url); var prefix = u.origin + dirname(u.pathname); function addPrefix(url) { return url.indexOf("://") < 0 ? (prefix + url) : url; } function makeLinkFQed(match, p1, url) { return p1 + '"' + addPrefix(url) + '"'; } source = source.replace(srcRE, makeLinkFQed); source = source.replace(linkRE, makeLinkFQed); source = source.replace(imageSrcRE, makeLinkFQed); source = source.replace(loaderLoadRE, function(match, fn, q1, url, q2) { return fn + '(' + q1 + addPrefix(url) + q2; }); return source; } var g = { html: '', }; var htmlParts = { js: { language: 'javascript', }, css: { language: 'css', }, html: { language: 'html', }, }; function forEachHTMLPart(fn) { Object.keys(htmlParts).forEach(function(name, ndx) { var info = htmlParts[name]; fn(info, ndx, name); }); } function getHTMLPart(re, obj, tag) { var part = ''; obj.html = obj.html.replace(re, function(p0, p1) { part = p1; return tag; }); return part.replace(/\s*/, ''); } function parseHTML(url, html) { html = fixSourceLinks(url, html); html = html.replace(/
[^]*?<\/div>/, ''); var styleRE = /'); htmlParts.html.source = getHTMLPart(bodyRE, obj, '${html}'); htmlParts.js.source = getHTMLPart(inlineScriptRE, obj, ''); html = obj.html; var tm = titleRE.exec(html); if (tm) { g.title = tm[1]; } var scripts = ''; html = html.replace(externalScriptRE, function(p0, p1, p2) { p1 = p1 || ''; scripts += '\n' + p1 + ''; return ''; }); var dataScripts = ''; html = html.replace(dataScriptRE, function(p0, p1, p2, p3) { p1 = p1 || ''; dataScripts += '\n' + p1 + ''; return ''; }); htmlParts.html.source += dataScripts; htmlParts.html.source += scripts + '\n'; // add style section if there is non if (html.indexOf("${css}") < 0) { html = html.replace("", "\n"); } // add hackedparams section. // We need a way to pass parameters to a blob. Normally they'd be passed as // query params but that only works in Firefox >:( html = html.replace("", '\n'); var links = ''; html = html.replace(cssLinkRE, function(p0, p1) { if (isCSSLinkRE.test(p1)) { var m = hrefRE.exec(p1); if (m) { links += `@import url("${m[1]}");\n`; } return ''; } else { return p0; } }); htmlParts.css.source = links + htmlParts.css.source; g.html = html; } function cantGetHTML(e) { // eslint-disable-line console.log(e); // eslint-disable-line console.log("TODO: don't run editor if can't get HTML"); // eslint-disable-line } function main() { var query = getQuery(); g.url = getFQUrl(query.url); g.query = getSearch(g.url); getHTML(query.url, function(err, html) { if (err) { console.log(err); // eslint-disable-line return; } parseHTML(query.url, html); setupEditor(query.url); if (query.startPane) { const button = document.querySelector(".button-" + query.startPane); toggleSourcePane(button); } }); } var blobUrl; function getSourceBlob(options) { options = options || {}; if (blobUrl) { URL.revokeObjectURL(blobUrl); } var source = g.html; source = source.replace("${hackedParams}", JSON.stringify(g.query)); source = source.replace('${html}', htmlParts.html.editor.getValue()); source = source.replace('${css}', htmlParts.css.editor.getValue()); source = source.replace('${js}', htmlParts.js.editor.getValue()); source = source.replace('', '\n"); var scriptNdx = source.indexOf('