前端代码编辑器ace 语法高亮
代码编辑器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 语法高亮的更多相关文章
- 前端代码编辑器ace 语法验证
本文主要是介绍实际项目中如何加入语法检测功能.官方文档链接https://github.com/ajaxorg/ace/wiki/Syntax-validation 代码编辑器ace,使用webwor ...
- 前端代码编辑器ace 语法提示 代码提示
本文主要是介绍ace编辑器的语法提示,自动完成.其实没什么可特别介绍的,有始有终吧,把项目中使用到的ace的功能都介绍下. { enableBasicAutocompletion: false, // ...
- ace -- 语法高亮
Creating a Syntax Highlighter for Ace 给ace创建一个语法高亮 Creating a new syntax highlighter for Ace is extr ...
- 修改Python IDLE代码配色及语法高亮主题
初学Python,想必大家拿来练习最多的IDE就是Python自带的IDLE了,但是默认的代码配色及语法高亮主题确实很不适应,所以我们需要做个小小的美化,比如像下面这样我做的美化配置: HOW TO ...
- 一切从编辑器说起:web前端代码编辑器
俗话说:工欲善其事,必先利其器. 工欲善其事必先利其器.谓工匠想要使他的工作做好,一定要先让工具锋利.比喻要做好一件事,准备工作非常重要. 前端写代码也是一样,需要一个好的适合自己的代码编辑器. 我想 ...
- Qt中文本编辑器实现语法高亮功能(Qscitinlla)
Scintilla是一个免费.跨平台.支持语法高亮的编辑控件.它完整支持源代码的编辑和调试,包括语法高亮.错误指示.代码完成(code completion)和调用提示(call tips).能包含标 ...
- 集成代码编辑器ACE的经验
ACE是最流行的在线代码编辑器之一,在CanTK的集成开发环境GameBuilder里也使用了ACE.ACE的功能非常强大,但是由于使用方法不当,大家反映GameBuilder的代码编辑器不好用.最近 ...
- mac 下面 vim 编辑器 开启语法高亮
cp /usr/share/vim/vimrc ~/.vimrc 拷贝默认的配置文件 vim ~/.vimrc 编辑该文件 在文件的最后加入 syntax on 保存退出即可
- Android平台上最好的几款免费的代码编辑器
使用正确的开发工具能够快速有效地完成源代码的编写和测试,使编程事半功倍.在网络信息高速发展的今天,移动设备的方便快捷已经深入人心,越来越多的程序员会选择在任何感觉舒适的地方使用移动设备查看或者编辑源代 ...
随机推荐
- maven的setting.xml文件中只配置本地仓库路径的方法
maven的setting.xml文件中只配置本地仓库路径的方法 即:settings标签下只有一个 localRepository标签,其他全部注释掉即可 <?xml version=&quo ...
- Codeforces Round #403 (Div. 2) B 三分 C dfs
B. The Meeting Place Cannot Be Changed time limit per test 5 seconds memory limit per test 256 megab ...
- 百度地图定位API,精度提高
我使用百度定位API DEMO上面好像就可以setCoorType("bd09ll");//百度地图坐标. 然后我找了下从其它坐标体系迁移到百度坐标. 问下: 1.那我还能不能在百 ...
- List<Hashtable>排序
hashtableList.Sort( delegate (Hashtable a, Hashtable b) { DateTime dateTime1 = (DateTime)a["ber ...
- elasticsearch中Node的创建
要连接到集群,首先要告诉集群:你是谁,你有什么特征.在es中体现为实例化节点,elasticsearch通过org.elasticsearch.node.NodeBuilder的build()或者no ...
- UOJ#204 【APIO2016】Boat
Time Limit: 70 Sec Memory Limit: 256 MBSubmit: 559 Solved: 248 Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向 ...
- MySQL数据库运行环境的搭建
第一步:安装wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b文件,安装过程中可能会遇到问题,把遇到的问题代码复制粘贴到360人工服务,查找方案 ...
- python初步学习-python数据类型-列表(list)
列表 list 在 python 中具有非常强大的功能 定义 在python中,用方括号表示一个list:[] 在方括号里面,可以是 int,也可以是 str类型的数据,甚至也可以是Flase/Tru ...
- javascript 事件绑定
一.最简单和向后兼容性最好的事件绑定方法是把事件绑定到元素标识的属性.事件属性名称由事件类型外加一个“on”前缀构成.这些属性也被称为事件处理器 <INPUT TYPE="text&q ...
- 【shell】shell中各种括号的作用()、(())、[]、[[]]、{}
一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有 ...