eleventy-plugin-syntaxhighl.../README.md

1149 lines
34 KiB
Markdown
Raw Permalink Normal View History

<p align="center"><img src="https://www.11ty.dev/img/logo-github.svg" width="200" height="200" alt="eleventy Logo"></p>
2023-02-03 00:49:35 +01:00
# eleventy-plugin-syntaxhighlighting-chroma
2023-02-03 00:49:35 +01:00
A module for handling syntax highlighting in [Eleventy](https://github.com/11ty/eleventy) using [Chroma](https://github.com/alecthomas/chroma); a syntax highlighter written in Go. There is no browser/client JavaScript required, the highlight transformations are all done at build-time.
I am making using of the [chroma-highlight](https://github.com/krymel/chroma-highlight) NPM package to include EX`Chroma` support. (It handles downloading the required binary for the platform you are working on).
This module/plugin used the 11ty plugin [eleventy-plugin-syntaxhighlight](https://github.com/11ty/eleventy-plugin-syntaxhighlight) as its basis.
Finally, I use the [JSDom](https://www.npmjs.com/package/jsdom) package to add `pre` and `code` attributes to the syntax highlighted code.
## Supported Args in Code Blocks
The first argument is always expected to be the language, at present there is no bugout/fail if a language is not provided first. (Nor in the original plugin)
For example
````
```js
```
````
For Markdown, separate arguments with a `/`, this seems to be hard coded somewhere in 11ty itself. I haven't a workaround yet.
````
```js/1,3:6
```
````
For `liquid` and `njk` you can use either `\` or spaces (` `) to separate the arguments.
### Currently Supported Arguments:
- `lineNumbers` will add line numbers starting from 1 in the code block.
- `lineNumbersStyle` if `table` is used, then code block will use a table to make it easier to drag and select the code. i.e `lineNumberStyle=table`
- `lineNumbersStart` the number to start the line number count from. i.e `lineNumbersStart=200`
- number **or** number,number **or** number:number **or** number,rangeStartNumber:rangeEndNumber **or** number,rangeStartNumber-rangeEndNumber to specify a line or lines to highlight. i.e `1`, `1,3`, `3:6`, or `1,3:6`, or `2,4-6`. **NOTE** if you use `lineNumbersStart` then the specified numbers must be relative to that (so `lineNumbersStart=200`, then use `204` to highlight line 204)
- `tabWidth` the number of spaces to replace tabs with, default is 8. Overrides value in eleventy config if set.
## Supported `options` in eleventy config
You can specify some arguments in the options object in `.eleventy.js` config. ~~Options are considered defaults, and can be overridden by codeblock arguments.~~**TODO**
Example of `options` object
```
eleventyConfig.addPlugin(syntaxHighlight, {
theme: "monokai",
lineNumbers: false,
highlightStyle: "bg:#943011",
tabWidth: 12,
lexerOverrides: {
njk: "vue",
liquid: "swift",
},
preAttributes: {
tabindex: 0,
testing: "ZX Spectrum Forever",
blargh: "Grrr Argh",
style: "border: purple 5px dashed",
},
codeAttributes: { test: "123" },
});
```
Theme can be set to one of these [themes](https://xyproto.github.io/splash/docs/all.html). If no theme is specified, then `monokai` is used.
- `lineNumbers` will add line numbers starting from 1 for each code block.
- `lineNumbersStyle` if `table` is used, then code block will use a table to make it easier to drag and select the code.
- `lexerOverrides` a key value pair, for instance `liquid: "vue"` will mean that when the code comes across the language `liquid` it will use the `vue` lexer instead. Useful for rendering code blocks that `Chroma` doesn't support out of the box.
- `tabWidth` the number of spaces to replace tabs with, default used by library is 8.
- `highlightStyle` allows you to override the theme's highlight color with one you specify. `highlightStyle` takes a string in the form of `bg:#XXXXXX` where `xxxxxx` is a either a 3 or 6 digit color code eg `bg:#943011`
2023-02-03 03:32:52 +01:00
## TO DO
- [✅] Support `.liquid` files
- [✅] Add passed in `code` and `pre` atributes into returned html from chroma
- [✅] Add other arguments that chroma can take (`--html-tab-width`, `--html-highlight-style`)
- [] Add testing
- [] Add improve regex for line numbers
- [] Add `--html-linkable-lines`
- [] Investigate if possible to use a bridge to call the Go Library directly from JavaScript rather than using the libary binary.
## Example output
Highlight line 1 and 3
````
2023-02-03 03:55:51 +01:00
```js/1,3
let multilineString = `
this is the first line
this is the middle line
this is the last line
`;
```
````
![](./images/hightlight-first-and-third-lines.png)
Line numbers shown and highlighting range of lines 3 through 6
````
```js/3:6/lineNumbers
let multilineString = `
this is the first line
this is the second line
this is the third line
this is the fourth line
this is the fifth line
this is the sixth line
this is the seventh line
this is the eighth line
`;
```
````
![](./images/highlight-range-with-line-numbers.png)
Line numbers shown, line numbers set to start at 200, and highlighting range of lines 202 through 204
````
```js/202:204/lineNumbers/table/lineNumbersStart=200
let multilineString = `
this is the first line
this is the second line
this is the third line
this is the fourth line
this is the fifth line
this is the sixth line
this is the seventh line
this is the eighth line
`;
```
````
2023-02-03 04:37:02 +01:00
![](./images/highlight-range-with-line-numbers-arbitary-start-number.png)
## Available Themes
The following themes are available:
```
abap algol algol_nu arduino autumn average base16-snazzy
borland bw catppuccin-frappe catppuccin-latte
catppuccin-macchiato catppuccin-mocha colorful doom-one
doom-one2 dracula emacs friendly fruity github github-dark
gruvbox gruvbox-light hr_high_contrast hrdark igor lovelace
manni modus-operandi modus-vivendi monokai monokailight
murphy native nord onedark onesenterprise paraiso-dark
paraiso-light pastie perldoc pygments rainbow_dash
rose-pine rose-pine-dawn rose-pine-moon rrt solarized-dark
solarized-dark256 solarized-light swapoff tango trac vim vs
vulcan witchhazel xcode xcode-dark
```
You can see examples of the [themes](https://xyproto.github.io/splash/docs/all.html).
## Available Lexers
Chroma provides highlighting for the following. Note you can use the lexer name itself, for instance `ActionScript` or its aliases `as` or `actionscript`.
**NOTE** If you spell the lexer incorrectly, or specify a language not understood by Chroma, then the build will fail. This was an intentional choice.
<details>
<summary>Tap/Click to reveal Long Lexer list</summary>
```
ABAP
aliases: abap
filenames: *.abap *.ABAP
mimetypes: text/x-abap
ABNF
aliases: abnf
filenames: *.abnf
mimetypes: text/x-abnf
ActionScript
aliases: as actionscript
filenames: *.as
mimetypes: application/x-actionscript text/x-actionscript text/actionscript
ActionScript 3
aliases: as3 actionscript3
filenames: *.as
mimetypes: application/x-actionscript3 text/x-actionscript3 text/actionscript3
Ada
aliases: ada ada95 ada2005
filenames: *.adb *.ads *.ada
mimetypes: text/x-ada
AL
aliases: al
filenames: *.al *.dal
mimetypes: text/x-al
Angular2
aliases: ng2
ANTLR
aliases: antlr
ApacheConf
aliases: apacheconf aconf apache
filenames: .htaccess apache.conf apache2.conf
mimetypes: text/x-apacheconf
APL
aliases: apl
filenames: *.apl
AppleScript
aliases: applescript
filenames: *.applescript
Arduino
aliases: arduino
filenames: *.ino
mimetypes: text/x-arduino
ArmAsm
aliases: armasm
filenames: *.s *.S
mimetypes: text/x-armasm text/x-asm
Awk
aliases: awk gawk mawk nawk
filenames: *.awk
mimetypes: application/x-awk
Ballerina
aliases: ballerina
filenames: *.bal
mimetypes: text/x-ballerina
Bash
aliases: bash sh ksh zsh shell
filenames: *.sh *.ksh *.bash *.ebuild *.eclass .env *.env *.exheres-0 *.exlib *.zsh *.zshrc .bashrc bashrc .bash_* bash_* zshrc .zshrc PKGBUILD
mimetypes: application/x-sh application/x-shellscript
BashSession
aliases: bash-session console shell-session
filenames: .sh-session
mimetypes: text/x-sh
Batchfile
aliases: bat batch dosbatch winbatch
filenames: *.bat *.cmd
mimetypes: application/x-dos-batch
BibTeX
aliases: bib bibtex
filenames: *.bib
mimetypes: text/x-bibtex
Bicep
aliases: bicep
filenames: *.bicep
BlitzBasic
aliases: blitzbasic b3d bplus
filenames: *.bb *.decls
mimetypes: text/x-bb
BNF
aliases: bnf
filenames: *.bnf
mimetypes: text/x-bnf
BQN
aliases: bqn
filenames: *.bqn
Brainfuck
aliases: brainfuck bf
filenames: *.bf *.b
mimetypes: application/x-brainfuck
C
aliases: c
filenames: *.c *.h *.idc *.x[bp]m
mimetypes: text/x-chdr text/x-csrc image/x-xbitmap image/x-xpixmap
C#
aliases: csharp c#
filenames: *.cs
mimetypes: text/x-csharp
C++
aliases: cpp c++
filenames: *.cpp *.hpp *.c++ *.h++ *.cc *.hh *.cxx *.hxx *.C *.H *.cp *.CPP
mimetypes: text/x-c++hdr text/x-c++src
Caddyfile
aliases: caddyfile caddy
filenames: Caddyfile*
Caddyfile Directives
aliases: caddyfile-directives caddyfile-d caddy-d
Cap'n Proto
aliases: capnp
filenames: *.capnp
Cassandra CQL
aliases: cassandra cql
filenames: *.cql
mimetypes: text/x-cql
Ceylon
aliases: ceylon
filenames: *.ceylon
mimetypes: text/x-ceylon
CFEngine3
aliases: cfengine3 cf3
filenames: *.cf
cfstatement
aliases: cfs
ChaiScript
aliases: chai chaiscript
filenames: *.chai
mimetypes: text/x-chaiscript application/x-chaiscript
Chapel
aliases: chapel chpl
filenames: *.chpl
Cheetah
aliases: cheetah spitfire
filenames: *.tmpl *.spt
mimetypes: application/x-cheetah application/x-spitfire
Clojure
aliases: clojure clj
filenames: *.clj
mimetypes: text/x-clojure application/x-clojure
CMake
aliases: cmake
filenames: *.cmake CMakeLists.txt
mimetypes: text/x-cmake
COBOL
aliases: cobol
filenames: *.cob *.COB *.cpy *.CPY
mimetypes: text/x-cobol
CoffeeScript
aliases: coffee-script coffeescript coffee
filenames: *.coffee
mimetypes: text/coffeescript
Common Lisp
aliases: common-lisp cl lisp
filenames: *.cl *.lisp
mimetypes: text/x-common-lisp
Common Lisp
aliases: common-lisp cl lisp
filenames: *.cl *.lisp
mimetypes: text/x-common-lisp
Coq
aliases: coq
filenames: *.v
mimetypes: text/x-coq
Crystal
aliases: cr crystal
filenames: *.cr
mimetypes: text/x-crystal
CSS
aliases: css
filenames: *.css
mimetypes: text/css
Cython
aliases: cython pyx pyrex
filenames: *.pyx *.pxd *.pxi
mimetypes: text/x-cython application/x-cython
D
aliases: d
filenames: *.d *.di
mimetypes: text/x-d
Dart
aliases: dart
filenames: *.dart
mimetypes: text/x-dart
Diff
aliases: diff udiff
filenames: *.diff *.patch
mimetypes: text/x-diff text/x-patch
Django/Jinja
aliases: django jinja
mimetypes: application/x-django-templating application/x-jinja
dns
aliases: zone bind
Docker
aliases: docker dockerfile
filenames: Dockerfile Dockerfile.* *.docker
mimetypes: text/x-dockerfile-config
DTD
aliases: dtd
filenames: *.dtd
mimetypes: application/xml-dtd
Dylan
aliases: dylan
filenames: *.dylan *.dyl *.intr
mimetypes: text/x-dylan
EBNF
aliases: ebnf
filenames: *.ebnf
mimetypes: text/x-ebnf
Elixir
aliases: elixir ex exs
filenames: *.ex *.exs
mimetypes: text/x-elixir
Elm
aliases: elm
filenames: *.elm
mimetypes: text/x-elm
EmacsLisp
aliases: emacs elisp emacs-lisp
filenames: *.el
mimetypes: text/x-elisp application/x-elisp
EmacsLisp
aliases: emacs elisp emacs-lisp
filenames: *.el
mimetypes: text/x-elisp application/x-elisp
Erlang
aliases: erlang
filenames: *.erl *.hrl *.es *.escript
mimetypes: text/x-erlang
Factor
aliases: factor
filenames: *.factor
mimetypes: text/x-factor
Fennel
aliases: fennel fnl
filenames: *.fennel
mimetypes: text/x-fennel application/x-fennel
Fish
aliases: fish fishshell
filenames: *.fish *.load
mimetypes: application/x-fish
Forth
aliases: forth
filenames: *.frt *.fth *.fs
mimetypes: application/x-forth
Fortran
aliases: fortran f90
filenames: *.f03 *.f90 *.f95 *.F03 *.F90 *.F95
mimetypes: text/x-fortran
FortranFixed
aliases: fortranfixed
filenames: *.f *.F
mimetypes: text/x-fortran
FSharp
aliases: fsharp
filenames: *.fs *.fsi
mimetypes: text/x-fsharp
GAS
aliases: gas asm
filenames: *.s *.S
mimetypes: text/x-gas
GDScript
aliases: gdscript gd
filenames: *.gd
mimetypes: text/x-gdscript application/x-gdscript
Genshi
aliases: genshi kid xml+genshi xml+kid
filenames: *.kid
mimetypes: application/x-genshi application/x-kid
Genshi HTML
aliases: html+genshi html+kid
mimetypes: text/html+genshi
Genshi Text
aliases: genshitext
mimetypes: application/x-genshi-text text/x-genshi
Gherkin
aliases: cucumber Cucumber gherkin Gherkin
filenames: *.feature *.FEATURE
mimetypes: text/x-gherkin
GLSL
aliases: glsl
filenames: *.vert *.frag *.geo
mimetypes: text/x-glslsrc
Gnuplot
aliases: gnuplot
filenames: *.plot *.plt
mimetypes: text/x-gnuplot
Go
aliases: go golang
filenames: *.go
mimetypes: text/x-gosrc
Go HTML Template
aliases: go-html-template
Go HTML Template
aliases: go-html-template
Go Text Template
aliases: go-text-template
GraphQL
aliases: graphql graphqls gql
filenames: *.graphql *.graphqls
Groff
aliases: groff nroff man
filenames: *.[1-9] *.1p *.3pm *.man
mimetypes: application/x-troff text/troff
Groovy
aliases: groovy
filenames: *.groovy *.gradle
mimetypes: text/x-groovy
Handlebars
aliases: handlebars hbs
filenames: *.handlebars *.hbs
Haskell
aliases: haskell hs
filenames: *.hs
mimetypes: text/x-haskell
Haxe
aliases: hx haxe hxsl
filenames: *.hx *.hxsl
mimetypes: text/haxe text/x-haxe text/x-hx
HCL
aliases: hcl
filenames: *.hcl
mimetypes: application/x-hcl
Hexdump
aliases: hexdump
HLB
aliases: hlb
filenames: *.hlb
HLSL
aliases: hlsl
filenames: *.hlsl *.hlsli
mimetypes: text/x-hlsl
HTML
aliases: html
filenames: *.html *.htm *.xhtml *.xslt
mimetypes: text/html application/xhtml+xml
HTTP
aliases: http
Hy
aliases: hylang
filenames: *.hy
mimetypes: text/x-hy application/x-hy
Idris
aliases: idris idr
filenames: *.idr
mimetypes: text/x-idris
Igor
aliases: igor igorpro
filenames: *.ipf
mimetypes: text/ipf
INI
aliases: ini cfg dosini
filenames: *.ini *.cfg *.inf *.service *.socket .gitconfig .editorconfig pylintrc .pylintrc
mimetypes: text/x-ini text/inf
Io
aliases: io
filenames: *.io
mimetypes: text/x-iosrc
J
aliases: j
filenames: *.ijs
mimetypes: text/x-j
Java
aliases: java
filenames: *.java
mimetypes: text/x-java
JavaScript
aliases: js javascript
filenames: *.js *.jsm *.mjs *.cjs
mimetypes: application/javascript application/x-javascript text/x-javascript text/javascript
JSON
aliases: json
filenames: *.json
mimetypes: application/json
Julia
aliases: julia jl
filenames: *.jl
mimetypes: text/x-julia application/x-julia
Jungle
aliases: jungle
filenames: *.jungle
mimetypes: text/x-jungle
Kotlin
aliases: kotlin
filenames: *.kt
mimetypes: text/x-kotlin
Lighttpd configuration file
aliases: lighty lighttpd
mimetypes: text/x-lighttpd-conf
LLVM
aliases: llvm
filenames: *.ll
mimetypes: text/x-llvm
Lua
aliases: lua
filenames: *.lua *.wlua
mimetypes: text/x-lua application/x-lua
Makefile
aliases: make makefile mf bsdmake
filenames: *.mak *.mk Makefile makefile Makefile.* GNUmakefile BSDmakefile
mimetypes: text/x-makefile
Mako
aliases: mako
filenames: *.mao
mimetypes: application/x-mako
markdown
aliases: md mkd
filenames: *.md *.mkd *.markdown
mimetypes: text/x-markdown
Mason
aliases: mason
filenames: *.m *.mhtml *.mc *.mi autohandler dhandler
mimetypes: application/x-mason
Mathematica
aliases: mathematica mma nb
filenames: *.nb *.cdf *.nbp *.ma
mimetypes: application/mathematica application/vnd.wolfram.mathematica application/vnd.wolfram.mathematica.package application/vnd.wolfram.cdf
Matlab
aliases: matlab
filenames: *.m
mimetypes: text/matlab
mcfunction
aliases: mcfunction
filenames: *.mcfunction
Meson
aliases: meson meson.build
filenames: meson.build meson_options.txt
mimetypes: text/x-meson
Metal
aliases: metal
filenames: *.metal
mimetypes: text/x-metal
MiniZinc
aliases: minizinc MZN mzn
filenames: *.mzn *.dzn *.fzn
mimetypes: text/minizinc
MLIR
aliases: mlir
filenames: *.mlir
mimetypes: text/x-mlir
Modula-2
aliases: modula2 m2
filenames: *.def *.mod
mimetypes: text/x-modula2
MonkeyC
aliases: monkeyc
filenames: *.mc
mimetypes: text/x-monkeyc
MorrowindScript
aliases: morrowind mwscript
Myghty
aliases: myghty
filenames: *.myt autodelegate
mimetypes: application/x-myghty
MySQL
aliases: mysql mariadb
filenames: *.sql
mimetypes: text/x-mysql text/x-mariadb
NASM
aliases: nasm
filenames: *.asm *.ASM
mimetypes: text/x-nasm
Newspeak
aliases: newspeak
filenames: *.ns2
mimetypes: text/x-newspeak
Nginx configuration file
aliases: nginx
filenames: nginx.conf
mimetypes: text/x-nginx-conf
Nim
aliases: nim nimrod
filenames: *.nim *.nimrod
mimetypes: text/x-nim
Nix
aliases: nixos nix
filenames: *.nix
mimetypes: text/x-nix
Objective-C
aliases: objective-c objectivec obj-c objc
filenames: *.m *.h
mimetypes: text/x-objective-c
OCaml
aliases: ocaml
filenames: *.ml *.mli *.mll *.mly
mimetypes: text/x-ocaml
Octave
aliases: octave
filenames: *.m
mimetypes: text/octave
OnesEnterprise
aliases: ones onesenterprise 1S 1S:Enterprise
filenames: *.EPF *.epf *.ERF *.erf
mimetypes: application/octet-stream
OpenEdge ABL
aliases: openedge abl progress openedgeabl
filenames: *.p *.cls *.w *.i
mimetypes: text/x-openedge application/x-openedge
OpenSCAD
aliases: openscad
filenames: *.scad
mimetypes: text/x-scad
Org Mode
aliases: org orgmode
filenames: *.org
mimetypes: text/org
PacmanConf
aliases: pacmanconf
filenames: pacman.conf
Perl
aliases: perl pl
filenames: *.pl *.pm *.t
mimetypes: text/x-perl application/x-perl
PHP
aliases: php php3 php4 php5
filenames: *.php *.php[345] *.inc
mimetypes: text/x-php
PHTML
aliases: phtml
filenames: *.phtml *.php *.php[345] *.inc
mimetypes: application/x-php application/x-httpd-php application/x-httpd-php3 application/x-httpd-php4 application/x-httpd-php5 text/x-php
Pig
aliases: pig
filenames: *.pig
mimetypes: text/x-pig
PkgConfig
aliases: pkgconfig
filenames: *.pc
PL/pgSQL
aliases: plpgsql
mimetypes: text/x-plpgsql
plaintext
aliases: text plain no-highlight
filenames: *.txt
mimetypes: text/plain
Plutus Core
aliases: plutus-core plc
filenames: *.plc
mimetypes: text/x-plutus-core application/x-plutus-core
Pony
aliases: pony
filenames: *.pony
PostgreSQL SQL dialect
aliases: postgresql postgres
mimetypes: text/x-postgresql
PostScript
aliases: postscript postscr
filenames: *.ps *.eps
mimetypes: application/postscript
POVRay
aliases: pov
filenames: *.pov *.inc
mimetypes: text/x-povray
PowerQuery
aliases: powerquery pq
filenames: *.pq
mimetypes: text/x-powerquery
PowerShell
aliases: powershell posh ps1 psm1 psd1 pwsh
filenames: *.ps1 *.psm1 *.psd1
mimetypes: text/x-powershell
Prolog
aliases: prolog
filenames: *.ecl *.prolog *.pro *.pl
mimetypes: text/x-prolog
PromQL
aliases: promql
filenames: *.promql
properties
aliases: java-properties
filenames: *.properties
mimetypes: text/x-java-properties
Protocol Buffer
aliases: protobuf proto
filenames: *.proto
PSL
aliases: psl
filenames: *.psl *.BATCH *.TRIG *.PROC
mimetypes: text/x-psl
Puppet
aliases: puppet
filenames: *.pp
Python
aliases: python py sage python3 py3
filenames: *.py *.pyi *.pyw *.jy *.sage *.sc SConstruct SConscript *.bzl BUCK BUILD BUILD.bazel WORKSPACE *.tac
mimetypes: text/x-python application/x-python text/x-python3 application/x-python3
Python 2
aliases: python2 py2
mimetypes: text/x-python2 application/x-python2
QBasic
aliases: qbasic basic
filenames: *.BAS *.bas
mimetypes: text/basic
QML
aliases: qml qbs
filenames: *.qml *.qbs
mimetypes: application/x-qml application/x-qt.qbs+qml
R
aliases: splus s r
filenames: *.S *.R *.r .Rhistory .Rprofile .Renviron
mimetypes: text/S-plus text/S text/x-r-source text/x-r text/x-R text/x-r-history text/x-r-profile
Racket
aliases: racket rkt
filenames: *.rkt *.rktd *.rktl
mimetypes: text/x-racket application/x-racket
Ragel
aliases: ragel
Raku
aliases: perl6 pl6 raku
filenames: *.pl *.pm *.nqp *.p6 *.6pl *.p6l *.pl6 *.6pm *.p6m *.pm6 *.t *.raku *.rakumod *.rakutest *.rakudoc
mimetypes: text/x-perl6 application/x-perl6 text/x-raku application/x-raku
react
aliases: jsx react
filenames: *.jsx *.react
mimetypes: text/jsx text/typescript-jsx
ReasonML
aliases: reason reasonml
filenames: *.re *.rei
mimetypes: text/x-reasonml
reg
aliases: registry
filenames: *.reg
mimetypes: text/x-windows-registry
reStructuredText
aliases: rst rest restructuredtext
filenames: *.rst *.rest
mimetypes: text/x-rst text/prs.fallenstein.rst
Rexx
aliases: rexx arexx
filenames: *.rexx *.rex *.rx *.arexx
mimetypes: text/x-rexx
Ruby
aliases: rb ruby duby
filenames: *.rb *.rbw Rakefile *.rake *.gemspec *.rbx *.duby Gemfile
mimetypes: text/x-ruby application/x-ruby
Rust
aliases: rust rs
filenames: *.rs *.rs.in
mimetypes: text/rust text/x-rust
SAS
aliases: sas
filenames: *.SAS *.sas
mimetypes: text/x-sas text/sas application/x-sas
Sass
aliases: sass
filenames: *.sass
mimetypes: text/x-sass
Scala
aliases: scala
filenames: *.scala
mimetypes: text/x-scala
Scheme
aliases: scheme scm
filenames: *.scm *.ss
mimetypes: text/x-scheme application/x-scheme
Scilab
aliases: scilab
filenames: *.sci *.sce *.tst
mimetypes: text/scilab
SCSS
aliases: scss
filenames: *.scss
mimetypes: text/x-scss
Sed
aliases: sed gsed ssed
filenames: *.sed *.[gs]sed
mimetypes: text/x-sed
Sieve
aliases: sieve
filenames: *.siv *.sieve
Smalltalk
aliases: smalltalk squeak st
filenames: *.st
mimetypes: text/x-smalltalk
Smarty
aliases: smarty
filenames: *.tpl
mimetypes: application/x-smarty
Snobol
aliases: snobol
filenames: *.snobol
mimetypes: text/x-snobol
Solidity
aliases: sol solidity
filenames: *.sol
SPARQL
aliases: sparql
filenames: *.rq *.sparql
mimetypes: application/sparql-query
SQL
aliases: sql
filenames: *.sql
mimetypes: text/x-sql
SquidConf
aliases: squidconf squid.conf squid
filenames: squid.conf
mimetypes: text/x-squidconf
Standard ML
aliases: sml
filenames: *.sml *.sig *.fun
mimetypes: text/x-standardml application/x-standardml
stas
filenames: *.stas
Stylus
aliases: stylus
filenames: *.styl
mimetypes: text/x-styl
Svelte
aliases: svelte
filenames: *.svelte
mimetypes: application/x-svelte
Swift
aliases: swift
filenames: *.swift
mimetypes: text/x-swift
SYSTEMD
aliases: systemd
filenames: *.automount *.device *.dnssd *.link *.mount *.netdev *.network *.path *.scope *.service *.slice *.socket *.swap *.target *.timer
mimetypes: text/plain
systemverilog
aliases: systemverilog sv
filenames: *.sv *.svh
mimetypes: text/x-systemverilog
TableGen
aliases: tablegen
filenames: *.td
mimetypes: text/x-tablegen
TASM
aliases: tasm
filenames: *.asm *.ASM *.tasm
mimetypes: text/x-tasm
Tcl
aliases: tcl
filenames: *.tcl *.rvt
mimetypes: text/x-tcl text/x-script.tcl application/x-tcl
Tcsh
aliases: tcsh csh
filenames: *.tcsh *.csh
mimetypes: application/x-csh
Termcap
aliases: termcap
filenames: termcap termcap.src
Terminfo
aliases: terminfo
filenames: terminfo terminfo.src
Terraform
aliases: terraform tf
filenames: *.tf
mimetypes: application/x-tf application/x-terraform
TeX
aliases: tex latex
filenames: *.tex *.aux *.toc
mimetypes: text/x-tex text/x-latex
Thrift
aliases: thrift
filenames: *.thrift
mimetypes: application/x-thrift
TOML
aliases: toml
filenames: *.toml
mimetypes: text/x-toml
TradingView
aliases: tradingview tv
filenames: *.tv
mimetypes: text/x-tradingview
Transact-SQL
aliases: tsql t-sql
mimetypes: text/x-tsql
Turing
aliases: turing
filenames: *.turing *.tu
mimetypes: text/x-turing
Turtle
aliases: turtle
filenames: *.ttl
mimetypes: text/turtle application/x-turtle
Twig
aliases: twig
mimetypes: application/x-twig
TypeScript
aliases: ts tsx typescript
filenames: *.ts *.tsx *.mts *.cts
mimetypes: text/x-typescript
TypoScript
aliases: typoscript
filenames: *.ts
mimetypes: text/x-typoscript
TypoScriptCssData
aliases: typoscriptcssdata
TypoScriptHtmlData
aliases: typoscripthtmldata
V
aliases: v vlang
filenames: *.v *.vv v.mod
mimetypes: text/x-v
V shell
aliases: vsh vshell
filenames: *.vsh
mimetypes: text/x-vsh
Vala
aliases: vala vapi
filenames: *.vala *.vapi
mimetypes: text/x-vala
VB.net
aliases: vb.net vbnet
filenames: *.vb *.bas
mimetypes: text/x-vbnet text/x-vba
verilog
aliases: verilog v
filenames: *.v
mimetypes: text/x-verilog
VHDL
aliases: vhdl
filenames: *.vhdl *.vhd
mimetypes: text/x-vhdl
VHS
aliases: vhs tape cassette
filenames: *.tape
VimL
aliases: vim
filenames: *.vim .vimrc .exrc .gvimrc _vimrc _exrc _gvimrc vimrc gvimrc
mimetypes: text/x-vim
vue
aliases: vue vuejs
filenames: *.vue
mimetypes: text/x-vue application/x-vue
WDTE
filenames: *.wdte
Whiley
aliases: whiley
filenames: *.whiley
mimetypes: text/x-whiley
XML
aliases: xml
filenames: *.xml *.xsl *.rss *.xslt *.xsd *.wsdl *.wsf *.svg *.csproj *.vcxproj *.fsproj
mimetypes: text/xml application/xml image/svg+xml application/rss+xml application/atom+xml
Xorg
aliases: xorg.conf
filenames: xorg.conf
YAML
aliases: yaml
filenames: *.yaml *.yml
mimetypes: text/x-yaml
YANG
aliases: yang
filenames: *.yang
mimetypes: application/yang
Zed
aliases: zed
filenames: *.zed
mimetypes: text/zed
Zig
aliases: zig
filenames: *.zig
mimetypes: text/zig
```
</details>
## Caveats
At present `Chroma` doesn't have support for highlighting `njk` or `liquid` code. As an alternative you can use `vue` in your documents, or use `lexerOverride` in `.eleventy.js` to specify a different lexer to use if `njk` or `liquid` are found.
Using this plugin is slower than either the offical highlighting plugin, or the [highlightjs](https://github.com/b-kelly/eleventy-plugin-highlightjs) plugin. More below.
2023-02-03 04:37:02 +01:00
## Thanks
I am stepping on the shoulders of others.
This plugin is based off of the official [eleventy-plugin-syntaxhighlight](https://github.com/11ty/eleventy-plugin-syntaxhighlight) plugin by Zach Leatherman et al. I modified its code to work with the Chroma highlighter.
I pull in the [chroma-highlight](https://github.com/krymel/chroma-highlight) NPM package by krymel. It downloads the Chroma highlighter binary for the platform you are on, and makes it available through a function to call where you pass in the formatter to use, the language, and any options.
Finally the [Chroma Highlighter](https://github.com/alecthomas/chroma) itself, by Alec Thomas. Tons of languages, themes, and its blazing fast. (Except when used this way)
## BENCH Results
At the moment, this plugin is the slowest by a factor of 7-8.
```
offical: Wrote 5 files in 0.09 seconds (v1.0.2)
highlightjs: Wrote 5 files in 0.11 seconds (v1.0.1)
chroma: Wrote 5 files in 0.74 seconds (v1.0.2)
```
Each block of code to be highlighted is a call to the `chroma` executable, and takes about 10-20ms. Rendering a whole page using the executable itself from the command line takes roughly 0.030 seconds (or 30ms) on an M1 MacBook Air.
```
time node_modules/chroma-highlight/bin/chroma --formatter html --lexer js --html-inline-styles ../test/JavaScriptFunctionTest.js
<snip output>
node_modules/chroma-highlight/bin/chroma --formatter html --lexer js 0.01s user 0.01s system 60% cpu 0.030 total
```
### 11ty offical Highlighter
```
> @11ty/eleventy-plugin-syntaxhighlight@4.2.0 bench
> DEBUG=Eleventy:Benchmark* npx @11ty/eleventy --input=demo --output=demo/_site --config=demo/eleventy-config.js
Eleventy:Benchmark Benchmark 5ms 3% 11× (Configuration) "highlight" Nunjucks Paired Shortcode +0ms
Eleventy:Benchmark Benchmark 2ms 1% 1× (Aggregate) Configuration addPlugin +0ms
Eleventy:Benchmark Benchmark 6ms 4% 2× (Aggregate) Searching the file system +0ms
Eleventy:Benchmark Benchmark 14ms 9% 5× (Aggregate) Template Read +0ms
Eleventy:Benchmark Benchmark 7ms 4% 5× (Aggregate) Template Compile +0ms
Eleventy:Benchmark Benchmark 1ms 0% 1× (Aggregate) > Compile > ./demo/2020-04-20-swift-coding-challenge-2.md +0ms
Eleventy:Benchmark Benchmark 35ms 22% 5× (Aggregate) Render +0ms
Eleventy:Benchmark Benchmark 7ms 4% 1× (Aggregate) > Render > ./demo/2020-04-20-swift-coding-challenge-2.md +0ms
Eleventy:Benchmark Benchmark 7ms 4% 1× (Aggregate) > Render > demo/_site/2020-04-20-swift-coding-challenge-2/index.html +0ms
Eleventy:Benchmark Benchmark 1ms 1% 1× (Aggregate) > Compile > ./demo/file-with-liquid-tags.md +0ms
Eleventy:Benchmark Benchmark 11ms 7% 1× (Aggregate) > Render > ./demo/file-with-liquid-tags.md +0ms
Eleventy:Benchmark Benchmark 11ms 7% 1× (Aggregate) > Render > demo/_site/file-with-liquid-tags/index.html +0ms
Eleventy:Benchmark Benchmark 6ms 3% 1× (Aggregate) > Render > ./demo/test-liquid.liquid +0ms
Eleventy:Benchmark Benchmark 6ms 3% 1× (Aggregate) > Render > demo/_site/test-liquid/index.html +0ms
Eleventy:Benchmark Benchmark 5ms 3% 1× (Aggregate) > Render > ./demo/test-markdown.md +0ms
Eleventy:Benchmark Benchmark 5ms 3% 1× (Aggregate) > Render > demo/_site/test-markdown/index.html +0ms
Eleventy:Benchmark Benchmark 4ms 3% 1× (Aggregate) > Compile > ./demo/test-nunjucks.njk +0ms
Eleventy:Benchmark Benchmark 5ms 3% 1× (Aggregate) > Render > ./demo/test-nunjucks.njk +1ms
Eleventy:Benchmark Benchmark 5ms 3% 1× (Aggregate) > Render > demo/_site/test-nunjucks/index.html +0ms
Eleventy:Benchmark Benchmark 2ms 2% 5× (Aggregate) Template Write +0ms
Eleventy:Benchmark Benchmark 3ms 2% 2× (Aggregate) Passthrough Copy File +0ms
[11ty] Copied 2 files / Wrote 5 files in 0.09 seconds (v1.0.2)
```
### eleventy-plugin-highlightjs
```
> eleventy-plugin-highlightjs@1.1.0 bench
> DEBUG=Eleventy:Benchmark* npx @11ty/eleventy --input=demo --output=demo/_site --config=demo/eleventy-config.js
Eleventy:Benchmark Benchmark 6ms 3% 11× (Configuration) "highlight" Nunjucks Paired Shortcode +0ms
Eleventy:Benchmark Benchmark 6ms 3% 2× (Aggregate) Searching the file system +1ms
Eleventy:Benchmark Benchmark 15ms 8% 5× (Aggregate) Template Read +0ms
Eleventy:Benchmark Benchmark 6ms 3% 5× (Aggregate) Template Compile +0ms
Eleventy:Benchmark Benchmark 1ms 0% 1× (Aggregate) > Compile > ./demo/2020-04-20-swift-coding-challenge-2.md +0ms
Eleventy:Benchmark Benchmark 53ms 27% 5× (Aggregate) Render +0ms
Eleventy:Benchmark Benchmark 17ms 9% 1× (Aggregate) > Render > ./demo/2020-04-20-swift-coding-challenge-2.md +0ms
Eleventy:Benchmark Benchmark 17ms 9% 1× (Aggregate) > Render > demo/_site/2020-04-20-swift-coding-challenge-2/index.html +0ms
Eleventy:Benchmark Benchmark 1ms 1% 1× (Aggregate) > Compile > ./demo/file-with-liquid-tags.md +0ms
Eleventy:Benchmark Benchmark 9ms 5% 1× (Aggregate) > Render > ./demo/file-with-liquid-tags.md +0ms
Eleventy:Benchmark Benchmark 9ms 5% 1× (Aggregate) > Render > demo/_site/file-with-liquid-tags/index.html +0ms
Eleventy:Benchmark Benchmark 6ms 3% 1× (Aggregate) > Render > ./demo/test-liquid.liquid +0ms
Eleventy:Benchmark Benchmark 6ms 3% 1× (Aggregate) > Render > demo/_site/test-liquid/index.html +0ms
Eleventy:Benchmark Benchmark 15ms 7% 1× (Aggregate) > Render > ./demo/test-markdown.md +0ms
Eleventy:Benchmark Benchmark 15ms 7% 1× (Aggregate) > Render > demo/_site/test-markdown/index.html +0ms
Eleventy:Benchmark Benchmark 3ms 2% 1× (Aggregate) > Compile > ./demo/test-nunjucks.njk +0ms
Eleventy:Benchmark Benchmark 6ms 3% 1× (Aggregate) > Render > ./demo/test-nunjucks.njk +0ms
Eleventy:Benchmark Benchmark 6ms 3% 1× (Aggregate) > Render > demo/_site/test-nunjucks/index.html +0ms
Eleventy:Benchmark Benchmark 3ms 2% 5× (Aggregate) Template Write +0ms
Eleventy:Benchmark Benchmark 3ms 1% 2× (Aggregate) Passthrough Copy File +0ms
[11ty] Copied 2 files / Wrote 5 files in 0.11 seconds (v1.0.1)
```
### This plugin
```
> eleventy-plugin-syntaxhighlight-chroma@0.0.1 bench
> DEBUG=Eleventy:Benchmark* npx @11ty/eleventy --input=demo --output=demo/_site --config=demo/eleventy-config.js
Eleventy:Benchmark Benchmark 132ms 14% 11× (Configuration) "highlight" Nunjucks Paired Shortcode +0ms
Eleventy:Benchmark Benchmark 2ms 0% 1× (Aggregate) Configuration addPlugin +0ms
Eleventy:Benchmark Benchmark 6ms 1% 2× (Aggregate) Searching the file system +0ms
Eleventy:Benchmark Benchmark 17ms 2% 5× (Aggregate) Template Read +0ms
Eleventy:Benchmark Benchmark 6ms 1% 5× (Aggregate) Template Compile +0ms
Eleventy:Benchmark Benchmark 1ms 0% 1× (Aggregate) > Compile > ./demo/2020-04-20-swift-coding-challenge-2.md +0ms
Eleventy:Benchmark Benchmark 677ms 70% 5× (Aggregate) Render +0ms
Eleventy:Benchmark Benchmark 77ms 8% 1× (Aggregate) > Render > ./demo/2020-04-20-swift-coding-challenge-2.md +0ms
Eleventy:Benchmark Benchmark 77ms 8% 1× (Aggregate) > Render > demo/_site/2020-04-20-swift-coding-challenge-2/index.html +0ms
Eleventy:Benchmark Benchmark 1ms 0% 1× (Aggregate) > Compile > ./demo/file-with-liquid-tags.md +0ms
Eleventy:Benchmark Benchmark 103ms 11% 1× (Aggregate) > Render > ./demo/file-with-liquid-tags.md +1ms
Eleventy:Benchmark Benchmark 103ms 11% 1× (Aggregate) > Render > demo/_site/file-with-liquid-tags/index.html +0ms
Eleventy:Benchmark Benchmark 94ms 10% 1× (Aggregate) > Render > ./demo/test-liquid.liquid +0ms
Eleventy:Benchmark Benchmark 94ms 10% 1× (Aggregate) > Render > demo/_site/test-liquid/index.html +0ms
Eleventy:Benchmark Benchmark 3ms 0% 1× (Aggregate) > Compile > ./demo/test-nunjucks.njk +0ms
Eleventy:Benchmark Benchmark 133ms 14% 1× (Aggregate) > Render > ./demo/test-nunjucks.njk +0ms
Eleventy:Benchmark Benchmark 133ms 14% 1× (Aggregate) > Render > demo/_site/test-nunjucks/index.html +0ms
Eleventy:Benchmark Benchmark 269ms 28% 1× (Aggregate) > Render > ./demo/test-markdown.md +0ms
Eleventy:Benchmark Benchmark 269ms 28% 1× (Aggregate) > Render > demo/_site/test-markdown/index.html +0ms
Eleventy:Benchmark Benchmark 7ms 1% 5× (Aggregate) Template Write +0ms
Eleventy:Benchmark Benchmark 7ms 1% 2× (Aggregate) Passthrough Copy File +0ms
[11ty] Copied 2 files / Wrote 5 files in 0.74 seconds (v1.0.2)
```