sb-edit-custom 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,606 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
14
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
15
+ if (ar || !(i in from)) {
16
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
17
+ ar[i] = from[i];
18
+ }
19
+ }
20
+ return to.concat(ar || Array.prototype.slice.call(from));
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ var OpCode_1 = require("../../OpCode");
24
+ function toScratchblocks(project, inOptions) {
25
+ if (inOptions === void 0) { inOptions = {}; }
26
+ var defaultOptions = {
27
+ indent: "\t"
28
+ };
29
+ var options = __assign(__assign({}, defaultOptions), inOptions);
30
+ function indent(str) {
31
+ return str
32
+ .split("\n")
33
+ .map(function (l) { return options.indent + l; })
34
+ .join("\n");
35
+ }
36
+ function input(inp, target, flag) {
37
+ if (flag === void 0) { flag = false; }
38
+ if (!inp) {
39
+ return "";
40
+ }
41
+ var escape = function (value) { return (value || "").toString().replace(/[()[\]]|v$/g, function (m) { return "\\" + m; }); };
42
+ switch (inp.type) {
43
+ case "number":
44
+ if (typeof inp.value === "number" || inp.value.trim().length === 0) {
45
+ return "(".concat(inp.value, ")");
46
+ }
47
+ else {
48
+ return "[".concat(escape(inp.value), "]");
49
+ }
50
+ case "angle":
51
+ return "(".concat(inp.value || "", ")");
52
+ case "string":
53
+ return "[".concat(escape(inp.value), "]");
54
+ case "graphicEffect":
55
+ case "soundEffect":
56
+ case "currentMenu":
57
+ case "greaterThanMenu": {
58
+ var value = inp.value === "PAN" || inp.value === "DAYOFWEEK"
59
+ ? {
60
+ PAN: "pan left/right",
61
+ DAYOFWEEK: "day of week"
62
+ }[inp.value]
63
+ : (inp.value || "").toLowerCase();
64
+ return "[".concat(escape(value), " v]");
65
+ }
66
+ case "variable":
67
+ case "list":
68
+ return "[".concat(escape(inp.value.name), " v]");
69
+ case "rotationStyle":
70
+ case "scrollAlignment":
71
+ case "stopMenu":
72
+ case "dragModeMenu":
73
+ case "propertyOfMenu":
74
+ case "mathopMenu":
75
+ case "frontBackMenu":
76
+ case "forwardBackwardMenu":
77
+ case "costumeNumberName":
78
+ return "[".concat(escape(inp.value), " v]");
79
+ case "goToTarget":
80
+ case "pointTowardsTarget":
81
+ case "cloneTarget":
82
+ case "distanceToMenu":
83
+ case "touchingTarget":
84
+ case "target": {
85
+ var value = {
86
+ _mouse_: "mouse-pointer",
87
+ _myself_: "myself",
88
+ _random_: "random position",
89
+ _stage_: "Stage"
90
+ }[inp.value] || inp.value;
91
+ return "(".concat(escape(value), " v)");
92
+ }
93
+ case "costume":
94
+ case "sound":
95
+ case "penColorParam":
96
+ case "musicDrum":
97
+ case "musicInstrument":
98
+ case "videoSensingAttribute":
99
+ case "videoSensingSubject":
100
+ case "videoSensingVideoState":
101
+ return "(".concat(escape(inp.value), " v)");
102
+ case "broadcast":
103
+ case "backdrop":
104
+ case "key":
105
+ if (flag) {
106
+ return "[".concat(escape(inp.value), " v]");
107
+ }
108
+ else {
109
+ return "(".concat(escape(inp.value), " v)");
110
+ }
111
+ case "color": {
112
+ var hex = function (k) {
113
+ return (inp.value || { r: 0, g: 0, b: 0 })[k].toString(16).padStart(2, "0");
114
+ };
115
+ return "[#".concat(hex("r") + hex("g") + hex("b"), "]");
116
+ }
117
+ case "block":
118
+ if (flag) {
119
+ if (inp.value) {
120
+ return "\n" + indent(blockToScratchblocks(inp.value, target)) + "\n";
121
+ }
122
+ else {
123
+ return "\n";
124
+ }
125
+ }
126
+ else {
127
+ if (inp.value) {
128
+ var ret = blockToScratchblocks(inp.value, target);
129
+ if (ret[0] === "(" || ret[0] === "<") {
130
+ return ret;
131
+ }
132
+ else {
133
+ return "(" + ret + ")";
134
+ }
135
+ }
136
+ else {
137
+ return "()";
138
+ }
139
+ }
140
+ case "blocks":
141
+ if (inp.value) {
142
+ return "\n" + indent(blocksToScratchblocks(inp.value, target)) + "\n";
143
+ }
144
+ else {
145
+ return "\n";
146
+ }
147
+ default:
148
+ return "(unknown input type [".concat(inp.type, "])");
149
+ }
150
+ }
151
+ function blockToScratchblocks(block, target) {
152
+ if (!target) {
153
+ throw new Error("expected target");
154
+ }
155
+ var i = function (key, flag) {
156
+ // TODO: type this function properly and remove this type assertion
157
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
158
+ return input(block.inputs[key], target, flag);
159
+ };
160
+ var operator = function (op) { return "(".concat(i("NUM1"), " ").concat(op, " ").concat(i("NUM2"), ")"); };
161
+ var boolop = function (op, flag) {
162
+ if (flag === void 0) { flag = false; }
163
+ if (flag) {
164
+ return "<".concat(i("OPERAND1") || "<>", " ").concat(op, " ").concat(i("OPERAND2") || "<>", ">");
165
+ }
166
+ else {
167
+ return "<".concat(i("OPERAND1"), " ").concat(op, " ").concat(i("OPERAND2"), ">");
168
+ }
169
+ };
170
+ switch (block.opcode) {
171
+ // motion ------------------------------------------------------ //
172
+ case OpCode_1.OpCode.motion_movesteps:
173
+ return "move ".concat(i("STEPS"), " steps");
174
+ case OpCode_1.OpCode.motion_turnright:
175
+ return "turn cw ".concat(i("DEGREES"), " degrees");
176
+ case OpCode_1.OpCode.motion_turnleft:
177
+ return "turn ccw ".concat(i("DEGREES"), " degrees");
178
+ case OpCode_1.OpCode.motion_goto:
179
+ return "go to ".concat(i("TO"));
180
+ case OpCode_1.OpCode.motion_gotoxy:
181
+ return "go to x: ".concat(i("X"), " y: ").concat(i("Y"));
182
+ case OpCode_1.OpCode.motion_glideto:
183
+ return "glide ".concat(i("SECS"), " secs to ").concat(i("TO"));
184
+ case OpCode_1.OpCode.motion_glidesecstoxy:
185
+ return "glide ".concat(i("SECS"), " secs to x: ").concat(i("X"), " y: ").concat(i("Y"));
186
+ case OpCode_1.OpCode.motion_pointindirection:
187
+ return "point in direction ".concat(i("DIRECTION"));
188
+ case OpCode_1.OpCode.motion_pointtowards:
189
+ return "point towards ".concat(i("TOWARDS"));
190
+ case OpCode_1.OpCode.motion_changexby:
191
+ return "change x by ".concat(i("DX"));
192
+ case OpCode_1.OpCode.motion_setx:
193
+ return "set x to ".concat(i("X"));
194
+ case OpCode_1.OpCode.motion_changeyby:
195
+ return "change y by ".concat(i("DY"));
196
+ case OpCode_1.OpCode.motion_sety:
197
+ return "set y to ".concat(i("Y"));
198
+ case OpCode_1.OpCode.motion_ifonedgebounce:
199
+ return "if on edge, bounce";
200
+ case OpCode_1.OpCode.motion_setrotationstyle:
201
+ return "set rotation style ".concat(i("STYLE"));
202
+ case OpCode_1.OpCode.motion_xposition:
203
+ return "(x position)";
204
+ case OpCode_1.OpCode.motion_yposition:
205
+ return "(y position)";
206
+ case OpCode_1.OpCode.motion_direction:
207
+ return "(direction)";
208
+ case OpCode_1.OpCode.motion_scroll_right:
209
+ return "scroll right ".concat(i("DISTANCE"), " :: motion");
210
+ case OpCode_1.OpCode.motion_scroll_up:
211
+ return "scroll up ".concat(i("DISTANCE"), " :: motion");
212
+ case OpCode_1.OpCode.motion_align_scene:
213
+ return "align scene ".concat(i("ALIGNMENT"), " :: motion");
214
+ case OpCode_1.OpCode.motion_xscroll:
215
+ return "(x scroll)";
216
+ case OpCode_1.OpCode.motion_yscroll:
217
+ return "(y scroll)";
218
+ // looks ------------------------------------------------------- //
219
+ case OpCode_1.OpCode.looks_sayforsecs:
220
+ return "say ".concat(i("MESSAGE"), " for ").concat(i("SECS"), " seconds");
221
+ case OpCode_1.OpCode.looks_say:
222
+ return "say ".concat(i("MESSAGE"));
223
+ case OpCode_1.OpCode.looks_thinkforsecs:
224
+ return "think ".concat(i("MESSAGE"), " for ").concat(i("SECS"), " seconds");
225
+ case OpCode_1.OpCode.looks_think:
226
+ return "think ".concat(i("MESSAGE"));
227
+ case OpCode_1.OpCode.looks_switchcostumeto:
228
+ return "switch costume to ".concat(i("COSTUME"));
229
+ case OpCode_1.OpCode.looks_nextcostume:
230
+ return "next costume";
231
+ case OpCode_1.OpCode.looks_switchbackdropto:
232
+ return "switch backdrop to ".concat(i("BACKDROP"));
233
+ case OpCode_1.OpCode.looks_nextbackdrop:
234
+ return "next backdrop";
235
+ case OpCode_1.OpCode.looks_changesizeby:
236
+ return "change size by ".concat(i("CHANGE"));
237
+ case OpCode_1.OpCode.looks_setsizeto:
238
+ return "set size to ".concat(i("SIZE"), "%");
239
+ case OpCode_1.OpCode.looks_changeeffectby:
240
+ return "change ".concat(i("EFFECT"), " effect by ").concat(i("CHANGE"), " :: looks");
241
+ case OpCode_1.OpCode.looks_seteffectto:
242
+ return "set ".concat(i("EFFECT"), " effect to ").concat(i("VALUE"), " :: looks");
243
+ case OpCode_1.OpCode.looks_cleargraphiceffects:
244
+ return "clear graphic effects";
245
+ case OpCode_1.OpCode.looks_show:
246
+ return "show";
247
+ case OpCode_1.OpCode.looks_hide:
248
+ return "hide";
249
+ case OpCode_1.OpCode.looks_gotofrontback:
250
+ return "go to ".concat(i("FRONT_BACK"), " layer");
251
+ case OpCode_1.OpCode.looks_goforwardbackwardlayers:
252
+ return "go ".concat(i("FORWARD_BACKWARD"), " ").concat(i("NUM"), " layers");
253
+ case OpCode_1.OpCode.looks_costumenumbername:
254
+ return "(costume ".concat(i("NUMBER_NAME"), ")");
255
+ case OpCode_1.OpCode.looks_backdropnumbername:
256
+ return "(backdrop ".concat(i("NUMBER_NAME"), ")");
257
+ case OpCode_1.OpCode.looks_size:
258
+ return "(size)";
259
+ case OpCode_1.OpCode.looks_hideallsprites:
260
+ return "hide all sprites :: looks";
261
+ case OpCode_1.OpCode.looks_switchbackdroptoandwait:
262
+ return "switch backdrop to ".concat(i("BACKDROP"), " and wait");
263
+ case OpCode_1.OpCode.looks_changestretchby:
264
+ return "change stretch by ".concat(i("CHANGE"), " :: looks");
265
+ case OpCode_1.OpCode.looks_setstretchto:
266
+ return "set stretch to ".concat(i("STRETCH"), " % :: looks");
267
+ // sound ------------------------------------------------------- //
268
+ case OpCode_1.OpCode.sound_playuntildone:
269
+ return "play sound ".concat(i("SOUND_MENU"), " until done");
270
+ case OpCode_1.OpCode.sound_play:
271
+ return "start sound ".concat(i("SOUND_MENU"));
272
+ case OpCode_1.OpCode.sound_stopallsounds:
273
+ return "stop all sounds";
274
+ case OpCode_1.OpCode.sound_changeeffectby:
275
+ return "change ".concat(i("EFFECT"), " effect by ").concat(i("VALUE"), " :: sound");
276
+ case OpCode_1.OpCode.sound_seteffectto:
277
+ return "set ".concat(i("EFFECT"), " effect to ").concat(i("VALUE"), " :: sound");
278
+ case OpCode_1.OpCode.sound_cleareffects:
279
+ return "clear sound effects";
280
+ case OpCode_1.OpCode.sound_changevolumeby:
281
+ return "change volume by ".concat(i("VOLUME"));
282
+ case OpCode_1.OpCode.sound_setvolumeto:
283
+ return "set volume to ".concat(i("VOLUME"), " %");
284
+ case OpCode_1.OpCode.sound_volume:
285
+ return "(volume)";
286
+ // events ------------------------------------------------------ //
287
+ case OpCode_1.OpCode.event_whenflagclicked:
288
+ return "when green flag clicked";
289
+ case OpCode_1.OpCode.event_whenkeypressed:
290
+ return "when ".concat(i("KEY_OPTION", true), " key pressed");
291
+ case OpCode_1.OpCode.event_whenthisspriteclicked:
292
+ return "when this sprite clicked";
293
+ case OpCode_1.OpCode.event_whenstageclicked:
294
+ return "when stage clicked :: control hat";
295
+ case OpCode_1.OpCode.event_whenbackdropswitchesto:
296
+ return "when backdrop switches to ".concat(i("BACKDROP", true));
297
+ case OpCode_1.OpCode.event_whengreaterthan:
298
+ return "when ".concat(i("WHENGREATERTHANMENU"), " > ").concat(i("VALUE"));
299
+ case OpCode_1.OpCode.event_whenbroadcastreceived:
300
+ return "when I receive ".concat(i("BROADCAST_OPTION", true));
301
+ case OpCode_1.OpCode.event_broadcast:
302
+ return "broadcast ".concat(i("BROADCAST_INPUT"));
303
+ case OpCode_1.OpCode.event_broadcastandwait:
304
+ return "broadcast ".concat(i("BROADCAST_INPUT"), " and wait");
305
+ // control ----------------------------------------------------- //
306
+ case OpCode_1.OpCode.control_wait:
307
+ return "wait ".concat(i("DURATION"), " seconds");
308
+ case OpCode_1.OpCode.control_repeat:
309
+ return "repeat ".concat(i("TIMES")) + (i("SUBSTACK", true) || "\n") + "end";
310
+ case OpCode_1.OpCode.control_forever:
311
+ return "forever" + (i("SUBSTACK", true) || "\n") + "end";
312
+ case OpCode_1.OpCode.control_if:
313
+ return "if ".concat(i("CONDITION") || "<>", " then") + (i("SUBSTACK", true) || "\n") + "end";
314
+ case OpCode_1.OpCode.control_if_else:
315
+ return ("if ".concat(i("CONDITION") || "<>", " then") +
316
+ (i("SUBSTACK", true) || "\n") +
317
+ "else" +
318
+ (i("SUBSTACK2", true) || "\n") +
319
+ "end");
320
+ case OpCode_1.OpCode.control_wait_until:
321
+ return "wait until ".concat(i("CONDITION") || "<>");
322
+ case OpCode_1.OpCode.control_repeat_until:
323
+ return "repeat until ".concat(i("CONDITION") || "<>") + (i("SUBSTACK", true) || "\n") + "end";
324
+ case OpCode_1.OpCode.control_while:
325
+ return "while ".concat(i("CONDITION") || "<>", " {") + (i("SUBSTACK", true) || "\n") + "} :: control";
326
+ case OpCode_1.OpCode.control_for_each:
327
+ return "for each ".concat(i("VARIABLE"), " in ").concat(i("VALUE"), " {") + (i("SUBSTACK", true) || "\n") + "} :: control";
328
+ case OpCode_1.OpCode.control_all_at_once:
329
+ return "all at once {" + (i("SUBSTACK", true) || "\n") + "} :: control";
330
+ case OpCode_1.OpCode.control_stop:
331
+ return "stop ".concat(i("STOP_OPTION"));
332
+ case OpCode_1.OpCode.control_start_as_clone:
333
+ return "when I start as a clone";
334
+ case OpCode_1.OpCode.control_create_clone_of:
335
+ return "create clone of ".concat(i("CLONE_OPTION"));
336
+ case OpCode_1.OpCode.control_delete_this_clone:
337
+ return "delete this clone";
338
+ case OpCode_1.OpCode.control_get_counter:
339
+ return "(counter :: control)";
340
+ case OpCode_1.OpCode.control_incr_counter:
341
+ return "increment counter :: control";
342
+ case OpCode_1.OpCode.control_clear_counter:
343
+ return "clear coutner :: control";
344
+ // sensing ----------------------------------------------------- //
345
+ case OpCode_1.OpCode.sensing_touchingobject:
346
+ return "<touching ".concat(i("TOUCHINGOBJECTMENU"), " ?>");
347
+ case OpCode_1.OpCode.sensing_touchingcolor:
348
+ return "<touching ".concat(i("COLOR"), " ?>");
349
+ case OpCode_1.OpCode.sensing_coloristouchingcolor:
350
+ return "<color ".concat(i("COLOR"), " is touching ").concat(i("COLOR2"), " ?>");
351
+ case OpCode_1.OpCode.sensing_distanceto:
352
+ return "(distance to ".concat(i("DISTANCETOMENU"), ")");
353
+ case OpCode_1.OpCode.sensing_askandwait:
354
+ return "ask ".concat(i("QUESTION"), " and wait");
355
+ case OpCode_1.OpCode.sensing_answer:
356
+ return "(answer)";
357
+ case OpCode_1.OpCode.sensing_keypressed:
358
+ return "<key ".concat(i("KEY_OPTION"), " pressed?>");
359
+ case OpCode_1.OpCode.sensing_mousedown:
360
+ return "<mouse down?>";
361
+ case OpCode_1.OpCode.sensing_mousex:
362
+ return "(mouse x)";
363
+ case OpCode_1.OpCode.sensing_mousey:
364
+ return "(mouse y)";
365
+ case OpCode_1.OpCode.sensing_setdragmode:
366
+ return "set drag mode ".concat(i("DRAG_MODE"));
367
+ case OpCode_1.OpCode.sensing_loudness:
368
+ return "(loudness)";
369
+ case OpCode_1.OpCode.sensing_loud:
370
+ return "<loud? :: sensing>";
371
+ case OpCode_1.OpCode.sensing_timer:
372
+ return "(timer)";
373
+ case OpCode_1.OpCode.sensing_resettimer:
374
+ return "reset timer";
375
+ case OpCode_1.OpCode.sensing_of:
376
+ return "(".concat(i("PROPERTY"), " of ").concat(i("OBJECT"), ")");
377
+ case OpCode_1.OpCode.sensing_current:
378
+ return "(current ".concat(i("CURRENTMENU"), ")");
379
+ case OpCode_1.OpCode.sensing_dayssince2000:
380
+ return "(days since 2000)";
381
+ case OpCode_1.OpCode.sensing_username:
382
+ return "(username)";
383
+ case OpCode_1.OpCode.sensing_userid:
384
+ return "(user id :: sensing)";
385
+ // operators --------------------------------------------------- //
386
+ case OpCode_1.OpCode.operator_add:
387
+ return operator("+");
388
+ case OpCode_1.OpCode.operator_subtract:
389
+ return operator("-");
390
+ case OpCode_1.OpCode.operator_multiply:
391
+ return operator("*");
392
+ case OpCode_1.OpCode.operator_divide:
393
+ return operator("/");
394
+ case OpCode_1.OpCode.operator_random:
395
+ return "(pick random ".concat(i("FROM"), " to ").concat(i("TO"), ")");
396
+ case OpCode_1.OpCode.operator_gt:
397
+ return boolop(">");
398
+ case OpCode_1.OpCode.operator_lt:
399
+ return boolop("<");
400
+ case OpCode_1.OpCode.operator_equals:
401
+ return boolop("=");
402
+ case OpCode_1.OpCode.operator_and:
403
+ return boolop("and", true);
404
+ case OpCode_1.OpCode.operator_or:
405
+ return boolop("or", true);
406
+ case OpCode_1.OpCode.operator_not:
407
+ return "<not ".concat(i("OPERAND") || "<>", ">");
408
+ case OpCode_1.OpCode.operator_join:
409
+ return "(join ".concat(i("STRING1"), " ").concat(i("STRING2"), ")");
410
+ case OpCode_1.OpCode.operator_letter_of:
411
+ return "(letter ".concat(i("LETTER"), " of ").concat(i("STRING"), ")");
412
+ case OpCode_1.OpCode.operator_length:
413
+ return "(length of ".concat(i("STRING"), ")");
414
+ case OpCode_1.OpCode.operator_contains:
415
+ return "<".concat(i("STRING1"), " contains ").concat(i("STRING2"), " ? :: operators>");
416
+ case OpCode_1.OpCode.operator_mod:
417
+ return operator("mod");
418
+ case OpCode_1.OpCode.operator_round:
419
+ return "(round ".concat(i("NUM"), ")");
420
+ case OpCode_1.OpCode.operator_mathop:
421
+ return "(".concat(i("OPERATOR"), " of ").concat(i("NUM"), ")");
422
+ // data -------------------------------------------------------- //
423
+ case OpCode_1.OpCode.data_variable:
424
+ return "(".concat(block.inputs.VARIABLE.value.name, " :: variables)");
425
+ case OpCode_1.OpCode.data_setvariableto:
426
+ return "set ".concat(i("VARIABLE"), " to ").concat(i("VALUE"));
427
+ case OpCode_1.OpCode.data_changevariableby:
428
+ return "change ".concat(i("VARIABLE"), " by ").concat(i("VALUE"));
429
+ case OpCode_1.OpCode.data_showvariable:
430
+ return "show variable ".concat(i("VARIABLE"));
431
+ case OpCode_1.OpCode.data_hidevariable:
432
+ return "hide variable ".concat(i("VARIABLE"));
433
+ case OpCode_1.OpCode.data_listcontents:
434
+ return "(".concat(block.inputs.LIST.value.name, " :: list)");
435
+ case OpCode_1.OpCode.data_addtolist:
436
+ return "add ".concat(i("ITEM"), " to ").concat(i("LIST"));
437
+ case OpCode_1.OpCode.data_deleteoflist:
438
+ return "delete ".concat(i("INDEX"), " of ").concat(i("LIST"));
439
+ case OpCode_1.OpCode.data_deletealloflist:
440
+ return "delete all of ".concat(i("LIST"));
441
+ case OpCode_1.OpCode.data_insertatlist:
442
+ return "insert ".concat(i("ITEM"), " at ").concat(i("INDEX"), " of ").concat(i("LIST"));
443
+ case OpCode_1.OpCode.data_replaceitemoflist:
444
+ return "replace item ".concat(i("INDEX"), " of ").concat(i("LIST"), " with ").concat(i("ITEM"));
445
+ case OpCode_1.OpCode.data_itemoflist:
446
+ return "(item ".concat(i("INDEX"), " of ").concat(i("LIST"), ")");
447
+ case OpCode_1.OpCode.data_itemnumoflist:
448
+ return "(item # of ".concat(i("ITEM"), " in ").concat(i("LIST"), ")");
449
+ case OpCode_1.OpCode.data_lengthoflist:
450
+ return "(length of ".concat(i("LIST"), ")");
451
+ case OpCode_1.OpCode.data_listcontainsitem:
452
+ return "<".concat(i("LIST"), " contains ").concat(i("ITEM"), " ? :: list>");
453
+ case OpCode_1.OpCode.data_showlist:
454
+ return "show list ".concat(i("LIST"));
455
+ case OpCode_1.OpCode.data_hidelist:
456
+ return "hide list ".concat(i("LIST"));
457
+ // custom blocks ----------------------------------------------- //
458
+ case OpCode_1.OpCode.procedures_definition: {
459
+ var spec = block.inputs.ARGUMENTS.value
460
+ .map(function (_a) {
461
+ var type = _a.type, name = _a.name;
462
+ switch (type) {
463
+ case "label":
464
+ return name.replace(/\//g, "\\/");
465
+ case "numberOrString":
466
+ return "(".concat(name, ")");
467
+ case "boolean":
468
+ return "<".concat(name, ">");
469
+ }
470
+ })
471
+ .join(" ");
472
+ return "define ".concat(spec) + (block.inputs.WARP.value ? " // run without screen refresh" : "");
473
+ }
474
+ case OpCode_1.OpCode.procedures_call: {
475
+ var definition = target.scripts
476
+ .map(function (s) { return s.blocks[0]; })
477
+ .find(function (b) { return b.opcode === OpCode_1.OpCode.procedures_definition && b.inputs.PROCCODE.value === block.inputs.PROCCODE.value; });
478
+ // we guarantee the opcode check is true already by checking it in find(), but typescript doesn't seem to notice that, so we include this assert here
479
+ if (definition && definition.opcode === OpCode_1.OpCode.procedures_definition) {
480
+ var index_1 = 0;
481
+ return (definition.inputs.ARGUMENTS.value
482
+ .map(function (_a) {
483
+ var type = _a.type, name = _a.name;
484
+ switch (type) {
485
+ case "label":
486
+ return name.replace(/\//g, "\\/");
487
+ default:
488
+ // TODO: deal with empty boolean inputs, which can't even load yet
489
+ return input(block.inputs.INPUTS.value[index_1++], target);
490
+ }
491
+ })
492
+ .join(" ") + " :: custom");
493
+ }
494
+ else {
495
+ return "... // missing custom block definition for ".concat(block.inputs.PROCCODE.value);
496
+ }
497
+ }
498
+ case OpCode_1.OpCode.argument_reporter_string_number:
499
+ return "(".concat(block.inputs.VALUE.value, " :: custom-arg)");
500
+ case OpCode_1.OpCode.argument_reporter_boolean:
501
+ return "<".concat(block.inputs.VALUE.value, " :: custom-arg>");
502
+ // extension: music -------------------------------------------- //
503
+ case OpCode_1.OpCode.music_playDrumForBeats:
504
+ return "play drum ".concat(i("DRUM"), " for ").concat(i("BEATS"), " beats");
505
+ case OpCode_1.OpCode.music_midiPlayDrumForBeats:
506
+ return "play (old midi) drum ".concat(i("DRUM"), " for ").concat(i("BEATS"), " beats :: music");
507
+ case OpCode_1.OpCode.music_restForBeats:
508
+ return "rest for ".concat(i("BEATS"), " beats");
509
+ case OpCode_1.OpCode.music_playNoteForBeats:
510
+ return "play note ".concat(i("NOTE"), " for ").concat(i("BEATS"), " beats");
511
+ case OpCode_1.OpCode.music_setInstrument:
512
+ return "set instrument to ".concat(i("INSTRUMENT"));
513
+ case OpCode_1.OpCode.music_midiSetInstrument:
514
+ return "set (old midi) instrument to ".concat(i("INSTRUMENT"), " :: music");
515
+ case OpCode_1.OpCode.music_setTempo:
516
+ return "set tempo to ".concat(i("TEMPO"));
517
+ case OpCode_1.OpCode.music_changeTempo:
518
+ return "change tempo by ".concat(i("TEMPO"));
519
+ case OpCode_1.OpCode.music_getTempo:
520
+ return "(tempo)";
521
+ // extension: pen ---------------------------------------------- //
522
+ case OpCode_1.OpCode.pen_clear:
523
+ return "erase all";
524
+ case OpCode_1.OpCode.pen_stamp:
525
+ return "stamp";
526
+ case OpCode_1.OpCode.pen_penDown:
527
+ return "pen down";
528
+ case OpCode_1.OpCode.pen_penUp:
529
+ return "pen up";
530
+ case OpCode_1.OpCode.pen_setPenColorToColor:
531
+ return "set pen color to ".concat(i("COLOR"));
532
+ case OpCode_1.OpCode.pen_changePenColorParamBy:
533
+ return "change pen ".concat(i("COLOR_PARAM"), " by ").concat(i("VALUE"));
534
+ case OpCode_1.OpCode.pen_setPenColorParamTo:
535
+ return "set pen ".concat(i("COLOR_PARAM"), " to ").concat(i("VALUE"));
536
+ case OpCode_1.OpCode.pen_changePenSizeBy:
537
+ return "change pen size by ".concat(i("SIZE"));
538
+ case OpCode_1.OpCode.pen_setPenSizeTo:
539
+ return "set pen size to ".concat(i("SIZE"));
540
+ case OpCode_1.OpCode.pen_changePenShadeBy:
541
+ return "change pen shade by ".concat(i("SHADE"));
542
+ case OpCode_1.OpCode.pen_setPenShadeToNumber:
543
+ return "set pen shade to ".concat(i("SHADE"));
544
+ case OpCode_1.OpCode.pen_changePenHueBy:
545
+ return "change pen color by ".concat(i("HUE"));
546
+ case OpCode_1.OpCode.pen_setPenHueToNumber:
547
+ return "set pen hue to ".concat(i("HUE"));
548
+ // extension: video sensing ----------------------------------- //
549
+ case OpCode_1.OpCode.videoSensing_whenMotionGreaterThan:
550
+ return "when video motion > ".concat(i("REFERENCE"));
551
+ case OpCode_1.OpCode.videoSensing_videoOn:
552
+ return "(video ".concat(i("ATTRIBUTE"), " on ").concat(i("SUBJECT"), ")");
553
+ case OpCode_1.OpCode.videoSensing_videoToggle:
554
+ return "turn video ".concat(i("VIDEO_STATE"));
555
+ case OpCode_1.OpCode.videoSensing_setVideoTransparency:
556
+ return "set video transparency to ".concat(i("TRANSPARENCY"));
557
+ // leftover menu "blocks" ----------------------------------- //
558
+ case OpCode_1.OpCode.motion_pointtowards_menu:
559
+ case OpCode_1.OpCode.motion_glideto_menu:
560
+ case OpCode_1.OpCode.motion_goto_menu:
561
+ case OpCode_1.OpCode.looks_costume:
562
+ case OpCode_1.OpCode.looks_backdrops:
563
+ case OpCode_1.OpCode.sound_sounds_menu:
564
+ case OpCode_1.OpCode.control_create_clone_of_menu:
565
+ case OpCode_1.OpCode.sensing_touchingobjectmenu:
566
+ case OpCode_1.OpCode.sensing_distancetomenu:
567
+ case OpCode_1.OpCode.sensing_keyoptions:
568
+ case OpCode_1.OpCode.sensing_of_object_menu:
569
+ case OpCode_1.OpCode.pen_menu_colorParam:
570
+ case OpCode_1.OpCode.music_menu_DRUM:
571
+ case OpCode_1.OpCode.music_menu_INSTRUMENT:
572
+ case OpCode_1.OpCode.videoSensing_menu_ATTRIBUTE:
573
+ case OpCode_1.OpCode.videoSensing_menu_SUBJECT:
574
+ case OpCode_1.OpCode.videoSensing_menu_VIDEO_STATE:
575
+ case OpCode_1.OpCode.wedo2_menu_MOTOR_ID:
576
+ case OpCode_1.OpCode.wedo2_menu_MOTOR_DIRECTION:
577
+ case OpCode_1.OpCode.wedo2_menu_TILT_DIRECTION:
578
+ case OpCode_1.OpCode.wedo2_menu_TILT_DIRECTION_ANY:
579
+ return "";
580
+ default:
581
+ return "unknown block [".concat(block.opcode, "] \\(").concat(Object.keys(block.inputs)
582
+ .map(function (k) { return "[".concat(k, "]"); })
583
+ .join(", "), "\\)");
584
+ }
585
+ }
586
+ function blocksToScratchblocks(blocks, target) {
587
+ return blocks.map(function (b) { return blockToScratchblocks(b, target); }).join("\n");
588
+ }
589
+ function scriptToScratchblocks(script, target) {
590
+ return blocksToScratchblocks(script.blocks, target);
591
+ }
592
+ var targets = {};
593
+ var _loop_1 = function (target) {
594
+ targets[target.name] = target.scripts
595
+ .map(function (script) { return scriptToScratchblocks(script, target); })
596
+ .filter(function (scratchblocks) { return scratchblocks.length > 0; })
597
+ .join("\n\n");
598
+ };
599
+ for (var _i = 0, _a = __spreadArray([project.stage], project.sprites, true); _i < _a.length; _i++) {
600
+ var target = _a[_i];
601
+ _loop_1(target);
602
+ }
603
+ return targets;
604
+ }
605
+ exports.default = toScratchblocks;
606
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9TY3JhdGNoYmxvY2tzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lvL3NjcmF0Y2hibG9ja3MvdG9TY3JhdGNoYmxvY2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFLQSx1Q0FBc0M7QUFNdEMsU0FBd0IsZUFBZSxDQUNyQyxPQUFnQixFQUNoQixTQUErQztJQUEvQywwQkFBQSxFQUFBLGNBQStDO0lBSS9DLElBQU0sY0FBYyxHQUEyQjtRQUM3QyxNQUFNLEVBQUUsSUFBSTtLQUNiLENBQUM7SUFDRixJQUFNLE9BQU8seUJBQVEsY0FBYyxHQUFLLFNBQVMsQ0FBRSxDQUFDO0lBRXBELFNBQVMsTUFBTSxDQUFDLEdBQVc7UUFDekIsT0FBTyxHQUFHO2FBQ1AsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNYLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFsQixDQUFrQixDQUFDO2FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBUyxLQUFLLENBQUMsR0FBbUIsRUFBRSxNQUFjLEVBQUUsSUFBWTtRQUFaLHFCQUFBLEVBQUEsWUFBWTtRQUM5RCxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1IsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELElBQU0sTUFBTSxHQUFHLFVBQUMsS0FBYSxJQUFhLE9BQUEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxVQUFBLENBQUMsSUFBSSxPQUFBLElBQUksR0FBRyxDQUFDLEVBQVIsQ0FBUSxDQUFDLEVBQTlELENBQThELENBQUM7UUFFekcsUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ2hCLEtBQUssUUFBUTtnQkFDWCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSyxR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