blockly 7.20211209.2 → 8.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 (262) hide show
  1. package/blockly.d.ts +18963 -18432
  2. package/blockly.min.js +852 -844
  3. package/blockly_compressed.js +669 -664
  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 +22 -13
  8. package/blocks/logic.js +13 -3
  9. package/blocks/loops.js +24 -11
  10. package/blocks/math.js +12 -3
  11. package/blocks/procedures.js +41 -27
  12. package/blocks/text.js +22 -13
  13. package/blocks/variables.js +14 -3
  14. package/blocks/variables_dynamic.js +13 -3
  15. package/blocks_compressed.js +146 -141
  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 +19 -9
  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/variable_map.js +325 -341
  193. package/core/variable_model.js +55 -54
  194. package/core/variables.js +9 -2
  195. package/core/variables_dynamic.js +3 -1
  196. package/core/warning.js +126 -120
  197. package/core/widgetdiv.js +4 -4
  198. package/core/workspace.js +685 -664
  199. package/core/workspace_audio.js +124 -118
  200. package/core/workspace_comment.js +308 -298
  201. package/core/workspace_comment_svg.js +1029 -951
  202. package/core/workspace_drag_surface_svg.js +147 -140
  203. package/core/workspace_dragger.js +70 -71
  204. package/core/workspace_svg.js +2322 -2297
  205. package/core/xml.js +30 -20
  206. package/core/zoom_controls.js +431 -439
  207. package/dart_compressed.js +40 -43
  208. package/dart_compressed.js.map +1 -1
  209. package/generators/dart/colour.js +56 -64
  210. package/generators/dart/lists.js +61 -50
  211. package/generators/dart/math.js +160 -148
  212. package/generators/dart/text.js +83 -61
  213. package/generators/javascript/colour.js +37 -34
  214. package/generators/javascript/lists.js +50 -43
  215. package/generators/javascript/math.js +123 -139
  216. package/generators/javascript/text.js +67 -81
  217. package/generators/lua/colour.js +25 -23
  218. package/generators/lua/lists.js +97 -69
  219. package/generators/lua/logic.js +1 -2
  220. package/generators/lua/math.js +182 -144
  221. package/generators/lua/text.js +116 -99
  222. package/generators/php/colour.js +38 -32
  223. package/generators/php/lists.js +109 -89
  224. package/generators/php/math.js +90 -81
  225. package/generators/php/text.js +63 -61
  226. package/generators/python/colour.js +18 -18
  227. package/generators/python/lists.js +38 -30
  228. package/generators/python/loops.js +12 -8
  229. package/generators/python/math.js +104 -106
  230. package/generators/python/text.js +34 -30
  231. package/javascript_compressed.js +37 -39
  232. package/javascript_compressed.js.map +1 -1
  233. package/lua_compressed.js +39 -42
  234. package/lua_compressed.js.map +1 -1
  235. package/msg/az.js +2 -2
  236. package/msg/be.js +4 -4
  237. package/msg/cs.js +15 -15
  238. package/msg/de.js +1 -1
  239. package/msg/diq.js +1 -1
  240. package/msg/eo.js +1 -1
  241. package/msg/es.js +1 -1
  242. package/msg/fa.js +1 -1
  243. package/msg/fr.js +4 -4
  244. package/msg/he.js +1 -1
  245. package/msg/hr.js +2 -2
  246. package/msg/hy.js +2 -2
  247. package/msg/id.js +12 -12
  248. package/msg/inh.js +14 -14
  249. package/msg/ja.js +7 -7
  250. package/msg/lv.js +29 -29
  251. package/msg/pa.js +3 -3
  252. package/msg/smn.js +436 -0
  253. package/msg/te.js +1 -1
  254. package/msg/yue.js +1 -1
  255. package/msg/zh-hans.js +3 -3
  256. package/msg/zh-hant.js +3 -3
  257. package/package.json +7 -6
  258. package/php_compressed.js +38 -42
  259. package/php_compressed.js.map +1 -1
  260. package/python_compressed.js +26 -25
  261. package/python_compressed.js.map +1 -1
  262. package/blocks/all.js +0 -23
