Converting Pygments Styles to Chroma
Chroma is a syntax highlighter written in Go. Hugo uses it for internal highlighting. My theme Hugo-Octopress used the solarized dark theme built into the CSS (from Octopress). Chroma does not support this theme, so I had to generate the CSS myself.
Chroma has a built-in tool for converting styles _tools/style.py.
Instructions
These steps are for an Ubuntu 16 machine, but can be adapted for any OS.
- Install Go, configure
GOPATHand the rest. - Install Chroma with
go get github.com/alecthomas/chroma. - Install Python 3.
- Install Pygments for Python 3:
sudo apt-get install python3-pygments. - Install Pystache for Python 3:
sudo apt-get install python3-pystache. - Clone
solarized dark:git clone https://github.com/john2x/solarized-pygment/(do not need to install it). - (Optional) Rename the three py files inside
solarized=pygment/pygments_solarizedto more descriptive names. For exampledark.pymight becomesolarized-dark.py. - Open each of them and note the style class name. For example for
dark.pyit'sSolarizedDarkStyle. - Copy the files to the
pygmentsinstallation path. On my machine it was:/usr/local/lib/python3.5/dist-packages/Pygments-2.2.0-py3.5.egg/pygments/styles.
- Use the
_tools/style.pyto generategofiles from styles:python3 style.py [style-name] pygments.styles.[py-file-name].[style-class-name] > style-name.gostyle-nameis a string with new style's name. E.g.solarized-dark.py-file-nameis the name of thepyfile (w/o extension) that was copied to the Pygments directory. E.g.dark.style-class-nameis the name of the python class inside the style. E.g.SolarizedDarkStyle.
- My example command was:
python3 style.py solarized-dark pygments.styles.dark.SolarizedDarkStyle > solarized-dark.go
- Repeat for any other styles.
- Copy the resulting
gofiles to$GOPATH/Go/src/github.com/alecthomas/chroma/styles.- You can open the file to double-check the style name passed to
chroma.MustNewStyle: var SolarizedDark = Register(chroma.MustNewStyle("solarized-dark", chroma.StyleEntries{
- You can open the file to double-check the style name passed to
- Now create the following Go application (or copy
createCSS.go). Modify the file and style names as needed and execute it:package main import ( "os" "github.com/alecthomas/chroma/formatters/html" "github.com/alecthomas/chroma/styles" ) func main() { f, _ := os.Create("solarized-dark.css") defer f.Close() formatter := html.New(html.WithClasses()) if err := formatter.WriteCSS(f, styles.Get("solarized-dark")); err != nil { panic(err) } } - Copy/paste the CSS files to your theme's CSS.
- Inside your site's config file:
- Remove
pygmentsUseClassic: This will tell Hugo to use Chroma. pygmentsuseclasses = true: Use CSS for highlighting.pygmentscodefences = true: This adds code highlight to code fences.
- Remove