blockly 7.20211209.3 → 8.0.1-beta.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 (363) hide show
  1. package/blockly.d.ts +18963 -18432
  2. package/blockly.min.js +582 -546
  3. package/blockly_compressed.js +448 -416
  4. package/blockly_compressed.js.map +1 -1
  5. package/blocks/blocks.js +47 -0
  6. package/blocks/colour.js +13 -3
  7. package/blocks/lists.js +33 -18
  8. package/blocks/logic.js +24 -8
  9. package/blocks/loops.js +20 -7
  10. package/blocks/math.js +12 -3
  11. package/blocks/procedures.js +41 -27
  12. package/blocks/text.js +33 -18
  13. package/blocks/variables.js +14 -3
  14. package/blocks/variables_dynamic.js +13 -3
  15. package/blocks_compressed.js +129 -126
  16. package/blocks_compressed.js.map +1 -1
  17. package/core/block.js +1869 -1814
  18. package/core/block_drag_surface.js +201 -200
  19. package/core/block_dragger.js +377 -373
  20. package/core/block_svg.js +1593 -1479
  21. package/core/blockly.js +8 -22
  22. package/core/blocks.js +9 -2
  23. package/core/browser_events.js +22 -5
  24. package/core/bubble.js +841 -797
  25. package/core/bubble_dragger.js +213 -206
  26. package/core/bump_objects.js +2 -2
  27. package/core/clipboard.js +9 -9
  28. package/core/comment.js +353 -332
  29. package/core/common.js +46 -17
  30. package/core/component_manager.js +181 -174
  31. package/core/config.js +87 -0
  32. package/core/connection.js +595 -584
  33. package/core/connection_checker.js +242 -244
  34. package/core/connection_db.js +235 -230
  35. package/core/contextmenu.js +9 -6
  36. package/core/contextmenu_items.js +1 -2
  37. package/core/contextmenu_registry.js +93 -89
  38. package/core/css.js +474 -474
  39. package/core/delete_area.js +45 -42
  40. package/core/drag_target.js +57 -56
  41. package/core/dropdowndiv.js +153 -163
  42. package/core/events/events.js +2 -2
  43. package/core/events/events_abstract.js +89 -77
  44. package/core/events/events_block_base.js +37 -36
  45. package/core/events/events_block_change.js +130 -124
  46. package/core/events/events_block_create.js +73 -71
  47. package/core/events/events_block_delete.js +84 -82
  48. package/core/events/events_block_drag.js +50 -49
  49. package/core/events/events_block_move.js +147 -140
  50. package/core/events/events_bubble_open.js +51 -50
  51. package/core/events/events_click.js +48 -44
  52. package/core/events/events_comment_base.js +72 -69
  53. package/core/events/events_comment_change.js +63 -61
  54. package/core/events/events_comment_create.js +44 -42
  55. package/core/events/events_comment_delete.js +42 -40
  56. package/core/events/events_comment_move.js +106 -104
  57. package/core/events/events_marker_move.js +65 -64
  58. package/core/events/events_selected.js +46 -45
  59. package/core/events/events_theme_change.js +36 -35
  60. package/core/events/events_toolbox_item_select.js +46 -45
  61. package/core/events/events_trashcan_open.js +37 -36
  62. package/core/events/events_ui.js +47 -46
  63. package/core/events/events_ui_base.js +30 -29
  64. package/core/events/events_var_base.js +37 -36
  65. package/core/events/events_var_create.js +50 -48
  66. package/core/events/events_var_delete.js +50 -48
  67. package/core/events/events_var_rename.js +51 -49
  68. package/core/events/events_viewport.js +66 -65
  69. package/core/events/utils.js +29 -14
  70. package/core/events/workspace_events.js +49 -55
  71. package/core/extensions.js +4 -3
  72. package/core/field.js +1061 -997
  73. package/core/field_angle.js +462 -442
  74. package/core/field_checkbox.js +194 -182
  75. package/core/field_colour.js +519 -505
  76. package/core/field_dropdown.js +617 -598
  77. package/core/field_image.js +229 -220
  78. package/core/field_label.js +102 -91
  79. package/core/field_label_serializable.js +42 -41
  80. package/core/field_multilineinput.js +372 -358
  81. package/core/field_number.js +272 -253
  82. package/core/field_textinput.js +499 -467
  83. package/core/field_variable.js +458 -420
  84. package/core/flyout_base.js +1005 -952
  85. package/core/flyout_button.js +277 -260
  86. package/core/flyout_horizontal.js +304 -302
  87. package/core/flyout_metrics_manager.js +64 -64
  88. package/core/flyout_vertical.js +306 -300
  89. package/core/generator.js +459 -446
  90. package/core/gesture.js +829 -813
  91. package/core/grid.js +166 -163
  92. package/core/icon.js +168 -159
  93. package/core/inject.js +7 -5
  94. package/core/input.js +257 -248
  95. package/core/insertion_marker_manager.js +655 -624
  96. package/core/internal_constants.js +0 -129
  97. package/core/keyboard_nav/ast_node.js +605 -596
  98. package/core/keyboard_nav/basic_cursor.js +166 -165
  99. package/core/keyboard_nav/cursor.js +99 -97
  100. package/core/keyboard_nav/marker.js +83 -79
  101. package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
  102. package/core/marker_manager.js +153 -141
  103. package/core/menu.js +377 -372
  104. package/core/menuitem.js +223 -217
  105. package/core/metrics_manager.js +403 -390
  106. package/core/mutator.js +468 -437
  107. package/core/names.js +229 -188
  108. package/core/options.js +290 -284
  109. package/core/procedures.js +29 -17
  110. package/core/registry.js +19 -16
  111. package/core/rendered_connection.js +482 -463
  112. package/core/renderers/common/block_rendering.js +9 -3
  113. package/core/renderers/common/constants.js +1119 -1112
  114. package/core/renderers/common/debug.js +14 -0
  115. package/core/renderers/common/debugger.js +338 -316
  116. package/core/renderers/common/drawer.js +380 -370
  117. package/core/renderers/common/i_path_object.js +2 -2
  118. package/core/renderers/common/info.js +626 -618
  119. package/core/renderers/common/marker_svg.js +579 -541
  120. package/core/renderers/common/path_object.js +203 -200
  121. package/core/renderers/common/renderer.js +220 -218
  122. package/core/renderers/geras/constants.js +36 -36
  123. package/core/renderers/geras/drawer.js +155 -147
  124. package/core/renderers/geras/highlight_constants.js +244 -238
  125. package/core/renderers/geras/highlighter.js +231 -179
  126. package/core/renderers/geras/info.js +392 -369
  127. package/core/renderers/geras/measurables/inline_input.js +25 -19
  128. package/core/renderers/geras/measurables/statement_input.js +23 -17
  129. package/core/renderers/geras/path_object.js +106 -121
  130. package/core/renderers/geras/renderer.js +96 -98
  131. package/core/renderers/measurables/base.js +30 -18
  132. package/core/renderers/measurables/bottom_row.js +83 -80
  133. package/core/renderers/measurables/connection.js +22 -15
  134. package/core/renderers/measurables/external_value_input.js +35 -22
  135. package/core/renderers/measurables/field.js +35 -20
  136. package/core/renderers/measurables/hat.js +18 -13
  137. package/core/renderers/measurables/icon.js +24 -17
  138. package/core/renderers/measurables/in_row_spacer.js +15 -13
  139. package/core/renderers/measurables/inline_input.js +43 -33
  140. package/core/renderers/measurables/input_connection.js +41 -28
  141. package/core/renderers/measurables/input_row.js +50 -44
  142. package/core/renderers/measurables/jagged_edge.js +14 -12
  143. package/core/renderers/measurables/next_connection.js +16 -14
  144. package/core/renderers/measurables/output_connection.js +26 -20
  145. package/core/renderers/measurables/previous_connection.js +16 -15
  146. package/core/renderers/measurables/round_corner.js +20 -18
  147. package/core/renderers/measurables/row.js +184 -168
  148. package/core/renderers/measurables/spacer_row.js +38 -23
  149. package/core/renderers/measurables/square_corner.js +18 -16
  150. package/core/renderers/measurables/statement_input.js +23 -20
  151. package/core/renderers/measurables/top_row.js +88 -85
  152. package/core/renderers/minimalist/constants.js +8 -7
  153. package/core/renderers/minimalist/drawer.js +11 -10
  154. package/core/renderers/minimalist/info.js +18 -18
  155. package/core/renderers/minimalist/renderer.js +40 -39
  156. package/core/renderers/thrasos/info.js +258 -248
  157. package/core/renderers/thrasos/renderer.js +20 -20
  158. package/core/renderers/zelos/constants.js +898 -873
  159. package/core/renderers/zelos/drawer.js +186 -169
  160. package/core/renderers/zelos/info.js +502 -479
  161. package/core/renderers/zelos/marker_svg.js +129 -115
  162. package/core/renderers/zelos/measurables/bottom_row.js +31 -30
  163. package/core/renderers/zelos/measurables/inputs.js +22 -21
  164. package/core/renderers/zelos/measurables/row_elements.js +14 -13
  165. package/core/renderers/zelos/measurables/top_row.js +34 -33
  166. package/core/renderers/zelos/path_object.js +181 -180
  167. package/core/renderers/zelos/renderer.js +91 -92
  168. package/core/scrollbar.js +759 -713
  169. package/core/scrollbar_pair.js +250 -245
  170. package/core/serialization/blocks.js +20 -10
  171. package/core/serialization/workspaces.js +3 -2
  172. package/core/shortcut_registry.js +286 -277
  173. package/core/sprites.js +31 -0
  174. package/core/theme.js +135 -141
  175. package/core/theme_manager.js +147 -143
  176. package/core/toolbox/category.js +602 -576
  177. package/core/toolbox/collapsible_category.js +226 -227
  178. package/core/toolbox/separator.js +70 -61
  179. package/core/toolbox/toolbox.js +934 -927
  180. package/core/toolbox/toolbox_item.js +115 -99
  181. package/core/tooltip.js +108 -35
  182. package/core/touch.js +8 -3
  183. package/core/touch_gesture.js +254 -251
  184. package/core/trashcan.js +606 -595
  185. package/core/utils/coordinate.js +97 -95
  186. package/core/utils/dom.js +2 -2
  187. package/core/utils/global.js +2 -0
  188. package/core/utils/rect.js +41 -37
  189. package/core/utils/sentinel.js +25 -0
  190. package/core/utils/size.js +30 -27
  191. package/core/utils/svg.js +18 -16
  192. package/core/utils/toolbox.js +1 -1
  193. package/core/variable_map.js +325 -341
  194. package/core/variable_model.js +55 -54
  195. package/core/variables.js +9 -2
  196. package/core/variables_dynamic.js +3 -1
  197. package/core/warning.js +126 -120
  198. package/core/widgetdiv.js +4 -4
  199. package/core/workspace.js +685 -664
  200. package/core/workspace_audio.js +124 -118
  201. package/core/workspace_comment.js +308 -298
  202. package/core/workspace_comment_svg.js +1029 -951
  203. package/core/workspace_drag_surface_svg.js +147 -140
  204. package/core/workspace_dragger.js +70 -71
  205. package/core/workspace_svg.js +2322 -2297
  206. package/core/xml.js +30 -20
  207. package/core/zoom_controls.js +431 -439
  208. package/dart_compressed.js +5 -4
  209. package/dart_compressed.js.map +1 -1
  210. package/generators/dart/colour.js +56 -64
  211. package/generators/dart/lists.js +61 -50
  212. package/generators/dart/math.js +160 -148
  213. package/generators/dart/text.js +83 -61
  214. package/generators/javascript/colour.js +37 -34
  215. package/generators/javascript/lists.js +50 -43
  216. package/generators/javascript/math.js +123 -139
  217. package/generators/javascript/text.js +67 -81
  218. package/generators/lua/colour.js +25 -23
  219. package/generators/lua/lists.js +97 -69
  220. package/generators/lua/logic.js +1 -2
  221. package/generators/lua/math.js +182 -144
  222. package/generators/lua/text.js +116 -99
  223. package/generators/php/colour.js +38 -32
  224. package/generators/php/lists.js +109 -89
  225. package/generators/php/math.js +90 -81
  226. package/generators/php/text.js +63 -61
  227. package/generators/python/colour.js +18 -18
  228. package/generators/python/lists.js +38 -30
  229. package/generators/python/loops.js +12 -8
  230. package/generators/python/math.js +104 -106
  231. package/generators/python/text.js +34 -30
  232. package/javascript_compressed.js +5 -4
  233. package/javascript_compressed.js.map +1 -1
  234. package/lua_compressed.js +5 -4
  235. package/lua_compressed.js.map +1 -1
  236. package/msg/ab.js +1 -2
  237. package/msg/ace.js +1 -2
  238. package/msg/af.js +1 -2
  239. package/msg/am.js +1 -2
  240. package/msg/ar.js +1 -2
  241. package/msg/ast.js +1 -2
  242. package/msg/az.js +3 -4
  243. package/msg/ba.js +1 -2
  244. package/msg/bcc.js +1 -2
  245. package/msg/be-tarask.js +1 -2
  246. package/msg/be.js +5 -6
  247. package/msg/bg.js +1 -2
  248. package/msg/bn.js +1 -2
  249. package/msg/br.js +1 -2
  250. package/msg/bs.js +1 -2
  251. package/msg/ca.js +1 -2
  252. package/msg/cdo.js +1 -2
  253. package/msg/cs.js +16 -17
  254. package/msg/da.js +1 -2
  255. package/msg/de.js +2 -3
  256. package/msg/diq.js +2 -3
  257. package/msg/dty.js +1 -2
  258. package/msg/ee.js +1 -2
  259. package/msg/el.js +1 -2
  260. package/msg/en-gb.js +1 -2
  261. package/msg/en.js +1 -2
  262. package/msg/eo.js +2 -3
  263. package/msg/es.js +2 -3
  264. package/msg/et.js +1 -2
  265. package/msg/eu.js +1 -2
  266. package/msg/fa.js +2 -3
  267. package/msg/fi.js +1 -2
  268. package/msg/fo.js +1 -2
  269. package/msg/fr.js +5 -6
  270. package/msg/frr.js +1 -2
  271. package/msg/gl.js +1 -2
  272. package/msg/gn.js +1 -2
  273. package/msg/gor.js +1 -2
  274. package/msg/ha.js +1 -2
  275. package/msg/hak.js +1 -2
  276. package/msg/he.js +2 -3
  277. package/msg/hi.js +1 -2
  278. package/msg/hr.js +3 -4
  279. package/msg/hrx.js +1 -2
  280. package/msg/hu.js +1 -2
  281. package/msg/hy.js +3 -4
  282. package/msg/ia.js +1 -2
  283. package/msg/id.js +13 -14
  284. package/msg/ig.js +1 -2
  285. package/msg/inh.js +15 -16
  286. package/msg/is.js +1 -2
  287. package/msg/it.js +1 -2
  288. package/msg/ja.js +8 -9
  289. package/msg/ka.js +1 -2
  290. package/msg/kab.js +1 -2
  291. package/msg/kbd-cyrl.js +1 -2
  292. package/msg/km.js +1 -2
  293. package/msg/kn.js +1 -2
  294. package/msg/ko.js +1 -2
  295. package/msg/ksh.js +1 -2
  296. package/msg/ku-latn.js +1 -2
  297. package/msg/ky.js +1 -2
  298. package/msg/la.js +1 -2
  299. package/msg/lb.js +1 -2
  300. package/msg/lki.js +1 -2
  301. package/msg/lo.js +1 -2
  302. package/msg/lrc.js +1 -2
  303. package/msg/lt.js +1 -2
  304. package/msg/lv.js +30 -31
  305. package/msg/mg.js +1 -2
  306. package/msg/mk.js +1 -2
  307. package/msg/ml.js +1 -2
  308. package/msg/mnw.js +1 -2
  309. package/msg/ms.js +1 -2
  310. package/msg/my.js +1 -2
  311. package/msg/mzn.js +1 -2
  312. package/msg/nb.js +1 -2
  313. package/msg/ne.js +1 -2
  314. package/msg/nl.js +1 -2
  315. package/msg/oc.js +1 -2
  316. package/msg/olo.js +1 -2
  317. package/msg/pa.js +4 -5
  318. package/msg/pl.js +1 -2
  319. package/msg/pms.js +1 -2
  320. package/msg/ps.js +1 -2
  321. package/msg/pt-br.js +1 -2
  322. package/msg/pt.js +1 -2
  323. package/msg/ro.js +1 -2
  324. package/msg/ru.js +1 -2
  325. package/msg/sc.js +1 -2
  326. package/msg/sco.js +1 -2
  327. package/msg/sd.js +1 -2
  328. package/msg/shn.js +1 -2
  329. package/msg/si.js +1 -2
  330. package/msg/sk.js +1 -2
  331. package/msg/skr-arab.js +1 -2
  332. package/msg/sl.js +1 -2
  333. package/msg/smn.js +435 -0
  334. package/msg/sq.js +1 -2
  335. package/msg/sr-latn.js +1 -2
  336. package/msg/sr.js +1 -2
  337. package/msg/sv.js +1 -2
  338. package/msg/sw.js +1 -2
  339. package/msg/ta.js +1 -2
  340. package/msg/tcy.js +1 -2
  341. package/msg/te.js +2 -3
  342. package/msg/th.js +1 -2
  343. package/msg/ti.js +1 -2
  344. package/msg/tl.js +1 -2
  345. package/msg/tlh.js +1 -2
  346. package/msg/tr.js +1 -2
  347. package/msg/ug-arab.js +1 -2
  348. package/msg/uk.js +1 -2
  349. package/msg/ur.js +1 -2
  350. package/msg/uz.js +1 -2
  351. package/msg/vi.js +1 -2
  352. package/msg/xmf.js +1 -2
  353. package/msg/yo.js +1 -2
  354. package/msg/yue.js +2 -3
  355. package/msg/zgh.js +1 -2
  356. package/msg/zh-hans.js +4 -5
  357. package/msg/zh-hant.js +4 -5
  358. package/package.json +7 -6
  359. package/php_compressed.js +5 -4
  360. package/php_compressed.js.map +1 -1
  361. package/python_compressed.js +5 -4
  362. package/python_compressed.js.map +1 -1
  363. package/blocks/all.js +0 -36
