chroma:纯 Go 实现的通用语法高亮库

官网地址: alecthomas/chroma: A general purpose syntax highlighter in pure Go (github.com)

注意:由于Chroma刚刚发布,其API仍在不断变化。也就是说,高级接口不应发生重大变化。

Chroma获取源代码和其他结构化文本并将其转换为语法 突出显示的 HTML、ANSI 彩色文本等。

Chroma主要基于Pygments,包括 Pygments词法和样式的翻译器。

目录

  1. 目录
  2. 支持的语言
  3. 试试吧
  4. 使用库
    1. 快速入门
    2. 识别语言
    3. 格式化输出
    4. HTML 格式化程序
  5. 更多详情
    1. 词法分析
    2. 格式化程序
    3. 风格
  6. 命令行界面
  7. 测试词法分析
  8. 与俾格门人相比,缺少什么?

支持的语言

前缀语言
一个ABAP, ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, ArangoDB AQL, Arduino, Awk
BBallerina, Bash, Batchfile, BibTeX, Bicep, BlitzBasic, BNF, Brainfuck, BQN
CC, 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
DD, Dart, Diff, Django/Jinja, Docker, DTD, Dylan
EEBNF, Elixir, Elm, EmacsLisp, Erlang
F因子, 鱼, 福斯, 福特兰, FSharp
GGAS, GDScript, Genshi, Genshi HTML, Genshi Text, Gherkin, GLSL, Gnuplot, Go, Go HTML Template, Go Text Template, GraphQL, Groff, Groovy
HHandlebars, Haskell, Haxe, HCL, Hexdump, HLB, HLSL, HTML, HTTP, HYY
伊德里斯, 伊戈尔, 伊尼, 艾欧
JJ, Java, JavaScript, JSON, Julia, Jungle
K科特林
LLighttpd 配置文件, LLVM, Lua
MMakefile, Mako, markdown, Mason, Mathematica, Matlab, MiniZinc, MLIR, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL
NNASM, Newspeak, Nginx profile file, Nim, Nix
OObjective-C, OCaml, Octave, OnesEnterprise, OpenEdge ABL, OpenSCAD, Org Mode
PPacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Pony, PostgreSQL SQL 方言, PostScript, POVRay, PowerShell, Prolog, PromQL, Properties, Protocol Buffer, PSL, Puppet, Python 2, Python
QQBasic
RR, Racket, Ragel, Raku, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust
SSAS, Sass, Scala, Scheme, Scilab, SCSS, Sed, Smali, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Standard ML, stas, Stylus, Svelte, Swift, SYSTEMD, systemverilog
TTableGen, TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turing, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData
VVB.net, verilog, VHDL, VHS, VimL, vue
W西德·
XXML, Xorg
Y杨亚姆
Z急转

我将尝试使本节保持最新,但权威列表可以是 以Chroma显示 --列表

试试吧

Chroma Playground上尝试各种语言和风格。

使用库

Chroma和Pygments一样,具有词法分析器格式化程序样式的概念。

词法分析器将源文本转换为标记流,样式指定令牌如何 类型映射到颜色,格式化程序将标记和样式转换为 格式化输出。

每个包都存在一个包,包含一个全局变量 与所有注册的实现。还有辅助函数 用于在每个包中使用注册表,例如按名称查找词法分析器或 匹配文件名等Registry

在所有情况下,如果无法确定词法分析器、格式化程序或样式,则将 被退回。在这种情况下,您可能希望默认为每个相应包中的值,该值提供合理的默认值。nilFallback

快速入门

存在一个方便的功能,可用于简单地格式化某些源 文本,毫不费力:

err := quick.Highlight(os.Stdout, someSourceCode, "go", "html", "monokai")

识别语言

要突出显示代码,您首先必须确定代码是什么语言 写在。有三种主要方法可以做到这一点:

  1. 从文件名中检测语言。lexer := lexers.Match("foo.go")
  2. 通过其Chroma语法 ID 显式指定语言(完整列表可从 获得)。lexers.Names()lexer := lexers.Get("go")
  3. 从语言内容中检测语言。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。通过该软件包可以获得更大的灵活性。htmlformatters/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色和真彩色的终端输出。

包含仅输出令牌文本的格式化程序,格式化程序输出原始标记。后者对于调试词法分析器很有用。nooptokens

风格

Chroma样式在 XML 中定义。样式条目使用与 Pygments 相同的语法

所有侏儒风格都已使用脚本转换为Chroma。_tools/style.py

当您使用Chroma的样式之一时, 知道令牌类型为令牌提供默认样式。它这样做 通过定义前景色和背景色。Background

例如,这会为样式中未定义的每个标记名称提供默认颜色 和用于突出显示的代码块的背景:#f8f8f8#000000
<entry type="Background" style="#f8f8f2 bg:#000000"/>

此外,样式文件中的令牌类型是分层的。例如,如果未定义,Chroma 将使用 中的标记样式。因此,当多个注释标记使用相同的颜色时,只需定义并覆盖具有不同颜色的注释标记。CommentSpecialCommentComment

有关可用样式及其外观的快速概述,请查看Chroma样式库

命令行界面

包括Chroma的命令行界面。

可从发布页面安装二进制文件。

CLI 可用作预处理器,对 的输出进行着色 请参阅环境变量的文档。less(1)LESSOPEN

该标志可用于抑制输出并返回退出状态 1 便于在Chroma的情况下回退到其他一些预处理器 不解析要用于给定文件的特定词法分析器。例如:--fail

export LESSOPEN='| p() { chroma --fail "$1" || cat "$1"; }; p "%s"'

替换为您最喜欢的回退预处理器。cat

当调用为 时,标志会自动转动 在引擎盖下,便于与更少的管道运输集成 Debian 及其衍生产品; 对于该设置,可执行文件可以只符号链接到 。.lessfilter--failchroma~/.lessfilter

测试词法分析

如果您编辑一些词法分析器并想尝试一下,请打开一个 shell 并运行:cmd/chromad

go run .

将打印一个链接。在浏览器中打开它。现在,您可以使用本地更改在操场上进行测试。

如果要运行测试和词法分析器,请在根目录中打开一个 shell 并运行:

go test ./lexers

更新或添加词法分析器时,请添加测试。请参阅词法分析器/README.md 了解更多信息。

与俾格门人相比,缺少什么?

  • 相当多的词法分析器,出于各种原因(欢迎拉取请求):
    • 复杂语言的 Pygments 词法分析器通常包括自定义代码 处理某些方面,例如 Raku 将代码嵌套在内部的能力 正则表达式。这些需要时间和精力来转换。
    • 我大多只转换我听说过的语言,以降低移植成本。
  • 为了简单起见,省略了俾格门人的一些更深奥的特征。
  • 虽然Chroma API支持内容检测,但很少有语言支持它们。 我计划在某个时候实施统计分析器,但时间不够。
版权声明:本文《chroma:纯 Go 实现的通用语法高亮库》为「linux名库」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。联系方式osschina@qq.com
 
Leave a Reply 0

Your email address will not be published. Required fields are marked *


加好友请备注:linuxlibs
您可以在微信公众号联系我们
您可以通过邮件联系我们
我们将24小时内回复。
取消