「 纯 Go 中的通用语法高亮显示器 」
翻译的原文 | 与日期 | 最新更新 | 更多 |
---|---|---|---|
commit | ⏰ 2018-10-21 | 中文翻译 |
欢迎 👏 勘误/校对/更新贡献 😊 具体贡献请看
If help, buy me coffee —— 营养跟不上了,给我来瓶营养快线吧! 💰
**注意:**由于 Chroma 刚刚发布,其 API 仍在不断变化.也就是说,高级接口应该不会发生太大变化.
Chroma 采用源码和其他结构的文本,将其转换为语法高亮的 HTML,ANSI 色彩文本等.
Chroma 很大程度上依赖于Pygments :python,包括 Pygments 的词法分析器-lexers
和样式-styles
的转移.
字首 | 语言 |
---|---|
A | ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, Awk |
B | Ballerina, Base Makefile, Bash, Batchfile, BlitzBasic, BNF, Brainfuck |
C | C, C#, C++, Cassandra CQL, CFEngine3, cfstatement/ColdFusion, CMake, COBOL, CSS, Cap'n Proto, Ceylon, ChaiScript, Cheetah, Clojure, CoffeeScript, Common Lisp, Coq, Crystal, Cython |
D | Dart, Diff, Django/Jinja, Docker, DTD |
E | EBNF, Elixir, Elm, EmacsLisp, Erlang |
F | Factor, Fish, Forth, Fortran, FSharp |
G | GAS, GDScript, GLSL, Genshi, Genshi HTML, Genshi Text, Gnuplot, Go, Go HTML Template, Go Text Template, Groovy |
H | Handlebars, Haskell, Haxe, Hexdump, HTML, HTTP, Hy |
I | Idris, INI, Io |
J | Java, JavaScript, JSON, Jsx, Julia, Jungle |
K | Kotlin |
L | Lighttpd configuration file, LLVM, Lua |
M | Mako, Markdown, Mason, Mathematica, MiniZinc, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL |
N | NASM, Newspeak, Nginx configuration file, Nim, Nix |
O | Objective-C, OCaml, Octave, OpenSCAD, Org Mode |
P | PacmanConf, Perl, PHP, Pig, PkgConfig, Plaintext, PL/pgSQL, PostgreSQL SQL dialect, PostScript, POVRay, PowerShell, Prolog, Protocol Buffer, Puppet, Python, Python 3 |
Q | QBasic |
R | R, Racket, Ragel, reg, reStructuredText, Rexx, Ruby, Rust |
S | Sass, Scala, Scheme, Scilab, SCSS, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Swift, systemd, Systemverilog |
T | TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData |
V | verilog, VHDL, VimL |
W | WDTE |
X | XML, Xorg |
Y | YAML |
我将保持此部分的更新,但更及时与权威的列表在chroma --list
.
与 Pygments 一样,Chroma 具有以下概念词法分析器-lexers,格式化-formatters和款式-styles.
Lexers 将源文本转换为标记流数据,styles 指定相应的标记类型如何映射到颜色,格式化程序将标记和 styles 转换为格式化输出.
每个概念都有一个包,包含一个全局包Registry
,其中具有所有已注册实现的变量。还有一些辅助函数可以让每个包都能使用注册表,例如按名称查找词法分析器,或匹配文件名等.
在所有情况下,如果无法确定词法分析器,格式化程序或样式,nil
将返回。在这种情况下,您可能希望默认为每个包中的Fallback
值,此提供合理的默认值.
存在一个便利功能,可以用来简单格式一些源文本,而不需要任何努力:
err := quick.Highlight(os.Stdout, someSourceCode, "go", "html", "monokai")
要高亮代码,首先必须确定编写代码的语言.有三种主要方法:
-
从文件名中检测语言.
lexer := lexers.Match("foo.go")
-
通过其 Chroma 语法 ID 明确指定语言(可从
lexers.Names()
中获取完整列表).lexer := lexers.Get("go")
-
从其内容中,分析语言.
lexer := lexers.Analyse("package main\n\nfunc main()\n{\n}\n")
在所有情况下,如果语言无法识别,返回一个nil
.
if lexer == nil {
lexer = lexers.Fallback
}
在这一点上,应该指出一些词法分析者可能不尽如人意。为了缓解这种情况,您可以使用合并词法分析器,将相同标记类型的运行合并到一个标记中:
lexer = chroma.Coalesce(lexer)
识别语言后,您需要选择格式化程序和样式(主题).
style := styles.Get("swapoff")
if style == nil {
style = styles.Fallback
}
formatter := formatters.Get("html")
if formatter == nil {
formatter = formatters.Fallback
}
然后获取Token-标记上的迭代器:
contents, err := ioutil.ReadAll(r)
iterator, err := lexer.Tokenise(nil, string(contents))
最后,从迭代器格式化标记:
err := formatter.Format(w, style, iterator)
默认情况下,已注册的html
格式化程序会生成带有嵌入式 CSS 的独立 HTML。更多的灵活性可以试试formatters/html
包.
首先,可以使用以下构造函数选项,自定义格式化程序生成的输出:
Standalone()
- 使用嵌入式 CSS 生成独立 HTML.WithClasses()
- 使用类,而不是内联样式属性.ClassPrefix(prefix)
- 为每个生成的 CSS 类添加前缀.TabWidth(width)
- 以字符为单位设置渲染的标签宽度.WithLineNumbers()
- 渲染行号(LineNumbers
样式).HighlightLines(ranges)
- 突出显示这些范围内的线条(LineHighlight
样式).LineNumbersInTable()
- 使用table,来格式化行号和代码,而不是 span.
如果是使用WithClasses()
,可以从格式化程序中,获取相应的 CSS:
formatter := html.New(html.WithClasses())
err := formatter.WriteCSS(w, style)
见Pygments 文档有关实施词法分析器的详细信息.大多数概念直接适用于 Chroma,但请参阅现有的 lexer 实现,以获取实际示例.
在许多情况下,可以使用附带的 Python 3 脚本pygments2chroma.py
直接从 Pygments 那里,自动转换词法分析器。如下:
python3 ~/Projects/chroma/_tools/pygments2chroma.py \
pygments.lexers.jvm.KotlinLexer \
> ~/Projects/chroma/lexers/kotlin.go \
&& gofmt -s -w ~/Projects/chroma/lexers/*.go
见pygments-lexers.go的笔记,其记录了有关词法分析器的列表,以及有关导入它们的一些问题的说明.
Chroma 支持 HTML 输出,以及 8 色,256 色和真彩色的终端输出.
一个noop
仅包含,输出标记文本的格式化程序,以及 一个tokens
formatter 输出原始标记。后者对调试词法分析器非常有用.
Chroma styles使用与Pygments相同的语法.
所有 Pygments 样式都被_tools/style.py
脚本转换为 Chroma的了.
有关可用样式,及其外观的简易概述,请查看Chroma 主题画廊.
包括 Chroma 的命令行界面.它可以安装:
go get -u github.com/alecthomas/chroma/cmd/chroma
- 由于各种原因(欢迎提出请求),其中相当多的lexers:
- Pygments对 复杂语言的词法分析器,通常包含处理某些方面的自定义代码,例如 Perl6 在正则表达式中嵌套代码的能力。这需要时间和精力来转换.
- 我大多只转换我听过的语言,以降低移植成本.
- 为简单起见,省略了 Pygments 的一些太深奥的功能.
- 虽然 Chroma API 支持内容检测,但仅有少有语言支持。我计划在哪个时候实现一个统计分析仪,但时间不够.