天天看点

我给数据只存在 localStorage 的实用备忘录 添加了语法高亮和折叠功能

背景

上篇文章《我开发了个:所有数据只保存在 localStorage 的实用备忘录》提到,我用 Ace 这个Web编辑器,实现了一个 网页版 Sublime Text。临时存一些文本、代码、思路等,非常方便。

特点在于:

  • 信息只保存本地,非常安全。
  • 响应速度非常快。
  • 编辑器好用,支持搜索、正则替换、多光标模式。
  • 自动保存,退出后,未主动保存的文件也会存下来。

但是没有做语法高亮。这不太方便,所以我今天给它加上了「语法高亮和折叠功能」。

使用体验

基于文件名后缀识别

正如 Sublime Text 一样,我不做预测,只判断文件类型。用户可以在左侧的列表中,修改文件名,用​

​.​

​加上后缀,告知系统这是什么类型的文件。于是编辑器就是用这种文件对应的语言的语法。

文件名后缀和对应的语言映射关系如下:

{
  "py": "python",
  "go": "golang",
  "js": "javascript",
  "ts": "typescript",
  "c": "c_cpp",
  "cpp": "c_cpp",
  "erl": "erlang",
  "hrl": "erlang",
  "kt": "kotlin",
  "md": "markdown",
  "proto": "protobuf",
  "conf": "nginx",
  "txt": "plain_text",
  "rs": "rust",
  "rb": "ruby",
  "v": "verilog",
  "vhd": "vhdl",
  "vhdl": "vhdl"
}      

此外,还有一些是文件后缀能看出语言类型的,不需要做映射:

[
  "jsx",
  "tsx",
  "css",
  "scss",
  "less",
  "sql",
  "java",
  "ejs",
  "sh",
  "lua",
  "svg",
  "xml",
  "json",
  "yaml",
  "html",
  "ini",
  "php",
  "r",
  "scala"
]      

如果文件后缀转小写后,不在上面的列表中,则认为是文本类型,没有高亮和折叠。

我给数据只存在 localStorage 的实用备忘录 添加了语法高亮和折叠功能

只要修改文件名,语法高亮实时生效。

语法高亮动态加载

得益于 Ace 优秀的设计,我们可以懒加载语法配置。方法如下:

ace.config.set('basePath', 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.12.3/');      

这句代码设置了要请求的地址的基本路径,后面会去拼接需要的语法文件名。需要设置语法时,就这样调用:

editor.session.setMode("ace/mode/" + mode);      

有哪些mode呢?可以在这里搜索到:cdnjs.com/libraries/a…

搜索​

​mode-​

​即可找到有配置的语法文件。

上面的语法映射,就是我手动添加的,筛选了一些自己认识的语法,把后缀映射到了语法文件名上。

这样设置好后,当你需要某种语法文件时,会自动去下载,下载完毕后,立马应用该语法。

此外,Ace 借助 service worker 实现了语法配置文件的缓存。需要下载某个配置文件时,如果已有缓存,就直接取缓存中的文件,不再下载了。如下图:

我给数据只存在 localStorage 的实用备忘录 添加了语法高亮和折叠功能

使用地址 & 源码

快来体验一下吧:

写在最后

继续阅读