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

配置mode

  在线调试语法高亮 https://ace.c9.io/tool/mode_creator.html,可以自己练手下
  在ace项目的lib/ace/mode文件夹中已经定义了很多mode.下面介绍配置一个新的mode,其中包括 语法高亮规则,缩进规则,代码折叠规则。

语法高亮规则

语法高亮的规则可以继承其他规则,通过oop.inherits(MyNewHighlightRules, TextHighlightRules),比如php代码里面可以写html,所以继承HtmlHighlightRules。
ace高亮语法是一种状态机机制。每一个状态,里面可以包含多个 用正则表达式regex定义的token标记。token标记可以通过next属性决定下一个状态。

 this.$rules = {
stateName: [{
token: token, // String, Array, or Function: the CSS token to apply
regex: regex, // String or RegExp: the regexp to match
next: next // [Optional] String: next state to enter
}]
};

this.$rules对象用来定义状态机的规则。开始规则定义为start状态,按顺序检测start的token列表。
当检测到regex匹配的时候,文本包裹成`<span class="ace_${token}">${文本}</span>`,在编辑器显示。

 token=='function' => class="ace_function"
token=='support.function' => class="ace_support ace_function"

定义regex

regex属性可以是正则表达式,也可以是正则表达式的字符串,字符串需要注意\转义

 {
token : "constant.language.escape",
regex : /\$[\w\d]+/
regex : “\\$[\\w\\d]+”
}

regex与token关系

regex不存在捕获,token可以是String, Function返回字符串
token函数也可以用来对regex匹配的内容,再进行细分

 {
token: function(value) {
if (colors.hasOwnProperty(value.toLowerCase())) {
return "support.constant.color";
} else if (fonts.hasOwnProperty(value.toLowerCase())) {
return "support.constant.fonts";
} else {
return "text";
}
},
regex: "\\-?[a-zA-Z_][a-zA-Z0-9_\\-]*"
}

regex存在捕获分组,token可以是String(所有分组都用一样的定义), Array(长度和分组数量相同,与分组结果11对应),或Function返回Array

 {
token : "constant",
regex : "INT_MAX|INT_MIN"
} // INT_MAX -> constant(INT_MAX) {
token : ["constant", "keyword"],
regex : "^(#{1,6})(.+)$"
} // ### Header -> constant(###), keyword( Header) {
token : "constant",
regex : "(a+)(b)(\\1)"
} // aabaa -> constant(aabaa) :: abaa -> constant(aba) + a {
token : function (first, second) {
if (first == "a") return ["constant", "keyword"];
return ["keyword", "constant"];
},
regex: "(.)(world)"
} // aworld -> constant(a), keyword(world) :: bworld -> keyword(a), constant(world)

分组需要覆盖所有匹配结果,如果需要不匹配的话,请使用(?:), (hel)lo => (hel)(?:lo)

定义状态

语法高亮状态机,一般处于start状态,如果你定义了next,会流转到next指定的状态,一直流转下去。最后,应该回到start状态,对后面的文本继续进行检测。
可以理解是一个词法分析的过程。

 this.$rules = {
"start" : [{
token : "text",
regex : "<\\!\\[CDATA\\[",
next : "cdata"
}],
"cdata" : [{
token : "text",
regex : "\\]\\]>",
next : "start"
}, {
defaultToken : "text"
}]
};

上面示例中,当检测到"<![cdata["字符串,标记器从start状态移动到cdata状态,默认使用text标记,直到遇到关闭符号“]]>”,重新回到start状态继续检测。

扩展高亮规则

如果你的语法中间,可以通过(<?lua, <?php)标识符来嵌入其他语言块。Ace可以使用一些有用的函数来进行扩展

getRules 获取存在的规则

 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;
this.$rules = new HtmlHighlightRules().getRules();

addRules 合并规则

 this.$rules = {
"start": [ /* ... */ ]
}; var newRules = {
"start": [ /* ... */ ]
} this.addRules(newRules, "new-"); /*
this.$rules = {
"start": [ ... ],
"new-start": [ ... ]
};
*/

embedRules 扩展规则

 this.addRules(newRules, "new-") == embedRules(this.$rules, "new-", newRules);

 var HtmlHighlightRules = require("./html_highlight_rules").HtmlHighlightRules;
