blockly 把工作区中的块输出成代码

Blockly开发入门指北 Blockly开发入门指北 【腾讯文档】Blockly开发入门指北 https://docs.qq.com/doc/DRWRDUU5kR2lhaGNN 写这篇文章的目的 最近公司的项目用到了Blockly这个东西(不知道怎么形容,就用东西这个词吧),但是这个东西呢,官网没有中文,示例给的也都很简单,api文档也是杂七杂八什么都有令人头秃,国内用这个的人似乎也不多(是不是真的不多我也不清楚),网络上的相关文档很少,成体系的教程也没有,因此我打算自己写一个,出于个人水平问题,如有疏漏,在所难免。 阅读详情

代码生成器

Blockly的大多数应用程序都要求将用户的程序翻译成JavaScript,Python,PHP,Lua,Dart或其他语言。此操作由Blockly在客户端执行。这个过程就需要代码生成器。

生成代码

第一步是包含所用语言的生成器。Blockly包含以下5种生成器,分别对应不同的语言:

  1. javascript_compressed.js
  2. python_compressed.js
  3. php_compressed.js
  4. lua_compressed.js
  5. dart_compressed.js
    当然,在引入某个生成器之前,你应该先引入blockly_compressed.js。例如,下面是包含的JavaScript生成器:
<script src="blockly_compressed.js"></script>
<script src="javascript_compressed.js"></script>

接下来,在应用程序中可以随时通过调用下来的函数将用户在工作区组合的块导出为代码:

var code = Blockly.JavaScript.workspaceToCode(workspace);

同理,如果你需要生成其它语言的代码,则把:

<script src="https://blockly-demo.appspot.com/static/javascript_compressed.js"></script>

中的JavaScript替换成Python,PHP,Lua,或Dart。

实时生成

生成代码是一个非常快速的操作,因此你可以时常调用此函数。一个常见的策略是通过向Blockly的更改事件添加监听器来实时生成和显示代码:

function myUpdateFunction(event) {
  var code = Blockly.JavaScript.workspaceToCode(workspace);
  console.info(code)
}
workspace.addChangeListener(myUpdateFunction);

在这里可以看到示例

查看event以获取更多信息。

给自定义块添加生成器函数

在上文中我们提到了如何去创建自定义工具,但我们同时还要指定这个块背后对应的代码。这样才能将该模块转换为代码。标准生成器通常采用以下格式:

Blockly.JavaScript['text_length'] = function(block) {
  // String or array length.
  var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE',
      Blockly.JavaScript.ORDER_FUNCTION_CALL) || '\'\'';
  return [argument0 + '.length', Blockly.JavaScript.ORDER_MEMBER];
};

生成器函数对块进行引用以进行处理。它将输入(上面的VALUE输入框)渲染为代码串,然后将这些代码串连接成更大的表达式。

请参阅使用自定义生成器 了解更多详细信

综合示例

下面的例子中,我们自定义了一个工具lenght_of,同时指定了它背后对应的代码。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Blockly Demo: Fixed Blockly</title>
  <script src="../../blockly_compressed.js"></script>
  <script src="../../blocks_compressed.js"></script>
  <script src="../../msg/js/en.js"></script>
  <script src="../../javascript_compressed.js"></script>  
  <style>
    body {
      background-color: #fff;
      font-family: sans-serif;
    }
    h1 {
      font-weight: normal;
      font-size: 140%;
    }
  </style>