@@ -25,11 +25,11 @@ Lua['math_number'] = function(block) {
25
25
  Lua['math_arithmetic'] = function(block) {
26
26
  // Basic arithmetic operators, and power.
27
27
  const OPERATORS = {
28
- ADD: [' + ', Lua.ORDER_ADDITIVE],
29
- MINUS: [' - ', Lua.ORDER_ADDITIVE],
30
- MULTIPLY: [' * ', Lua.ORDER_MULTIPLICATIVE],
31
- DIVIDE: [' / ', Lua.ORDER_MULTIPLICATIVE],
32
- POWER: [' ^ ', Lua.ORDER_EXPONENTIATION]
28
+ 'ADD': [' + ', Lua.ORDER_ADDITIVE],
29
+ 'MINUS': [' - ', Lua.ORDER_ADDITIVE],
30
+ 'MULTIPLY': [' * ', Lua.ORDER_MULTIPLICATIVE],
31
+ 'DIVIDE': [' / ', Lua.ORDER_MULTIPLICATIVE],
32
+ 'POWER': [' ^ ', Lua.ORDER_EXPONENTIATION],
33
33
  };
34
34
  const tuple = OPERATORS[block.getFieldValue('OP')];
35
35
  const operator = tuple[0];
@@ -113,12 +113,12 @@ Lua['math_single'] = function(block) {
113
113
  Lua['math_constant'] = function(block) {
114
114
  // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY.
115
115
  const CONSTANTS = {
116
- PI: ['math.pi', Lua.ORDER_HIGH],
117
- E: ['math.exp(1)', Lua.ORDER_HIGH],
118
- GOLDEN_RATIO: ['(1 + math.sqrt(5)) / 2', Lua.ORDER_MULTIPLICATIVE],
119
- SQRT2: ['math.sqrt(2)', Lua.ORDER_HIGH],
120
- SQRT1_2: ['math.sqrt(1 / 2)', Lua.ORDER_HIGH],
121
- INFINITY: ['math.huge', Lua.ORDER_HIGH]
116
+ 'PI': ['math.pi', Lua.ORDER_HIGH],
117
+ 'E': ['math.exp(1)', Lua.ORDER_HIGH],
118
+ 'GOLDEN_RATIO': ['(1 + math.sqrt(5)) / 2', Lua.ORDER_MULTIPLICATIVE],
119
+ 'SQRT2': ['math.sqrt(2)', Lua.ORDER_HIGH],
120
+ 'SQRT1_2': ['math.sqrt(1 / 2)', Lua.ORDER_HIGH],
121
+ 'INFINITY': ['math.huge', Lua.ORDER_HIGH],
122
122
  };
123
123
  return CONSTANTS[block.getFieldValue('CONSTANT')];
124
124
  };
@@ -126,61 +126,59 @@ Lua['math_constant'] = function(block) {
126
126
  Lua['math_number_property'] = function(block) {
127
127
  // Check if a number is even, odd, prime, whole, positive, or negative
128
128
  // or if it is divisible by certain number. Returns true or false.
129
- const number_to_check =
130
- Lua.valueToCode(block, 'NUMBER_TO_CHECK', Lua.ORDER_MULTIPLICATIVE) ||
131
- '0';
132
- const dropdown_property = block.getFieldValue('PROPERTY');
129
+ const PROPERTIES = {
130
+ 'EVEN': [' % 2 == 0', Lua.ORDER_MULTIPLICATIVE, Lua.ORDER_RELATIONAL],
131
+ 'ODD': [' % 2 == 1', Lua.ORDER_MULTIPLICATIVE, Lua.ORDER_RELATIONAL],
132
+ 'WHOLE': [' % 1 == 0', Lua.ORDER_MULTIPLICATIVE, Lua.ORDER_RELATIONAL],
133
+ 'POSITIVE': [' > 0', Lua.ORDER_RELATIONAL, Lua.ORDER_RELATIONAL],
134
+ 'NEGATIVE': [' < 0', Lua.ORDER_RELATIONAL, Lua.ORDER_RELATIONAL],
135
+ 'DIVISIBLE_BY': [null, Lua.ORDER_MULTIPLICATIVE, Lua.ORDER_RELATIONAL],
136
+ 'PRIME': [null, Lua.ORDER_NONE, Lua.ORDER_HIGH],
137
+ };
138
+ const dropdownProperty = block.getFieldValue('PROPERTY');
139
+ const [suffix, inputOrder, outputOrder] = PROPERTIES[dropdownProperty];
140
+ const numberToCheck = Lua.valueToCode(block, 'NUMBER_TO_CHECK',
141
+ inputOrder) || '0';
133
142
  let code;
134
- if (dropdown_property === 'PRIME') {
143
+ if (dropdownProperty === 'PRIME') {
135
144
  // Prime is a special case as it is not a one-liner test.
136
- const functionName = Lua.provideFunction_('math_isPrime', [
137
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(n)',
138
- ' -- https://en.wikipedia.org/wiki/Primality_test#Naive_methods',
139
- ' if n == 2 or n == 3 then', ' return true', ' end',
140
- ' -- False if n is NaN, negative, is 1, or not whole.',
141
- ' -- And false if n is divisible by 2 or 3.',
142
- ' if not(n > 1) or n % 1 ~= 0 or n % 2 == 0 or n % 3 == 0 then',
143
- ' return false', ' end',
144
- ' -- Check all the numbers of form 6k +/- 1, up to sqrt(n).',
145
- ' for x = 6, math.sqrt(n) + 1.5, 6 do',
146
- ' if n % (x - 1) == 0 or n % (x + 1) == 0 then', ' return false',
147
- ' end', ' end', ' return true', 'end'
148
- ]);
149
- code = functionName + '(' + number_to_check + ')';
150
- return [code, Lua.ORDER_HIGH];
151
- }
152
- switch (dropdown_property) {
153
- case 'EVEN':
154
- code = number_to_check + ' % 2 == 0';
155
- break;
156
- case 'ODD':
157
- code = number_to_check + ' % 2 == 1';
158
- break;
159
- case 'WHOLE':
160
- code = number_to_check + ' % 1 == 0';
161
- break;
162
- case 'POSITIVE':
163
- code = number_to_check + ' > 0';
164
- break;
165
- case 'NEGATIVE':
166
- code = number_to_check + ' < 0';
167
- break;
168
- case 'DIVISIBLE_BY': {
169
- const divisor =
170
- Lua.valueToCode(block, 'DIVISOR', Lua.ORDER_MULTIPLICATIVE);
171
- // If 'divisor' is some code that evals to 0, Lua will produce a nan.
172
- // Let's produce nil if we can determine this at compile-time.
173
- if (!divisor || divisor === '0') {
174
- return ['nil', Lua.ORDER_ATOMIC];
175
- }
176
- // The normal trick to implement ?: with and/or doesn't work here:
177
- // divisor == 0 and nil or number_to_check % divisor == 0
178
- // because nil is false, so allow a runtime failure. :-(
179
- code = number_to_check + ' % ' + divisor + ' == 0';
180
- break;
145
+ const functionName = Lua.provideFunction_('math_isPrime', `
146
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(n)
147
+ -- https://en.wikipedia.org/wiki/Primality_test#Naive_methods
148
+ if n == 2 or n == 3 then
149
+ return true
150
+ end
151
+ -- False if n is NaN, negative, is 1, or not whole.
152
+ -- And false if n is divisible by 2 or 3.
153
+ if not(n > 1) or n % 1 ~= 0 or n % 2 == 0 or n % 3 == 0 then
154
+ return false
155
+ end
156
+ -- Check all the numbers of form 6k +/- 1, up to sqrt(n).
157
+ for x = 6, math.sqrt(n) + 1.5, 6 do
158
+ if n % (x - 1) == 0 or n % (x + 1) == 0 then
159
+ return false
160
+ end
161
+ end
162
+ return true
163
+ end
164
+ `);
165
+ code = functionName + '(' + numberToCheck + ')';
166
+ } else if (dropdownProperty === 'DIVISIBLE_BY') {
167
+ const divisor = Lua.valueToCode(block, 'DIVISOR',
168
+ Lua.ORDER_MULTIPLICATIVE) || '0';
169
+ // If 'divisor' is some code that evals to 0, Lua will produce a nan.
170
+ // Let's produce nil if we can determine this at compile-time.
171
+ if (divisor === '0') {
172
+ return ['nil', Lua.ORDER_ATOMIC];
181
173
  }
174
+ // The normal trick to implement ?: with and/or doesn't work here:
175
+ // divisor == 0 and nil or number_to_check % divisor == 0
176
+ // because nil is false, so allow a runtime failure. :-(
177
+ code = numberToCheck + ' % ' + divisor + ' == 0';
178
+ } else {
179
+ code = numberToCheck + suffix;
182
180
  }
183
- return [code, Lua.ORDER_RELATIONAL];
181
+ return [code, outputOrder];
184
182
  };
185
183
 
186
184
  Lua['math_change'] = function(block) {
@@ -204,11 +202,15 @@ Lua['math_on_list'] = function(block) {
204
202
 
205
203
  // Functions needed in more than one case.
206
204
  function provideSum() {
207
- return Lua.provideFunction_('math_sum', [
208
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)',
209
- ' local result = 0', ' for _, v in ipairs(t) do',
210
- ' result = result + v', ' end', ' return result', 'end'
211
- ]);
205
+ return Lua.provideFunction_('math_sum', `
206
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)
207
+ local result = 0
208
+ for _, v in ipairs(t) do
209
+ result = result + v
210
+ end
211
+ return result
212
+ end
213
+ `);
212
214
  }
213
215
 
214
216
  switch (func) {
@@ -218,103 +220,139 @@ Lua['math_on_list'] = function(block) {
218
220
 
219
221
  case 'MIN':
220
222
  // Returns 0 for the empty list.
221
- functionName = Lua.provideFunction_('math_min', [
222
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)',
223
- ' if #t == 0 then', ' return 0', ' end',
224
- ' local result = math.huge', ' for _, v in ipairs(t) do',
225
- ' if v < result then', ' result = v', ' end', ' end',
226
- ' return result', 'end'
227
- ]);
223
+ functionName = Lua.provideFunction_('math_min', `
224
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)
225
+ if #t == 0 then
226
+ return 0
227
+ end
228
+ local result = math.huge
229
+ for _, v in ipairs(t) do
230
+ if v < result then
231
+ result = v
232
+ end
233
+ end
234
+ return result
235
+ end
236
+ `);
228
237
  break;
229
238
 
230
239
  case 'AVERAGE':
231
240
  // Returns 0 for the empty list.
232
- functionName = Lua.provideFunction_('math_average', [
233
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)',
234
- ' if #t == 0 then', ' return 0', ' end',
235
- ' return ' + provideSum() + '(t) / #t', 'end'
236
- ]);
241
+ functionName = Lua.provideFunction_('math_average', `
242
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)
243
+ if #t == 0 then
244
+ return 0
245
+ end
246
+ return ${provideSum()}(t) / #t
247
+ end
248
+ `);
237
249
  break;
238
250
 
239
251
  case 'MAX':
240
252
  // Returns 0 for the empty list.
241
- functionName = Lua.provideFunction_('math_max', [
242
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)',
243
- ' if #t == 0 then', ' return 0', ' end',
244
- ' local result = -math.huge', ' for _, v in ipairs(t) do',
245
- ' if v > result then', ' result = v', ' end', ' end',
246
- ' return result', 'end'
247
- ]);
253
+ functionName = Lua.provideFunction_('math_max', `
254
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)
255
+ if #t == 0 then
256
+ return 0
257
+ end
258
+ local result = -math.huge
259
+ for _, v in ipairs(t) do
260
+ if v > result then
261
+ result = v
262
+ end
263
+ end
264
+ return result
265
+ end
266
+ `);
248
267
  break;
249
268
 
250
269
  case 'MEDIAN':
251
- functionName = Lua.provideFunction_(
252
- 'math_median',
253
- // This operation excludes non-numbers.
254
- [
255
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)',
256
- ' -- Source: http://lua-users.org/wiki/SimpleStats',
257
- ' if #t == 0 then', ' return 0', ' end', ' local temp={}',
258
- ' for _, v in ipairs(t) do', ' if type(v) == "number" then',
259
- ' table.insert(temp, v)', ' end', ' end',
260
- ' table.sort(temp)', ' if #temp % 2 == 0 then',
261
- ' return (temp[#temp/2] + temp[(#temp/2)+1]) / 2', ' else',
262
- ' return temp[math.ceil(#temp/2)]', ' end', 'end'
263
- ]);
270
+ // This operation excludes non-numbers.
271
+ functionName = Lua.provideFunction_('math_median', `
272
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)
273
+ -- Source: http://lua-users.org/wiki/SimpleStats
274
+ if #t == 0 then
275
+ return 0
276
+ end
277
+ local temp = {}
278
+ for _, v in ipairs(t) do
279
+ if type(v) == 'number' then
280
+ table.insert(temp, v)
281
+ end
282
+ end
283
+ table.sort(temp)
284
+ if #temp % 2 == 0 then
285
+ return (temp[#temp / 2] + temp[(#temp / 2) + 1]) / 2
286
+ else
287
+ return temp[math.ceil(#temp / 2)]
288
+ end
289
+ end
290
+ `);
264
291
  break;
265
292
 
266
293
  case 'MODE':
267
- functionName = Lua.provideFunction_(
268
- 'math_modes',
269
- // As a list of numbers can contain more than one mode,
270
- // the returned result is provided as an array.
271
- // The Lua version includes non-numbers.
272
- [
273
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)',
274
- ' -- Source: http://lua-users.org/wiki/SimpleStats',
275
- ' local counts={}',
276
- ' for _, v in ipairs(t) do',
277
- ' if counts[v] == nil then',
278
- ' counts[v] = 1',
279
- ' else',
280
- ' counts[v] = counts[v] + 1',
281
- ' end',
282
- ' end',
283
- ' local biggestCount = 0',
284
- ' for _, v in pairs(counts) do',
285
- ' if v > biggestCount then',
286
- ' biggestCount = v',
287
- ' end',
288
- ' end',
289
- ' local temp={}',
290
- ' for k, v in pairs(counts) do',
291
- ' if v == biggestCount then',
292
- ' table.insert(temp, k)',
293
- ' end',
294
- ' end',
295
- ' return temp',
296
- 'end'
297
- ]);
294
+ // As a list of numbers can contain more than one mode,
295
+ // the returned result is provided as an array.
296
+ // The Lua version includes non-numbers.
297
+ functionName = Lua.provideFunction_('math_modes', `
298
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)
299
+ -- Source: http://lua-users.org/wiki/SimpleStats
300
+ local counts = {}
301
+ for _, v in ipairs(t) do
302
+ if counts[v] == nil then
303
+ counts[v] = 1
304
+ else
305
+ counts[v] = counts[v] + 1
306
+ end
307
+ end
308
+ local biggestCount = 0
309
+ for _, v in pairs(counts) do
310
+ if v > biggestCount then
311
+ biggestCount = v
312
+ end
313
+ end
314
+ local temp = {}
315
+ for k, v in pairs(counts) do
316
+ if v == biggestCount then
317
+ table.insert(temp, k)
318
+ end
319
+ end
320
+ return temp
321
+ end
322
+ `);
298
323
  break;
299
324
 
300
325
  case 'STD_DEV':
301
- functionName = Lua.provideFunction_('math_standard_deviation', [
302
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', ' local m',
303
- ' local vm', ' local total = 0', ' local count = 0',
304
- ' local result', ' m = #t == 0 and 0 or ' + provideSum() + '(t) / #t',
305
- ' for _, v in ipairs(t) do', ' if type(v) == \'number\' then',
306
- ' vm = v - m', ' total = total + (vm * vm)',
307
- ' count = count + 1', ' end', ' end',
308
- ' result = math.sqrt(total / (count-1))', ' return result', 'end'
309
- ]);
326
+ functionName = Lua.provideFunction_('math_standard_deviation', `
327
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)
328
+ local m
329
+ local vm
330
+ local total = 0
331
+ local count = 0
332
+ local result
333
+ m = #t == 0 and 0 or ${provideSum()}(t) / #t
334
+ for _, v in ipairs(t) do
335
+ if type(v) == 'number' then
336
+ vm = v - m
337
+ total = total + (vm * vm)
338
+ count = count + 1
339
+ end
340
+ end
341
+ result = math.sqrt(total / (count-1))
342
+ return result
343
+ end
344
+ `);
310
345
  break;
311
346
 
312
347
  case 'RANDOM':
313
- functionName = Lua.provideFunction_('math_random_list', [
314
- 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)',
315
- ' if #t == 0 then', ' return nil', ' end',
316
- ' return t[math.random(#t)]', 'end'
317
- ]);
348
+ functionName = Lua.provideFunction_('math_random_list', `
349
+ function ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)
350
+ if #t == 0 then
351
+ return nil
352
+ end
353
+ return t[math.random(#t)]
354
+ end
355
+ `);
318
356
  break;
319
357
 
320
358
  default: