|
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