var LuaHighlightRules = require("./lua_highlight_rules").LuaHighlightRules; var LuaPageHighlightRules = function() {
this.$rules = new HtmlHighlightRules().getRules(); for (var i in this.$rules) {
this.$rules[i].unshift({
token: "keyword",
regex: "<\\%\\=?",
next: "lua-start"
}, {
token: "keyword",
regex: "<\\?lua\\=?",
next: "lua-start"
});
}
this.embedRules(LuaHighlightRules, "lua-", [
{
token: "keyword",
regex: "\\%>",
next: "start"
},
{
token: "keyword",
regex: "\\?>",
next: "start"
}
]);
}

当遇到'<%='或‘<?lua=’,就到lua-start状态,就使用LuaHighlightRules去检测下面的文本,直到遇到"%>", "?>"回到原来的HtmlHighlightRules;
上面例子会存在<%=?>的嵌套,存在些问题

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

  1. 前端代码编辑器ace 语法验证

    本文主要是介绍实际项目中如何加入语法检测功能.官方文档链接https://github.com/ajaxorg/ace/wiki/Syntax-validation 代码编辑器ace,使用webwor ...

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

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

  3. ace -- 语法高亮

    Creating a Syntax Highlighter for Ace 给ace创建一个语法高亮 Creating a new syntax highlighter for Ace is extr ...

  4. 修改Python IDLE代码配色及语法高亮主题

    初学Python,想必大家拿来练习最多的IDE就是Python自带的IDLE了,但是默认的代码配色及语法高亮主题确实很不适应,所以我们需要做个小小的美化,比如像下面这样我做的美化配置: HOW TO ...

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

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

  6. Qt中文本编辑器实现语法高亮功能(Qscitinlla)

    Scintilla是一个免费.跨平台.支持语法高亮的编辑控件.它完整支持源代码的编辑和调试,包括语法高亮.错误指示.代码完成(code completion)和调用提示(call tips).能包含标 ...

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

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

  8. mac 下面 vim 编辑器 开启语法高亮

    cp /usr/share/vim/vimrc ~/.vimrc 拷贝默认的配置文件 vim ~/.vimrc 编辑该文件 在文件的最后加入 syntax on 保存退出即可

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

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

随机推荐

  1. Tomcat启动web项目报Bad version number in .class file (unable to load class ...)错误的解决方法

    一.发现问题:启动 tomcat 控制台报该错误.   二.原因:tomcat 的 jdk 版本和编译.class的 jdk 版本不一致.   三.解决办法:   步骤一: 查看 MyEclipse ...

  2. ACM1258邻接表

    教训:使用邻接表的时候一定要把邻接表的结构组定义的足够大,不能仅仅等于节点的个数,因为线段的数量往往远超过节点的数量. 这个题目是拓扑排序练习,提高下理解. #include<iostream& ...

  3. 【C++对象模型】第六章 执行期语意学

    执行期语意学,即在程序执行时,编译器产生额外的指令调用,确保对象的构造,内存的释放,以及类型转换与临时对象的生成的安全进行. 1.对象的构造和析构 对于类对象的构造,一般在定义之后则开始内部的构造过程 ...

  4. 【BZOJ2693】jzptab [莫比乌斯反演]

    jzptab Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description   求 Input 第一行一个 ...

  5. 【BZOJ】1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列

    [题意]给定n头牛,k个特色,给出每头牛拥有哪些特色的二进制对应数字,[i,j]平衡当且仅当第i~j头牛的所有特色数量都相等,求最长区间长度. [算法]平衡树+数学转化 [题解]统计前缀和sum[i] ...

  6. LTC 钱包部署

    基础环境 系统: CentOS 7.x nodejs: v4.6.0 zeromq: 4.x 安装nodejs + zeromq 基础依赖 yum install -y gcc make gcc-c+ ...

  7. Connections between cities(LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题目: Problem Description After World War X, a lot ...

  8. windows10安装oracle11g报错ORA-01034、ORA-01078

    ORA-01034表示数据库实例未建立,可以先用管理员账号进入一个空白实例 sqlplus / as sysdba; 如果您当前使用的账号是安装oracle的账号,则不需要账号密码就可以登陆oracl ...

  9. 小程序var that=this

    小程序的js函数中,一般第一句就是var that=this,那么此语句的必要性是什么呢?下面用一段代码来解释这个问题 Page({ //页面的初始数据 loadUsers: function () ...

  10. bzoj 1046 LIS

    假设我们知道以每个点开始到最后的最长上升序列,设为w[i],这样首先我们在w值中取max,如果询问的值比max大,这样显然就是无解,如果小的话,我们需要求出来字典序最小的方案. 那么对于所有i,我们肯 ...