scratchblocks-plus 1.0.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.
Files changed (119) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +193 -0
  3. package/browser.es.js +8 -0
  4. package/browser.js +8 -0
  5. package/build/scratchblocks-plus.min.es.js +12 -0
  6. package/build/scratchblocks-plus.min.es.js.map +1 -0
  7. package/build/scratchblocks-plus.min.js +12 -0
  8. package/build/scratchblocks-plus.min.js.map +1 -0
  9. package/build/translations-all-es.js +11 -0
  10. package/build/translations-all-es.js.map +1 -0
  11. package/build/translations-all.js +11 -0
  12. package/build/translations-all.js.map +1 -0
  13. package/build/translations-es.js +11 -0
  14. package/build/translations-es.js.map +1 -0
  15. package/build/translations.js +11 -0
  16. package/build/translations.js.map +1 -0
  17. package/index.d.ts +297 -0
  18. package/index.js +229 -0
  19. package/locales/ab.json +1630 -0
  20. package/locales/af.json +1630 -0
  21. package/locales/all.d.ts +108 -0
  22. package/locales/all.js +161 -0
  23. package/locales/am.json +1925 -0
  24. package/locales/an.json +1630 -0
  25. package/locales/ar.json +1924 -0
  26. package/locales/ast.json +1630 -0
  27. package/locales/az.json +1925 -0
  28. package/locales/be.json +1630 -0
  29. package/locales/bg.json +1924 -0
  30. package/locales/bn.json +1630 -0
  31. package/locales/ca.json +1930 -0
  32. package/locales/ckb.json +1630 -0
  33. package/locales/cs.json +1930 -0
  34. package/locales/cy.json +1929 -0
  35. package/locales/da.json +1924 -0
  36. package/locales/de.json +1929 -0
  37. package/locales/el.json +1931 -0
  38. package/locales/eo.json +1630 -0
  39. package/locales/es-419.json +1924 -0
  40. package/locales/es.json +1929 -0
  41. package/locales/et.json +1924 -0
  42. package/locales/eu.json +1924 -0
  43. package/locales/fa.json +1929 -0
  44. package/locales/fi.json +1924 -0
  45. package/locales/fil.json +1631 -0
  46. package/locales/forums.js +37 -0
  47. package/locales/fr.json +1929 -0
  48. package/locales/fy.json +1630 -0
  49. package/locales/ga.json +1924 -0
  50. package/locales/gd.json +1929 -0
  51. package/locales/gl.json +1924 -0
  52. package/locales/ha.json +1630 -0
  53. package/locales/he.json +1929 -0
  54. package/locales/hi.json +1635 -0
  55. package/locales/hr.json +1929 -0
  56. package/locales/ht.json +1630 -0
  57. package/locales/hu.json +1930 -0
  58. package/locales/hy.json +1630 -0
  59. package/locales/id.json +1929 -0
  60. package/locales/is.json +1924 -0
  61. package/locales/it.json +1929 -0
  62. package/locales/ja-Hira.json +1637 -0
  63. package/locales/ja.json +1931 -0
  64. package/locales/ka.json +1630 -0
  65. package/locales/kk.json +1632 -0
  66. package/locales/km.json +1630 -0
  67. package/locales/ko.json +1924 -0
  68. package/locales/ku.json +1632 -0
  69. package/locales/lt.json +1924 -0
  70. package/locales/lv.json +1924 -0
  71. package/locales/mi.json +1924 -0
  72. package/locales/mn.json +1631 -0
  73. package/locales/nb.json +1929 -0
  74. package/locales/nl.json +1929 -0
  75. package/locales/nn.json +1630 -0
  76. package/locales/nso.json +1630 -0
  77. package/locales/oc.json +1630 -0
  78. package/locales/or.json +1631 -0
  79. package/locales/pl.json +1929 -0
  80. package/locales/pt-br.json +1924 -0
  81. package/locales/pt.json +1929 -0
  82. package/locales/qu.json +1630 -0
  83. package/locales/rap.json +1632 -0
  84. package/locales/ro.json +1929 -0
  85. package/locales/ru.json +1929 -0
  86. package/locales/sk.json +1924 -0
  87. package/locales/sl.json +1929 -0
  88. package/locales/sr.json +1924 -0
  89. package/locales/sv.json +1924 -0
  90. package/locales/sw.json +1630 -0
  91. package/locales/th.json +1924 -0
  92. package/locales/tn.json +1630 -0
  93. package/locales/tr.json +1932 -0
  94. package/locales/uk.json +1924 -0
  95. package/locales/uz.json +1631 -0
  96. package/locales/vi.json +1925 -0
  97. package/locales/xh.json +1630 -0
  98. package/locales/zh-cn.json +1930 -0
  99. package/locales/zh-tw.json +1930 -0
  100. package/locales/zu.json +1918 -0
  101. package/package.json +81 -0
  102. package/scratch2/blocks.js +1000 -0
  103. package/scratch2/draw.js +452 -0
  104. package/scratch2/filter.js +78 -0
  105. package/scratch2/index.js +12 -0
  106. package/scratch2/style.css.js +148 -0
  107. package/scratch2/style.js +214 -0
  108. package/scratch3/blocks.js +1134 -0
  109. package/scratch3/draw.js +334 -0
  110. package/scratch3/index.js +12 -0
  111. package/scratch3/style.css.js +280 -0
  112. package/scratch3/style.js +877 -0
  113. package/syntax/blocks.js +921 -0
  114. package/syntax/commands.js +1755 -0
  115. package/syntax/dropdowns.js +688 -0
  116. package/syntax/extensions.js +34 -0
  117. package/syntax/index.js +17 -0
  118. package/syntax/model.js +566 -0
  119. package/syntax/syntax.js +1091 -0
