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.
- package/blockly.d.ts +18963 -18432
- package/blockly.min.js +852 -844
- package/blockly_compressed.js +669 -664
- package/blockly_compressed.js.map +1 -1
- package/blocks/blocks.js +47 -0
- package/blocks/colour.js +13 -3
- package/blocks/lists.js +22 -13
- package/blocks/logic.js +13 -3
- package/blocks/loops.js +24 -11
- package/blocks/math.js +12 -3
- package/blocks/procedures.js +41 -27
- package/blocks/text.js +22 -13
- package/blocks/variables.js +14 -3
- package/blocks/variables_dynamic.js +13 -3
- package/blocks_compressed.js +146 -141
- package/blocks_compressed.js.map +1 -1
- package/core/block.js +1869 -1814
- package/core/block_drag_surface.js +201 -200
- package/core/block_dragger.js +377 -373
- package/core/block_svg.js +1593 -1479
- package/core/blockly.js +8 -22
- package/core/blocks.js +9 -2
- package/core/browser_events.js +22 -5
- package/core/bubble.js +841 -797
- package/core/bubble_dragger.js +213 -206
- package/core/bump_objects.js +2 -2
- package/core/clipboard.js +9 -9
- package/core/comment.js +353 -332
- package/core/common.js +46 -17
- package/core/component_manager.js +181 -174
- package/core/config.js +87 -0
- package/core/connection.js +595 -584
- package/core/connection_checker.js +242 -244
- package/core/connection_db.js +235 -230
- package/core/contextmenu.js +9 -6
- package/core/contextmenu_items.js +1 -2
- package/core/contextmenu_registry.js +93 -89
- package/core/css.js +474 -474
- package/core/delete_area.js +45 -42
- package/core/drag_target.js +57 -56
- package/core/dropdowndiv.js +153 -163
- package/core/events/events.js +2 -2
- package/core/events/events_abstract.js +89 -77
- package/core/events/events_block_base.js +37 -36
- package/core/events/events_block_change.js +130 -124
- package/core/events/events_block_create.js +73 -71
- package/core/events/events_block_delete.js +84 -82
- package/core/events/events_block_drag.js +50 -49
- package/core/events/events_block_move.js +147 -140
- package/core/events/events_bubble_open.js +51 -50
- package/core/events/events_click.js +48 -44
- package/core/events/events_comment_base.js +72 -69
- package/core/events/events_comment_change.js +63 -61
- package/core/events/events_comment_create.js +44 -42
- package/core/events/events_comment_delete.js +42 -40
- package/core/events/events_comment_move.js +106 -104
- package/core/events/events_marker_move.js +65 -64
- package/core/events/events_selected.js +46 -45
- package/core/events/events_theme_change.js +36 -35
- package/core/events/events_toolbox_item_select.js +46 -45
- package/core/events/events_trashcan_open.js +37 -36
- package/core/events/events_ui.js +47 -46
- package/core/events/events_ui_base.js +30 -29
- package/core/events/events_var_base.js +37 -36
- package/core/events/events_var_create.js +50 -48
- package/core/events/events_var_delete.js +50 -48
- package/core/events/events_var_rename.js +51 -49
- package/core/events/events_viewport.js +66 -65
- package/core/events/utils.js +29 -14
- package/core/events/workspace_events.js +49 -55
- package/core/extensions.js +4 -3
- package/core/field.js +1061 -997
- package/core/field_angle.js +462 -442
- package/core/field_checkbox.js +194 -182
- package/core/field_colour.js +519 -505
- package/core/field_dropdown.js +617 -598
- package/core/field_image.js +229 -220
- package/core/field_label.js +102 -91
- package/core/field_label_serializable.js +42 -41
- package/core/field_multilineinput.js +372 -358
- package/core/field_number.js +272 -253
- package/core/field_textinput.js +499 -467
- package/core/field_variable.js +458 -420
- package/core/flyout_base.js +1005 -952
- package/core/flyout_button.js +277 -260
- package/core/flyout_horizontal.js +304 -302
- package/core/flyout_metrics_manager.js +64 -64
- package/core/flyout_vertical.js +306 -300
- package/core/generator.js +459 -446
- package/core/gesture.js +829 -813
- package/core/grid.js +166 -163
- package/core/icon.js +168 -159
- package/core/inject.js +7 -5
- package/core/input.js +257 -248
- package/core/insertion_marker_manager.js +655 -624
- package/core/internal_constants.js +0 -129
- package/core/keyboard_nav/ast_node.js +605 -596
- package/core/keyboard_nav/basic_cursor.js +166 -165
- package/core/keyboard_nav/cursor.js +99 -97
- package/core/keyboard_nav/marker.js +83 -79
- package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
- package/core/marker_manager.js +153 -141
- package/core/menu.js +377 -372
- package/core/menuitem.js +223 -217
- package/core/metrics_manager.js +403 -390
- package/core/mutator.js +468 -437
- package/core/names.js +229 -188
- package/core/options.js +290 -284
- package/core/procedures.js +29 -17
- package/core/registry.js +19 -16
- package/core/rendered_connection.js +482 -463
- package/core/renderers/common/block_rendering.js +9 -3
- package/core/renderers/common/constants.js +1119 -1112
- package/core/renderers/common/debug.js +14 -0
- package/core/renderers/common/debugger.js +338 -316
- package/core/renderers/common/drawer.js +380 -370
- package/core/renderers/common/i_path_object.js +2 -2
- package/core/renderers/common/info.js +626 -618
- package/core/renderers/common/marker_svg.js +579 -541
- package/core/renderers/common/path_object.js +203 -200
- package/core/renderers/common/renderer.js +220 -218
- package/core/renderers/geras/constants.js +36 -36
- package/core/renderers/geras/drawer.js +155 -147
- package/core/renderers/geras/highlight_constants.js +244 -238
- package/core/renderers/geras/highlighter.js +231 -179
- package/core/renderers/geras/info.js +392 -369
- package/core/renderers/geras/measurables/inline_input.js +25 -19
- package/core/renderers/geras/measurables/statement_input.js +23 -17
- package/core/renderers/geras/path_object.js +106 -121
- package/core/renderers/geras/renderer.js +96 -98
- package/core/renderers/measurables/base.js +30 -18
- package/core/renderers/measurables/bottom_row.js +83 -80
- package/core/renderers/measurables/connection.js +22 -15
- package/core/renderers/measurables/external_value_input.js +35 -22
- package/core/renderers/measurables/field.js +35 -20
- package/core/renderers/measurables/hat.js +18 -13
- package/core/renderers/measurables/icon.js +24 -17
- package/core/renderers/measurables/in_row_spacer.js +15 -13
- package/core/renderers/measurables/inline_input.js +43 -33
- package/core/renderers/measurables/input_connection.js +41 -28
- package/core/renderers/measurables/input_row.js +50 -44
- package/core/renderers/measurables/jagged_edge.js +14 -12
- package/core/renderers/measurables/next_connection.js +16 -14
- package/core/renderers/measurables/output_connection.js +26 -20
- package/core/renderers/measurables/previous_connection.js +16 -15
- package/core/renderers/measurables/round_corner.js +20 -18
- package/core/renderers/measurables/row.js +184 -168
- package/core/renderers/measurables/spacer_row.js +38 -23
- package/core/renderers/measurables/square_corner.js +18 -16
- package/core/renderers/measurables/statement_input.js +23 -20
- package/core/renderers/measurables/top_row.js +88 -85
- package/core/renderers/minimalist/constants.js +8 -7
- package/core/renderers/minimalist/drawer.js +11 -10
- package/core/renderers/minimalist/info.js +18 -18
- package/core/renderers/minimalist/renderer.js +40 -39
- package/core/renderers/thrasos/info.js +258 -248
- package/core/renderers/thrasos/renderer.js +20 -20
- package/core/renderers/zelos/constants.js +898 -873
- package/core/renderers/zelos/drawer.js +186 -169
- package/core/renderers/zelos/info.js +502 -479
- package/core/renderers/zelos/marker_svg.js +129 -115
- package/core/renderers/zelos/measurables/bottom_row.js +31 -30
- package/core/renderers/zelos/measurables/inputs.js +22 -21
- package/core/renderers/zelos/measurables/row_elements.js +14 -13
- package/core/renderers/zelos/measurables/top_row.js +34 -33
- package/core/renderers/zelos/path_object.js +181 -180
- package/core/renderers/zelos/renderer.js +91 -92
- package/core/scrollbar.js +759 -713
- package/core/scrollbar_pair.js +250 -245
- package/core/serialization/blocks.js +19 -9
- package/core/serialization/workspaces.js +3 -2
- package/core/shortcut_registry.js +286 -277
- package/core/sprites.js +31 -0
- package/core/theme.js +135 -141
- package/core/theme_manager.js +147 -143
- package/core/toolbox/category.js +602 -576
- package/core/toolbox/collapsible_category.js +226 -227
- package/core/toolbox/separator.js +70 -61
- package/core/toolbox/toolbox.js +934 -927
- package/core/toolbox/toolbox_item.js +115 -99
- package/core/tooltip.js +108 -35
- package/core/touch.js +8 -3
- package/core/touch_gesture.js +254 -251
- package/core/trashcan.js +606 -595
- package/core/utils/coordinate.js +97 -95
- package/core/utils/dom.js +2 -2
- package/core/utils/global.js +2 -0
- package/core/utils/rect.js +41 -37
- package/core/utils/sentinel.js +25 -0
- package/core/utils/size.js +30 -27
- package/core/utils/svg.js +18 -16
- package/core/variable_map.js +325 -341
- package/core/variable_model.js +55 -54
- package/core/variables.js +9 -2
- package/core/variables_dynamic.js +3 -1
- package/core/warning.js +126 -120
- package/core/widgetdiv.js +4 -4
- package/core/workspace.js +685 -664
- package/core/workspace_audio.js +124 -118
- package/core/workspace_comment.js +308 -298
- package/core/workspace_comment_svg.js +1029 -951
- package/core/workspace_drag_surface_svg.js +147 -140
- package/core/workspace_dragger.js +70 -71
- package/core/workspace_svg.js +2322 -2297
- package/core/xml.js +30 -20
- package/core/zoom_controls.js +431 -439
- package/dart_compressed.js +40 -43
- package/dart_compressed.js.map +1 -1
- package/generators/dart/colour.js +56 -64
- package/generators/dart/lists.js +61 -50
- package/generators/dart/math.js +160 -148
- package/generators/dart/text.js +83 -61
- package/generators/javascript/colour.js +37 -34
- package/generators/javascript/lists.js +50 -43
- package/generators/javascript/math.js +123 -139
- package/generators/javascript/text.js +67 -81
- package/generators/lua/colour.js +25 -23
- package/generators/lua/lists.js +97 -69
- package/generators/lua/logic.js +1 -2
- package/generators/lua/math.js +182 -144
- package/generators/lua/text.js +116 -99
- package/generators/php/colour.js +38 -32
- package/generators/php/lists.js +109 -89
- package/generators/php/math.js +90 -81
- package/generators/php/text.js +63 -61
- package/generators/python/colour.js +18 -18
- package/generators/python/lists.js +38 -30
- package/generators/python/loops.js +12 -8
- package/generators/python/math.js +104 -106
- package/generators/python/text.js +34 -30
- package/javascript_compressed.js +37 -39
- package/javascript_compressed.js.map +1 -1
- package/lua_compressed.js +39 -42
- package/lua_compressed.js.map +1 -1
- package/msg/az.js +2 -2
- package/msg/be.js +4 -4
- package/msg/cs.js +15 -15
- package/msg/de.js +1 -1
- package/msg/diq.js +1 -1
- package/msg/eo.js +1 -1
- package/msg/es.js +1 -1
- package/msg/fa.js +1 -1
- package/msg/fr.js +4 -4
- package/msg/he.js +1 -1
- package/msg/hr.js +2 -2
- package/msg/hy.js +2 -2
- package/msg/id.js +12 -12
- package/msg/inh.js +14 -14
- package/msg/ja.js +7 -7
- package/msg/lv.js +29 -29
- package/msg/pa.js +3 -3
- package/msg/smn.js +436 -0
- package/msg/te.js +1 -1
- package/msg/yue.js +1 -1
- package/msg/zh-hans.js +3 -3
- package/msg/zh-hant.js +3 -3
- package/package.json +7 -6
- package/php_compressed.js +38 -42
- package/php_compressed.js.map +1 -1
- package/python_compressed.js +26 -25
- package/python_compressed.js.map +1 -1
- package/blocks/all.js +0 -23
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
*/
|
|
18
18
|
goog.module('Blockly.BasicCursor');
|
|
19
19
|
|
|
20
|
-
const object = goog.require('Blockly.utils.object');
|
|
21
20
|
const registry = goog.require('Blockly.registry');
|
|
22
21
|
const {ASTNode} = goog.require('Blockly.ASTNode');
|
|
23
22
|
const {Cursor} = goog.require('Blockly.Cursor');
|
|
@@ -27,196 +26,198 @@ const {Cursor} = goog.require('Blockly.Cursor');
|
|
|
27
26
|
* Class for a basic cursor.
|
|
28
27
|
* This will allow the user to get to all nodes in the AST by hitting next or
|
|
29
28
|
* previous.
|
|
30
|
-
* @constructor
|
|
31
29
|
* @extends {Cursor}
|
|
32
30
|
* @alias Blockly.BasicCursor
|
|
33
31
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
* Name used for registering a basic cursor.
|
|
41
|
-
* @const {string}
|
|
42
|
-
*/
|
|
43
|
-
BasicCursor.registrationName = 'basicCursor';
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Find the next node in the pre order traversal.
|
|
47
|
-
* @return {?ASTNode} The next node, or null if the current node is
|
|
48
|
-
* not set or there is no next value.
|
|
49
|
-
* @override
|
|
50
|
-
*/
|
|
51
|
-
BasicCursor.prototype.next = function() {
|
|
52
|
-
const curNode = this.getCurNode();
|
|
53
|
-
if (!curNode) {
|
|
54
|
-
return null;
|
|
32
|
+
class BasicCursor extends Cursor {
|
|
33
|
+
/**
|
|
34
|
+
* @alias Blockly.BasicCursor
|
|
35
|
+
*/
|
|
36
|
+
constructor() {
|
|
37
|
+
super();
|
|
55
38
|
}
|
|
56
|
-
const newNode = this.getNextNode_(curNode, this.validNode_);
|
|
57
39
|
|
|
58
|
-
|
|
59
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Find the next node in the pre order traversal.
|
|
42
|
+
* @return {?ASTNode} The next node, or null if the current node is
|
|
43
|
+
* not set or there is no next value.
|
|
44
|
+
* @override
|
|
45
|
+
*/
|
|
46
|
+
next() {
|
|
47
|
+
const curNode = this.getCurNode();
|
|
48
|
+
if (!curNode) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const newNode = this.getNextNode_(curNode, this.validNode_);
|
|
52
|
+
|
|
53
|
+
if (newNode) {
|
|
54
|
+
this.setCurNode(newNode);
|
|
55
|
+
}
|
|
56
|
+
return newNode;
|
|
60
57
|
}
|
|
61
|
-
return newNode;
|
|
62
|
-
};
|
|
63
58
|
|
|
64
|
-
/**
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Find the previous node in the pre order traversal.
|
|
78
|
-
* @return {?ASTNode} The previous node, or null if the current node
|
|
79
|
-
* is not set or there is no previous value.
|
|
80
|
-
* @override
|
|
81
|
-
*/
|
|
82
|
-
BasicCursor.prototype.prev = function() {
|
|
83
|
-
const curNode = this.getCurNode();
|
|
84
|
-
if (!curNode) {
|
|
85
|
-
return null;
|
|
59
|
+
/**
|
|
60
|
+
* For a basic cursor we only have the ability to go next and previous, so
|
|
61
|
+
* in will also allow the user to get to the next node in the pre order
|
|
62
|
+
* traversal.
|
|
63
|
+
* @return {?ASTNode} The next node, or null if the current node is
|
|
64
|
+
* not set or there is no next value.
|
|
65
|
+
* @override
|
|
66
|
+
*/
|
|
67
|
+
in() {
|
|
68
|
+
return this.next();
|
|
86
69
|
}
|
|
87
|
-
const newNode = this.getPreviousNode_(curNode, this.validNode_);
|
|
88
70
|
|
|
89
|
-
|
|
90
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Find the previous node in the pre order traversal.
|
|
73
|
+
* @return {?ASTNode} The previous node, or null if the current node
|
|
74
|
+
* is not set or there is no previous value.
|
|
75
|
+
* @override
|
|
76
|
+
*/
|
|
77
|
+
prev() {
|
|
78
|
+
const curNode = this.getCurNode();
|
|
79
|
+
if (!curNode) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const newNode = this.getPreviousNode_(curNode, this.validNode_);
|
|
83
|
+
|
|
84
|
+
if (newNode) {
|
|
85
|
+
this.setCurNode(newNode);
|
|
86
|
+
}
|
|
87
|
+
return newNode;
|
|
91
88
|
}
|
|
92
|
-
return newNode;
|
|
93
|
-
};
|
|
94
89
|
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
90
|
+
/**
|
|
91
|
+
* For a basic cursor we only have the ability to go next and previous, so
|
|
92
|
+
* out will allow the user to get to the previous node in the pre order
|
|
93
|
+
* traversal.
|
|
94
|
+
* @return {?ASTNode} The previous node, or null if the current node is
|
|
95
|
+
* not set or there is no previous value.
|
|
96
|
+
* @override
|
|
97
|
+
*/
|
|
98
|
+
out() {
|
|
99
|
+
return this.prev();
|
|
100
|
+
}
|
|
106
101
|
|
|
107
|
-
/**
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Uses pre order traversal to navigate the Blockly AST. This will allow
|
|
104
|
+
* a user to easily navigate the entire Blockly AST without having to go in
|
|
105
|
+
* and out levels on the tree.
|
|
106
|
+
* @param {?ASTNode} node The current position in the AST.
|
|
107
|
+
* @param {!function(ASTNode) : boolean} isValid A function true/false
|
|
108
|
+
* depending on whether the given node should be traversed.
|
|
109
|
+
* @return {?ASTNode} The next node in the traversal.
|
|
110
|
+
* @protected
|
|
111
|
+
*/
|
|
112
|
+
getNextNode_(node, isValid) {
|
|
113
|
+
if (!node) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const newNode = node.in() || node.next();
|
|
117
|
+
if (isValid(newNode)) {
|
|
118
|
+
return newNode;
|
|
119
|
+
} else if (newNode) {
|
|
120
|
+
return this.getNextNode_(newNode, isValid);
|
|
121
|
+
}
|
|
122
|
+
const siblingOrParent = this.findSiblingOrParent_(node.out());
|
|
123
|
+
if (isValid(siblingOrParent)) {
|
|
124
|
+
return siblingOrParent;
|
|
125
|
+
} else if (siblingOrParent) {
|
|
126
|
+
return this.getNextNode_(siblingOrParent, isValid);
|
|
127
|
+
}
|
|
119
128
|
return null;
|
|
120
129
|
}
|
|
121
|
-
const newNode = node.in() || node.next();
|
|
122
|
-
if (isValid(newNode)) {
|
|
123
|
-
return newNode;
|
|
124
|
-
} else if (newNode) {
|
|
125
|
-
return this.getNextNode_(newNode, isValid);
|
|
126
|
-
}
|
|
127
|
-
const siblingOrParent = this.findSiblingOrParent_(node.out());
|
|
128
|
-
if (isValid(siblingOrParent)) {
|
|
129
|
-
return siblingOrParent;
|
|
130
|
-
} else if (siblingOrParent) {
|
|
131
|
-
return this.getNextNode_(siblingOrParent, isValid);
|
|
132
|
-
}
|
|
133
|
-
return null;
|
|
134
|
-
};
|
|
135
130
|
|
|
136
|
-
/**
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
131
|
+
/**
|
|
132
|
+
* Reverses the pre order traversal in order to find the previous node. This
|
|
133
|
+
* will allow a user to easily navigate the entire Blockly AST without having
|
|
134
|
+
* to go in and out levels on the tree.
|
|
135
|
+
* @param {?ASTNode} node The current position in the AST.
|
|
136
|
+
* @param {!function(ASTNode) : boolean} isValid A function true/false
|
|
137
|
+
* depending on whether the given node should be traversed.
|
|
138
|
+
* @return {?ASTNode} The previous node in the traversal or null if no
|
|
139
|
+
* previous node exists.
|
|
140
|
+
* @protected
|
|
141
|
+
*/
|
|
142
|
+
getPreviousNode_(node, isValid) {
|
|
143
|
+
if (!node) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
let newNode = node.prev();
|
|
147
|
+
|
|
148
|
+
if (newNode) {
|
|
149
|
+
newNode = this.getRightMostChild_(newNode);
|
|
150
|
+
} else {
|
|
151
|
+
newNode = node.out();
|
|
152
|
+
}
|
|
153
|
+
if (isValid(newNode)) {
|
|
154
|
+
return newNode;
|
|
155
|
+
} else if (newNode) {
|
|
156
|
+
return this.getPreviousNode_(newNode, isValid);
|
|
157
|
+
}
|
|
149
158
|
return null;
|
|
150
159
|
}
|
|
151
|
-
let newNode = node.prev();
|
|
152
160
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
161
|
+
/**
|
|
162
|
+
* Decides what nodes to traverse and which ones to skip. Currently, it
|
|
163
|
+
* skips output, stack and workspace nodes.
|
|
164
|
+
* @param {?ASTNode} node The AST node to check whether it is valid.
|
|
165
|
+
* @return {boolean} True if the node should be visited, false otherwise.
|
|
166
|
+
* @protected
|
|
167
|
+
*/
|
|
168
|
+
validNode_(node) {
|
|
169
|
+
let isValid = false;
|
|
170
|
+
const type = node && node.getType();
|
|
171
|
+
if (type === ASTNode.types.OUTPUT || type === ASTNode.types.INPUT ||
|
|
172
|
+
type === ASTNode.types.FIELD || type === ASTNode.types.NEXT ||
|
|
173
|
+
type === ASTNode.types.PREVIOUS || type === ASTNode.types.WORKSPACE) {
|
|
174
|
+
isValid = true;
|
|
175
|
+
}
|
|
176
|
+
return isValid;
|
|
162
177
|
}
|
|
163
|
-
return null;
|
|
164
|
-
};
|
|
165
178
|
|
|
166
|
-
/**
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
179
|
+
/**
|
|
180
|
+
* From the given node find either the next valid sibling or parent.
|
|
181
|
+
* @param {?ASTNode} node The current position in the AST.
|
|
182
|
+
* @return {?ASTNode} The parent AST node or null if there are no
|
|
183
|
+
* valid parents.
|
|
184
|
+
* @private
|
|
185
|
+
*/
|
|
186
|
+
findSiblingOrParent_(node) {
|
|
187
|
+
if (!node) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
const nextNode = node.next();
|
|
191
|
+
if (nextNode) {
|
|
192
|
+
return nextNode;
|
|
193
|
+
}
|
|
194
|
+
return this.findSiblingOrParent_(node.out());
|
|
180
195
|
}
|
|
181
|
-
return isValid;
|
|
182
|
-
};
|
|
183
196
|
|
|
184
|
-
/**
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
197
|
+
/**
|
|
198
|
+
* Get the right most child of a node.
|
|
199
|
+
* @param {?ASTNode} node The node to find the right most child of.
|
|
200
|
+
* @return {?ASTNode} The right most child of the given node, or the node
|
|
201
|
+
* if no child exists.
|
|
202
|
+
* @private
|
|
203
|
+
*/
|
|
204
|
+
getRightMostChild_(node) {
|
|
205
|
+
if (!node.in()) {
|
|
206
|
+
return node;
|
|
207
|
+
}
|
|
208
|
+
let newNode = node.in();
|
|
209
|
+
while (newNode.next()) {
|
|
210
|
+
newNode = newNode.next();
|
|
211
|
+
}
|
|
212
|
+
return this.getRightMostChild_(newNode);
|
|
194
213
|
}
|
|
195
|
-
|
|
196
|
-
if (nextNode) {
|
|
197
|
-
return nextNode;
|
|
198
|
-
}
|
|
199
|
-
return this.findSiblingOrParent_(node.out());
|
|
200
|
-
};
|
|
201
|
-
|
|
214
|
+
}
|
|
202
215
|
|
|
203
216
|
/**
|
|
204
|
-
*
|
|
205
|
-
* @
|
|
206
|
-
* @return {?ASTNode} The right most child of the given node, or the node
|
|
207
|
-
* if no child exists.
|
|
208
|
-
* @private
|
|
217
|
+
* Name used for registering a basic cursor.
|
|
218
|
+
* @const {string}
|
|
209
219
|
*/
|
|
210
|
-
BasicCursor.
|
|
211
|
-
if (!node.in()) {
|
|
212
|
-
return node;
|
|
213
|
-
}
|
|
214
|
-
let newNode = node.in();
|
|
215
|
-
while (newNode.next()) {
|
|
216
|
-
newNode = newNode.next();
|
|
217
|
-
}
|
|
218
|
-
return this.getRightMostChild_(newNode);
|
|
219
|
-
};
|
|
220
|
+
BasicCursor.registrationName = 'basicCursor';
|
|
220
221
|
|
|
221
222
|
registry.register(
|
|
222
223
|
registry.Type.CURSOR, BasicCursor.registrationName, BasicCursor);
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
*/
|
|
18
18
|
goog.module('Blockly.Cursor');
|
|
19
19
|
|
|
20
|
-
const object = goog.require('Blockly.utils.object');
|
|
21
20
|
const registry = goog.require('Blockly.registry');
|
|
22
21
|
const {ASTNode} = goog.require('Blockly.ASTNode');
|
|
23
22
|
const {Marker} = goog.require('Blockly.Marker');
|
|
@@ -25,117 +24,120 @@ const {Marker} = goog.require('Blockly.Marker');
|
|
|
25
24
|
/**
|
|
26
25
|
* Class for a cursor.
|
|
27
26
|
* A cursor controls how a user navigates the Blockly AST.
|
|
28
|
-
* @constructor
|
|
29
27
|
* @extends {Marker}
|
|
30
28
|
* @alias Blockly.Cursor
|
|
31
29
|
*/
|
|
32
|
-
|
|
33
|
-
Cursor.superClass_.constructor.call(this);
|
|
34
|
-
|
|
30
|
+
class Cursor extends Marker {
|
|
35
31
|
/**
|
|
36
|
-
* @
|
|
32
|
+
* @alias Blockly.Cursor
|
|
37
33
|
*/
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
object.inherits(Cursor, Marker);
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Find the next connection, field, or block.
|
|
44
|
-
* @return {ASTNode} The next element, or null if the current node is
|
|
45
|
-
* not set or there is no next value.
|
|
46
|
-
* @public
|
|
47
|
-
*/
|
|
48
|
-
Cursor.prototype.next = function() {
|
|
49
|
-
const curNode = this.getCurNode();
|
|
50
|
-
if (!curNode) {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
let newNode = curNode.next();
|
|
55
|
-
while (newNode && newNode.next() &&
|
|
56
|
-
(newNode.getType() === ASTNode.types.NEXT ||
|
|
57
|
-
newNode.getType() === ASTNode.types.BLOCK)) {
|
|
58
|
-
newNode = newNode.next();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (newNode) {
|
|
62
|
-
this.setCurNode(newNode);
|
|
63
|
-
}
|
|
64
|
-
return newNode;
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Find the in connection or field.
|
|
69
|
-
* @return {ASTNode} The in element, or null if the current node is
|
|
70
|
-
* not set or there is no in value.
|
|
71
|
-
* @public
|
|
72
|
-
*/
|
|
73
|
-
Cursor.prototype.in = function() {
|
|
74
|
-
let curNode = this.getCurNode();
|
|
75
|
-
if (!curNode) {
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
// If we are on a previous or output connection, go to the block level before
|
|
79
|
-
// performing next operation.
|
|
80
|
-
if (curNode.getType() === ASTNode.types.PREVIOUS ||
|
|
81
|
-
curNode.getType() === ASTNode.types.OUTPUT) {
|
|
82
|
-
curNode = curNode.next();
|
|
83
|
-
}
|
|
84
|
-
const newNode = curNode.in();
|
|
85
|
-
|
|
86
|
-
if (newNode) {
|
|
87
|
-
this.setCurNode(newNode);
|
|
88
|
-
}
|
|
89
|
-
return newNode;
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Find the previous connection, field, or block.
|
|
94
|
-
* @return {ASTNode} The previous element, or null if the current node
|
|
95
|
-
* is not set or there is no previous value.
|
|
96
|
-
* @public
|
|
97
|
-
*/
|
|
98
|
-
Cursor.prototype.prev = function() {
|
|
99
|
-
const curNode = this.getCurNode();
|
|
100
|
-
if (!curNode) {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
let newNode = curNode.prev();
|
|
34
|
+
constructor() {
|
|
35
|
+
super();
|
|
104
36
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
37
|
+
/**
|
|
38
|
+
* @override
|
|
39
|
+
*/
|
|
40
|
+
this.type = 'cursor';
|
|
109
41
|
}
|
|
110
42
|
|
|
111
|
-
|
|
112
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Find the next connection, field, or block.
|
|
45
|
+
* @return {ASTNode} The next element, or null if the current node is
|
|
46
|
+
* not set or there is no next value.
|
|
47
|
+
* @public
|
|
48
|
+
*/
|
|
49
|
+
next() {
|
|
50
|
+
const curNode = this.getCurNode();
|
|
51
|
+
if (!curNode) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let newNode = curNode.next();
|
|
56
|
+
while (newNode && newNode.next() &&
|
|
57
|
+
(newNode.getType() === ASTNode.types.NEXT ||
|
|
58
|
+
newNode.getType() === ASTNode.types.BLOCK)) {
|
|
59
|
+
newNode = newNode.next();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (newNode) {
|
|
63
|
+
this.setCurNode(newNode);
|
|
64
|
+
}
|
|
65
|
+
return newNode;
|
|
113
66
|
}
|
|
114
|
-
return newNode;
|
|
115
|
-
};
|
|
116
67
|
|
|
117
|
-
/**
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Find the in connection or field.
|
|
70
|
+
* @return {ASTNode} The in element, or null if the current node is
|
|
71
|
+
* not set or there is no in value.
|
|
72
|
+
* @public
|
|
73
|
+
*/
|
|
74
|
+
in() {
|
|
75
|
+
let curNode = this.getCurNode();
|
|
76
|
+
if (!curNode) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
// If we are on a previous or output connection, go to the block level
|
|
80
|
+
// before performing next operation.
|
|
81
|
+
if (curNode.getType() === ASTNode.types.PREVIOUS ||
|
|
82
|
+
curNode.getType() === ASTNode.types.OUTPUT) {
|
|
83
|
+
curNode = curNode.next();
|
|
84
|
+
}
|
|
85
|
+
const newNode = curNode.in();
|
|
86
|
+
|
|
87
|
+
if (newNode) {
|
|
88
|
+
this.setCurNode(newNode);
|
|
89
|
+
}
|
|
90
|
+
return newNode;
|
|
127
91
|
}
|
|
128
|
-
let newNode = curNode.out();
|
|
129
92
|
|
|
130
|
-
|
|
131
|
-
|
|
93
|
+
/**
|
|
94
|
+
* Find the previous connection, field, or block.
|
|
95
|
+
* @return {ASTNode} The previous element, or null if the current node
|
|
96
|
+
* is not set or there is no previous value.
|
|
97
|
+
* @public
|
|
98
|
+
*/
|
|
99
|
+
prev() {
|
|
100
|
+
const curNode = this.getCurNode();
|
|
101
|
+
if (!curNode) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
let newNode = curNode.prev();
|
|
105
|
+
|
|
106
|
+
while (newNode && newNode.prev() &&
|
|
107
|
+
(newNode.getType() === ASTNode.types.NEXT ||
|
|
108
|
+
newNode.getType() === ASTNode.types.BLOCK)) {
|
|
109
|
+
newNode = newNode.prev();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (newNode) {
|
|
113
|
+
this.setCurNode(newNode);
|
|
114
|
+
}
|
|
115
|
+
return newNode;
|
|
132
116
|
}
|
|
133
117
|
|
|
134
|
-
|
|
135
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Find the out connection, field, or block.
|
|
120
|
+
* @return {ASTNode} The out element, or null if the current node is
|
|
121
|
+
* not set or there is no out value.
|
|
122
|
+
* @public
|
|
123
|
+
*/
|
|
124
|
+
out() {
|
|
125
|
+
const curNode = this.getCurNode();
|
|
126
|
+
if (!curNode) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
let newNode = curNode.out();
|
|
130
|
+
|
|
131
|
+
if (newNode && newNode.getType() === ASTNode.types.BLOCK) {
|
|
132
|
+
newNode = newNode.prev() || newNode;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (newNode) {
|
|
136
|
+
this.setCurNode(newNode);
|
|
137
|
+
}
|
|
138
|
+
return newNode;
|
|
136
139
|
}
|
|
137
|
-
|
|
138
|
-
};
|
|
140
|
+
}
|
|
139
141
|
|
|
140
142
|
registry.register(registry.Type.CURSOR, registry.DEFAULT, Cursor);
|
|
141
143
|
|