@digipair/skill-web-editor 0.91.0-0 → 0.91.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-to-json.cjs.js +338 -0
- package/blockly-to-json.esm.js +336 -0
- package/index.cjs.d.ts +1 -0
- package/index.cjs.js +12 -0
- package/index.cjs2.js +72611 -0
- package/index.esm.js +1 -0
- package/index.esm2.js +72608 -0
- package/libs/skill-web-editor/src/lib/blocks/json.d.ts +145 -0
- package/libs/skill-web-editor/src/lib/editor.element.d.ts +24 -0
- package/libs/skill-web-editor/src/lib/generator/blockly-to-json.d.ts +1 -0
- package/libs/skill-web-editor/src/lib/generator/json-to-blockly.d.ts +1 -0
- package/libs/skill-web-editor/src/lib/generator/pins-to-blockly.d.ts +139 -0
- package/libs/skill-web-editor/src/lib/schemas/web.fr.schema.d.ts +4028 -0
- package/libs/skill-web-editor/src/lib/schemas/web.schema.d.ts +4028 -0
- package/libs/skill-web-editor/src/lib/skill-web-editor.d.ts +1 -0
- package/package.json +5 -21
- package/pins-to-blockly.cjs.js +628 -0
- package/pins-to-blockly.esm.js +624 -0
- package/.swcrc +0 -28
- package/README.md +0 -7
- package/eslint.config.mjs +0 -22
- package/rollup.config.cjs +0 -28
- package/src/lib/blocks/json.ts +0 -145
- package/src/lib/editor.element.ts +0 -279
- package/src/lib/generator/blockly-to-json.ts +0 -360
- package/src/lib/generator/json-to-blockly.ts +0 -757
- package/src/lib/generator/pins-to-blockly.ts +0 -927
- package/src/lib/schemas/web.fr.schema.ts +0 -34473
- package/src/lib/schemas/web.schema.ts +0 -34473
- package/src/lib/skill-web-editor.spec.ts +0 -7
- package/src/lib/skill-web-editor.ts +0 -1
- package/tsconfig.json +0 -13
- package/tsconfig.lib.json +0 -19
- /package/{src/index.d.ts → index.d.ts} +0 -0
- /package/{src/index.ts → libs/skill-web-editor/src/index.d.ts} +0 -0
- /package/{src/schema.fr.json → schema.fr.json} +0 -0
- /package/{src/schema.json → schema.json} +0 -0
@@ -0,0 +1,338 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
var index = require('./index.cjs2.js');
|
4
|
+
|
5
|
+
const jsonGenerator = new Blockly.Generator('JSON');
|
6
|
+
jsonGenerator.PRECEDENCE = 0;
|
7
|
+
jsonGenerator['generic-scene-block'] = function(block) {
|
8
|
+
function safeParse(jsonString, defaultValue) {
|
9
|
+
try {
|
10
|
+
if (jsonString && jsonString.trim() !== '') {
|
11
|
+
return JSON.parse(jsonString);
|
12
|
+
}
|
13
|
+
} catch (e) {
|
14
|
+
console.error('JSON parsing error:', e);
|
15
|
+
}
|
16
|
+
return defaultValue;
|
17
|
+
}
|
18
|
+
const pinsCode = jsonGenerator.valueToCode(block, 'EXECUTE_PINS', jsonGenerator.PRECEDENCE) || 'null';
|
19
|
+
const metadataCode = jsonGenerator.valueToCode(block, 'METADATA_INPUT', jsonGenerator.PRECEDENCE) || '{}';
|
20
|
+
const eventsCode = jsonGenerator.valueToCode(block, 'EVENTS_INPUT', jsonGenerator.PRECEDENCE) || '{}';
|
21
|
+
const pinsData = safeParse(pinsCode, null);
|
22
|
+
const metadata = safeParse(metadataCode, {});
|
23
|
+
const events = safeParse(eventsCode, {});
|
24
|
+
const objectToSerialize = index._extends({
|
25
|
+
type: block.getFieldValue('SCENE_TYPE') || null,
|
26
|
+
metadata: metadata
|
27
|
+
}, pinsData !== null ? pinsData : {}, {
|
28
|
+
events: events
|
29
|
+
});
|
30
|
+
const serializedCode = JSON.stringify(objectToSerialize);
|
31
|
+
return [
|
32
|
+
serializedCode,
|
33
|
+
jsonGenerator.PRECEDENCE
|
34
|
+
];
|
35
|
+
};
|
36
|
+
jsonGenerator['logic_null'] = function(block) {
|
37
|
+
return [
|
38
|
+
'null',
|
39
|
+
jsonGenerator.PRECEDENCE
|
40
|
+
];
|
41
|
+
};
|
42
|
+
jsonGenerator['text_multiline'] = function(block) {
|
43
|
+
const textValue = block.getFieldValue('TEXT');
|
44
|
+
const code = `${JSON.stringify(textValue)}`;
|
45
|
+
return [
|
46
|
+
code,
|
47
|
+
jsonGenerator.PRECEDENCE
|
48
|
+
];
|
49
|
+
};
|
50
|
+
jsonGenerator['math_number'] = function(block) {
|
51
|
+
const code = String(block.getFieldValue('NUM'));
|
52
|
+
return [
|
53
|
+
code,
|
54
|
+
jsonGenerator.PRECEDENCE
|
55
|
+
];
|
56
|
+
};
|
57
|
+
jsonGenerator['logic_boolean'] = function(block) {
|
58
|
+
const code = block.getFieldValue('BOOL') === 'TRUE' ? 'true' : 'false';
|
59
|
+
return [
|
60
|
+
code,
|
61
|
+
jsonGenerator.PRECEDENCE
|
62
|
+
];
|
63
|
+
};
|
64
|
+
jsonGenerator['member'] = function(block) {
|
65
|
+
const name = block.getFieldValue('MEMBER_NAME');
|
66
|
+
const value = jsonGenerator.valueToCode(block, 'MEMBER_VALUE', jsonGenerator.PRECEDENCE);
|
67
|
+
const code = `"${name}": ${value}`;
|
68
|
+
return [
|
69
|
+
code,
|
70
|
+
jsonGenerator.PRECEDENCE
|
71
|
+
];
|
72
|
+
};
|
73
|
+
jsonGenerator['array-input'] = function(block) {
|
74
|
+
const value = jsonGenerator.valueToCode(block, 'MEMBER_VALUE', jsonGenerator.PRECEDENCE);
|
75
|
+
const code = `${value}`;
|
76
|
+
return [
|
77
|
+
code,
|
78
|
+
jsonGenerator.PRECEDENCE
|
79
|
+
];
|
80
|
+
};
|
81
|
+
jsonGenerator['array'] = function(block) {
|
82
|
+
const statementMembers = jsonGenerator.customStatementToCode(block, 'MEMBERS');
|
83
|
+
const code = '[\n' + statementMembers + '\n]';
|
84
|
+
return [
|
85
|
+
code,
|
86
|
+
jsonGenerator.PRECEDENCE
|
87
|
+
];
|
88
|
+
};
|
89
|
+
jsonGenerator['object'] = function(block) {
|
90
|
+
const statementMembers = jsonGenerator.customStatementToCode(block, 'MEMBERS');
|
91
|
+
const code = '{\n' + statementMembers + '\n}';
|
92
|
+
return [
|
93
|
+
code,
|
94
|
+
jsonGenerator.PRECEDENCE
|
95
|
+
];
|
96
|
+
};
|
97
|
+
jsonGenerator['unknown-format'] = function(block) {
|
98
|
+
const code = '"unknown-format"';
|
99
|
+
return [
|
100
|
+
code,
|
101
|
+
jsonGenerator.PRECEDENCE
|
102
|
+
];
|
103
|
+
};
|
104
|
+
jsonGenerator['unknown-pins'] = function(block) {
|
105
|
+
const code = '"unknown-pins"';
|
106
|
+
return [
|
107
|
+
code,
|
108
|
+
jsonGenerator.PRECEDENCE
|
109
|
+
];
|
110
|
+
};
|
111
|
+
jsonGenerator['unknown-component'] = function(block) {
|
112
|
+
const code = '"unknown-component"';
|
113
|
+
return [
|
114
|
+
code,
|
115
|
+
jsonGenerator.PRECEDENCE
|
116
|
+
];
|
117
|
+
};
|
118
|
+
jsonGenerator.scrub_ = function(block, code, thisOnly) {
|
119
|
+
const nextBlock = block.nextConnection && block.nextConnection.targetBlock();
|
120
|
+
if (nextBlock && !thisOnly) {
|
121
|
+
return code + ',\n' + jsonGenerator.blockToCode(nextBlock);
|
122
|
+
}
|
123
|
+
return code;
|
124
|
+
};
|
125
|
+
jsonGenerator.generatePin = function(block) {
|
126
|
+
let code = '{\n';
|
127
|
+
const elementName = block.type.split('/__PINS__/')[1];
|
128
|
+
const libraryName = block.type.split('/__PINS__/')[0];
|
129
|
+
code += ` "library": "${libraryName}",`;
|
130
|
+
code += `\n "element": "${elementName}",`;
|
131
|
+
let propertiesCode = '';
|
132
|
+
let eventCode = '';
|
133
|
+
let conditionCode = '';
|
134
|
+
for(let i = 0, input; input = block.inputList[i]; i++){
|
135
|
+
const inputName = input.name;
|
136
|
+
const connectedBlock = input.connection && input.connection.targetBlock();
|
137
|
+
if (connectedBlock) {
|
138
|
+
if (inputName !== 'pins' && input.type == 3) {
|
139
|
+
const inputCode = jsonGenerator.customStatementToCode(block, inputName);
|
140
|
+
if (inputName.includes('__EVENT__/')) {
|
141
|
+
eventCode += ` "${inputName.split('__EVENT__/')[1]}": [${inputCode}],`;
|
142
|
+
} else if (inputName.includes('__CONDITION__/')) {
|
143
|
+
conditionCode += ` "${inputName.split('__CONDITION__/')[1]}": [${inputCode}],`;
|
144
|
+
} else {
|
145
|
+
propertiesCode += ` "${inputName}": [${inputCode}],`;
|
146
|
+
}
|
147
|
+
} else {
|
148
|
+
const codeToAdd = getCodeFromBlock(connectedBlock);
|
149
|
+
const inputCode = jsonGenerator.customStatementToCode(block, inputName);
|
150
|
+
if (inputName === 'pins') {
|
151
|
+
code += ` "${inputName}": [${inputCode}],`;
|
152
|
+
} else if (inputName.includes('__CONDITION__/')) {
|
153
|
+
conditionCode += ` "${inputName.split('__CONDITION__/')[1].replace(/__EVALUATE$/g, '')}": ${inputCode},`;
|
154
|
+
} else if (codeToAdd !== 'undefined') {
|
155
|
+
propertiesCode += ` "${inputName.replace(/__EVALUATE$/g, '')}": ${codeToAdd},`;
|
156
|
+
}
|
157
|
+
}
|
158
|
+
}
|
159
|
+
}
|
160
|
+
if (propertiesCode !== '') {
|
161
|
+
if (propertiesCode.endsWith(',')) {
|
162
|
+
propertiesCode = propertiesCode.slice(0, -1);
|
163
|
+
}
|
164
|
+
code += '\n"properties": {\n' + propertiesCode + '\n },';
|
165
|
+
}
|
166
|
+
if (eventCode !== '') {
|
167
|
+
if (eventCode.endsWith(',')) {
|
168
|
+
eventCode = eventCode.slice(0, -1);
|
169
|
+
}
|
170
|
+
code += '\n"events": {\n' + eventCode + '\n },';
|
171
|
+
}
|
172
|
+
if (conditionCode !== '') {
|
173
|
+
if (conditionCode.endsWith(',')) {
|
174
|
+
conditionCode = conditionCode.slice(0, -1);
|
175
|
+
}
|
176
|
+
code += '\n"conditions": {\n' + conditionCode + '\n },';
|
177
|
+
}
|
178
|
+
if (code.endsWith(',')) {
|
179
|
+
code = code.slice(0, -1);
|
180
|
+
}
|
181
|
+
code += '}';
|
182
|
+
return [
|
183
|
+
code,
|
184
|
+
jsonGenerator.PRECEDENCE
|
185
|
+
];
|
186
|
+
};
|
187
|
+
jsonGenerator.generateComponent = function(block) {
|
188
|
+
let code = '{\n';
|
189
|
+
for(let i = 0, input; input = block.inputList[i]; i++){
|
190
|
+
const inputName = input.name;
|
191
|
+
const connectedBlock = input.connection && input.connection.targetBlock();
|
192
|
+
let codeToAdd;
|
193
|
+
if (connectedBlock) {
|
194
|
+
if (input.type == 3) {
|
195
|
+
const code = jsonGenerator.customStatementToCode(block, inputName);
|
196
|
+
codeToAdd = '[' + code + ']';
|
197
|
+
} else {
|
198
|
+
codeToAdd = getCodeFromBlock(connectedBlock);
|
199
|
+
}
|
200
|
+
if (codeToAdd !== 'undefined') {
|
201
|
+
code += ` "${inputName.replace(/__EVALUATE$/g, '')}": ${codeToAdd},`;
|
202
|
+
}
|
203
|
+
}
|
204
|
+
}
|
205
|
+
if (code.endsWith(',')) {
|
206
|
+
code = code.slice(0, -1);
|
207
|
+
}
|
208
|
+
code += '\n}';
|
209
|
+
return [
|
210
|
+
code,
|
211
|
+
jsonGenerator.PRECEDENCE
|
212
|
+
];
|
213
|
+
};
|
214
|
+
Blockly.Generator.prototype.blockToCode = function(block) {
|
215
|
+
if (!block) {
|
216
|
+
return '';
|
217
|
+
}
|
218
|
+
if (isPins(block)) {
|
219
|
+
return this.generatePin(block);
|
220
|
+
} else if (isComponent(block)) {
|
221
|
+
return this.generateComponent(block);
|
222
|
+
} else if (isSceneBlock(block)) {
|
223
|
+
return this.generateSceneBlock(block);
|
224
|
+
}
|
225
|
+
const func = this[block.type];
|
226
|
+
if (typeof func === 'function') {
|
227
|
+
const result = func.call(this, block);
|
228
|
+
if (Array.isArray(result) && result.length === 2) {
|
229
|
+
return result;
|
230
|
+
} else {
|
231
|
+
console.log('Unexpected result from generator for block type:', block.type, result);
|
232
|
+
return [
|
233
|
+
'',
|
234
|
+
0
|
235
|
+
];
|
236
|
+
}
|
237
|
+
}
|
238
|
+
};
|
239
|
+
jsonGenerator.customStatementToCode = function(block, inputName) {
|
240
|
+
let code = '';
|
241
|
+
let connectedBlock = block.getInputTargetBlock(inputName);
|
242
|
+
while(connectedBlock){
|
243
|
+
code += getCodeFromBlock(connectedBlock) + ',';
|
244
|
+
connectedBlock = connectedBlock.nextConnection && connectedBlock.nextConnection.targetBlock();
|
245
|
+
}
|
246
|
+
if (code.endsWith(',')) {
|
247
|
+
code = code.slice(0, -1);
|
248
|
+
}
|
249
|
+
return code;
|
250
|
+
};
|
251
|
+
function isPins(block) {
|
252
|
+
const blockType = block.type;
|
253
|
+
if (blockType.includes('/__PINS__/')) {
|
254
|
+
return true;
|
255
|
+
}
|
256
|
+
return false;
|
257
|
+
}
|
258
|
+
function isComponent(block) {
|
259
|
+
const blockType = block.type;
|
260
|
+
if (blockType.includes('/__COMPONENTS__/')) {
|
261
|
+
return true;
|
262
|
+
}
|
263
|
+
return false;
|
264
|
+
}
|
265
|
+
function isSceneBlock(block) {
|
266
|
+
const blockType = block.type;
|
267
|
+
if (blockType.includes('/__SCENEBLOCK__/')) {
|
268
|
+
return true;
|
269
|
+
}
|
270
|
+
return false;
|
271
|
+
}
|
272
|
+
jsonGenerator.generateSceneBlock = function(block) {
|
273
|
+
function safeParse(jsonString, defaultValue) {
|
274
|
+
try {
|
275
|
+
if (jsonString && jsonString.trim() !== '') {
|
276
|
+
return JSON.parse(jsonString);
|
277
|
+
}
|
278
|
+
} catch (e) {
|
279
|
+
console.error('JSON parsing error:', e);
|
280
|
+
}
|
281
|
+
return defaultValue;
|
282
|
+
}
|
283
|
+
const pinsCode = jsonGenerator.customStatementToCode(block, 'EXECUTE_PINS', jsonGenerator.PRECEDENCE) || '';
|
284
|
+
const pinsData = safeParse('[' + pinsCode + ']', null);
|
285
|
+
const metadata = {};
|
286
|
+
const properties = {};
|
287
|
+
block.inputList.forEach(function(input) {
|
288
|
+
if (input.name !== 'EXECUTE_PINS') {
|
289
|
+
const isMetadata = input.name.startsWith('metadata--');
|
290
|
+
const target = isMetadata ? metadata : properties;
|
291
|
+
const name = isMetadata ? input.name.replace('metadata--', '') : input.name;
|
292
|
+
const fieldValue = valueToCode(block, input);
|
293
|
+
if (fieldValue) {
|
294
|
+
target[name.replace(/__EVALUATE$/g, '')] = safeParse(fieldValue, {});
|
295
|
+
}
|
296
|
+
}
|
297
|
+
});
|
298
|
+
const element = block.type.split('/__SCENEBLOCK__/')[1];
|
299
|
+
const library = block.type.split('/__SCENEBLOCK__/')[0];
|
300
|
+
const objectToSerialize = {
|
301
|
+
library,
|
302
|
+
element,
|
303
|
+
metadata,
|
304
|
+
properties,
|
305
|
+
pins: pinsData !== null ? pinsData : []
|
306
|
+
};
|
307
|
+
const serializedCode = JSON.stringify(objectToSerialize);
|
308
|
+
return [
|
309
|
+
serializedCode,
|
310
|
+
jsonGenerator.PRECEDENCE
|
311
|
+
];
|
312
|
+
};
|
313
|
+
function getCodeFromBlock(block) {
|
314
|
+
let code = '';
|
315
|
+
if (isPins(block)) {
|
316
|
+
const pinCode = jsonGenerator.generatePin(block);
|
317
|
+
code += pinCode[0];
|
318
|
+
} else if (isComponent(block)) {
|
319
|
+
const componentCode = jsonGenerator.generateComponent(block);
|
320
|
+
code += componentCode[0];
|
321
|
+
} else {
|
322
|
+
const generalCode = jsonGenerator[block.type](block);
|
323
|
+
code += generalCode[0];
|
324
|
+
}
|
325
|
+
return code;
|
326
|
+
}
|
327
|
+
function valueToCode(block, input) {
|
328
|
+
let result = '';
|
329
|
+
if (input.type === 3) {
|
330
|
+
const code = jsonGenerator.customStatementToCode(block, input.name);
|
331
|
+
result = '[' + code + ']';
|
332
|
+
} else {
|
333
|
+
result = jsonGenerator.valueToCode(block, input.name, jsonGenerator.PRECEDENCE);
|
334
|
+
}
|
335
|
+
return result;
|
336
|
+
}
|
337
|
+
|
338
|
+
exports.jsonGenerator = jsonGenerator;
|
@@ -0,0 +1,336 @@
|
|
1
|
+
import { _ as _extends } from './index.esm2.js';
|
2
|
+
|
3
|
+
const jsonGenerator = new Blockly.Generator('JSON');
|
4
|
+
jsonGenerator.PRECEDENCE = 0;
|
5
|
+
jsonGenerator['generic-scene-block'] = function(block) {
|
6
|
+
function safeParse(jsonString, defaultValue) {
|
7
|
+
try {
|
8
|
+
if (jsonString && jsonString.trim() !== '') {
|
9
|
+
return JSON.parse(jsonString);
|
10
|
+
}
|
11
|
+
} catch (e) {
|
12
|
+
console.error('JSON parsing error:', e);
|
13
|
+
}
|
14
|
+
return defaultValue;
|
15
|
+
}
|
16
|
+
const pinsCode = jsonGenerator.valueToCode(block, 'EXECUTE_PINS', jsonGenerator.PRECEDENCE) || 'null';
|
17
|
+
const metadataCode = jsonGenerator.valueToCode(block, 'METADATA_INPUT', jsonGenerator.PRECEDENCE) || '{}';
|
18
|
+
const eventsCode = jsonGenerator.valueToCode(block, 'EVENTS_INPUT', jsonGenerator.PRECEDENCE) || '{}';
|
19
|
+
const pinsData = safeParse(pinsCode, null);
|
20
|
+
const metadata = safeParse(metadataCode, {});
|
21
|
+
const events = safeParse(eventsCode, {});
|
22
|
+
const objectToSerialize = _extends({
|
23
|
+
type: block.getFieldValue('SCENE_TYPE') || null,
|
24
|
+
metadata: metadata
|
25
|
+
}, pinsData !== null ? pinsData : {}, {
|
26
|
+
events: events
|
27
|
+
});
|
28
|
+
const serializedCode = JSON.stringify(objectToSerialize);
|
29
|
+
return [
|
30
|
+
serializedCode,
|
31
|
+
jsonGenerator.PRECEDENCE
|
32
|
+
];
|
33
|
+
};
|
34
|
+
jsonGenerator['logic_null'] = function(block) {
|
35
|
+
return [
|
36
|
+
'null',
|
37
|
+
jsonGenerator.PRECEDENCE
|
38
|
+
];
|
39
|
+
};
|
40
|
+
jsonGenerator['text_multiline'] = function(block) {
|
41
|
+
const textValue = block.getFieldValue('TEXT');
|
42
|
+
const code = `${JSON.stringify(textValue)}`;
|
43
|
+
return [
|
44
|
+
code,
|
45
|
+
jsonGenerator.PRECEDENCE
|
46
|
+
];
|
47
|
+
};
|
48
|
+
jsonGenerator['math_number'] = function(block) {
|
49
|
+
const code = String(block.getFieldValue('NUM'));
|
50
|
+
return [
|
51
|
+
code,
|
52
|
+
jsonGenerator.PRECEDENCE
|
53
|
+
];
|
54
|
+
};
|
55
|
+
jsonGenerator['logic_boolean'] = function(block) {
|
56
|
+
const code = block.getFieldValue('BOOL') === 'TRUE' ? 'true' : 'false';
|
57
|
+
return [
|
58
|
+
code,
|
59
|
+
jsonGenerator.PRECEDENCE
|
60
|
+
];
|
61
|
+
};
|
62
|
+
jsonGenerator['member'] = function(block) {
|
63
|
+
const name = block.getFieldValue('MEMBER_NAME');
|
64
|
+
const value = jsonGenerator.valueToCode(block, 'MEMBER_VALUE', jsonGenerator.PRECEDENCE);
|
65
|
+
const code = `"${name}": ${value}`;
|
66
|
+
return [
|
67
|
+
code,
|
68
|
+
jsonGenerator.PRECEDENCE
|
69
|
+
];
|
70
|
+
};
|
71
|
+
jsonGenerator['array-input'] = function(block) {
|
72
|
+
const value = jsonGenerator.valueToCode(block, 'MEMBER_VALUE', jsonGenerator.PRECEDENCE);
|
73
|
+
const code = `${value}`;
|
74
|
+
return [
|
75
|
+
code,
|
76
|
+
jsonGenerator.PRECEDENCE
|
77
|
+
];
|
78
|
+
};
|
79
|
+
jsonGenerator['array'] = function(block) {
|
80
|
+
const statementMembers = jsonGenerator.customStatementToCode(block, 'MEMBERS');
|
81
|
+
const code = '[\n' + statementMembers + '\n]';
|
82
|
+
return [
|
83
|
+
code,
|
84
|
+
jsonGenerator.PRECEDENCE
|
85
|
+
];
|
86
|
+
};
|
87
|
+
jsonGenerator['object'] = function(block) {
|
88
|
+
const statementMembers = jsonGenerator.customStatementToCode(block, 'MEMBERS');
|
89
|
+
const code = '{\n' + statementMembers + '\n}';
|
90
|
+
return [
|
91
|
+
code,
|
92
|
+
jsonGenerator.PRECEDENCE
|
93
|
+
];
|
94
|
+
};
|
95
|
+
jsonGenerator['unknown-format'] = function(block) {
|
96
|
+
const code = '"unknown-format"';
|
97
|
+
return [
|
98
|
+
code,
|
99
|
+
jsonGenerator.PRECEDENCE
|
100
|
+
];
|
101
|
+
};
|
102
|
+
jsonGenerator['unknown-pins'] = function(block) {
|
103
|
+
const code = '"unknown-pins"';
|
104
|
+
return [
|
105
|
+
code,
|
106
|
+
jsonGenerator.PRECEDENCE
|
107
|
+
];
|
108
|
+
};
|
109
|
+
jsonGenerator['unknown-component'] = function(block) {
|
110
|
+
const code = '"unknown-component"';
|
111
|
+
return [
|
112
|
+
code,
|
113
|
+
jsonGenerator.PRECEDENCE
|
114
|
+
];
|
115
|
+
};
|
116
|
+
jsonGenerator.scrub_ = function(block, code, thisOnly) {
|
117
|
+
const nextBlock = block.nextConnection && block.nextConnection.targetBlock();
|
118
|
+
if (nextBlock && !thisOnly) {
|
119
|
+
return code + ',\n' + jsonGenerator.blockToCode(nextBlock);
|
120
|
+
}
|
121
|
+
return code;
|
122
|
+
};
|
123
|
+
jsonGenerator.generatePin = function(block) {
|
124
|
+
let code = '{\n';
|
125
|
+
const elementName = block.type.split('/__PINS__/')[1];
|
126
|
+
const libraryName = block.type.split('/__PINS__/')[0];
|
127
|
+
code += ` "library": "${libraryName}",`;
|
128
|
+
code += `\n "element": "${elementName}",`;
|
129
|
+
let propertiesCode = '';
|
130
|
+
let eventCode = '';
|
131
|
+
let conditionCode = '';
|
132
|
+
for(let i = 0, input; input = block.inputList[i]; i++){
|
133
|
+
const inputName = input.name;
|
134
|
+
const connectedBlock = input.connection && input.connection.targetBlock();
|
135
|
+
if (connectedBlock) {
|
136
|
+
if (inputName !== 'pins' && input.type == 3) {
|
137
|
+
const inputCode = jsonGenerator.customStatementToCode(block, inputName);
|
138
|
+
if (inputName.includes('__EVENT__/')) {
|
139
|
+
eventCode += ` "${inputName.split('__EVENT__/')[1]}": [${inputCode}],`;
|
140
|
+
} else if (inputName.includes('__CONDITION__/')) {
|
141
|
+
conditionCode += ` "${inputName.split('__CONDITION__/')[1]}": [${inputCode}],`;
|
142
|
+
} else {
|
143
|
+
propertiesCode += ` "${inputName}": [${inputCode}],`;
|
144
|
+
}
|
145
|
+
} else {
|
146
|
+
const codeToAdd = getCodeFromBlock(connectedBlock);
|
147
|
+
const inputCode = jsonGenerator.customStatementToCode(block, inputName);
|
148
|
+
if (inputName === 'pins') {
|
149
|
+
code += ` "${inputName}": [${inputCode}],`;
|
150
|
+
} else if (inputName.includes('__CONDITION__/')) {
|
151
|
+
conditionCode += ` "${inputName.split('__CONDITION__/')[1].replace(/__EVALUATE$/g, '')}": ${inputCode},`;
|
152
|
+
} else if (codeToAdd !== 'undefined') {
|
153
|
+
propertiesCode += ` "${inputName.replace(/__EVALUATE$/g, '')}": ${codeToAdd},`;
|
154
|
+
}
|
155
|
+
}
|
156
|
+
}
|
157
|
+
}
|
158
|
+
if (propertiesCode !== '') {
|
159
|
+
if (propertiesCode.endsWith(',')) {
|
160
|
+
propertiesCode = propertiesCode.slice(0, -1);
|
161
|
+
}
|
162
|
+
code += '\n"properties": {\n' + propertiesCode + '\n },';
|
163
|
+
}
|
164
|
+
if (eventCode !== '') {
|
165
|
+
if (eventCode.endsWith(',')) {
|
166
|
+
eventCode = eventCode.slice(0, -1);
|
167
|
+
}
|
168
|
+
code += '\n"events": {\n' + eventCode + '\n },';
|
169
|
+
}
|
170
|
+
if (conditionCode !== '') {
|
171
|
+
if (conditionCode.endsWith(',')) {
|
172
|
+
conditionCode = conditionCode.slice(0, -1);
|
173
|
+
}
|
174
|
+
code += '\n"conditions": {\n' + conditionCode + '\n },';
|
175
|
+
}
|
176
|
+
if (code.endsWith(',')) {
|
177
|
+
code = code.slice(0, -1);
|
178
|
+
}
|
179
|
+
code += '}';
|
180
|
+
return [
|
181
|
+
code,
|
182
|
+
jsonGenerator.PRECEDENCE
|
183
|
+
];
|
184
|
+
};
|
185
|
+
jsonGenerator.generateComponent = function(block) {
|
186
|
+
let code = '{\n';
|
187
|
+
for(let i = 0, input; input = block.inputList[i]; i++){
|
188
|
+
const inputName = input.name;
|
189
|
+
const connectedBlock = input.connection && input.connection.targetBlock();
|
190
|
+
let codeToAdd;
|
191
|
+
if (connectedBlock) {
|
192
|
+
if (input.type == 3) {
|
193
|
+
const code = jsonGenerator.customStatementToCode(block, inputName);
|
194
|
+
codeToAdd = '[' + code + ']';
|
195
|
+
} else {
|
196
|
+
codeToAdd = getCodeFromBlock(connectedBlock);
|
197
|
+
}
|
198
|
+
if (codeToAdd !== 'undefined') {
|
199
|
+
code += ` "${inputName.replace(/__EVALUATE$/g, '')}": ${codeToAdd},`;
|
200
|
+
}
|
201
|
+
}
|
202
|
+
}
|
203
|
+
if (code.endsWith(',')) {
|
204
|
+
code = code.slice(0, -1);
|
205
|
+
}
|
206
|
+
code += '\n}';
|
207
|
+
return [
|
208
|
+
code,
|
209
|
+
jsonGenerator.PRECEDENCE
|
210
|
+
];
|
211
|
+
};
|
212
|
+
Blockly.Generator.prototype.blockToCode = function(block) {
|
213
|
+
if (!block) {
|
214
|
+
return '';
|
215
|
+
}
|
216
|
+
if (isPins(block)) {
|
217
|
+
return this.generatePin(block);
|
218
|
+
} else if (isComponent(block)) {
|
219
|
+
return this.generateComponent(block);
|
220
|
+
} else if (isSceneBlock(block)) {
|
221
|
+
return this.generateSceneBlock(block);
|
222
|
+
}
|
223
|
+
const func = this[block.type];
|
224
|
+
if (typeof func === 'function') {
|
225
|
+
const result = func.call(this, block);
|
226
|
+
if (Array.isArray(result) && result.length === 2) {
|
227
|
+
return result;
|
228
|
+
} else {
|
229
|
+
console.log('Unexpected result from generator for block type:', block.type, result);
|
230
|
+
return [
|
231
|
+
'',
|
232
|
+
0
|
233
|
+
];
|
234
|
+
}
|
235
|
+
}
|
236
|
+
};
|
237
|
+
jsonGenerator.customStatementToCode = function(block, inputName) {
|
238
|
+
let code = '';
|
239
|
+
let connectedBlock = block.getInputTargetBlock(inputName);
|
240
|
+
while(connectedBlock){
|
241
|
+
code += getCodeFromBlock(connectedBlock) + ',';
|
242
|
+
connectedBlock = connectedBlock.nextConnection && connectedBlock.nextConnection.targetBlock();
|
243
|
+
}
|
244
|
+
if (code.endsWith(',')) {
|
245
|
+
code = code.slice(0, -1);
|
246
|
+
}
|
247
|
+
return code;
|
248
|
+
};
|
249
|
+
function isPins(block) {
|
250
|
+
const blockType = block.type;
|
251
|
+
if (blockType.includes('/__PINS__/')) {
|
252
|
+
return true;
|
253
|
+
}
|
254
|
+
return false;
|
255
|
+
}
|
256
|
+
function isComponent(block) {
|
257
|
+
const blockType = block.type;
|
258
|
+
if (blockType.includes('/__COMPONENTS__/')) {
|
259
|
+
return true;
|
260
|
+
}
|
261
|
+
return false;
|
262
|
+
}
|
263
|
+
function isSceneBlock(block) {
|
264
|
+
const blockType = block.type;
|
265
|
+
if (blockType.includes('/__SCENEBLOCK__/')) {
|
266
|
+
return true;
|
267
|
+
}
|
268
|
+
return false;
|
269
|
+
}
|
270
|
+
jsonGenerator.generateSceneBlock = function(block) {
|
271
|
+
function safeParse(jsonString, defaultValue) {
|
272
|
+
try {
|
273
|
+
if (jsonString && jsonString.trim() !== '') {
|
274
|
+
return JSON.parse(jsonString);
|
275
|
+
}
|
276
|
+
} catch (e) {
|
277
|
+
console.error('JSON parsing error:', e);
|
278
|
+
}
|
279
|
+
return defaultValue;
|
280
|
+
}
|
281
|
+
const pinsCode = jsonGenerator.customStatementToCode(block, 'EXECUTE_PINS', jsonGenerator.PRECEDENCE) || '';
|
282
|
+
const pinsData = safeParse('[' + pinsCode + ']', null);
|
283
|
+
const metadata = {};
|
284
|
+
const properties = {};
|
285
|
+
block.inputList.forEach(function(input) {
|
286
|
+
if (input.name !== 'EXECUTE_PINS') {
|
287
|
+
const isMetadata = input.name.startsWith('metadata--');
|
288
|
+
const target = isMetadata ? metadata : properties;
|
289
|
+
const name = isMetadata ? input.name.replace('metadata--', '') : input.name;
|
290
|
+
const fieldValue = valueToCode(block, input);
|
291
|
+
if (fieldValue) {
|
292
|
+
target[name.replace(/__EVALUATE$/g, '')] = safeParse(fieldValue, {});
|
293
|
+
}
|
294
|
+
}
|
295
|
+
});
|
296
|
+
const element = block.type.split('/__SCENEBLOCK__/')[1];
|
297
|
+
const library = block.type.split('/__SCENEBLOCK__/')[0];
|
298
|
+
const objectToSerialize = {
|
299
|
+
library,
|
300
|
+
element,
|
301
|
+
metadata,
|
302
|
+
properties,
|
303
|
+
pins: pinsData !== null ? pinsData : []
|
304
|
+
};
|
305
|
+
const serializedCode = JSON.stringify(objectToSerialize);
|
306
|
+
return [
|
307
|
+
serializedCode,
|
308
|
+
jsonGenerator.PRECEDENCE
|
309
|
+
];
|
310
|
+
};
|
311
|
+
function getCodeFromBlock(block) {
|
312
|
+
let code = '';
|
313
|
+
if (isPins(block)) {
|
314
|
+
const pinCode = jsonGenerator.generatePin(block);
|
315
|
+
code += pinCode[0];
|
316
|
+
} else if (isComponent(block)) {
|
317
|
+
const componentCode = jsonGenerator.generateComponent(block);
|
318
|
+
code += componentCode[0];
|
319
|
+
} else {
|
320
|
+
const generalCode = jsonGenerator[block.type](block);
|
321
|
+
code += generalCode[0];
|
322
|
+
}
|
323
|
+
return code;
|
324
|
+
}
|
325
|
+
function valueToCode(block, input) {
|
326
|
+
let result = '';
|
327
|
+
if (input.type === 3) {
|
328
|
+
const code = jsonGenerator.customStatementToCode(block, input.name);
|
329
|
+
result = '[' + code + ']';
|
330
|
+
} else {
|
331
|
+
result = jsonGenerator.valueToCode(block, input.name, jsonGenerator.PRECEDENCE);
|
332
|
+
}
|
333
|
+
return result;
|
334
|
+
}
|
335
|
+
|
336
|
+
export { jsonGenerator };
|
package/index.cjs.d.ts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
export * from "./src/index";
|
package/index.cjs.js
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
4
|
+
|
5
|
+
var index = require('./index.cjs2.js');
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
Object.defineProperty(exports, 'EditorElement', {
|
10
|
+
enumerable: true,
|
11
|
+
get: function () { return index.EditorElement; }
|
12
|
+
});
|