阅读本文,了解如何定义块对应的代码、转代码流程
块转代码
前面的文章提到过,块的定义,在目录 blocks/
里,而相应的转代码目录,是generators/
目录。
这个目录下,有语言.ts
文件和同名目录,如python.ts
、python/
。
这是因为python.ts
(generators/python.ts)是块转python脚本的生成器实例pythonGenerator
初始化的地方。
而python/
目录,是每一个块映射python脚本的地方。
举例
例如,我们在blocks/
中,定义了一个积木块 (if…do…):
{
'type': 'controls_if',
'message0': '%{BKY_CONTROLS_IF_MSG_IF} %1',
'args0': [
{
'type': 'input_value',
'name': 'IF0',
'check': 'Boolean',
},
],
'message1': '%{BKY_CONTROLS_IF_MSG_THEN} %1',
'args1': [
{
'type': 'input_statement',
'name': 'DO0',
},
],
'previousStatement': false,
'nextStatement': false,
'style': 'logic_blocks',
'helpUrl': '%{BKY_CONTROLS_IF_HELPURL}',
'suppressPrefixSuffix': true,
'mutator': 'controls_if_mutator',
'extensions': ['controls_if_tooltip'],
},
那么在generators/python/logic.ts
中,就要定义相应的:
// 导出一个函数,用于将Blockly的controls_if块转换成Python代码。
export function controls_if(block, generator) {
// 初始化变量
let n = 0; // 用于遍历条件和分支的计数器
let code = '', // 存储最终生成的Python代码
branchCode, // 存储每个条件分支的代码
conditionCode; // 存储每个条件的表达式代码
// 检查是否需要手动添加语句前缀
if (generator.STATEMENT_PREFIX) {
// 如果自动插入前缀关闭,则手动添加前缀,并注入block的id
code += generator.injectId(generator