</head>
<body>
  <div id="blocklyDiv" style="height: 580px; width: 600px;"></div>
  <div>
    <button id="gerateCode">生成代码</button> 
    <button id="runCode">执行代码</button> 
  </div>
  <xml id="toolbox" style="display: none">
    <block type="controls_if"></block>
    <block type="logic_compare"></block>
    <block type="controls_repeat_ext"></block>
    <block type="math_number"></block>
    <block type="math_arithmetic"></block>
    <block type="text"></block>
    <block type="text_print"></block>
    <block type="string_length"></block>
  </xml>
  <script type="text/javascript">
    var code = ""
    document.getElementById("gerateCode").addEventListener("click",function(){
      console.info(".....代码如下....")
      code = Blockly.JavaScript.workspaceToCode(demoWorkspace);
      console.info(code)
    });

    document.getElementById("runCode").addEventListener("click",function(){
      console.info("执行代码如下....")
      try{
        eval(code)
      }
      catch(e){
        console.info("执行代码错误",e)
      }
    });
  </script>
  <script type="text/javascript">
    Blockly.Blocks['string_length'] = {
      init: function() {
        this.jsonInit({
          "message0": 'length of %1',
          "args0": [
            {
              "type": "input_value",
              "name": "VALUE",
              "check": "String"
            }
          ],
          "output": "Number",
          "colour": 160,
          "tooltip": "Returns number of letters in the provided text.",
          "helpUrl": "http://www.w3schools.com/jsref/jsref_length_string.asp"
        });
      }
    };

    Blockly.JavaScript['string_length'] = function(block) {
      // String or array length.
      var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE',
          Blockly.JavaScript.ORDER_FUNCTION_CALL) || '\'\'';
      return [argument0 + '.length', Blockly.JavaScript.ORDER_MEMBER];
      // return "'aaa'.length";
    };

  </script>
  <script>
    var demoWorkspace = Blockly.inject('blocklyDiv',
        {
          media: '../../media/',
         toolbox: document.getElementById('toolbox')
       });

  </script>
</body>
</html>

 

【Blockly开发教程】01 初识Blockly Blockly 是由 Google 开发的开源代码库,它可以为网页程序和移动端应用程序添加可视化代码编辑器。 阅读详情

相关推荐

【Blockly开发教程】02 配置你的blockly:初始化Blockly

在本节,你将了解如何初始化Blockly模块,如何将Blockly集成到一个Web应用中,以及了解一些好的开源示例。另外,可以了解到分析开源代码的一种方法。

Bright的博客 1806

Blockly编程教程-Google Blockly入门与介绍

介绍blockly是google发布的可视化编程工具,基于web技术构建。在功能/设计上和MIT的儿童编程语言Scratch类似使用blockly的时候,用户可以通过拖曳模块,来构建代码逻辑,过程很像搭积木在用户视角下,blockly是一个简单易用的可视化工具,用来生成代码。在开发者视角下,blockly是一个文本框,里边包含了用户输入好的代码。代码生成到文本框的过程,就是用户在blockly里拖...

LitTwoTwo的博客 2万+

【Blockly开发教程】08 积木块转代码

阅读本文,了解如何定义块对应的代码、转代码流程。

Bright的博客 1340

Blockly-图形化编程工具

整个过程只需要鼠标的拖曳,不需要键盘敲击。Blockly初始时,将分类XML转化为分类区和积木区,生成Workspace,运行时,将脚本区中的积木组,转成对应的代码段,然后转成可执行的高级编程语言,获得结果。Blockly语言2012年还处于技术探讨阶段,希望开发人员使用Blockly,给予反馈,想出新的能使用它的地方,所有的代码都是开源的。用于编写代码的区域,将积木区中的积木,拖动到脚本区,积木进行卡合形成积木组,积木组即可成为可执行的代码段,执行代码段获得运算结果;不需要任何的代码编写。

顺其自然~专栏 1万+

【Blockly开发教程】06 Workspace概念

本文介绍了Blockly的Workspace相关概念和配置、使用方法。

Bright的博客 1620

利用blockly源码测试块生成

Unit Tests After changing or adding code, you should run existing unit tests and consider writing more. All tests are executed on the uncompressed versions of the code. There are two sets of u

Zhang_HZ2016的博客 2779

blockly -- 定义块工具

Blockly Developer Tools Blockly Developer Tools是一个基于Web的开发人员工具,可自动执行Blockly配置过程的各个部分,包括创建自定义块,构建工具箱和配置Web Blockly工作区。 使用该工具的Blockly开发人员流程包括三个部分: 使用“Block Factory”和“Block Exporter”创建自定义块。 使用工作区工厂构...

wolf 1779

25届电信保研经验贴(空天院)

学校:中九专业:电子信息工程加权:92.89绩点:3.91/4.0rank:前五学期rank2/95,综合排名rank1(前六学期和综合排名出的晚,实际上只用到了前五学期)科研竞赛:市级大创、数模省一、数竞省二,其他校奖若干英语:六级462、四级548个人感觉:rank=科研>竞赛>英语总之rank和科研必须得有一项,要么就rank高,很多强com院校入营看rank。我rank比较有优势,因此报的多是强com院校。要么就科研经历丰富,多主动联系老师,特别是弱com院校。冬令营:空天院。

