@@ -27,6 +27,32 @@ import GdxForConverter from './gdx_for';
27
27
/* eslint-disable no-invalid-this */
28
28
const ColorRegexp = / ^ # [ 0 - 9 a - f A - F ] { 6 } $ / ;
29
29
30
+ // from scratch-vm/src/serialization/sb3.js
31
+ const CORE_EXTENSIONS = [
32
+ 'argument' ,
33
+ 'colour' ,
34
+ 'control' ,
35
+ 'data' ,
36
+ 'event' ,
37
+ 'looks' ,
38
+ 'math' ,
39
+ 'motion' ,
40
+ 'operator' ,
41
+ 'procedures' ,
42
+ 'sensing' ,
43
+ 'sound'
44
+ ] ;
45
+
46
+ // from scratch-vm/src/serialization/sb3.js
47
+ const getExtensionIdForOpcode = function ( opcode ) {
48
+ const index = opcode . indexOf ( '_' ) ;
49
+ const prefix = opcode . substring ( 0 , index ) ;
50
+ if ( CORE_EXTENSIONS . indexOf ( prefix ) === - 1 ) {
51
+ if ( prefix !== '' ) return prefix ;
52
+ }
53
+ return null ;
54
+ } ;
55
+
30
56
/**
31
57
* Class for a block converter that translates ruby code into the blocks.
32
58
*/
@@ -80,6 +106,7 @@ class RubyToBlocksConverter {
80
106
errors : [ ] ,
81
107
argumentBlocks : { } ,
82
108
procedureCallBlocks : { } ,
109
+ extensionIDs : new Set ( ) ,
83
110
84
111
blocks : { } ,
85
112
blockTypes : { } ,
@@ -127,6 +154,11 @@ class RubyToBlocksConverter {
127
154
`could not convert ${ block . opcode } : ${ this . _getSource ( block . node ) } `
128
155
) ;
129
156
}
157
+
158
+ const extensionID = getExtensionIdForOpcode ( block . opcode ) ;
159
+ if ( extensionID ) {
160
+ this . _context . extensionIDs . add ( extensionID ) ;
161
+ }
130
162
} ) ;
131
163
return true ;
132
164
} catch ( e ) {
@@ -182,11 +214,21 @@ class RubyToBlocksConverter {
182
214
Object . keys ( target . blocks . _blocks ) . forEach ( blockId => {
183
215
target . blocks . deleteBlock ( blockId ) ;
184
216
} ) ;
185
- Object . keys ( this . _context . blocks ) . forEach ( blockId => {
186
- target . blocks . createBlock ( this . _context . blocks [ blockId ] ) ;
217
+
218
+ const extensionPromises = [ ] ;
219
+ this . _context . extensionIDs . forEach ( extensionID => {
220
+ if ( ! this . vm . extensionManager . isExtensionLoaded ( extensionID ) ) {
221
+ extensionPromises . push ( this . vm . extensionManager . loadExtensionURL ( extensionID ) ) ;
222
+ }
187
223
} ) ;
188
224
189
- this . vm . emitWorkspaceUpdate ( ) ;
225
+ Promise . all ( extensionPromises ) . then ( ( ) => {
226
+ Object . keys ( this . _context . blocks ) . forEach ( blockId => {
227
+ target . blocks . createBlock ( this . _context . blocks [ blockId ] ) ;
228
+ } ) ;
229
+
230
+ this . vm . emitWorkspaceUpdate ( ) ;
231
+ } ) ;
190
232
}
191
233
192
234
_callConvertersHandler ( handlerName ) {
0 commit comments