@blockdia/scratch-blocks 0.1.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 (243) hide show
  1. package/.nvmrc +1 -0
  2. package/LICENSE +674 -0
  3. package/README.md +57 -0
  4. package/TRADEMARK +1 -0
  5. package/blockly_compressed_horizontal.js +2268 -0
  6. package/blockly_compressed_vertical.js +2296 -0
  7. package/blockly_uncompressed_horizontal.js +1212 -0
  8. package/blockly_uncompressed_vertical.js +1212 -0
  9. package/blocks_common/colour.js +61 -0
  10. package/blocks_common/math.js +159 -0
  11. package/blocks_common/matrix.js +54 -0
  12. package/blocks_common/note.js +58 -0
  13. package/blocks_common/text.js +57 -0
  14. package/blocks_compressed.js +37 -0
  15. package/blocks_compressed_horizontal.js +68 -0
  16. package/blocks_compressed_vertical.js +216 -0
  17. package/blocks_horizontal/control.js +212 -0
  18. package/blocks_horizontal/default_toolbox.js +139 -0
  19. package/blocks_horizontal/event.js +190 -0
  20. package/blocks_horizontal/wedo.js +325 -0
  21. package/blocks_vertical/control.js +532 -0
  22. package/blocks_vertical/data.js +666 -0
  23. package/blocks_vertical/default_toolbox.js +571 -0
  24. package/blocks_vertical/event.js +329 -0
  25. package/blocks_vertical/extensions.js +294 -0
  26. package/blocks_vertical/looks.js +591 -0
  27. package/blocks_vertical/motion.js +587 -0
  28. package/blocks_vertical/operators.js +470 -0
  29. package/blocks_vertical/procedures.js +1051 -0
  30. package/blocks_vertical/sensing.js +555 -0
  31. package/blocks_vertical/sound.js +246 -0
  32. package/blocks_vertical/vertical_extensions.js +289 -0
  33. package/build/gen_blocks.js +1 -0
  34. package/build/test_expect.js +1 -0
  35. package/build/test_input.js +1 -0
  36. package/build.py +647 -0
  37. package/cleanup.sh +101 -0
  38. package/core/block.js +1837 -0
  39. package/core/block_animations.js +107 -0
  40. package/core/block_drag_surface.js +299 -0
  41. package/core/block_dragger.js +424 -0
  42. package/core/block_events.js +531 -0
  43. package/core/block_render_svg_horizontal.js +892 -0
  44. package/core/block_render_svg_vertical.js +1734 -0
  45. package/core/block_svg.js +1355 -0
  46. package/core/blockly.js +620 -0
  47. package/core/blocks.js +37 -0
  48. package/core/bubble.js +664 -0
  49. package/core/bubble_dragger.js +285 -0
  50. package/core/colours.js +177 -0
  51. package/core/comment.js +293 -0
  52. package/core/comment_events.js +539 -0
  53. package/core/connection.js +776 -0
  54. package/core/connection_db.js +300 -0
  55. package/core/constants.js +408 -0
  56. package/core/contextmenu.js +534 -0
  57. package/core/css.js +1354 -0
  58. package/core/data_category.js +490 -0
  59. package/core/dragged_connection_manager.js +260 -0
  60. package/core/dropdowndiv.js +408 -0
  61. package/core/events.js +429 -0
  62. package/core/events_abstract.js +113 -0
  63. package/core/extensions.js +450 -0
  64. package/core/field.js +810 -0
  65. package/core/field_angle.js +410 -0
  66. package/core/field_checkbox.js +133 -0
  67. package/core/field_colour.js +253 -0
  68. package/core/field_colour_slider.js +387 -0
  69. package/core/field_date.js +353 -0
  70. package/core/field_dropdown.js +447 -0
  71. package/core/field_iconmenu.js +309 -0
  72. package/core/field_image.js +200 -0
  73. package/core/field_label.js +136 -0
  74. package/core/field_label_serializable.js +125 -0
  75. package/core/field_matrix.js +566 -0
  76. package/core/field_note.js +850 -0
  77. package/core/field_number.js +366 -0
  78. package/core/field_numberdropdown.js +77 -0
  79. package/core/field_textdropdown.js +164 -0
  80. package/core/field_textinput.js +675 -0
  81. package/core/field_textinput_removable.js +105 -0
  82. package/core/field_variable.js +385 -0
  83. package/core/field_variable_getter.js +185 -0
  84. package/core/field_vertical_separator.js +161 -0
  85. package/core/flyout_base.js +935 -0
  86. package/core/flyout_button.js +324 -0
  87. package/core/flyout_dragger.js +83 -0
  88. package/core/flyout_extension_category_header.js +159 -0
  89. package/core/flyout_horizontal.js +475 -0
  90. package/core/flyout_vertical.js +770 -0
  91. package/core/generator.js +426 -0
  92. package/core/gesture.js +1010 -0
  93. package/core/grid.js +227 -0
  94. package/core/icon.js +205 -0
  95. package/core/inject.js +496 -0
  96. package/core/input.js +285 -0
  97. package/core/insertion_marker_manager.js +678 -0
  98. package/core/intersection_observer.js +102 -0
  99. package/core/msg.js +62 -0
  100. package/core/mutator.js +426 -0
  101. package/core/names.js +198 -0
  102. package/core/options.js +244 -0
  103. package/core/procedures.js +739 -0
  104. package/core/rendered_connection.js +417 -0
  105. package/core/scratch_block_comment.js +646 -0
  106. package/core/scratch_blocks_utils.js +246 -0
  107. package/core/scratch_bubble.js +699 -0
  108. package/core/scratch_events.js +131 -0
  109. package/core/scratch_msgs.js +85 -0
  110. package/core/scrollbar.js +875 -0
  111. package/core/toolbox.js +803 -0
  112. package/core/tooltip.js +337 -0
  113. package/core/touch.js +226 -0
  114. package/core/trashcan.js +343 -0
  115. package/core/ui_events.js +91 -0
  116. package/core/ui_menu_utils.js +68 -0
  117. package/core/utils.js +825 -0
  118. package/core/variable_events.js +259 -0
  119. package/core/variable_map.js +415 -0
  120. package/core/variable_model.js +116 -0
  121. package/core/variables.js +674 -0
  122. package/core/warning.js +199 -0
  123. package/core/widgetdiv.js +344 -0
  124. package/core/workspace.js +673 -0
  125. package/core/workspace_audio.js +170 -0
  126. package/core/workspace_comment.js +426 -0
  127. package/core/workspace_comment_render_svg.js +706 -0
  128. package/core/workspace_comment_svg.js +609 -0
  129. package/core/workspace_drag_surface_svg.js +195 -0
  130. package/core/workspace_dragger.js +132 -0
  131. package/core/workspace_svg.js +2382 -0
  132. package/core/xml.js +930 -0
  133. package/core/zoom_controls.js +301 -0
  134. package/dist/horizontal.js +222 -0
  135. package/dist/vertical.js +222 -0
  136. package/dist/web/horizontal.js +232 -0
  137. package/dist/web/vertical.js +232 -0
  138. package/i18n/common.py +234 -0
  139. package/i18n/create_messages.py +162 -0
  140. package/i18n/create_scratch_msgs.js +69 -0
  141. package/i18n/dedup_json.py +73 -0
  142. package/i18n/js_to_json.js +46 -0
  143. package/i18n/js_to_json.py +136 -0
  144. package/i18n/json_to_js.js +52 -0
  145. package/i18n/json_to_js.py +185 -0
  146. package/i18n/sync_tx_translations.js +111 -0
  147. package/i18n/test_scratch_msgs.js +87 -0
  148. package/i18n/tests.py +47 -0
  149. package/i18n/xliff_to_json.py +232 -0
  150. package/local_build.sh +70 -0
  151. package/media/click.mp3 +0 -0
  152. package/media/click.ogg +0 -0
  153. package/media/click.wav +0 -0
  154. package/media/comment-arrow-down.svg +10 -0
  155. package/media/comment-arrow-up.svg +10 -0
  156. package/media/delete-x.svg +10 -0
  157. package/media/delete.mp3 +0 -0
  158. package/media/delete.ogg +0 -0
  159. package/media/delete.wav +0 -0
  160. package/media/dropdown-arrow-dark.svg +1 -0
  161. package/media/dropdown-arrow.svg +1 -0
  162. package/media/extensions/microbit-block-icon.svg +130 -0
  163. package/media/extensions/music-block-icon.svg +17 -0
  164. package/media/extensions/pen-block-icon.svg +19 -0
  165. package/media/extensions/wedo2-block-icon.svg +36 -0
  166. package/media/eyedropper.svg +22 -0
  167. package/media/green-flag.svg +17 -0
  168. package/media/handclosed.cur +0 -0
  169. package/media/handdelete.cur +0 -0
  170. package/media/handopen.cur +0 -0
  171. package/media/icons/arrow.svg +12 -0
  172. package/media/icons/arrow_button.svg +1 -0
  173. package/media/icons/control_forever.svg +1 -0
  174. package/media/icons/control_repeat.svg +1 -0
  175. package/media/icons/control_stop.svg +1 -0
  176. package/media/icons/control_wait.svg +1 -0
  177. package/media/icons/event_broadcast_blue.svg +1 -0
  178. package/media/icons/event_broadcast_coral.svg +1 -0
  179. package/media/icons/event_broadcast_green.svg +1 -0
  180. package/media/icons/event_broadcast_magenta.svg +1 -0
  181. package/media/icons/event_broadcast_orange.svg +1 -0
  182. package/media/icons/event_broadcast_purple.svg +1 -0
  183. package/media/icons/event_when-broadcast-received_blue.svg +1 -0
  184. package/media/icons/event_when-broadcast-received_coral.svg +1 -0
  185. package/media/icons/event_when-broadcast-received_green.svg +1 -0
  186. package/media/icons/event_when-broadcast-received_magenta.svg +1 -0
  187. package/media/icons/event_when-broadcast-received_orange.svg +1 -0
  188. package/media/icons/event_when-broadcast-received_purple.svg +1 -0
  189. package/media/icons/event_whenflagclicked.svg +1 -0
  190. package/media/icons/remove.svg +19 -0
  191. package/media/icons/set-led_blue.svg +1 -0
  192. package/media/icons/set-led_coral.svg +1 -0
  193. package/media/icons/set-led_green.svg +1 -0
  194. package/media/icons/set-led_magenta.svg +1 -0
  195. package/media/icons/set-led_mystery.svg +1 -0
  196. package/media/icons/set-led_orange.svg +1 -0
  197. package/media/icons/set-led_purple.svg +1 -0
  198. package/media/icons/set-led_white.svg +1 -0
  199. package/media/icons/set-led_yellow.svg +1 -0
  200. package/media/icons/wedo_motor-clockwise.svg +1 -0
  201. package/media/icons/wedo_motor-counterclockwise.svg +1 -0
  202. package/media/icons/wedo_motor-speed_fast.svg +1 -0
  203. package/media/icons/wedo_motor-speed_med.svg +1 -0
  204. package/media/icons/wedo_motor-speed_slow.svg +1 -0
  205. package/media/icons/wedo_when-distance_close.svg +1 -0
  206. package/media/icons/wedo_when-tilt-backward.svg +1 -0
  207. package/media/icons/wedo_when-tilt-forward.svg +1 -0
  208. package/media/icons/wedo_when-tilt-left.svg +1 -0
  209. package/media/icons/wedo_when-tilt-right.svg +1 -0
  210. package/media/icons/wedo_when-tilt.svg +1 -0
  211. package/media/repeat.svg +18 -0
  212. package/media/rotate-left.svg +1 -0
  213. package/media/rotate-right.svg +1 -0
  214. package/media/sprites.png +0 -0
  215. package/media/status-not-ready.svg +13 -0
  216. package/media/status-ready.svg +13 -0
  217. package/media/zoom-in.svg +1 -0
  218. package/media/zoom-out.svg +1 -0
  219. package/media/zoom-reset.svg +1 -0
  220. package/msg/js/en.js +290 -0
  221. package/msg/json/en.json +285 -0
  222. package/msg/messages.js +359 -0
  223. package/msg/scratch_msgs.js +22969 -0
  224. package/package.json +60 -0
  225. package/pull_from_blockly.sh +151 -0
  226. package/renovate.json5 +15 -0
  227. package/shim/blockly_compressed_horizontal-blocks_compressed.js +1 -0
  228. package/shim/blockly_compressed_horizontal.Blockly.js +1 -0
  229. package/shim/blockly_compressed_horizontal.goog.js +1 -0
  230. package/shim/blockly_compressed_horizontal.js +1 -0
  231. package/shim/blockly_compressed_vertical-blocks_compressed.js +1 -0
  232. package/shim/blockly_compressed_vertical.Blockly.js +1 -0
  233. package/shim/blockly_compressed_vertical.goog.js +1 -0
  234. package/shim/blockly_compressed_vertical.js +1 -0
  235. package/shim/blocks_compressed_horizontal-blockly_compressed_horizontal-messages.js +1 -0
  236. package/shim/blocks_compressed_horizontal.js +1 -0
  237. package/shim/blocks_compressed_vertical-blockly_compressed_vertical-messages.js +1 -0
  238. package/shim/blocks_compressed_vertical.js +1 -0
  239. package/shim/gh-pages.js +1 -0
  240. package/shim/horizontal.js +1 -0
  241. package/shim/index.js +17 -0
  242. package/shim/vertical.js +1 -0
  243. package/universal-python.js +82 -0