qq_68608661的博客 6328

blockly -- 定义块

定义块 块定义描述了块的外观和行为,包括文本,颜色,形状以及它可以连接的其他块。 定义自定义块后,每个平台都会以不同的方式加载这些定义,详细信息请参见网络和Android特定配置指南。 JSON格式与JavaScript API Blockly有两种定义块的方式:JSON对象和JavaScript函数。JSON格式是跨平台的,因此可以使用相同的代码在Web,Android和iO...

wolf 3825

CloudCompare横截面工具实战:从点云切片到轮廓提取的完整流程

本文详细介绍了CloudCompare软件中Cross Section工具的核心功能与实战流程。从交互式裁剪框的精准操控,到包络线提取的参数设置与优化,再到内部轮廓提取及批量处理技巧,完整解析了如何从三维点云中高效提取建筑立面、隧道断面等关键轮廓信息,是点云数据处理与分析的实用指南。

weixin_29290963的博客 284

详述字符集与汉字编码

字符集与字符编码是文本处理的基础概念。字符集定义字符集合(如ASCII、GB2312、Unicode),字符编码则规定字符如何存储为二进制数据。汉字编码经历了从区域化(GB2312、GBK、BIG5)到全球化(Unicode)的演进,Unicode通过UTF-8、UTF-16等编码方案实现跨语言兼容。UTF-8因兼容ASCII、节省空间且无乱码风险,成为中文互联网的主流编码。正确处理编码问题需统一标准、明确声明格式,并注意生僻字的特殊处理。

零零发不爱ai的博客 805

blockly自定义块简单实现

