首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义语言生成器到Blockly

自定义语言生成器到Blockly
EN

Stack Overflow用户
提问于 2017-07-04 01:01:50
回答 2查看 3.9K关注 0票数 6

我知道我可以用

代码语言:javascript
复制
Blockly.JavaScript['my_code'] = function() {  ... }

但是如何添加像JSON这样的语言支持呢?我试过..。

代码语言:javascript
复制
Blockly.Json['my_code'] = function() {  ... }

当我试图恢复时,它失败了。

代码语言:javascript
复制
Blockly.Json.workspaceToCode(this.workspace)

workspaceToCode不是一个函数。

我需要向Blockly添加一种新的语言

我不会显示这种新的语言(JSON),它只用于向机器人发送指令。

我试着

代码语言:javascript
复制
Blockly.Json = new Blockly.Generator('Json');
Blockly.Json['my_code'] = function() {  ... }

但是,错误发生在

代码语言:javascript
复制
Blockly.Json.workspaceToCode(this.workspace)

错误..。

代码语言:javascript
复制
Uncaught TypeError: this.init is not a function
    at js.ou3v.module.exports.Blockly.Generator.workspaceToCode
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-01 19:16:00

为Blockly创建一个新的语言生成器是一项相当大的任务,考虑到这一点,文档在创建一个语言生成器方面似乎没有提供太多帮助。

根据我的经验,构建生成器的最佳方法是查看发电机/中现有的生成器,我已经将JavaScript生成器用作我希望生成C++代码的项目的模板。

还值得注意的是,块状工厂生成JSON供其他Blockly应用程序使用,但是当我查看代码时,没有为其定义实际生成器。

我认为您所得到的错误是由于Blockly.Json没有init函数而引起的。这是在现有生成器文件中定义的内容,例如,来自JavaScript生成器:

代码语言:javascript
复制
/**
* Initialise the database of variable names.
* @param {!Blockly.Workspace} workspace Workspace to generate code from.
*/
Blockly.JavaScript.init = function(workspace) {
  ....
};

考虑到这一点,您的功能如下所示:

代码语言:javascript
复制
/**
* Initialise the database of variable names.
* @param {!Blockly.Workspace} workspace Workspace to generate code from.
*/
Blockly.Json.init = function(workspace) {
 .....
};

生成器文件还包含其他函数,但是查看现有代码并根据您的需要对其进行调整将有助于您完成任务。

票数 8
EN

Stack Overflow用户

发布于 2022-04-05 11:21:10

下面是我想出的最小可行的例子:

我定义了一个小的自定义块print

代码语言:javascript
复制
Blockly.defineBlocksWithJsonArray([
  {
    type: 'print',
    message0: 'print %1',
    args0: [
      { type: 'field_input', name: 'EMOJI_CODE' }
    ]
  }
]);

然后我用这个新块初始化Blockly编辑器:

代码语言:javascript
复制
const ws = Blockly.inject('ide', {
  toolbox: {
    kind: 'flyoutToolbox',
    contents: [
      { kind: 'block', type: 'print' }
    ]
  }
});

然后,我需要定义块将生成什么。

在本例中,我们将字符串转换为emojis,例如:-)变得。我定义了一种新的语言,以及print块应该做什么:

代码语言:javascript
复制
const emojiLang = new Blockly.Generator('EmojiLang');

emojiLang['print'] = function (block) {
  const code = block.getFieldValue('EMOJI_CODE');
  if (!code) return 'waiting…';
  if (code == ':-)') return '';
  if (code == ':-(') return '';
  if (code == ':-/') return '';
  return '(unknown)';
};

最后,我将听取编辑器中将块转换为表情符号的更改:

代码语言:javascript
复制
ws.addChangeListener(function () {
  document.getElementById('out').innerHTML =
    emojiLang.workspaceToCode(ws);
});

全工作实例

代码语言:javascript
复制
const emojiLang = new Blockly.Generator('EmojiLang');

emojiLang['print'] = function (block) {
  const code = block.getFieldValue('EMOJI_CODE');
  if (!code) return 'waiting…';
  if (code == ':-)') return '';
  if (code == ':-(') return '';
  if (code == ':-/') return '';
  return '(unknown)';
};

Blockly.defineBlocksWithJsonArray([
  {
    type: 'print',
    message0: 'print %1',
    args0: [
      { type: 'field_input', name: 'EMOJI_CODE' }
    ]
  }
]);

const ws = Blockly.inject('ide', {
  toolbox: {
    kind: 'flyoutToolbox',
    contents: [
      { kind: 'block', type: 'print' }
    ]
  }
});

ws.addChangeListener(function () {
  document.getElementById('out').innerHTML =
    emojiLang.workspaceToCode(ws);
});
代码语言:javascript
复制
<script src="https://unpkg.com/blockly/blockly.min.js"></script>

Emoji: <span id="out"></span>
<div id="ide" style="height:200px;width:400px;"></div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44895551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档