-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRenderBlocks.js
140 lines (122 loc) · 4.35 KB
/
RenderBlocks.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Taken from https://makecode.microbit.org/blocks-embed ("HTML only")
/* message signatures
export interface RenderBlocksRequestMessage extends SimulatorMessage {
type: "renderblocks",
id: string;
code: string;
options?: {
package?: string;
packageId?: string;
snippetMode?: boolean;
}
}
export interface RenderBlocksResponseMessage extends SimulatorMessage {
source: "makecode",
type: "renderblocks",
id: string;
svg?: string;
width?: number;
height?: number;
}*/
var makeCodeRenderPre = makeCodeRenderPre || (function () {
// pre waiting to be rendered
// when undefined, iframe is loaded and ready
var pendingPres = [];
function injectRenderer() {
var f = document.getElementById("makecoderenderer");
// check iframe already added to the DOM
if (f) {
return;
}
var f = document.createElement("iframe");
f.id = "makecoderenderer";
f.style.position = "absolute";
f.style.left = 0;
f.style.bottom = 0;
f.style.width = "1px";
f.style.height = "1px";
f.src = "https://makecode.microbit.org/--docs?render=1"
document.body.appendChild(f);
}
function renderPre(pre) {
console.log('render ' + pre.id)
var f = document.getElementById("makecoderenderer");
// check if iframe is added and ready (pendingPres is undefined)
if (!f || !!pendingPres) {
// queue up
pendingPres.push(pre);
injectRenderer();
} else {
f.contentWindow.postMessage({
type: "renderblocks",
id: pre.id,
code: pre.innerText,
options: {
packageId: pre.getAttribute("pub")
}
}, "https://makecode.microbit.org/");
}
}
// listen for messages
window.addEventListener("message", function (ev) {
var msg = ev.data;
if (msg.source != "makecode") return;
console.log(msg.type)
switch (msg.type) {
case "renderready":
// flush pending requests
var pres = pendingPres;
// set as undefined to notify that iframe is ready
pendingPres = undefined;
pres.forEach(function (pre) { renderPre(pre); })
break;
case "renderblocks":
var svg = msg.svg; // this is an string containing SVG
var id = msg.id; // this is the id you sent
// replace text with svg
var img = document.createElement("img");
img.src = msg.uri;
img.width = msg.width;
img.height = msg.height;
var code = document.getElementById(id);
code.parentElement.insertBefore(img, code)
code.parentElement.removeChild(code);
// @ngammarano
numberOfPres--;
if (numberOfPres == 0) {
document.getElementById("body").style = "background-color: #D0FFD0";
};
break;
}
}, false);
return renderPre;
})();
let numberOfPres = 0;
function renderSnippets() {
// TODO ADD RENDER LOGIC HERE
let pres = document.getElementsByTagName("pre");
numberOfPres = pres.length;
if (numberOfPres != 0) {
document.getElementById("body").style = "background-color: #FFFFD0";
};
Array.prototype.forEach.call(pres, function (pre) {
makeCodeRenderPre(pre);
});
}
// load the renderer
//renderSnippets();
let preNumber = 0;
function clearScreen() {
document.getElementById("mainBlocks").innerHTML = "";
preNumber = 0;
}
function addCode() {
document.getElementById("mainBlocks").innerHTML += "<h2>Project " + preNumber.toString() + "</h2>";
document.getElementById("mainBlocks").innerHTML += "<pre id='pre" + preNumber.toString() + "'>" + document.getElementById("makecodeCode").value + "</pre>";
preNumber++;
}
function addProject() {
document.getElementById("mainBlocks").innerHTML += "<h2>Project " + preNumber.toString() + "</h2>";
document.getElementById("mainBlocks").innerHTML += "<pre id='pre" + preNumber.toString() + "' pub='" + document.getElementById("makecodeProject").value + "'></pre>";
preNumber++;
}