chroma:纯 Go 实现的通用语法高亮库
官网地址: alecthomas/chroma: A general purpose syntax highlighter in pure Go (github.com)
注意:由于Chroma刚刚发布,其API仍在不断变化。也就是说,高级接口不应发生重大变化。
Chroma获取源代码和其他结构化文本并将其转换为语法 突出显示的 HTML、ANSI 彩色文本等。
Chroma主要基于Pygments,包括 Pygments词法和样式的翻译器。
目录索引
目录
支持的语言
前缀 | 语言 |
---|---|
一个 | ABAP, ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, ArangoDB AQL, Arduino, Awk |
B | Ballerina, Bash, Batchfile, BibTeX, Bicep, BlitzBasic, BNF, Brainfuck, BQN |
C | C, C#, C++, Caddyfile, Caddyfile Directives, Cap'n Proto, Cassandra CQL, Ceylon, CFEngine3, cfstatement, ChaiScript, Chapel, Cheetah, Clojure, CMake, COBOL, CoffeeScript, Common Lisp, Coq, Crystal, CSS, Cython |
D | D, Dart, Diff, Django/Jinja, Docker, DTD, Dylan |
E | EBNF, Elixir, Elm, EmacsLisp, Erlang |
F | 因子, 鱼, 福斯, 福特兰, FSharp |
G | GAS, GDScript, Genshi, Genshi HTML, Genshi Text, Gherkin, GLSL, Gnuplot, Go, Go HTML Template, Go Text Template, GraphQL, Groff, Groovy |
H | Handlebars, Haskell, Haxe, HCL, Hexdump, HLB, HLSL, HTML, HTTP, HYY |
我 | 伊德里斯, 伊戈尔, 伊尼, 艾欧 |
J | J, Java, JavaScript, JSON, Julia, Jungle |
K | 科特林 |
L | Lighttpd 配置文件, LLVM, Lua |
M | Makefile, Mako, markdown, Mason, Mathematica, Matlab, MiniZinc, MLIR, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL |
N | NASM, Newspeak, Nginx profile file, Nim, Nix |
O | Objective-C, OCaml, Octave, OnesEnterprise, OpenEdge ABL, OpenSCAD, Org Mode |
P | PacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Pony, PostgreSQL SQL 方言, PostScript, POVRay, PowerShell, Prolog, PromQL, Properties, Protocol Buffer, PSL, Puppet, Python 2, Python |
Q | QBasic |
R | R, Racket, Ragel, Raku, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust |
S | SAS, Sass, Scala, Scheme, Scilab, SCSS, Sed, Smali, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Standard ML, stas, Stylus, Svelte, Swift, SYSTEMD, systemverilog |
T | TableGen, TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turing, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData |
V | VB.net, verilog, VHDL, VHS, VimL, vue |
W | 西德· |
X | XML, Xorg |
Y | 杨亚姆 |
Z | 急转 |
我将尝试使本节保持最新,但权威列表可以是 以Chroma显示 --列表
。
试试吧
在Chroma Playground上尝试各种语言和风格。
使用库
Chroma和Pygments一样,具有词法分析器,格式化程序和样式的概念。
词法分析器将源文本转换为标记流,样式指定令牌如何 类型映射到颜色,格式化程序将标记和样式转换为 格式化输出。
每个包都存在一个包,包含一个全局变量 与所有注册的实现。还有辅助函数 用于在每个包中使用注册表,例如按名称查找词法分析器或 匹配文件名等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 }
然后获取令牌上的迭代器:
contents, err := ioutil.ReadAll(r) iterator, err := lexer.Tokenise(nil, string(contents))
最后,格式化迭代器中的令牌:
err := formatter.Format(w, style, iterator)
HTML 格式化程序
默认情况下,注册的格式化程序生成独立的 HTML 嵌入式 CSS。通过该软件包可以获得更大的灵活性。html
formatters/html
首先,格式化程序生成的输出可以使用 以下构造函数选项:
Standalone()
- 使用嵌入式CSS生成独立的HTML。WithClasses()
- 使用类而不是内联样式属性。ClassPrefix(prefix)
- 为每个生成的 CSS 类添加前缀。TabWidth(width)
- 设置渲染的选项卡宽度(以字符为单位)。WithLineNumbers()
- 渲染行号(样式为 )。LineNumbers
WithLinkableLineNumbers()
- 使行号可链接并链接到自己。HighlightLines(ranges)
- 突出显示这些范围内的线条(样式为 )。LineHighlight
LineNumbersInTable()
- 使用表格格式化行号和代码,而不是跨度。
如果使用,则可以使用以下方法从格式化程序获取相应的 CSS:WithClasses()
formatter := html.New(html.WithClasses(true)) err := formatter.WriteCSS(w, style)
更多详情
词法分析
有关实现词法分析器的详细信息,请参阅 Pygments 文档。大多数概念直接适用于Chroma, 但有关实际示例,请参阅现有的词法分析器实现。
在许多情况下,词法分析器可以直接通过以下方式自动转换 使用包含的 Python 3 脚本。我使用类似的东西 以下内容:pygments2chroma_xml.py
python3 _tools/pygments2chroma_xml.py \ pygments.lexers.jvm.KotlinLexer \ > lexers/embedded/kotlin.xml
请参阅pygments-词法分析器中的注释.txt以获取词法分析器的列表,以及有关导入它们的一些问题的注释。
格式化程序
Chroma支持HTML输出,以及8色,256色和真彩色的终端输出。
包含仅输出令牌文本的格式化程序,格式化程序输出原始标记。后者对于调试词法分析器很有用。noop
tokens
风格
Chroma样式在 XML 中定义。样式条目使用与 Pygments 相同的语法。
所有侏儒风格都已使用脚本转换为Chroma。_tools/style.py
当您使用Chroma的样式之一时, 知道令牌类型为令牌提供默认样式。它这样做 通过定义前景色和背景色。Background
例如,这会为样式中未定义的每个标记名称提供默认颜色 和用于突出显示的代码块的背景:#f8f8f8#000000
<entry type="Background" style="#f8f8f2 bg:#000000"/>
此外,样式文件中的令牌类型是分层的。例如,如果未定义,Chroma 将使用 中的标记样式。因此,当多个注释标记使用相同的颜色时,只需定义并覆盖具有不同颜色的注释标记。CommentSpecial
Comment
Comment
有关可用样式及其外观的快速概述,请查看Chroma样式库。
命令行界面
包括Chroma的命令行界面。
可从发布页面安装二进制文件。
CLI 可用作预处理器,对 的输出进行着色 请参阅环境变量的文档。less(1)
LESSOPEN
该标志可用于抑制输出并返回退出状态 1 便于在Chroma的情况下回退到其他一些预处理器 不解析要用于给定文件的特定词法分析器。例如:--fail
export LESSOPEN='| p() { chroma --fail "$1" || cat "$1"; }; p "%s"'
替换为您最喜欢的回退预处理器。cat
当调用为 时,标志会自动转动 在引擎盖下,便于与更少的管道运输集成 Debian 及其衍生产品; 对于该设置,可执行文件可以只符号链接到 。.lessfilter
--fail
chroma
~/.lessfilter
测试词法分析
如果您编辑一些词法分析器并想尝试一下,请打开一个 shell 并运行:cmd/chromad
go run .
将打印一个链接。在浏览器中打开它。现在,您可以使用本地更改在操场上进行测试。
如果要运行测试和词法分析器,请在根目录中打开一个 shell 并运行:
go test ./lexers
更新或添加词法分析器时,请添加测试。请参阅词法分析器/README.md 了解更多信息。
与俾格门人相比,缺少什么?
- 相当多的词法分析器,出于各种原因(欢迎拉取请求):
- 复杂语言的 Pygments 词法分析器通常包括自定义代码 处理某些方面,例如 Raku 将代码嵌套在内部的能力 正则表达式。这些需要时间和精力来转换。
- 我大多只转换我听说过的语言,以降低移植成本。
- 为了简单起见,省略了俾格门人的一些更深奥的特征。
- 虽然Chroma API支持内容检测,但很少有语言支持它们。 我计划在某个时候实施统计分析器,但时间不够。