@digipair/skill-web-editor
Version:
337 lines (334 loc) • 11.3 kB
JavaScript
import { _ as _extends } from './index.esm2.js';
const jsonGenerator = new Blockly.Generator('JSON');
jsonGenerator.PRECEDENCE = 0;
jsonGenerator['generic-scene-block'] = function(block) {
function safeParse(jsonString, defaultValue) {
try {
if (jsonString && jsonString.trim() !== '') {
return JSON.parse(jsonString);
}
} catch (e) {
console.error('JSON parsing error:', e);
}
return defaultValue;
}
const pinsCode = jsonGenerator.valueToCode(block, 'EXECUTE_PINS', jsonGenerator.PRECEDENCE) || 'null';
const metadataCode = jsonGenerator.valueToCode(block, 'METADATA_INPUT', jsonGenerator.PRECEDENCE) || '{}';
const eventsCode = jsonGenerator.valueToCode(block, 'EVENTS_INPUT', jsonGenerator.PRECEDENCE) || '{}';
const pinsData = safeParse(pinsCode, null);
const metadata = safeParse(metadataCode, {});
const events = safeParse(eventsCode, {});
const objectToSerialize = _extends({
type: block.getFieldValue('SCENE_TYPE') || null,
metadata: metadata
}, pinsData !== null ? pinsData : {}, {
events: events
});
const serializedCode = JSON.stringify(objectToSerialize);
return [
serializedCode,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['logic_null'] = function(block) {
return [
'null',
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['text_multiline'] = function(block) {
const textValue = block.getFieldValue('TEXT');
const code = `${JSON.stringify(textValue)}`;
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['math_number'] = function(block) {
const code = String(block.getFieldValue('NUM'));
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['logic_boolean'] = function(block) {
const code = block.getFieldValue('BOOL') === 'TRUE' ? 'true' : 'false';
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['member'] = function(block) {
const name = block.getFieldValue('MEMBER_NAME');
const value = jsonGenerator.valueToCode(block, 'MEMBER_VALUE', jsonGenerator.PRECEDENCE);
const code = `"${name}": ${value}`;
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['array-input'] = function(block) {
const value = jsonGenerator.valueToCode(block, 'MEMBER_VALUE', jsonGenerator.PRECEDENCE);
const code = `${value}`;
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['array'] = function(block) {
const statementMembers = jsonGenerator.customStatementToCode(block, 'MEMBERS');
const code = '[\n' + statementMembers + '\n]';
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['object'] = function(block) {
const statementMembers = jsonGenerator.customStatementToCode(block, 'MEMBERS');
const code = '{\n' + statementMembers + '\n}';
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['unknown-format'] = function(block) {
const code = '"unknown-format"';
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['unknown-pins'] = function(block) {
const code = '"unknown-pins"';
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator['unknown-component'] = function(block) {
const code = '"unknown-component"';
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator.scrub_ = function(block, code, thisOnly) {
const nextBlock = block.nextConnection && block.nextConnection.targetBlock();
if (nextBlock && !thisOnly) {
return code + ',\n' + jsonGenerator.blockToCode(nextBlock);
}
return code;
};
jsonGenerator.generatePin = function(block) {
let code = '{\n';
const elementName = block.type.split('/__PINS__/')[1];
const libraryName = block.type.split('/__PINS__/')[0];
code += ` "library": "${libraryName}",`;
code += `\n "element": "${elementName}",`;
let propertiesCode = '';
let eventCode = '';
let conditionCode = '';
for(let i = 0, input; input = block.inputList[i]; i++){
const inputName = input.name;
const connectedBlock = input.connection && input.connection.targetBlock();
if (connectedBlock) {
if (inputName !== 'pins' && input.type == 3) {
const inputCode = jsonGenerator.customStatementToCode(block, inputName);
if (inputName.includes('__EVENT__/')) {
eventCode += ` "${inputName.split('__EVENT__/')[1]}": [${inputCode}],`;
} else if (inputName.includes('__CONDITION__/')) {
conditionCode += ` "${inputName.split('__CONDITION__/')[1]}": [${inputCode}],`;
} else {
propertiesCode += ` "${inputName}": [${inputCode}],`;
}
} else {
const codeToAdd = getCodeFromBlock(connectedBlock);
const inputCode = jsonGenerator.customStatementToCode(block, inputName);
if (inputName === 'pins') {
code += ` "${inputName}": [${inputCode}],`;
} else if (inputName.includes('__CONDITION__/')) {
conditionCode += ` "${inputName.split('__CONDITION__/')[1].replace(/__EVALUATE$/g, '')}": ${inputCode},`;
} else if (codeToAdd !== 'undefined') {
propertiesCode += ` "${inputName.replace(/__EVALUATE$/g, '')}": ${codeToAdd},`;
}
}
}
}
if (propertiesCode !== '') {
if (propertiesCode.endsWith(',')) {
propertiesCode = propertiesCode.slice(0, -1);
}
code += '\n"properties": {\n' + propertiesCode + '\n },';
}
if (eventCode !== '') {
if (eventCode.endsWith(',')) {
eventCode = eventCode.slice(0, -1);
}
code += '\n"events": {\n' + eventCode + '\n },';
}
if (conditionCode !== '') {
if (conditionCode.endsWith(',')) {
conditionCode = conditionCode.slice(0, -1);
}
code += '\n"conditions": {\n' + conditionCode + '\n },';
}
if (code.endsWith(',')) {
code = code.slice(0, -1);
}
code += '}';
return [
code,
jsonGenerator.PRECEDENCE
];
};
jsonGenerator.generateComponent = function(block) {
let code = '{\n';
for(let i = 0, input; input = block.inputList[i]; i++){
const inputName = input.name;
const connectedBlock = input.connection && input.connection.targetBlock();
let codeToAdd;
if (connectedBlock) {
if (input.type == 3) {
const code = jsonGenerator.customStatementToCode(block, inputName);
codeToAdd = '[' + code + ']';
} else {
codeToAdd = getCodeFromBlock(connectedBlock);
}
if (codeToAdd !== 'undefined') {
code += ` "${inputName.replace(/__EVALUATE$/g, '')}": ${codeToAdd},`;
}
}
}
if (code.endsWith(',')) {
code = code.slice(0, -1);
}
code += '\n}';
return [
code,
jsonGenerator.PRECEDENCE
];
};
Blockly.Generator.prototype.blockToCode = function(block) {
if (!block) {
return '';
}
if (isPins(block)) {
return this.generatePin(block);
} else if (isComponent(block)) {
return this.generateComponent(block);
} else if (isSceneBlock(block)) {
return this.generateSceneBlock(block);
}
const func = this[block.type];
if (typeof func === 'function') {
const result = func.call(this, block);
if (Array.isArray(result) && result.length === 2) {
return result;
} else {
console.log('Unexpected result from generator for block type:', block.type, result);
return [
'',
0
];
}
}
};
jsonGenerator.customStatementToCode = function(block, inputName) {
let code = '';
let connectedBlock = block.getInputTargetBlock(inputName);
while(connectedBlock){
code += getCodeFromBlock(connectedBlock) + ',';
connectedBlock = connectedBlock.nextConnection && connectedBlock.nextConnection.targetBlock();
}
if (code.endsWith(',')) {
code = code.slice(0, -1);
}
return code;
};
function isPins(block) {
const blockType = block.type;
if (blockType.includes('/__PINS__/')) {
return true;
}
return false;
}
function isComponent(block) {
const blockType = block.type;
if (blockType.includes('/__COMPONENTS__/')) {
return true;
}
return false;
}
function isSceneBlock(block) {
const blockType = block.type;
if (blockType.includes('/__SCENEBLOCK__/')) {
return true;
}
return false;
}
jsonGenerator.generateSceneBlock = function(block) {
function safeParse(jsonString, defaultValue) {
try {
if (jsonString && jsonString.trim() !== '') {
return JSON.parse(jsonString);
}
} catch (e) {
console.error('JSON parsing error:', e);
}
return defaultValue;
}
const pinsCode = jsonGenerator.customStatementToCode(block, 'EXECUTE_PINS', jsonGenerator.PRECEDENCE) || '';
const pinsData = safeParse('[' + pinsCode + ']', null);
const metadata = {};
const properties = {};
block.inputList.forEach(function(input) {
if (input.name !== 'EXECUTE_PINS') {
const isMetadata = input.name.startsWith('metadata--');
const target = isMetadata ? metadata : properties;
const name = isMetadata ? input.name.replace('metadata--', '') : input.name;
const fieldValue = valueToCode(block, input);
if (fieldValue) {
target[name.replace(/__EVALUATE$/g, '')] = safeParse(fieldValue, {});
}
}
});
const element = block.type.split('/__SCENEBLOCK__/')[1];
const library = block.type.split('/__SCENEBLOCK__/')[0];
const objectToSerialize = {
library,
element,
metadata,
properties,
pins: pinsData !== null ? pinsData : []
};
const serializedCode = JSON.stringify(objectToSerialize);
return [
serializedCode,
jsonGenerator.PRECEDENCE
];
};
function getCodeFromBlock(block) {
let code = '';
if (isPins(block)) {
const pinCode = jsonGenerator.generatePin(block);
code += pinCode[0];
} else if (isComponent(block)) {
const componentCode = jsonGenerator.generateComponent(block);
code += componentCode[0];
} else {
const generalCode = jsonGenerator[block.type](block);
code += generalCode[0];
}
return code;
}
function valueToCode(block, input) {
let result = '';
if (input.type === 3) {
const code = jsonGenerator.customStatementToCode(block, input.name);
result = '[' + code + ']';
} else {
result = jsonGenerator.valueToCode(block, input.name, jsonGenerator.PRECEDENCE);
}
return result;
}
export { jsonGenerator };