blockly自定义块支持使用json和JS,本文使用JS。 自定义块需要两个部分,blocks和generators。要看效果可以新建自己的index.html。 一、自定义块的步骤 1.在blocks/文件夹下新建文件myblocks.js文件,写入 'use strict'; goog.require('Blockly.Blocks'); goog.require('Blo...

tomato3351的博客 4732

别再为采样窗口发愁了!手把手教你用STM32实现三电阻分扇区电流采样(附代码避坑)

本文详细介绍了STM32平台下三电阻分扇区电流采样的实现方法,重点解决采样窗口选择不当和扇区切换逻辑问题。通过PWM定时器与ADC协同工作的底层机制分析,提供可移植的代码示例和实战经验,帮助工程师在电机矢量控制(FOC)系统中实现高精度相电流采样。

weixin_42531516的博客 165

blockly - 自定义块

添加自定义块 虽然Blockly定义了许多标准块,但是大多数应用程序需要定义和实现至少几个与域相关的块。 块由三个组件组成: 块定义对象:定义块的外观和行为,包括文本,颜色,字段和连接。 工具箱引用:对工具箱XML中块类型的引用,因此用户可以将其添加到工作区中。 生成器功能:生成此块的代码字符串。即使目标语言不是JavaScript,甚至对于Blockly for Android,它始...

wolf 2287

超声波探伤技术在风电叶片检测中的实战应用(含设备选型指南)

本文深入探讨了超声波探伤技术在风电叶片高空检测中的实战应用,重点分析了相控阵超声、激光超声等技术的选择与挑战。文章提供了详细的设备选型指南,对比了奥林巴斯、GE及国产品牌的优劣,并解读了典型缺陷的超声图谱特征,旨在帮助风电运维工程师安全、高效地完成叶片内部损伤的无损检测与预防性维护。

desk3的博客 885

踩坑记录:Clawdbot 对接 Minimax 报错 “401 token is unusable (1004)“ 的终极解决方案

如果你也在配置 Clawdbot 对接 Minimax 模型时,明明 API Key 是新申请的,却死活报错 `401 Unauthorized`,错误码 `1004`,提示 `token is unusable`——那么恭喜你,来对地方了。

hampeter的博客 2000

Blockly的配置

Blockly 的配置 本文基于Web Blockly,整理一下可视化编程工具-Blockly 的常用配置,包括:工作区配置、添加自定义块、配置工具箱、配置代码生成器等。 固定尺寸工作区 可调尺寸工作区 添加自定义块(Block) 工具箱(Toolbox)配置 代码生成器 网格(Grid) 缩放(Zoom) 事件 云存储 1. 固定尺寸工作区 把 Blockly 放到网页上最...

BianHuanShiZhe的专栏 1479

YOLOv11改进 - 卷积Conv | RFAConv:感受野注意力卷积动态调整感受野,提升小目标检出精度

本文介绍了感受野注意力卷积(RFAConv)及其在 YOLOv11 中的结合。空间注意力虽广泛应用但有局限,RFAConv 是将空间注意力与卷积操作融合的新型注意力机制,通过强化感受野空间特征关注、解决卷积核参数共享挑战、增强大尺寸卷积核处理能力等策略优化卷积核功能。它有基于 Group Conv 和 Unfold 两种实现方式,实验表明前者性能更好。我们将 RFAConv 集成进 YOLOv11,在数据集实验证明了方法优越性 。

魔改工程师的博客 1220

Blockly学习——定义块(define blocks)

Blockly学习——定义块(define blocks) 定义块是blockly开发最重要的环节,可以利用官方工具:Blockly Developer Tools ,也可以自己定义,本文记录整理通过代码定义方法,原网址为: https://developers.google.com/blockly/guides/create-custom-blocks/define-blocks JSON vs JavaScript 有两种定义 block 的方式: JSON objects 和 JavaScr

qq_41818255的博客 2258

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

AI人人懂 927

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

blockly -- 自定义块

本文档面向希望在Blockly中创建新块的开发人员。假定有人拥有一个可以编辑的Blockly本地副本,一个通常熟悉Blockly的用法,另一个则对JavaScript有基本的了解。 Blockly带有大量预定义的块。从数学函数到循环结构,应有尽有。但是,为了与外部应用程序接口,必须创建自定义块以形成API。例如,创建绘图程序时,可能需要创建一个“半径为R的绘图圆”块。 在大多数情况下,...

wolf 2496

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

blockly研究(二)自定义svg图形块

来更了。。 这篇就大概说说如何做简单的自定义图形吧,第三篇再说自定义生成代码以及自定义校验相关 以下所有截图都是mac截取的,分辨率较大,在csdn里面变形了, 建议放大看 其实就是捋一捋源码画图方法是用来干嘛的 -1、先构建基础块 当然是去blockly提供的工厂生成自定义块,不会的可以去看第一篇教程的入门部分 0、了解blockly图形化是怎么画的 1、...

听闻青春丶 6320

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

vue + blockly 自定义块、工具箱、主题

vue + blockly 自定义块、工具箱、主题 自定义块建议使用 Blockly Developer Tools 方便而且选择多样,随时生成块代码。 自定义块 块由三个组件组成: 块定义对象:定义块的外观和行为,包括文本、颜色、字段和连接。 工具箱引用:对工具箱 XML 中块类型的引用,因此用户可以将其添加到工作区。 生成器函数:生成此块的代码字符串。它总是用 JavaScript 编写,即使目标语言不是 JavaScript。 通过 Blockly Developer Tools

范百岁 5478

blockly构建自定义块及其工具

<h1 id="前言">前言</h1> <p><a href="https://blockly-demo.appspot.com/static/demos/blockfactory/index.htm

fly7632785的专栏 1969

blockly自定义中文出问题_Blockly教程 创建自定义块-Blockly 开发者工具

[suxing_insert_post ids=163]Blockly Developer Tools是一个基于Web的开发者工具,它可以通过配置自动化的完成 Blockly 组件开发,包括创建自定义模块、建立工具箱、并配置 Web Blockly工作区。使用工具的 Glockly 开发过程分为三部分:使用Block Factory 和 Block Exporter创建自定义块使用Workspac...

weixin_28816215的博客 809

blockly 代码html,【blockly入门指引】2, 在网页中使用blockly

原文:https://developers.google.com/blockly/guides/get-started/webblockly可以在web,android,ios端使用。下面介绍的是如何在web端中去使用。简单来理解就是把它看作是一个js库,在html中引入这个js库即可。给你源码blockly是开源,你可以直接去官网上去下载。如下列出了地址:下载zip下载TARgitHub代码下载...

weixin_29029169的博客 1036
上一篇: blockly -- Custom Blocks: Style Guide
下一篇: blockly--主题
wolf131721
博客等级 码龄9年 38粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值