armo-breadboard
Version:
Edit a live React component's source in real time.
57 lines (44 loc) • 2.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createBreadboardHTMLTransform = createBreadboardHTMLTransform;
var _breadboardHost = require('!!raw!../breadboard-host.js');
var _breadboardHost2 = _interopRequireDefault(_breadboardHost);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function replaceLocalNodes(nodes, attr, scheme) {
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
var parser = document.createElement('a');
parser.href = node[attr];
if (parser.host === window.location.host && parser.protocol === window.location.protocol) {
var comment = document.createComment(scheme + '://' + parser.pathname);
node.parentNode.replaceChild(comment, node);
}
}
}
function createBreadboardHTMLTransform(hostURL) {
return function (source) {
var parser = new DOMParser();
var doc = parser.parseFromString(source, "text/html");
var scripts = doc.getElementsByTagName('script');
replaceLocalNodes(scripts, 'src', 'breadboardscript');
var links = doc.querySelectorAll('link[rel="stylesheet"]');
replaceLocalNodes(links, 'href', 'breadboardstyle');
var head = doc.getElementsByTagName('head')[0];
var hostScript = doc.createElement('script');
// TODO: if IE, use `hostURL`
//hostScript.src = `data:text/javascript;charset=utf-8;base64,${btoa(hostScriptSource)}`
hostScript.text = '__$BREADBOARD_HOST_SCRIPT$__';
// Insert our scripts before the first script, so that we have access to anything defined before there.
var headScripts = head.getElementsByTagName('script');
if (headScripts.length > 0) {
head.insertBefore(hostScript, headScripts[0]);
} else {
head.appendChild(hostScript);
}
head.insertBefore(document.createComment('BREADBOARD_SETTINGS'), hostScript);
var serializer = new XMLSerializer();
return serializer.serializeToString(doc).replace('__$BREADBOARD_HOST_SCRIPT$__', _breadboardHost2.default);
};
}