@@ -0,0 +1,688 @@
1
+ export const dropdowns = [
2
+ { id: "MOTION_GOTO_POINTER", value: "mouse-pointer" },
3
+ { id: "MOTION_GOTO_RANDOM", value: "random position" },
4
+ { id: "MOTION_GLIDETO_POINTER", value: "mouse-pointer" },
5
+ { id: "MOTION_GLIDETO_RANDOM", value: "random position" },
6
+ { id: "MOTION_POINTTOWARDS_POINTER", value: "mouse-pointer" },
7
+ { id: "MOTION_POINTTOWARDS_RANDOM", value: "random direction" },
8
+ { id: "MOTION_SETROTATIONSTYLE_LEFTRIGHT", value: "left-right" },
9
+ { id: "MOTION_SETROTATIONSTYLE_DONTROTATE", value: "don't rotate" },
10
+ { id: "MOTION_SETROTATIONSTYLE_ALLAROUND", value: "all around" },
11
+ {
12
+ id: "LOOKS_NEXTBACKDROP",
13
+ value: "next backdrop",
14
+ parents: ["LOOKS_SWITCHBACKDROPTO"],
15
+ },
16
+ {
17
+ id: "LOOKS_PREVIOUSBACKDROP",
18
+ value: "previous backdrop",
19
+ parents: ["LOOKS_SWITCHBACKDROPTO"],
20
+ },
21
+ {
22
+ id: "LOOKS_RANDOMBACKDROP",
23
+ value: "random backdrop",
24
+ parents: ["LOOKS_SWITCHBACKDROPTO"],
25
+ },
26
+ {
27
+ id: "LOOKS_EFFECT_COLOR",
28
+ value: "color",
29
+ parents: ["LOOKS_SETEFFECTTO", "LOOKS_CHANGEEFFECTBY"],
30
+ },
31
+ {
32
+ id: "LOOKS_EFFECT_FISHEYE",
33
+ value: "fisheye",
34
+ parents: ["LOOKS_SETEFFECTTO", "LOOKS_CHANGEEFFECTBY"],
35
+ },
36
+ {
37
+ id: "LOOKS_EFFECT_WHIRL",
38
+ value: "whirl",
39
+ parents: ["LOOKS_SETEFFECTTO", "LOOKS_CHANGEEFFECTBY"],
40
+ },
41
+ {
42
+ id: "LOOKS_EFFECT_PIXELATE",
43
+ value: "pixelate",
44
+ parents: ["LOOKS_SETEFFECTTO", "LOOKS_CHANGEEFFECTBY"],
45
+ },
46
+ {
47
+ id: "LOOKS_EFFECT_MOSAIC",
48
+ value: "mosaic",
49
+ parents: ["LOOKS_SETEFFECTTO", "LOOKS_CHANGEEFFECTBY"],
50
+ },
51
+ {
52
+ id: "LOOKS_EFFECT_BRIGHTNESS",
53
+ value: "brightness",
54
+ parents: ["LOOKS_SETEFFECTTO", "LOOKS_CHANGEEFFECTBY"],
55
+ },
56
+ {
57
+ id: "LOOKS_EFFECT_GHOST",
58
+ value: "ghost",
59
+ parents: ["LOOKS_SETEFFECTTO", "LOOKS_CHANGEEFFECTBY"],
60
+ },
61
+ { id: "LOOKS_GOTOFRONTBACK_FRONT", value: "front" },
62
+ { id: "LOOKS_GOTOFRONTBACK_BACK", value: "back" },
63
+ { id: "LOOKS_GOFORWARDBACKWARDLAYERS_FORWARD", value: "forward" },
64
+ { id: "LOOKS_GOFORWARDBACKWARDLAYERS_BACKWARD", value: "backward" },
65
+ {
66
+ id: "LOOKS_NUMBERNAME_NUMBER",
67
+ value: "number",
68
+ parents: ["LOOKS_COSTUMENUMBERNAME", "LOOKS_BACKDROPNUMBERNAME"],
69
+ },
70
+ {
71
+ id: "LOOKS_NUMBERNAME_NAME",
72
+ value: "name",
73
+ parents: ["LOOKS_COSTUMENUMBERNAME", "LOOKS_BACKDROPNUMBERNAME"],
74
+ },
75
+ {
76
+ id: "SOUND_EFFECTS_PITCH",
77
+ value: "pitch",
78
+ parents: ["SOUND_CHANGEEFFECTBY", "SOUND_SETEFFECTO"],
79
+ },
80
+ {
81
+ id: "SOUND_EFFECTS_PAN",
82
+ value: "pan left/right",
83
+ parents: ["SOUND_CHANGEEFFECTBY", "SOUND_SETEFFECTO"],
84
+ },
85
+ {
86
+ id: "EVENT_WHENKEYPRESSED_SPACE",
87
+ value: "space",
88
+ parents: [
89
+ "EVENT_WHENKEYPRESSED",
90
+ "SENSING_KEYPRESSED",
91
+ "makeymakey.whenKeyPressed",
92
+ ],
93
+ },
94
+ {
95
+ id: "EVENT_WHENKEYPRESSED_LEFT",
96
+ value: "left arrow",
97
+ parents: [
98
+ "EVENT_WHENKEYPRESSED",
99
+ "SENSING_KEYPRESSED",
100
+ "makeymakey.whenKeyPressed",
101
+ ],
102
+ },
103
+ {
104
+ id: "EVENT_WHENKEYPRESSED_RIGHT",
105
+ value: "right arrow",
106
+ parents: [
107
+ "EVENT_WHENKEYPRESSED",
108
+ "SENSING_KEYPRESSED",
109
+ "makeymakey.whenKeyPressed",
110
+ ],
111
+ },
112
+ {
113
+ id: "EVENT_WHENKEYPRESSED_DOWN",
114
+ value: "down arrow",
115
+ parents: [
116
+ "EVENT_WHENKEYPRESSED",
117
+ "SENSING_KEYPRESSED",
118
+ "makeymakey.whenKeyPressed",
119
+ ],
120
+ },
121
+ {
122
+ id: "EVENT_WHENKEYPRESSED_UP",
123
+ value: "up arrow",
124
+ parents: [
125
+ "EVENT_WHENKEYPRESSED",
126
+ "SENSING_KEYPRESSED",
127
+ "makeymakey.whenKeyPressed",
128
+ ],
129
+ },
130
+ {
131
+ id: "EVENT_WHENKEYPRESSED_ANY",
132
+ value: "any",
133
+ parents: ["EVENT_WHENKEYPRESSED", "SENSING_KEYPRESSED"],
134
+ },
135
+ {
136
+ id: "EVENT_WHENGREATERTHAN_TIMER",
137
+ value: "timer",
138
+ parents: ["EVENT_WHENGREATERTHAN"],
139
+ },
140
+ {
141
+ id: "EVENT_WHENGREATERTHAN_LOUDNESS",
142
+ value: "loudness",
143
+ parents: ["EVENT_WHENGREATERTHAN"],
144
+ },
145
+ { id: "CONTROL_STOP_ALL", value: "all" },
146
+ { id: "CONTROL_STOP_THIS", value: "this script" },
147
+ { id: "CONTROL_STOP_OTHER", value: "other scripts in sprite" },
148
+ { id: "CONTROL_CREATECLONEOF_MYSELF", value: "myself" },
149
+ { id: "SENSING_TOUCHINGOBJECT_POINTER", value: "mouse-pointer" },
150
+ { id: "SENSING_TOUCHINGOBJECT_EDGE", value: "edge" },
151
+ { id: "SENSING_DISTANCETO_POINTER", value: "mouse-pointer" },
152
+ { id: "SENSING_SETDRAGMODE_DRAGGABLE", value: "draggable" },
153
+ { id: "SENSING_SETDRAGMODE_NOTDRAGGABLE", value: "not draggable" },
154
+ { id: "SENSING_OF_XPOSITION", value: "x position" },
155
+ { id: "SENSING_OF_YPOSITION", value: "y position" },
156
+ { id: "SENSING_OF_DIRECTION", value: "direction" },
157
+ { id: "SENSING_OF_COSTUMENUMBER", value: "costume #" },
158
+ { id: "SENSING_OF_COSTUMENAME", value: "costume name" },
159
+ { id: "SENSING_OF_SIZE", value: "size" },
160
+ { id: "SENSING_OF_VOLUME", value: "volume" },
161
+ { id: "SENSING_OF_BACKDROPNUMBER", value: "backdrop #" },
162
+ { id: "SENSING_OF_BACKDROPNAME", value: "backdrop name" },
163
+ { id: "SENSING_OF_STAGE", value: "Stage" },
164
+ { id: "SENSING_CURRENT_YEAR", value: "year" },
165
+ { id: "SENSING_CURRENT_MONTH", value: "month" },
166
+ { id: "SENSING_CURRENT_DATE", value: "date" },
167
+ { id: "SENSING_CURRENT_DAYOFWEEK", value: "day of week" },
168
+ { id: "SENSING_CURRENT_HOUR", value: "hour" },
169
+ { id: "SENSING_CURRENT_MINUTE", value: "minute" },
170
+ { id: "SENSING_CURRENT_SECOND", value: "second" },
171
+ { id: "OPERATORS_MATHOP_ABS", value: "abs" },
172
+ { id: "OPERATORS_MATHOP_FLOOR", value: "floor" },
173
+ { id: "OPERATORS_MATHOP_CEILING", value: "ceiling" },
174
+ { id: "OPERATORS_MATHOP_SQRT", value: "sqrt" },
175
+ { id: "OPERATORS_MATHOP_SIN", value: "sin" },
176
+ { id: "OPERATORS_MATHOP_COS", value: "cos" },
177
+ { id: "OPERATORS_MATHOP_TAN", value: "tan" },
178
+ { id: "OPERATORS_MATHOP_ASIN", value: "asin" },
179
+ { id: "OPERATORS_MATHOP_ACOS", value: "acos" },
180
+ { id: "OPERATORS_MATHOP_ATAN", value: "atan" },
181
+ { id: "OPERATORS_MATHOP_LN", value: "ln" },
182
+ { id: "OPERATORS_MATHOP_LOG", value: "log" },
183
+ { id: "OPERATORS_MATHOP_EEXP", value: "e ^" },
184
+ { id: "OPERATORS_MATHOP_10EXP", value: "10 ^" },
185
+ { id: "music.drumSnare", value: "(1) Snare Drum" },
186
+ { id: "music.drumBass", value: "(2) Bass Drum" },
187
+ { id: "music.drumSideStick", value: "(3) Side Stick" },
188
+ { id: "music.drumCrashCymbal", value: "(4) Crash Cymbal" },
189
+ { id: "music.drumOpenHiHat", value: "(5) Open Hi-Hat" },
190
+ { id: "music.drumClosedHiHat", value: "(6) Closed Hi-Hat" },
191
+ { id: "music.drumTambourine", value: "(7) Tambourine" },
192
+ { id: "music.drumHandClap", value: "(8) Hand Clap" },
193
+ { id: "music.drumClaves", value: "(9) Claves" },
194
+ { id: "music.drumWoodBlock", value: "(10) Wood Block" },
195
+ { id: "music.drumCowbell", value: "(11) Cowbell" },
196
+ { id: "music.drumTriangle", value: "(12) Triangle" },
197
+ { id: "music.drumBongo", value: "(13) Bongo" },
198
+ { id: "music.drumConga", value: "(14) Conga" },
199
+ { id: "music.drumCabasa", value: "(15) Cabasa" },
200
+ { id: "music.drumGuiro", value: "(16) Guiro" },
201
+ { id: "music.drumVibraslap", value: "(17) Vibraslap" },
202
+ { id: "music.drumCuica", value: "(18) Cuica" },
203
+ { id: "music.instrumentPiano", value: "(1) Piano" },
204
+ { id: "music.instrumentElectricPiano", value: "(2) Electric Piano" },
205
+ { id: "music.instrumentOrgan", value: "(3) Organ" },
206
+ { id: "music.instrumentGuitar", value: "(4) Guitar" },
207
+ { id: "music.instrumentElectricGuitar", value: "(5) Electric Guitar" },
208
+ { id: "music.instrumentBass", value: "(6) Bass" },
209
+ { id: "music.instrumentPizzicato", value: "(7) Pizzicato" },
210
+ { id: "music.instrumentCello", value: "(8) Cello" },
211
+ { id: "music.instrumentTrombone", value: "(9) Trombone" },
212
+ { id: "music.instrumentClarinet", value: "(10) Clarinet" },
213
+ { id: "music.instrumentSaxophone", value: "(11) Saxophone" },
214
+ { id: "music.instrumentFlute", value: "(12) Flute" },
215
+ { id: "music.instrumentWoodenFlute", value: "(13) Wooden Flute" },
216
+ { id: "music.instrumentBassoon", value: "(14) Bassoon" },
217
+ { id: "music.instrumentChoir", value: "(15) Choir" },
218
+ { id: "music.instrumentVibraphone", value: "(16) Vibraphone" },
219
+ { id: "music.instrumentMusicBox", value: "(17) Music Box" },
220
+ { id: "music.instrumentSteelDrum", value: "(18) Steel Drum" },
221
+ { id: "music.instrumentMarimba", value: "(19) Marimba" },
222
+ { id: "music.instrumentSynthLead", value: "(20) Synth Lead" },
223
+ { id: "music.instrumentSynthPad", value: "(21) Synth Pad" },
224
+ {
225
+ id: "pen.colorMenu.color",
226
+ value: "color",
227
+ parents: ["pen.setColorParam", "pen.changeColorParam"],
228
+ },
229
+ {
230
+ id: "pen.colorMenu.saturation",
231
+ value: "saturation",
232
+ parents: ["pen.setColorParam", "pen.changeColorParam"],
233
+ },
234
+ {
235
+ id: "pen.colorMenu.brightness",
236
+ value: "brightness",
237
+ parents: ["pen.setColorParam", "pen.changeColorParam"],
238
+ },
239
+ {
240
+ id: "pen.colorMenu.transparency",
241
+ value: "transparency",
242
+ parents: ["pen.setColorParam", "pen.changeColorParam"],
243
+ },
244
+ {
245
+ id: "videoSensing.direction",
246
+ value: "direction",
247
+ parents: ["videoSensing.videoOn"],
248
+ },
249
+ {
250
+ id: "videoSensing.motion",
251
+ value: "motion",
252
+ parents: ["videoSensing.videoOn"],
253
+ },
254
+ {
255
+ id: "videoSensing.sprite",
256
+ value: "sprite",
257
+ parents: ["videoSensing.videoOn"],
258
+ },
259
+ {
260
+ id: "videoSensing.stage",
261
+ value: "stage",
262
+ parents: ["videoSensing.videoOn"],
263
+ },
264
+ {
265
+ id: "videoSensing.off",
266
+ value: "off",
267
+ parents: ["videoSensing.videoToggle"],
268
+ },
269
+ { id: "videoSensing.on", value: "on", parents: ["videoSensing.videoToggle"] },
270
+ {
271
+ id: "videoSensing.onFlipped",
272
+ value: "on flipped",
273
+ parents: ["videoSensing.videoToggle"],
274
+ },
275
+ {
276
+ id: "text2speech.alto",
277
+ value: "alto",
278
+ parents: ["text2speech.setVoiceBlock"],
279
+ },
280
+ {
281
+ id: "text2speech.tenor",
282
+ value: "tenor",
283
+ parents: ["text2speech.setVoiceBlock"],
284
+ },
285
+ {
286
+ id: "text2speech.squeak",
287
+ value: "squeak",
288
+ parents: ["text2speech.setVoiceBlock"],
289
+ },
290
+ {
291
+ id: "text2speech.giant",
292
+ value: "giant",
293
+ parents: ["text2speech.setVoiceBlock"],
294
+ },
295
+ {
296
+ id: "text2speech.kitten",
297
+ value: "kitten",
298
+ parents: ["text2speech.setVoiceBlock"],
299
+ },
300
+ {
301
+ id: "makeymakey.upArrowShort",
302
+ value: "up",
303
+ parents: ["makeymakey.whenKeyPressed"],
304
+ },
305
+ {
306
+ id: "makeymakey.downArrowShort",
307
+ value: "down",
308
+ parents: ["makeymakey.whenKeyPressed"],
309
+ },
310
+ {
311
+ id: "makeymakey.leftArrowShort",
312
+ value: "left",
313
+ parents: ["makeymakey.whenKeyPressed"],
314
+ },
315
+ {
316
+ id: "makeymakey.rightArrowShort",
317
+ value: "right",
318
+ parents: ["makeymakey.whenKeyPressed"],
319
+ },
320
+ {
321
+ id: "microbit.buttonsMenu.any",
322
+ value: "any",
323
+ parents: ["microbit.whenButtonPressed", "microbit.isButtonPressed"],
324
+ },
325
+ {
326
+ id: "microbit.gesturesMenu.jumped",
327
+ value: "jumped",
328
+ parents: ["microbit.whenGesture"],
329
+ },
330
+ {
331
+ id: "microbit.gesturesMenu.moved",
332
+ value: "moved",
333
+ parents: ["microbit.whenGesture"],
334
+ },
335
+ {
336
+ id: "microbit.gesturesMenu.shaken",
337
+ value: "shaken",
338
+ parents: ["microbit.whenGesture"],
339
+ },
340
+ {
341
+ id: "microbit.tiltDirectionMenu.any",
342
+ value: "any",
343
+ parents: ["microbit.whenTilted", "microbit.isTilted"],
344
+ },
345
+ {
346
+ id: "microbit.tiltDirectionMenu.back",
347
+ value: "back",
348
+ parents: ["microbit.whenTilted", "microbit.isTilted", "microbit.tiltAngle"],
349
+ },
350
+ {
351
+ id: "microbit.tiltDirectionMenu.front",
352
+ value: "front",
353
+ parents: ["microbit.whenTilted", "microbit.isTilted", "microbit.tiltAngle"],
354
+ },
355
+ {
356
+ id: "microbit.tiltDirectionMenu.left",
357
+ value: "left",
358
+ parents: ["microbit.whenTilted", "microbit.isTilted", "microbit.tiltAngle"],
359
+ },
360
+ {
361
+ id: "microbit.tiltDirectionMenu.right",
362
+ value: "right",
363
+ parents: ["microbit.whenTilted", "microbit.isTilted", "microbit.tiltAngle"],
364
+ },
365
+ {
366
+ id: "boost.motorDirection.backward",
367
+ value: "that way",
368
+ parents: ["boost.setMotorDirection"],
369
+ },
370
+ {
371
+ id: "boost.motorDirection.forward",
372
+ value: "this way",
373
+ parents: ["boost.setMotorDirection"],
374
+ },
375
+ {
376
+ id: "boost.motorDirection.reverse",
377
+ value: "reverse",
378
+ parents: ["boost.setMotorDirection"],
379
+ },
380
+ {
381
+ id: "boost.color.any",
382
+ value: "any color",
383
+ parents: ["boost.whenColor", "boost.seeingColor"],
384
+ },
385
+ {
386
+ id: "boost.color.black",
387
+ value: "black",
388
+ parents: ["boost.whenColor", "boost.seeingColor"],
389
+ },
390
+ {
391
+ id: "boost.color.blue",
392
+ value: "blue",
393
+ parents: ["boost.whenColor", "boost.seeingColor"],
394
+ },
395
+ {
396
+ id: "boost.color.green",
397
+ value: "green",
398
+ parents: ["boost.whenColor", "boost.seeingColor"],
399
+ },
400
+ {
401
+ id: "boost.color.red",
402
+ value: "red",
403
+ parents: ["boost.whenColor", "boost.seeingColor"],
404
+ },
405
+ {
406
+ id: "boost.color.white",
407
+ value: "white",
408
+ parents: ["boost.whenColor", "boost.seeingColor"],
409
+ },
410
+ {
411
+ id: "boost.color.yellow",
412
+ value: "yellow",
413
+ parents: ["boost.whenColor", "boost.seeingColor"],
414
+ },
415
+ {
416
+ id: "boost.tiltDirection.any",
417
+ value: "any",
418
+ parents: ["boost.whenTilted"],
419
+ },
420
+ {
421
+ id: "boost.tiltDirection.up",
422
+ value: "up",
423
+ parents: ["boost.whenTilted", "boost.getTiltAngle"],
424
+ },
425
+ {
426
+ id: "boost.tiltDirection.down",
427
+ value: "down",
428
+ parents: ["boost.whenTilted", "boost.getTiltAngle"],
429
+ },
430
+ {
431
+ id: "boost.tiltDirection.left",
432
+ value: "left",
433
+ parents: ["boost.whenTilted", "boost.getTiltAngle"],
434
+ },
435
+ {
436
+ id: "boost.tiltDirection.right",
437
+ value: "right",
438
+ parents: ["boost.whenTilted", "boost.getTiltAngle"],
439
+ },
440
+ {
441
+ id: "wedo2.motorId.a",
442
+ value: "motor A",
443
+ parents: [
444
+ "wedo2.motorOnFor",
445
+ "wedo2.motorOn",
446
+ "wedo2.motorOff",
447
+ "wedo2.startMotorPower",
448
+ "wedo2.setMotorDirection",
449
+ ],
450
+ },
451
+ {
452
+ id: "wedo2.motorId.b",
453
+ value: "motor B",
454
+ parents: [
455
+ "wedo2.motorOnFor",
456
+ "wedo2.motorOn",
457
+ "wedo2.motorOff",
458
+ "wedo2.startMotorPower",
459
+ "wedo2.setMotorDirection",
460
+ ],
461
+ },
462
+ {
463
+ id: "wedo2.motorId.all",
464
+ value: "all motors",
465
+ parents: [
466
+ "wedo2.motorOnFor",
467
+ "wedo2.motorOn",
468
+ "wedo2.motorOff",
469
+ "wedo2.startMotorPower",
470
+ "wedo2.setMotorDirection",
471
+ ],
472
+ },
473
+ {
474
+ id: "wedo2.motorId.default",
475
+ value: "motor",
476
+ parents: [
477
+ "wedo2.motorOnFor",
478
+ "wedo2.motorOn",
479
+ "wedo2.motorOff",
480
+ "wedo2.startMotorPower",
481
+ "wedo2.setMotorDirection",
482
+ ],
483
+ },
484
+ {
485
+ id: "wedo2.motorDirection.forward",
486
+ value: "this way",
487
+ parents: ["wedo2.setMotorDirection"],
488
+ },
489
+ {
490
+ id: "wedo2.motorDirection.backward",
491
+ value: "that way",
492
+ parents: ["wedo2.setMotorDirection"],
493
+ },
494
+ {
495
+ id: "wedo2.motorDirection.reverse",
496
+ value: "reverse",
497
+ parents: ["wedo2.setMotorDirection"],
498
+ },
499
+ {
500
+ id: "wedo2.tiltDirection.any",
501
+ value: "any",
502
+ parents: ["wedo2.whenTilted", "wedo2.isTilted"],
503
+ },
504
+ {
505
+ id: "wedo2.tiltDirection.up",
506
+ value: "up",
507
+ parents: ["wedo2.whenTilted", "wedo2.isTilted", "wedo2.getTiltAngle"],
508
+ },
509
+ {
510
+ id: "wedo2.tiltDirection.down",
511
+ value: "down",
512
+ parents: ["wedo2.whenTilted", "wedo2.isTilted", "wedo2.getTiltAngle"],
513
+ },
514
+ {
515
+ id: "wedo2.tiltDirection.left",
516
+ value: "left",
517
+ parents: ["wedo2.whenTilted", "wedo2.isTilted", "wedo2.getTiltAngle"],
518
+ },
519
+ {
520
+ id: "wedo2.tiltDirection.right",
521
+ value: "right",
522
+ parents: ["wedo2.whenTilted", "wedo2.isTilted", "wedo2.getTiltAngle"],
523
+ },
524
+ {
525
+ id: "gdxfor.pulled",
526
+ value: "pulled",
527
+ parents: ["gdxfor.whenForcePushedOrPulled"],
528
+ },
529
+ {
530
+ id: "gdxfor.pushed",
531
+ value: "pushed",
532
+ parents: ["gdxfor.whenForcePushedOrPulled"],
533
+ },
534
+ { id: "gdxfor.shaken", value: "shaken", parents: ["gdxfor.whenGesture"] },
535
+ {
536
+ id: "gdxfor.startedFalling",
537
+ value: "started falling",
538
+ parents: ["gdxfor.whenGesture"],
539
+ },
540
+ {
541
+ id: "gdxfor.turnedFaceDown",
542
+ value: "turned face down",
543
+ parents: ["gdxfor.whenGesture"],
544
+ },
545
+ {
546
+ id: "gdxfor.turnedFaceUp",
547
+ value: "turned face up",
548
+ parents: ["gdxfor.whenGesture"],
549
+ },
550
+ {
551
+ id: "gdxfor.tiltDirectionMenu.front",
552
+ value: "front",
553
+ parents: ["gdxfor.whenTilted", "gdxfor.isTilted", "gdxfor.getTilt"],
554
+ },
555
+ {
556
+ id: "gdxfor.tiltDirectionMenu.back",
557
+ value: "back",
558
+ parents: ["gdxfor.whenTilted", "gdxfor.isTilted", "gdxfor.getTilt"],
559
+ },
560
+ {
561
+ id: "gdxfor.tiltDirectionMenu.left",
562
+ value: "left",
563
+ parents: ["gdxfor.whenTilted", "gdxfor.isTilted", "gdxfor.getTilt"],
564
+ },
565
+ {
566
+ id: "gdxfor.tiltDirectionMenu.right",
567
+ value: "right",
568
+ parents: ["gdxfor.whenTilted", "gdxfor.isTilted", "gdxfor.getTilt"],
569
+ },
570
+ {
571
+ id: "gdxfor.tiltDirectionMenu.any",
572
+ value: "any",
573
+ parents: ["gdxfor.whenTilted", "gdxfor.isTilted"],
574
+ },
575
+ ]
576
+
577
+ const scratchSpokenLanguageCodes = [
578
+ "ar",
579
+ "zh-cn",
580
+ "da",
581
+ "nl",
582
+ "en",
583
+ "fr",
584
+ "de",
585
+ "hi",
586
+ "is",
587
+ "it",
588
+ "ja",
589
+ "ko",
590
+ "nb",
591
+ "pl",
592
+ "pt-br",
593
+ "pt",
594
+ "ro",
595
+ "ru",
596
+ "es",
597
+ "es-419",
598
+ "sv",
599
+ "tr",
600
+ "cy",
601
+ ]
602
+
603
+ function getSpokenLanguageMenu(lang, languageNames, localeNames) {
604
+ const localizedNameMap = {}
605
+ let nameArray = languageNames.menuMap[lang]
606
+ if (nameArray) {
607
+ let spokenNameArray = []
608
+ if (languageNames.spokenLanguages) {
609
+ spokenNameArray = languageNames.spokenLanguages[lang]
610
+ nameArray = nameArray.concat(spokenNameArray)
611
+ }
612
+ nameArray.forEach(lang => {
613
+ localizedNameMap[lang.code] = lang.name
614
+ })
615
+ }
616
+
617
+ return Object.keys(localeNames).map(key => {
618
+ let name = localeNames[key].name
619
+ const localizedName = localizedNameMap[key]
620
+ if (localizedName) {
621
+ name = localizedName
622
+ }
623
+ name = name.charAt(0).toUpperCase() + name.slice(1)
624
+ return { text: name, value: key }
625
+ })
626
+ }
627
+
628
+ export function getLanguageDropdowns(lang, languageNames, localeNames) {
629
+ const localeDropdowns = {}
630
+ languageNames.menuMap[lang]?.forEach(info => {
631
+ localeDropdowns[`translate.language.${info.code}`] = {
632
+ value: info.name,
633
+ parents: ["translate.translateBlock"],
634
+ }
635
+ })
636
+ getSpokenLanguageMenu(lang, languageNames, localeNames).forEach(info => {
637
+ if (scratchSpokenLanguageCodes.includes(info.value)) {
638
+ localeDropdowns[`text2speech.language.${info.value}`] = {
639
+ value: info.text,
640
+ parents: ["text2speech.setLanguageBlock"],
641
+ }
642
+ }
643
+ })
644
+ return localeDropdowns
645
+ }
646
+
647
+ export function getMakeyMakeySequenceDropdowns(dropdowns) {
648
+ const raw = [
649
+ "left up right",
650
+ "right up left",
651
+ "left right",
652
+ "right left",
653
+ "up down",
654
+ "down up",
655
+ "up right down left",
656
+ "up left down right",
657
+ "up up down down left right left right",
658
+ ]
659
+ const result = {}
660
+ raw.forEach((value, index) => {
661
+ result[`makeymakey.sequence.${index}`] = {
662
+ value: value
663
+ .replaceAll("left", dropdowns["makeymakey.leftArrowShort"].value)
664
+ .replaceAll("right", dropdowns["makeymakey.rightArrowShort"].value)
665
+ .replaceAll("up", dropdowns["makeymakey.upArrowShort"].value)
666
+ .replaceAll("down", dropdowns["makeymakey.downArrowShort"].value),
667
+ parents: ["makeymakey.whenKeysPressedInOrder"],
668
+ }
669
+ })
670
+ return result
671
+ }
672
+
673
+ export function getDropdowns() {
674
+ dropdowns.forEach(item => {
675
+ if (!item.parents) {
676
+ if (item.id.startsWith("music.drum")) {
677
+ item.parents = ["music.playDrumForBeats"]
678
+ } else if (item.id.startsWith("music.instrument")) {
679
+ item.parents = ["music.setInstrument"]
680
+ } else {
681
+ const idx = item.id.lastIndexOf("_")
682
+ const parent = idx !== -1 ? item.id.substring(0, idx) : null
683
+ item.parents = parent ? [parent] : null
684
+ }
685
+ }
686
+ })
687
+ return dropdowns
688
+ }