annotate vendor/github.com/alecthomas/chroma/v2/README.md @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 # Chroma — A general purpose syntax highlighter in pure Go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2 [![Golang Documentation](https://godoc.org/github.com/alecthomas/chroma?status.svg)](https://godoc.org/github.com/alecthomas/chroma) [![CI](https://github.com/alecthomas/chroma/actions/workflows/ci.yml/badge.svg)](https://github.com/alecthomas/chroma/actions/workflows/ci.yml) [![Slack chat](https://img.shields.io/static/v1?logo=slack&style=flat&label=slack&color=green&message=gophers)](https://invite.slack.golangbridge.org/)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 > **NOTE:** As Chroma has just been released, its API is still in flux. That said, the high-level interface should not change significantly.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 Chroma takes source code and other structured text and converts it into syntax
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 highlighted HTML, ANSI-coloured text, etc.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 Chroma is based heavily on [Pygments](http://pygments.org/), and includes
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 translators for Pygments lexers and styles.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 <a id="markdown-table-of-contents" name="table-of-contents"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 ## Table of Contents
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 <!-- TOC -->
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 1. [Table of Contents](#table-of-contents)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 2. [Supported languages](#supported-languages)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 3. [Try it](#try-it)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 4. [Using the library](#using-the-library)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 1. [Quick start](#quick-start)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 2. [Identifying the language](#identifying-the-language)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 3. [Formatting the output](#formatting-the-output)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 4. [The HTML formatter](#the-html-formatter)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 5. [More detail](#more-detail)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 1. [Lexers](#lexers)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 2. [Formatters](#formatters)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28 3. [Styles](#styles)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 6. [Command-line interface](#command-line-interface)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 7. [What's missing compared to Pygments?](#whats-missing-compared-to-pygments)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 <!-- /TOC -->
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 <a id="markdown-supported-languages" name="supported-languages"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 ## Supported languages
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 Prefix | Language
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 :----: | --------
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 A | ABAP, ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, Arduino, Awk
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 B | Ballerina, Base Makefile, Bash, Batchfile, BibTeX, Bicep, BlitzBasic, BNF, Brainfuck
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 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
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 D | D, Dart, Diff, Django/Jinja, Docker, DTD, Dylan
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 E | EBNF, Elixir, Elm, EmacsLisp, Erlang
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 F | Factor, Fish, Forth, Fortran, FSharp
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 G | GAS, GDScript, Genshi, Genshi HTML, Genshi Text, Gherkin, GLSL, Gnuplot, Go, Go HTML Template, Go Text Template, GraphQL, Groff, Groovy
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 H | Handlebars, Haskell, Haxe, HCL, Hexdump, HLB, HTML, HTTP, Hy
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 I | Idris, Igor, INI, Io
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 J | J, Java, JavaScript, JSON, Julia, Jungle
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 K | Kotlin
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 L | Lighttpd configuration file, LLVM, Lua
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 M | Mako, markdown, Mason, Mathematica, Matlab, MiniZinc, MLIR, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 N | NASM, Newspeak, Nginx configuration file, Nim, Nix
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 O | Objective-C, OCaml, Octave, OnesEnterprise, OpenEdge ABL, OpenSCAD, Org Mode
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 P | PacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Pony, PostgreSQL SQL dialect, PostScript, POVRay, PowerShell, Prolog, PromQL, Properties, Protocol Buffer, Puppet, Python 2, Python
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 Q | QBasic
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 R | R, Racket, Ragel, Raku, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 S | SAS, Sass, Scala, Scheme, Scilab, SCSS, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Standard ML, Stylus, Svelte, Swift, SYSTEMD, systemverilog
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 T | TableGen, TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turing, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 V | VB.net, verilog, VHDL, VimL, vue
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 W | WDTE
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 X | XML, Xorg
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 Y | YAML, YANG
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 Z | Zig
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 _I will attempt to keep this section up to date, but an authoritative list can be
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 displayed with `chroma --list`._
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 <a id="markdown-try-it" name="try-it"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 ## Try it
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 Try out various languages and styles on the [Chroma Playground](https://swapoff.org/chroma/playground/).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 <a id="markdown-using-the-library" name="using-the-library"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 ## Using the library
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 Chroma, like Pygments, has the concepts of
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 [lexers](https://github.com/alecthomas/chroma/tree/master/lexers),
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 [formatters](https://github.com/alecthomas/chroma/tree/master/formatters) and
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 [styles](https://github.com/alecthomas/chroma/tree/master/styles).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 Lexers convert source text into a stream of tokens, styles specify how token
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 types are mapped to colours, and formatters convert tokens and styles into
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 formatted output.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 A package exists for each of these, containing a global `Registry` variable
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 with all of the registered implementations. There are also helper functions
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 for using the registry in each package, such as looking up lexers by name or
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 matching filenames, etc.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 In all cases, if a lexer, formatter or style can not be determined, `nil` will
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 be returned. In this situation you may want to default to the `Fallback`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 value in each respective package, which provides sane defaults.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 <a id="markdown-quick-start" name="quick-start"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 ### Quick start
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 A convenience function exists that can be used to simply format some source
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 text, without any effort:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 ```go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 err := quick.Highlight(os.Stdout, someSourceCode, "go", "html", "monokai")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 <a id="markdown-identifying-the-language" name="identifying-the-language"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 ### Identifying the language
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 To highlight code, you'll first have to identify what language the code is
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 written in. There are three primary ways to do that:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 1. Detect the language from its filename.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 ```go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 lexer := lexers.Match("foo.go")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 3. Explicitly specify the language by its Chroma syntax ID (a full list is available from `lexers.Names()`).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 ```go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 lexer := lexers.Get("go")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 3. Detect the language from its content.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 ```go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 lexer := lexers.Analyse("package main\n\nfunc main()\n{\n}\n")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 In all cases, `nil` will be returned if the language can not be identified.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 ```go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 if lexer == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 lexer = lexers.Fallback
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 At this point, it should be noted that some lexers can be extremely chatty. To
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 mitigate this, you can use the coalescing lexer to coalesce runs of identical
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 token types into a single token:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141 ```go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 lexer = chroma.Coalesce(lexer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 <a id="markdown-formatting-the-output" name="formatting-the-output"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 ### Formatting the output
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 Once a language is identified you will need to pick a formatter and a style (theme).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150 ```go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 style := styles.Get("swapoff")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 if style == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 style = styles.Fallback
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 formatter := formatters.Get("html")
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 if formatter == nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 formatter = formatters.Fallback
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 Then obtain an iterator over the tokens:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 ```go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 contents, err := ioutil.ReadAll(r)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 iterator, err := lexer.Tokenise(nil, string(contents))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 And finally, format the tokens from the iterator:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 ```go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 err := formatter.Format(w, style, iterator)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174 <a id="markdown-the-html-formatter" name="the-html-formatter"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 ### The HTML formatter
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 By default the `html` registered formatter generates standalone HTML with
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 embedded CSS. More flexibility is available through the `formatters/html` package.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 Firstly, the output generated by the formatter can be customised with the
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 following constructor options:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 - `Standalone()` - generate standalone HTML with embedded CSS.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 - `WithClasses()` - use classes rather than inlined style attributes.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 - `ClassPrefix(prefix)` - prefix each generated CSS class.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 - `TabWidth(width)` - Set the rendered tab width, in characters.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 - `WithLineNumbers()` - Render line numbers (style with `LineNumbers`).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
188 - `LinkableLineNumbers()` - Make the line numbers linkable and be a link to themselves.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
189 - `HighlightLines(ranges)` - Highlight lines in these ranges (style with `LineHighlight`).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
190 - `LineNumbersInTable()` - Use a table for formatting line numbers and code, rather than spans.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
191
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
192 If `WithClasses()` is used, the corresponding CSS can be obtained from the formatter with:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
193
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
194 ```go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
195 formatter := html.New(html.WithClasses(true))
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
196 err := formatter.WriteCSS(w, style)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
197 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
198
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
199 <a id="markdown-more-detail" name="more-detail"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
200 ## More detail
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
201
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
202 <a id="markdown-lexers" name="lexers"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
203 ### Lexers
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
204
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
205 See the [Pygments documentation](http://pygments.org/docs/lexerdevelopment/)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
206 for details on implementing lexers. Most concepts apply directly to Chroma,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
207 but see existing lexer implementations for real examples.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
208
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
209 In many cases lexers can be automatically converted directly from Pygments by
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
210 using the included Python 3 script `pygments2chroma.py`. I use something like
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
211 the following:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
212
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
213 ```sh
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
214 python3 _tools/pygments2chroma.py \
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
215 pygments.lexers.jvm.KotlinLexer \
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
216 > lexers/k/kotlin.go \
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
217 && gofmt -s -w lexers/k/kotlin.go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
218 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
219
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
220 See notes in [pygments-lexers.txt](https://github.com/alecthomas/chroma/blob/master/pygments-lexers.txt)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
221 for a list of lexers, and notes on some of the issues importing them.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
222
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
223 <a id="markdown-formatters" name="formatters"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
224 ### Formatters
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
225
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
226 Chroma supports HTML output, as well as terminal output in 8 colour, 256 colour, and true-colour.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
227
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
228 A `noop` formatter is included that outputs the token text only, and a `tokens`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
229 formatter outputs raw tokens. The latter is useful for debugging lexers.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
230
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
231 <a id="markdown-styles" name="styles"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
232 ### Styles
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
233
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
234 Chroma styles use the [same syntax](http://pygments.org/docs/styles/) as Pygments.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
235
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
236 All Pygments styles have been converted to Chroma using the `_tools/style.py` script.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
237
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
238 When you work with one of [Chroma's styles](https://github.com/alecthomas/chroma/tree/master/styles), know that the `chroma.Background` token type provides the default style for tokens. It does so by defining a foreground color and background color.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
239
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
240 For example, this gives each token name not defined in the style a default color of `#f8f8f8` and uses `#000000` for the highlighted code block's background:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
241
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
242 ~~~go
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
243 chroma.Background: "#f8f8f2 bg:#000000",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
244 ~~~
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
245
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
246 Also, token types in a style file are hierarchical. For instance, when `CommentSpecial` is not defined, Chroma uses the token style from `Comment`. So when several comment tokens use the same color, you'll only need to define `Comment` and override the one that has a different color.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
247
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
248 For a quick overview of the available styles and how they look, check out the [Chroma Style Gallery](https://xyproto.github.io/splash/docs/).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
249
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
250 <a id="markdown-command-line-interface" name="command-line-interface"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
251 ## Command-line interface
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
252
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
253 A command-line interface to Chroma is included.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
254
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
255 Binaries are available to install from [the releases page](https://github.com/alecthomas/chroma/releases).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
256
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
257 The CLI can be used as a preprocessor to colorise output of `less(1)`,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
258 see documentation for the `LESSOPEN` environment variable.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
259
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
260 The `--fail` flag can be used to suppress output and return with exit status
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
261 1 to facilitate falling back to some other preprocessor in case chroma
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
262 does not resolve a specific lexer to use for the given file. For example:
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
263
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
264 ```shell
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
265 export LESSOPEN='| p() { chroma --fail "$1" || cat "$1"; }; p "%s"'
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
266 ```
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
267
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
268 Replace `cat` with your favourite fallback preprocessor.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
269
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
270 When invoked as `.lessfilter`, the `--fail` flag is automatically turned
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
271 on under the hood for easy integration with [lesspipe shipping with
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
272 Debian and derivatives](https://manpages.debian.org/lesspipe#USER_DEFINED_FILTERS);
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
273 for that setup the `chroma` executable can be just symlinked to `~/.lessfilter`.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
274
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
275 <a id="markdown-whats-missing-compared-to-pygments" name="whats-missing-compared-to-pygments"></a>
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
276 ## What's missing compared to Pygments?
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
277
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
278 - Quite a few lexers, for various reasons (pull-requests welcome):
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
279 - Pygments lexers for complex languages often include custom code to
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
280 handle certain aspects, such as Raku's ability to nest code inside
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
281 regular expressions. These require time and effort to convert.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
282 - I mostly only converted languages I had heard of, to reduce the porting cost.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
283 - Some more esoteric features of Pygments are omitted for simplicity.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
284 - Though the Chroma API supports content detection, very few languages support them.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
285 I have plans to implement a statistical analyser at some point, but not enough time.