@@ -28,13 +28,14 @@ Lua['colour_random'] = function(block) {
28
28
 
29
29
  Lua['colour_rgb'] = function(block) {
30
30
  // Compose a colour from RGB components expressed as percentages.
31
- const functionName = Lua.provideFunction_('colour_rgb', [
32
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(r, g, b)',
33
- ' r = math.floor(math.min(100, math.max(0, r)) * 2.55 + .5)',
34
- ' g = math.floor(math.min(100, math.max(0, g)) * 2.55 + .5)',
35
- ' b = math.floor(math.min(100, math.max(0, b)) * 2.55 + .5)',
36
- ' return string.format("#%02x%02x%02x", r, g, b)', 'end'
37
- ]);
31
+ const functionName = Lua.provideFunction_('colour_rgb', `
32
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(r, g, b)
33
+ r = math.floor(math.min(100, math.max(0, r)) * 2.55 + .5)
34
+ g = math.floor(math.min(100, math.max(0, g)) * 2.55 + .5)
35
+ b = math.floor(math.min(100, math.max(0, b)) * 2.55 + .5)
36
+ return string.format("#%02x%02x%02x", r, g, b)
37
+ end
38
+ `);
38
39
  const r = Lua.valueToCode(block, 'RED', Lua.ORDER_NONE) || 0;
39
40
  const g = Lua.valueToCode(block, 'GREEN', Lua.ORDER_NONE) || 0;
40
41
  const b = Lua.valueToCode(block, 'BLUE', Lua.ORDER_NONE) || 0;
@@ -44,24 +45,25 @@ Lua['colour_rgb'] = function(block) {
44
45
 
45
46
  Lua['colour_blend'] = function(block) {
46
47
  // Blend two colours together.
47
- const functionName = Lua.provideFunction_('colour_blend', [
48
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(colour1, colour2, ratio)',
49
- ' local r1 = tonumber(string.sub(colour1, 2, 3), 16)',
50
- ' local r2 = tonumber(string.sub(colour2, 2, 3), 16)',
51
- ' local g1 = tonumber(string.sub(colour1, 4, 5), 16)',
52
- ' local g2 = tonumber(string.sub(colour2, 4, 5), 16)',
53
- ' local b1 = tonumber(string.sub(colour1, 6, 7), 16)',
54
- ' local b2 = tonumber(string.sub(colour2, 6, 7), 16)',
55
- ' local ratio = math.min(1, math.max(0, ratio))',
56
- ' local r = math.floor(r1 * (1 - ratio) + r2 * ratio + .5)',
57
- ' local g = math.floor(g1 * (1 - ratio) + g2 * ratio + .5)',
58
- ' local b = math.floor(b1 * (1 - ratio) + b2 * ratio + .5)',
59
- ' return string.format("#%02x%02x%02x", r, g, b)', 'end'
60
- ]);
48
+ const functionName = Lua.provideFunction_('colour_blend', `
49
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(colour1, colour2, ratio)
50
+ local r1 = tonumber(string.sub(colour1, 2, 3), 16)
51
+ local r2 = tonumber(string.sub(colour2, 2, 3), 16)
52
+ local g1 = tonumber(string.sub(colour1, 4, 5), 16)
53
+ local g2 = tonumber(string.sub(colour2, 4, 5), 16)
54
+ local b1 = tonumber(string.sub(colour1, 6, 7), 16)
55
+ local b2 = tonumber(string.sub(colour2, 6, 7), 16)
56
+ local ratio = math.min(1, math.max(0, ratio))
57
+ local r = math.floor(r1 * (1 - ratio) + r2 * ratio + .5)
58
+ local g = math.floor(g1 * (1 - ratio) + g2 * ratio + .5)
59
+ local b = math.floor(b1 * (1 - ratio) + b2 * ratio + .5)
60
+ return string.format("#%02x%02x%02x", r, g, b)
61
+ end
62
+ `);
61
63
  const colour1 =
62
- Lua.valueToCode(block, 'COLOUR1', Lua.ORDER_NONE) || '\'#000000\'';
64
+ Lua.valueToCode(block, 'COLOUR1', Lua.ORDER_NONE) || "'#000000'";
63
65
  const colour2 =
64
- Lua.valueToCode(block, 'COLOUR2', Lua.ORDER_NONE) || '\'#000000\'';
66
+ Lua.valueToCode(block, 'COLOUR2', Lua.ORDER_NONE) || "'#000000'";
65
67
  const ratio = Lua.valueToCode(block, 'RATIO', Lua.ORDER_NONE) || 0;
66
68
  const code =
67
69
  functionName + '(' + colour1 + ', ' + colour2 + ', ' + ratio + ')';
@@ -32,11 +32,15 @@ Lua['lists_create_with'] = function(block) {
32
32
 
33
33
  Lua['lists_repeat'] = function(block) {
34
34
  // Create a list with one element repeated.
35
- const functionName = Lua.provideFunction_('create_list_repeated', [
36
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(item, count)',
37
- ' local t = {}', ' for i = 1, count do', ' table.insert(t, item)',
38
- ' end', ' return t', 'end'
39
- ]);
35
+ const functionName = Lua.provideFunction_('create_list_repeated', `
36
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(item, count)
37
+ local t = {}
38
+ for i = 1, count do
39
+ table.insert(t, item)
40
+ end
41
+ return t
42
+ end
43
+ `);
40
44
  const element = Lua.valueToCode(block, 'ITEM', Lua.ORDER_NONE) || 'None';
41
45
  const repeatCount = Lua.valueToCode(block, 'NUM', Lua.ORDER_NONE) || '0';
42
46
  const code = functionName + '(' + element + ', ' + repeatCount + ')';
@@ -58,21 +62,31 @@ Lua['lists_isEmpty'] = function(block) {
58
62
 
59
63
  Lua['lists_indexOf'] = function(block) {
60
64
  // Find an item in the list.
61
- const item = Lua.valueToCode(block, 'FIND', Lua.ORDER_NONE) || '\'\'';
65
+ const item = Lua.valueToCode(block, 'FIND', Lua.ORDER_NONE) || "''";
62
66
  const list = Lua.valueToCode(block, 'VALUE', Lua.ORDER_NONE) || '{}';
63
67
  let functionName;
64
68
  if (block.getFieldValue('END') === 'FIRST') {
65
- functionName = Lua.provideFunction_('first_index', [
66
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, elem)',
67
- ' for k, v in ipairs(t) do', ' if v == elem then', ' return k',
68
- ' end', ' end', ' return 0', 'end'
69
- ]);
69
+ functionName = Lua.provideFunction_('first_index', `
70
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t, elem)
71
+ for k, v in ipairs(t) do
72
+ if v == elem then
73
+ return k
74
+ end
75
+ end
76
+ return 0
77
+ end
78
+ `);
70
79
  } else {
71
- functionName = Lua.provideFunction_('last_index', [
72
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, elem)',
73
- ' for i = #t, 1, -1 do', ' if t[i] == elem then', ' return i',
74
- ' end', ' end', ' return 0', 'end'
75
- ]);
80
+ functionName = Lua.provideFunction_('last_index', `
81
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t, elem)
82
+ for i = #t, 1, -1 do
83
+ if t[i] == elem then
84
+ return i
85
+ end
86
+ end
87
+ return 0
88
+ end
89
+ `);
76
90
  }
77
91
  const code = functionName + '(' + list + ', ' + item + ')';
78
92
  return [code, Lua.ORDER_HIGH];
@@ -217,22 +231,24 @@ Lua['lists_getSublist'] = function(block) {
217
231
  const at1 = Lua.valueToCode(block, 'AT1', Lua.ORDER_NONE) || '1';
218
232
  const at2 = Lua.valueToCode(block, 'AT2', Lua.ORDER_NONE) || '1';
219
233
 
234
+ // The value for 'FROM_END' and'FROM_START' depends on `at` so
235
+ // we add it as a parameter.
236
+ const at1Param =
237
+ (where1 === 'FROM_END' || where1 === 'FROM_START') ? ', at1' : '';
238
+ const at2Param =
239
+ (where2 === 'FROM_END' || where2 === 'FROM_START') ? ', at2' : '';
220
240
  const functionName = Lua.provideFunction_(
221
- 'list_sublist_' + where1.toLowerCase() + '_' + where2.toLowerCase(), [
222
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(source' +
223
- // The value for 'FROM_END' and'FROM_START' depends on `at` so
224
- // we add it as a parameter.
225
- ((where1 === 'FROM_END' || where1 === 'FROM_START') ? ', at1' :
226
- '') +
227
- ((where2 === 'FROM_END' || where2 === 'FROM_START') ? ', at2' :
228
- '') +
229
- ')',
230
- ' local t = {}',
231
- ' local start = ' + getListIndex('source', where1, 'at1'),
232
- ' local finish = ' + getListIndex('source', where2, 'at2'),
233
- ' for i = start, finish do', ' table.insert(t, source[i])', ' end',
234
- ' return t', 'end'
235
- ]);
241
+ 'list_sublist_' + where1.toLowerCase() + '_' + where2.toLowerCase(), `
242
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(source${at1Param}${at2Param})
243
+ local t = {}
244
+ local start = ${getListIndex('source', where1, 'at1')}
245
+ local finish = ${getListIndex('source', where2, 'at2')}
246
+ for i = start, finish do
247
+ table.insert(t, source[i])
248
+ end
249
+ return t
250
+ end
251
+ `);
236
252
  const code = functionName + '(' + list +
237
253
  // The value for 'FROM_END' and 'FROM_START' depends on `at` so we
238
254
  // pass it.
@@ -248,28 +264,28 @@ Lua['lists_sort'] = function(block) {
248
264
  const direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1;
249
265
  const type = block.getFieldValue('TYPE');
250
266
 
251
- const functionName = Lua.provideFunction_('list_sort', [
252
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(list, typev, direction)',
253
- ' local t = {}',
254
- ' for n,v in pairs(list) do table.insert(t, v) end', // Shallow-copy.
255
- ' local compareFuncs = {',
256
- ' NUMERIC = function(a, b)',
257
- ' return (tonumber(tostring(a)) or 0)',
258
- ' < (tonumber(tostring(b)) or 0) end,',
259
- ' TEXT = function(a, b)',
260
- ' return tostring(a) < tostring(b) end,',
261
- ' IGNORE_CASE = function(a, b)',
262
- ' return string.lower(tostring(a)) < string.lower(tostring(b)) end',
263
- ' }',
264
- ' local compareTemp = compareFuncs[typev]',
265
- ' local compare = compareTemp',
266
- ' if direction == -1',
267
- ' then compare = function(a, b) return compareTemp(b, a) end',
268
- ' end',
269
- ' table.sort(t, compare)',
270
- ' return t',
271
- 'end'
272
- ]);
267
+ const functionName = Lua.provideFunction_('list_sort', `
268
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(list, typev, direction)
269
+ local t = {}
270
+ for n,v in pairs(list) do table.insert(t, v) end
271
+ local compareFuncs = {
272
+ NUMERIC = function(a, b)
273
+ return (tonumber(tostring(a)) or 0)
274
+ < (tonumber(tostring(b)) or 0) end,
275
+ TEXT = function(a, b)
276
+ return tostring(a) < tostring(b) end,
277
+ IGNORE_CASE = function(a, b)
278
+ return string.lower(tostring(a)) < string.lower(tostring(b)) end
279
+ }
280
+ local compareTemp = compareFuncs[typev]
281
+ local compare = compareTemp
282
+ if direction == -1
283
+ then compare = function(a, b) return compareTemp(b, a) end
284
+ end
285
+ table.sort(t, compare)
286
+ return t
287
+ end
288
+ `);
273
289
 
274
290
  const code =
275
291
  functionName + '(' + list + ',"' + type + '", ' + direction + ')';
@@ -279,22 +295,30 @@ Lua['lists_sort'] = function(block) {
279
295
  Lua['lists_split'] = function(block) {
280
296
  // Block for splitting text into a list, or joining a list into text.
281
297
  let input = Lua.valueToCode(block, 'INPUT', Lua.ORDER_NONE);
282
- const delimiter = Lua.valueToCode(block, 'DELIM', Lua.ORDER_NONE) || '\'\'';
298
+ const delimiter = Lua.valueToCode(block, 'DELIM', Lua.ORDER_NONE) || "''";
283
299
  const mode = block.getFieldValue('MODE');
284
300
  let functionName;
285
301
  if (mode === 'SPLIT') {
286
302
  if (!input) {
287
- input = '\'\'';
303
+ input = "''";
288
304
  }
289
- functionName = Lua.provideFunction_('list_string_split', [
290
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(input, delim)',
291
- ' local t = {}', ' local pos = 1', ' while true do',
292
- ' next_delim = string.find(input, delim, pos)',
293
- ' if next_delim == nil then',
294
- ' table.insert(t, string.sub(input, pos))', ' break',
295
- ' else', ' table.insert(t, string.sub(input, pos, next_delim-1))',
296
- ' pos = next_delim + #delim', ' end', ' end', ' return t', 'end'
297
- ]);
305
+ functionName = Lua.provideFunction_('list_string_split', `
306
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(input, delim)
307
+ local t = {}
308
+ local pos = 1
309
+ while true do
310
+ next_delim = string.find(input, delim, pos)
311
+ if next_delim == nil then
312
+ table.insert(t, string.sub(input, pos))
313
+ break
314
+ else
315
+ table.insert(t, string.sub(input, pos, next_delim-1))
316
+ pos = next_delim + #delim
317
+ end
318
+ end
319
+ return t
320
+ end
321
+ `);
298
322
  } else if (mode === 'JOIN') {
299
323
  if (!input) {
300
324
  input = '{}';
@@ -310,11 +334,15 @@ Lua['lists_split'] = function(block) {
310
334
  Lua['lists_reverse'] = function(block) {
311
335
  // Block for reversing a list.
312
336
  const list = Lua.valueToCode(block, 'LIST', Lua.ORDER_NONE) || '{}';
313
- const functionName = Lua.provideFunction_('list_reverse', [
314
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(input)',
315
- ' local reversed = {}', ' for i = #input, 1, -1 do',
316
- ' table.insert(reversed, input[i])', ' end', ' return reversed', 'end'
317
- ]);
337
+ const functionName = Lua.provideFunction_('list_reverse', `
338
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(input)
339
+ local reversed = {}
340
+ for i = #input, 1, -1 do
341
+ table.insert(reversed, input[i])
342
+ end
343
+ return reversed
344
+ end
345
+ `);
318
346
  const code = functionName + '(' + list + ')';
319
347
  return [code, Lua.ORDER_HIGH];
320
348
  };
@@ -28,8 +28,7 @@ Lua['controls_if'] = function(block) {
28
28
  let branchCode = Lua.statementToCode(block, 'DO' + n);
29
29
  if (Lua.STATEMENT_SUFFIX) {
30
30
  branchCode = Lua.prefixLines(
31
- Lua.injectId(Lua.STATEMENT_SUFFIX, block), Lua.INDENT) +
32
- branchCode;
31
+ Lua.injectId(Lua.STATEMENT_SUFFIX, block), Lua.INDENT) + branchCode;
33
32
  }
34
33
  code +=
35
34
  (n > 0 ? 'else' : '') + 'if ' + conditionCode + ' then\n' + branchCode;