@@ -0,0 +1,532 @@
1
+ /**
2
+ * @license
3
+ * Visual Blocks Editor
4
+ *
5
+ * Copyright 2016 Massachusetts Institute of Technology
6
+ * All rights reserved.
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */
20
+
21
+ 'use strict';
22
+
23
+ goog.provide('Blockly.Blocks.control');
24
+
25
+ goog.require('Blockly.Blocks');
26
+ goog.require('Blockly.Colours');
27
+ goog.require('Blockly.ScratchBlocks.VerticalExtensions');
28
+
29
+
30
+ Blockly.Blocks['control_forever'] = {
31
+ /**
32
+ * Block for repeat n times (external number).
33
+ * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#5eke39
34
+ * @this Blockly.Block
35
+ */
36
+ init: function() {
37
+ this.jsonInit({
38
+ "id": "control_forever",
39
+ "message0": Blockly.Msg.CONTROL_FOREVER,
40
+ "message1": "%1", // Statement
41
+ "message2": "%1", // Icon
42
+ "lastDummyAlign2": "RIGHT",
43
+ "args1": [
44
+ {
45
+ "type": "input_statement",
46
+ "name": "SUBSTACK"
47
+ }
48
+ ],
49
+ "args2": [
50
+ {
51
+ "type": "field_image",
52
+ "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg",
53
+ "width": 24,
54
+ "height": 24,
55
+ "alt": "*",
56
+ "flip_rtl": true
57
+ }
58
+ ],
59
+ "category": Blockly.Categories.control,
60
+ "extensions": ["colours_control", "shape_end"]
61
+ });
62
+ }
63
+ };
64
+
65
+ Blockly.Blocks['control_repeat'] = {
66
+ /**
67
+ * Block for repeat n times (external number).
68
+ * https://blockly-demo.appspot.com/static/demos/blockfactory/index.html#so57n9
69
+ * @this Blockly.Block
70
+ */
71
+ init: function() {
72
+ this.jsonInit({
73
+ "id": "control_repeat",
74
+ "message0": Blockly.Msg.CONTROL_REPEAT,
75
+ "message1": "%1", // Statement
76
+ "message2": "%1", // Icon
77
+ "lastDummyAlign2": "RIGHT",
78
+ "args0": [
79
+ {
80
+ "type": "input_value",
81
+ "name": "TIMES"
82
+ }
83
+ ],
84
+ "args1": [
85
+ {
86
+ "type": "input_statement",
87
+ "name": "SUBSTACK"
88
+ }
89
+ ],
90
+ "args2": [
91
+ {
92
+ "type": "field_image",
93
+ "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg",
94
+ "width": 24,
95
+ "height": 24,
96
+ "alt": "*",
97
+ "flip_rtl": true
98
+ }
99
+ ],
100
+ "category": Blockly.Categories.control,
101
+ "extensions": ["colours_control", "shape_statement"]
102
+ });
103
+ }
104
+ };
105
+
106
+ Blockly.Blocks['control_if'] = {
107
+ /**
108
+ * Block for if-then.
109
+ * @this Blockly.Block
110
+ */
111
+ init: function() {
112
+ this.jsonInit({
113
+ "type": "control_if",
114
+ "message0": Blockly.Msg.CONTROL_IF,
115
+ "message1": "%1", // Statement
116
+ "args0": [
117
+ {
118
+ "type": "input_value",
119
+ "name": "CONDITION",
120
+ "check": "Boolean"
121
+ }
122
+ ],
123
+ "args1": [
124
+ {
125
+ "type": "input_statement",
126
+ "name": "SUBSTACK"
127
+ }
128
+ ],
129
+ "category": Blockly.Categories.control,
130
+ "extensions": ["colours_control", "shape_statement"]
131
+ });
132
+ }
133
+ };
134
+
135
+ Blockly.Blocks['control_if_else'] = {
136
+ /**
137
+ * Block for if-else.
138
+ * @this Blockly.Block
139
+ */
140
+ init: function() {
141
+ this.jsonInit({
142
+ "type": "control_if_else",
143
+ "message0": Blockly.Msg.CONTROL_IF,
144
+ "message1": "%1",
145
+ "message2": Blockly.Msg.CONTROL_ELSE,
146
+ "message3": "%1",
147
+ "args0": [
148
+ {
149
+ "type": "input_value",
150
+ "name": "CONDITION",
151
+ "check": "Boolean"
152
+ }
153
+ ],
154
+ "args1": [
155
+ {
156
+ "type": "input_statement",
157
+ "name": "SUBSTACK"
158
+ }
159
+ ],
160
+ "args3": [
161
+ {
162
+ "type": "input_statement",
163
+ "name": "SUBSTACK2"
164
+ }
165
+ ],
166
+ "category": Blockly.Categories.control,
167
+ "extensions": ["colours_control", "shape_statement"]
168
+ });
169
+ }
170
+ };
171
+
172
+ Blockly.Blocks['control_stop'] = {
173
+ /**
174
+ * Block for stop all scripts.
175
+ * @this Blockly.Block
176
+ */
177
+ init: function() {
178
+ var ALL_SCRIPTS = 'all';
179
+ var THIS_SCRIPT = 'this script';
180
+ var OTHER_SCRIPTS = 'other scripts in sprite';
181
+ var stopDropdown = new Blockly.FieldDropdown(function() {
182
+ if (this.sourceBlock_ &&
183
+ this.sourceBlock_.nextConnection &&
184
+ this.sourceBlock_.nextConnection.isConnected()) {
185
+ return [
186
+ [Blockly.Msg.CONTROL_STOP_OTHER, OTHER_SCRIPTS]
187
+ ];
188
+ }
189
+ return [[Blockly.Msg.CONTROL_STOP_ALL, ALL_SCRIPTS],
190
+ [Blockly.Msg.CONTROL_STOP_THIS, THIS_SCRIPT],
191
+ [Blockly.Msg.CONTROL_STOP_OTHER, OTHER_SCRIPTS]
192
+ ];
193
+ }, function(option) {
194
+ // Create an event group to keep field value and mutator in sync
195
+ // Return null at the end because setValue is called here already.
196
+ Blockly.Events.setGroup(true);
197
+ var oldMutation = Blockly.Xml.domToText(this.sourceBlock_.mutationToDom());
198
+ this.sourceBlock_.setNextStatement(option == OTHER_SCRIPTS);
199
+ var newMutation = Blockly.Xml.domToText(this.sourceBlock_.mutationToDom());
200
+ Blockly.Events.fire(new Blockly.Events.BlockChange(this.sourceBlock_,
201
+ 'mutation', null, oldMutation, newMutation));
202
+ this.setValue(option);
203
+ Blockly.Events.setGroup(false);
204
+ return null;
205
+ });
206
+ this.appendDummyInput()
207
+ .appendField(Blockly.Msg.CONTROL_STOP)
208
+ .appendField(stopDropdown, 'STOP_OPTION');
209
+ this.setCategory(Blockly.Categories.control);
210
+ this.setColour(Blockly.Colours.control.primary,
211
+ Blockly.Colours.control.secondary,
212
+ Blockly.Colours.control.tertiary,
213
+ Blockly.Colours.control.quaternary
214
+ );
215
+ this.setPreviousStatement(true);
216
+ },
217
+ mutationToDom: function() {
218
+ var container = document.createElement('mutation');
219
+ container.setAttribute('hasnext', this.nextConnection != null);
220
+ return container;
221
+ },
222
+ domToMutation: function(xmlElement) {
223
+ var hasNext = (xmlElement.getAttribute('hasnext') == 'true');
224
+ this.setNextStatement(hasNext);
225
+ }
226
+ };
227
+
228
+ Blockly.Blocks['control_wait'] = {
229
+ /**
230
+ * Block to wait (pause) stack.
231
+ * @this Blockly.Block
232
+ */
233
+ init: function() {
234
+ this.jsonInit({
235
+ "id": "control_wait",
236
+ "message0": Blockly.Msg.CONTROL_WAIT,
237
+ "args0": [
238
+ {
239
+ "type": "input_value",
240
+ "name": "DURATION"
241
+ }
242
+ ],
243
+ "category": Blockly.Categories.control,
244
+ "extensions": ["colours_control", "shape_statement"]
245
+ });
246
+ }
247
+ };
248
+
249
+ Blockly.Blocks['control_wait_until'] = {
250
+ /**
251
+ * Block to wait until a condition becomes true.
252
+ * @this Blockly.Block
253
+ */
254
+ init: function() {
255
+ this.jsonInit({
256
+ "message0": Blockly.Msg.CONTROL_WAITUNTIL,
257
+ "args0": [
258
+ {
259
+ "type": "input_value",
260
+ "name": "CONDITION",
261
+ "check": "Boolean"
262
+ }
263
+ ],
264
+ "category": Blockly.Categories.control,
265
+ "extensions": ["colours_control", "shape_statement"]
266
+ });
267
+ }
268
+ };
269
+
270
+ Blockly.Blocks['control_repeat_until'] = {
271
+ /**
272
+ * Block to repeat until a condition becomes true.
273
+ * @this Blockly.Block
274
+ */
275
+ init: function() {
276
+ this.jsonInit({
277
+ "message0": Blockly.Msg.CONTROL_REPEATUNTIL,
278
+ "message1": "%1",
279
+ "message2": "%1",
280
+ "lastDummyAlign2": "RIGHT",
281
+ "args0": [
282
+ {
283
+ "type": "input_value",
284
+ "name": "CONDITION",
285
+ "check": "Boolean"
286
+ }
287
+ ],
288
+ "args1": [
289
+ {
290
+ "type": "input_statement",
291
+ "name": "SUBSTACK"
292
+ }
293
+ ],
294
+ "args2": [
295
+ {
296
+ "type": "field_image",
297
+ "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg",
298
+ "width": 24,
299
+ "height": 24,
300
+ "alt": "*",
301
+ "flip_rtl": true
302
+ }
303
+ ],
304
+ "category": Blockly.Categories.control,
305
+ "extensions": ["colours_control", "shape_statement"]
306
+ });
307
+ }
308
+ };
309
+
310
+ Blockly.Blocks['control_while'] = {
311
+ /**
312
+ * Block to repeat until a condition becomes false.
313
+ * (This is an obsolete "hacked" block, for compatibility with 2.0.)
314
+ */
315
+ init: function() {
316
+ this.jsonInit({
317
+ "message0": Blockly.Msg.CONTROL_WHILE,
318
+ "message1": "%1",
319
+ "message2": "%1",
320
+ "lastDummyAlign2": "RIGHT",
321
+ "args0": [
322
+ {
323
+ "type": "input_value",
324
+ "name": "CONDITION",
325
+ "check": "Boolean"
326
+ }
327
+ ],
328
+ "args1": [
329
+ {
330
+ "type": "input_statement",
331
+ "name": "SUBSTACK"
332
+ }
333
+ ],
334
+ "args2": [
335
+ {
336
+ "type": "field_image",
337
+ "src": Blockly.mainWorkspace.options.pathToMedia + "repeat.svg",
338
+ "width": 24,
339
+ "height": 24,
340
+ "alt": "*",
341
+ "flip_rtl": true
342
+ }
343
+ ],
344
+ "category": Blockly.Categories.control,
345
+ "extensions": ["colours_control", "shape_statement"]
346
+ });
347
+ }
348
+ };
349
+
350
+ Blockly.Blocks['control_for_each'] = {
351
+ /**
352
+ * Block for for-each. This is an obsolete block that is implemented for
353
+ * compatibility with Scratch 2.0 projects.
354
+ * @this Blockly.Block
355
+ */
356
+ init: function() {
357
+ this.jsonInit({
358
+ "type": "control_for_each",
359
+ "message0": Blockly.Msg.CONTROL_FOREACH,
360
+ "message1": "%1",
361
+ "args0": [
362
+ {
363
+ "type": "field_variable",
364
+ "name": "VARIABLE"
365
+ },
366
+ {
367
+ "type": "input_value",
368
+ "name": "VALUE"
369
+ }
370
+ ],
371
+ "args1": [
372
+ {
373
+ "type": "input_statement",
374
+ "name": "SUBSTACK"
375
+ }
376
+ ],
377
+ "category": Blockly.Categories.control,
378
+ "extensions": ["colours_control", "shape_statement"]
379
+ });
380
+ }
381
+ };
382
+
383
+ Blockly.Blocks['control_start_as_clone'] = {
384
+ /**
385
+ * Block for "when I start as a clone" hat.
386
+ * @this Blockly.Block
387
+ */
388
+ init: function() {
389
+ this.jsonInit({
390
+ "id": "control_start_as_clone",
391
+ "message0": Blockly.Msg.CONTROL_STARTASCLONE,
392
+ "args0": [
393
+ ],
394
+ "category": Blockly.Categories.control,
395
+ "extensions": ["colours_control", "shape_hat"]
396
+ });
397
+ }
398
+ };
399
+
400
+ Blockly.Blocks['control_create_clone_of_menu'] = {
401
+ /**
402
+ * Create-clone drop-down menu.
403
+ * @this Blockly.Block
404
+ */
405
+ init: function() {
406
+ this.jsonInit({
407
+ "message0": "%1",
408
+ "args0": [
409
+ {
410
+ "type": "field_dropdown",
411
+ "name": "CLONE_OPTION",
412
+ "options": [
413
+ [Blockly.Msg.CONTROL_CREATECLONEOF_MYSELF, '_myself_']
414
+ ]
415
+ }
416
+ ],
417
+ "extensions": ["colours_control", "output_string"]
418
+ });
419
+ }
420
+ };
421
+
422
+ Blockly.Blocks['control_create_clone_of'] = {
423
+ /**
424
+ * Block for "create clone of..."
425
+ * @this Blockly.Block
426
+ */
427
+ init: function() {
428
+ this.jsonInit({
429
+ "id": "control_start_as_clone",
430
+ "message0": Blockly.Msg.CONTROL_CREATECLONEOF,
431
+ "args0": [
432
+ {
433
+ "type": "input_value",
434
+ "name": "CLONE_OPTION"
435
+ }
436
+ ],
437
+ "category": Blockly.Categories.control,
438
+ "extensions": ["colours_control", "shape_statement"]
439
+ });
440
+ }
441
+ };
442
+
443
+ Blockly.Blocks['control_delete_this_clone'] = {
444
+ /**
445
+ * Block for "delete this clone."
446
+ * @this Blockly.Block
447
+ */
448
+ init: function() {
449
+ this.jsonInit({
450
+ "message0": Blockly.Msg.CONTROL_DELETETHISCLONE,
451
+ "args0": [
452
+ ],
453
+ "category": Blockly.Categories.control,
454
+ "extensions": ["colours_control", "shape_end"]
455
+ });
456
+ }
457
+ };
458
+
459
+ Blockly.Blocks['control_get_counter'] = {
460
+ /**
461
+ * Block to get the counter value. This is an obsolete block that is
462
+ * implemented for compatibility with Scratch 2.0 projects.
463
+ * @this Blockly.Block
464
+ */
465
+ init: function() {
466
+ this.jsonInit({
467
+ "message0": Blockly.Msg.CONTROL_COUNTER,
468
+ "category": Blockly.Categories.control,
469
+ "extensions": ["colours_control", "output_number"]
470
+ });
471
+ }
472
+ };
473
+
474
+ Blockly.Blocks['control_incr_counter'] = {
475
+ /**
476
+ * Block to add one to the counter value. This is an obsolete block that is
477
+ * implemented for compatibility with Scratch 2.0 projects.
478
+ * @this Blockly.Block
479
+ */
480
+ init: function() {
481
+ this.jsonInit({
482
+ "message0": Blockly.Msg.CONTROL_INCRCOUNTER,
483
+ "category": Blockly.Categories.control,
484
+ "extensions": ["colours_control", "shape_statement"]
485
+ });
486
+ }
487
+ };
488
+
489
+ Blockly.Blocks['control_clear_counter'] = {
490
+ /**
491
+ * Block to clear the counter value. This is an obsolete block that is
492
+ * implemented for compatibility with Scratch 2.0 projects.
493
+ * @this Blockly.Block
494
+ */
495
+ init: function() {
496
+ this.jsonInit({
497
+ "message0": Blockly.Msg.CONTROL_CLEARCOUNTER,
498
+ "category": Blockly.Categories.control,
499
+ "extensions": ["colours_control", "shape_statement"]
500
+ });
501
+ }
502
+ };
503
+
504
+ Blockly.Blocks['control_all_at_once'] = {
505
+ /**
506
+ * Block to run the contained script. This is an obsolete block that is
507
+ * implemented for compatibility with Scratch 2.0 projects. Note that
508
+ * this was originally designed to run all of the contained blocks
509
+ * (sequentially, like normal) within a single frame, but this feature
510
+ * was removed in place of custom blocks marked "run without screen
511
+ * refresh". The "all at once" block was changed to run the contained
512
+ * blocks ordinarily, functioning the same way as an "if" block with a
513
+ * reporter that is always true (e.g. "if 1 = 1"). Also note that the
514
+ * Scratch 2.0 spec for this block is "warpSpeed", but the label shows
515
+ * "all at once".
516
+ * @this Blockly.Block
517
+ */
518
+ init: function() {
519
+ this.jsonInit({
520
+ "message0": Blockly.Msg.CONTROL_ALLATONCE,
521
+ "message1": "%1", // Statement
522
+ "args1": [
523
+ {
524
+ "type": "input_statement",
525
+ "name": "SUBSTACK"
526
+ }
527
+ ],
528
+ "category": Blockly.Categories.control,
529
+ "extensions": ["colours_control", "shape_statement"]
530
+ });
531
+ }
532
+ };