本文主要是介绍实际项目中如何加入语法检测功能。官方文档链接https://github.com/ajaxorg/ace/wiki/Syntax-validation

代码编辑器ace,使用webworker进行实时语法检查。目前支持JavaScript,json,php,coffeescript,css,xquery模式。
      根据官方https://ace.c9.io/#nav=higlighter的例子,在项目开发中,新增了Formula的语法高亮,下面是定义Mode并增加语法高亮的部分代码
      //parserNet是parser模块,在发生错误的时候会主动调用parseError方法

至于怎么实现语法检测的功能,比较复杂,涉及到编译原理,语法词法分析的知识。这个我了解的也只是入门,有时间的时候再介绍吧

ace.define("ace/mode/formula", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text", "ace/mode/formula_highlight_rules"], function (acequire, exports, module) {

    var oop = acequire("../lib/oop");
var TextMode = acequire("./text").Mode;
var FormulaHighlightRules = acequire("./formula_highlight_rules").FormulaHighlightRules; var Mode = function () {
this.HighlightRules = FormulaHighlightRules;
this.$behaviour = this.$defaultBehaviour;
};
oop.inherits(Mode, TextMode); (function () {
this.lineCommentStart = "//";
this.$id = "ace/mode/formula"; this.createWorker = function (session) {
var worker = {
//编辑器销毁或修改模式的时候
terminate: function () {
session.clearAnnotations(); //清除错误信息
this.$worker = null;
if (this.$doc)
this.$doc.off("change", this.changeListener);
this.changeListener = null;
this.$doc = null;
},
//文档变化的回调
_changeListener: function () {
if (!this.$doc) return;
var val = this.$doc.getValue();
if (val.trim() === "") {
session.clearAnnotations(); //清除错误信息
return;
}
var res = [];
//重写parserNet.parseError方法,收集错误信息
parserNet.parseError = function (str, obj) {
var column = obj.loc ? obj.loc.first_column : 0;
res.push({
column: column,
raw: str,
row: obj.line,
text: str,
type: "error"
})
}
try {
//parserNet.parse实时检测代码功能
parserNet.parse(val);
} catch (e) {
}
session.setAnnotations(res)//显示错误信息
},
//绑定文档对象的时候
attachToDocument(doc) {
if (this.$doc)
this.terminate();
this.$doc = doc;
this.changeListener = _.debounce(this._changeListener.bind(this), 500);
this.changeListener();
//绑定change文档事件
doc.on("change", this.changeListener);
},
//响应weoker中发出的消息,this.sender.emit("annotate",[])消息,也可以定义其他的消息名称
annotate(results) {
session.setAnnotations(results);
}
};
//绑定文档
worker.attachToDocument(session.getDocument());
return worker;
};
}).call(Mode.prototype);

在实际项目中,有可能是给ace已存在的高亮增加语法检测,下面是webpack打包项目中的写法,主要参考怎么引用已存在的ace模式

import 'brace/mode/mysql.js'
import {parserMySql} from '../mysql/mysqlParser.js';
var MysqlMode = ace.acequire("ace/mode/mysql").Mode;
(function () {
this.createWorker = function (session) {
var worker = {
terminate: function () {
session.clearAnnotations();
this.$worker = null;
if (this.$doc)
this.$doc.off("change", this.changeListener);
this.changeListener = null;
this.$doc = null;
},
_changeListener: function () {
if (!this.$doc) return;
var val = this.$doc.getValue();
var res = [];
parserMySql.parseError = function (str, obj) {
var column = obj.loc ? obj.loc.first_column : 0;
res.push({
column: column,
raw: str,
row: obj.line,
text: str,
type: "error"
})
}
if (val.trim().length === 0) {
res.push({
column: 0,
raw: "该字段不能为空",
row: 0,
text: "该字段不能为空",
type: "error"
})
} else {
try {
parserMySql.parse(val);
} catch (e) {
}
}
session.setAnnotations(res)
},
attachToDocument(doc) {
if (this.$doc)
this.terminate();
this.$doc = doc;
this.changeListener = _.debounce(this._changeListener.bind(this), 500);
this.changeListener();
doc.on("change", this.changeListener);
},
annotate(results) {
session.setAnnotations(results);
}
};
worker.attachToDocument(session.getDocument());
return worker;
};
}).call(MysqlMode.prototype);

前端代码编辑器ace 语法验证的更多相关文章

  1. 前端代码编辑器ace 语法提示 代码提示

    本文主要是介绍ace编辑器的语法提示,自动完成.其实没什么可特别介绍的,有始有终吧,把项目中使用到的ace的功能都介绍下. { enableBasicAutocompletion: false, // ...

  2. 前端代码编辑器ace 语法高亮

    代码编辑器codemirror和ace,都有接触过,主要是简单的api使用下.现在项目选用的ace.主要结合官网的文档,加入些自己的理解.官方原文链接https://ace.c9.io/#nav=hi ...

  3. 一切从编辑器说起:web前端代码编辑器

    俗话说:工欲善其事,必先利其器. 工欲善其事必先利其器.谓工匠想要使他的工作做好,一定要先让工具锋利.比喻要做好一件事,准备工作非常重要. 前端写代码也是一样,需要一个好的适合自己的代码编辑器. 我想 ...

  4. 集成代码编辑器ACE的经验

    ACE是最流行的在线代码编辑器之一,在CanTK的集成开发环境GameBuilder里也使用了ACE.ACE的功能非常强大,但是由于使用方法不当,大家反映GameBuilder的代码编辑器不好用.最近 ...

  5. Android平台上最好的几款免费的代码编辑器

    使用正确的开发工具能够快速有效地完成源代码的编写和测试,使编程事半功倍.在网络信息高速发展的今天,移动设备的方便快捷已经深入人心,越来越多的程序员会选择在任何感觉舒适的地方使用移动设备查看或者编辑源代 ...

  6. 【前端】ACE Editor(代码编辑器) 简易使用示例

    身为一个早已退役的Oier,当然忘不了当年一个个OJ页面上的代码显示和代码编辑器. 其中,洛谷使用的ACE Editor就是之一,非常的简洁美观.以及实际上在前端页面上搭建一个ACE Editor也是 ...

  7. 最好用的web端代码文本编辑器ACE

    使用足够简单,功能足够强大,体验足够优秀 之前有一个系列文章介绍我在运维系统开发过程中用到的那些顺手的前端插件,总共发了四篇文章介绍了三个非常棒的插件,分别是bootstrap-duallistbox ...

  8. ACE 1.1.9 发布,开源云端代码编辑器

    点这里 ACE 1.1.9 发布,开源云端代码编辑器 oschina 发布于: 2015年04月06日 (1评) 分享到:    收藏 +25 4月18日 武汉 源创会开始报名,送华为开发板 ACE ...

  9. ACE Editor在线代码编辑器简介及使用引导

    转自博客:https://www.cnblogs.com/cz-xjw/p/6476179.html ACE 是一个开源的.独立的.基于浏览器的代码编辑器,可以嵌入到任何web页面或JavaScrip ...

随机推荐

  1. 【bzoj4894】天赋

    Portal-->bzoj4894 Solution 这题的话其实,一句话题意就是求..外向树(方向是根往叶子).. 然后关于有向图的生成树计数的话,求外向树就是将度数矩阵改成入度,内向树就是改 ...

  2. struts2 - View页面中获取Action的成员变量

    struts2 - View页面中获取Action的成员变量 2016年03月02日 11:04:44 IT男青年 阅读数:1074   View页面中获取Action的成员变量 按照Struts的设 ...

  3. window.location.hash在firefox下中文自动转码为UTF-8问题

    1.window.location.hash window.location.hash这个属性主要是读取和写入网页位置的,我们经常会用来控制网页单页面跳转或者是控制网页位置.然而这个属性在firefo ...

  4. 面试的角度诠释Java工程师

    原文出处: locality 一.基础篇 1.面向对象的三大特性 继承.封装.多态 什么是继承?①继承是面向对象程序设计能够提高软件开发效率的重要原因之一.②继承是具有传递性的,就像现实中孙子不仅长得 ...

  5. Jenkins使用教程之用户权限管理(包含插件的安装)

    在工作的过程中由于分工合作的关系,我们因为工作内容的不同可能分为不同的组织里,但是jenkins默认的权限管理并没有用户组的概念,所以我们需要第三方插件的支持来解决问题.插件:Role-based A ...

  6. Python学习笔记(三十三)常用内置模块(2)collections_namedtuple_deque_defaultdict_OrderedDict_Counter

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431953239 ...

  7. Mysql通过show processlist排查数据库执行慢

    RDS for MySQL使用的是InnoDB引擎.不同于MyISAM引擎只提供表锁,InnoDB提供不同级别的锁.但是在我们日常的操作过程中经常由于对数据库不当的SQL操作导致出现长时间的锁,造成其 ...

  8. PHP扩展--taint检测隐藏漏洞

    简介 Taint 可以用来检测隐藏的XSS code, SQL注入, Shell注入等漏洞, 并且这些漏洞如果要用静态分析工具去排查, 将会非常困难, 比如对于如下的例子: <?php echo ...

  9. 如何阻止自动更新‘updated_at’和'created_at'

    可以在模版中添加一条代码: public $timestamps = false;

  10. Verilog笔记.5.同步、异步

    在数字电路中经常有同步synchronism.异步asynchronism的概念.异步指输入信号和时钟无关:同步指输入信号和时钟信号有关,实际上就是输入信号和时钟信号进行了与运算或者与非运算.实际开发 ...