|
14 | 14 |
|
15 | 15 | 'use strict';
|
16 | 16 |
|
| 17 | + var parser = new window.DOMParser(); |
| 18 | + |
17 | 19 | function loadTemplate(url, callback) {
|
18 | 20 | var link = document.createElement('link'),
|
19 | 21 | tag = document.getElementsByTagName('script')[0];
|
|
38 | 40 |
|
39 | 41 | function assembleHtml(head, body, css, js) {
|
40 | 42 | var html = '<!doctype html>\n<html>\n\n';
|
41 |
| - if(css==='jsbin'){ |
42 |
| - head = head.replace(/\/lib\//g,'https://blockly.webduino.io/lib/'); |
43 |
| - body = body.replace(/\/media\//g,'https://blockly.webduino.io/media/'); |
44 |
| - } |
| 43 | + |
45 | 44 | html += ('<head>' +
|
46 | 45 | (head ? '\n ' + head + '\n' : '') +
|
47 | 46 | (css ? '\n <style>' + css + '</style>\n' : '') +
|
|
87 | 86 | return $wrap.wrap('<div/>').parent().html();
|
88 | 87 | }
|
89 | 88 |
|
| 89 | + function injectDependencies(headStr) { |
| 90 | + var head = parser.parseFromString(headStr, 'text/html').head; |
| 91 | + |
| 92 | + head.querySelectorAll('script').forEach(function (sc) { |
| 93 | + sc.src = appendBaseURL(sc.getAttribute('src')); |
| 94 | + }); |
| 95 | + head.querySelectorAll('link').forEach(function (link) { |
| 96 | + link.href = appendBaseURL(link.getAttribute('href')); |
| 97 | + }); |
| 98 | + |
| 99 | + return head.innerHTML; |
| 100 | + } |
| 101 | + |
| 102 | + function injectMedia(bodyStr) { |
| 103 | + var body = parser.parseFromString(bodyStr, 'text/html').body; |
| 104 | + |
| 105 | + body.querySelectorAll('img').forEach(function (img) { |
| 106 | + img.src = appendBaseURL(img.getAttribute('src')); |
| 107 | + }); |
| 108 | + |
| 109 | + return body.innerHTML; |
| 110 | + } |
| 111 | + |
| 112 | + function appendBaseURL(url) { |
| 113 | + var urlc = url.toLowerCase(); |
| 114 | + if (urlc.indexOf('//') !== 0 && |
| 115 | + urlc.indexOf('http://') !== 0 && |
| 116 | + urlc.indexOf('https://') !== 0) { |
| 117 | + url = location.origin + url; |
| 118 | + } |
| 119 | + return url; |
| 120 | + } |
| 121 | + |
90 | 122 | var launchers = {
|
91 | 123 | jsfiddle: function (config) {
|
92 | 124 | var data = config.data;
|
|
121 | 153 |
|
122 | 154 | jsbin: function (config) {
|
123 | 155 | var data = config.data;
|
| 156 | + |
124 | 157 | if (config.jsPreprocessor) {
|
125 | 158 | data[config.jsPreprocessor] = data.js;
|
126 | 159 | delete data.js;
|
127 | 160 | }
|
128 |
| - data.html = assembleHtml(data.head,data.body,'jsbin'); |
| 161 | + data.html = assembleHtml(data.head, data.body); |
129 | 162 | config.modes = config.modes || 'html,css,js,output';
|
130 | 163 |
|
131 | 164 | post('//bin.webduino.io?' + config.modes, data);
|
|
158 | 191 |
|
159 | 192 | window.launcher = {
|
160 | 193 | loadTemplate: loadTemplate,
|
| 194 | + injectDependencies: injectDependencies, |
| 195 | + injectMedia: injectMedia, |
161 | 196 | translate: translate,
|
162 | 197 | jsfiddle: launchers.jsfiddle,
|
163 | 198 | codepen: launchers.codepen,
|
|
0 commit comments