mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-14 20:37:55 -05:00
047c4188df
f9a5dc59b Code Toggle block added to doc site final batch Templates ✅ Variables ✅ 4d4107968 Add eSolia as new sponsor 000fed94e Add missing closing tags for li in menu template example f462b620f Clarify that local CSV files cannot be inside data dir ae083641a Added hugo-search-index to list of search tools e2b64d0b7 Remove extra link 2fb4c9af5 Release 0.38.2 59b1c9853 releaser: Prepare repository for 0.39-DEV 92f6a05ea releaser: Add release notes to /docs for release of 0.38.2 76244729e releaser: Bump versions for release of 0.38.2 0960c5fb3 Adjust gray color of tab vs pane in code-toggle. 8ae3aadd7 use code-toggle shortcode when relevant Content Management ✅ 455b8b53b Update related.md 6e8d19090 Release 0.38.1 079ba044c releaser: Prepare repository for 0.39-DEV 6f23e6ec1 releaser: Add release notes to /docs for release of 0.38.1 c51692ceb releaser: Bump versions for release of 0.38.1 d37ea6a5e Update related.md faa2707d0 Update index.md 9ce901dcb Add a forgotten language tag (go-html-template) for code b05aaed14 Update where.md 4d4760819 Fix typo in code-toggle.md c5a5250a1 Use the new go-html-template Chroma lexer 2de831f4b Add the full list of Chroma lexers 18114d4b4 Update Output Formats b069d7f84 Release 0.38 caaa8355a releaser: Prepare repository for 0.39-DEV e45b7cc9f releaser: Add release notes to /docs for release of 0.38 40f40906e releaser: Bump versions for release of 0.38 2d52e2e4e Merge commit 'ed8bf081fdbf336e026517b7e1b123c039014ab5' 1439f64a0 docs: Generate docshelper data 5b0edfd79 Add .Site.IsServer fdb579ad1 Merge commit '0a23baa6a90901f772c234107c4f12c16c76f4aa' 7b71da1f8 hugolib: Add Reset method to delete key from Scratch 63a131664 docs: Add docs for lang.Merge 55cba056d Merge commit '3886fc1fef6ac19d58b9ba1bb642d0c6c9a54031' 6f301ebcc docs: Add docs on the new front matter configuration 7ba35ef56 Merge commit 'c0290655825e7bb36e13fb39f89d85b392cf1adc' 3d2cab754 releaser: Prepare repository for 0.38-DEV 095e888e1 releaser: Add release notes to /docs for release of 0.37.1 593fa0dcb releaser: Bump versions for release of 0.37.1 c18c1df54 releaser: Prepare repository for 0.38-DEV git-subtree-dir: docs git-subtree-split: f9a5dc59b77d15cc2c7534e10bcd90bcfeda7bb4
193 lines
7 KiB
Markdown
193 lines
7 KiB
Markdown
---
|
|
title: Syntax Highlighting
|
|
description: Hugo comes with reallly fast syntax highlighting from Chroma.
|
|
date: 2017-02-01
|
|
publishdate: 2017-02-01
|
|
keywords: [highlighting,pygments,chroma,code blocks,syntax]
|
|
categories: [content management]
|
|
menu:
|
|
docs:
|
|
parent: "content-management"
|
|
weight: 300
|
|
weight: 20
|
|
sections_weight: 20
|
|
draft: false
|
|
aliases: [/extras/highlighting/,/extras/highlight/,/tools/syntax-highlighting/]
|
|
toc: true
|
|
---
|
|
|
|
From Hugo 0.28, the default syntax hightlighter in Hugo is [Chroma](https://github.com/alecthomas/chroma); it is built in Go and is really, really fast -- and for the most important parts compatible with Pygments.
|
|
|
|
If you want to continue to use Pygments (see below), set `pygmentsUseClassic=true` in your site config.
|
|
|
|
The example below shows a simple code snippet from the Hugo source highlighted with the `highlight` shortcode. Note that the gohugo.io site is generated with `pygmentsUseClasses=true` (see [Generate Syntax Highlighter CSS](#generate-syntax-highlighter-css)).
|
|
|
|
* `linenos=inline` or `linenos=table` (`table` will give copy-and-paste friendly code blocks) turns on line numbers.
|
|
* `hl_lines` lists a set of line numbers or line number ranges to be highlighted. Note that the hyphen range syntax is only supported for Chroma.
|
|
* `linenostart=199` starts the line number count from 199.
|
|
|
|
With that, this:
|
|
|
|
```
|
|
{{</* highlight go "linenos=table,hl_lines=8 15-17,linenostart=199" */>}}
|
|
// ... code
|
|
{{</* / highlight */>}}
|
|
```
|
|
|
|
Gives this:
|
|
|
|
{{< highlight go "linenos=table,hl_lines=8 15-17,linenostart=199" >}}
|
|
// GetTitleFunc returns a func that can be used to transform a string to
|
|
// title case.
|
|
//
|
|
// The supported styles are
|
|
//
|
|
// - "Go" (strings.Title)
|
|
// - "AP" (see https://www.apstylebook.com/)
|
|
// - "Chicago" (see http://www.chicagomanualofstyle.org/home.html)
|
|
//
|
|
// If an unknown or empty style is provided, AP style is what you get.
|
|
func GetTitleFunc(style string) func(s string) string {
|
|
switch strings.ToLower(style) {
|
|
case "go":
|
|
return strings.Title
|
|
case "chicago":
|
|
tc := transform.NewTitleConverter(transform.ChicagoStyle)
|
|
return tc.Title
|
|
default:
|
|
tc := transform.NewTitleConverter(transform.APStyle)
|
|
return tc.Title
|
|
}
|
|
}
|
|
{{< / highlight >}}
|
|
|
|
|
|
## Configure Syntax Highlighter
|
|
To make the transition from Pygments to Chroma seamless, they share a common set of configuration options:
|
|
|
|
pygmentsOptions
|
|
: A comma separated list of options. See below for a full list.
|
|
|
|
pygmentsCodefences
|
|
: Set to true to enable syntax highlighting in code fences with a language tag in markdown (see below for an example).
|
|
|
|
pygmentsStyle
|
|
: The style of code highlighting. See https://help.farbox.com/pygments.html for a gallery. Note that this option is not relevant when `pygmentsUseClasses` is set.
|
|
|
|
pygmentsUseClasses
|
|
: Set to `true` to use CSS classes to format your highlighted code. See [Generate Syntax Highlighter CSS](#generate-syntax-highlighter-css).
|
|
|
|
pygmentsCodefencesGuessSyntax
|
|
: Set to `true` to try to do syntax highlighting on code fenced blocks in markdown without a language tag.
|
|
|
|
pygmentsUseClassic
|
|
: Set to true to use Pygments instead of the much faster Chroma.
|
|
|
|
### Options
|
|
|
|
`pygmentsOptions` can be set either in site config or overridden per code block in the Highlight shortcode or template func.
|
|
|
|
noclasses
|
|
: Use inline style.
|
|
|
|
linenos
|
|
: For Chroma, any value in this setting will print line numbers. Pygments has some more fine grained control.
|
|
|
|
linenostart
|
|
: Start the line numbers from this value (default is 1).
|
|
|
|
|
|
hl_lines
|
|
: Highlight a space separated list of line numbers. For Chroma, you can provide a list of ranges, i.e. "3-8 10-20".
|
|
|
|
|
|
The full set of supported options for Pygments is: `encoding`, `outencoding`, `nowrap`, `full`, `title`, `style`, `noclasses`, `classprefix`, `cssclass`, `cssstyles`, `prestyles`, `linenos`, `hl_lines`, `linenostart`, `linenostep`, `linenospecial`, `nobackground`, `lineseparator`, `lineanchors`, `linespans`, `anchorlinenos`, `startinline`. See the [Pygments HTML Formatter Documentation](http://pygments.org/docs/formatters/#HtmlFormatter) for details.
|
|
|
|
|
|
## Generate Syntax Highlighter CSS
|
|
|
|
If you run with `pygmentsUseClasses=true` in your site config, you need a style sheet.
|
|
|
|
You can generate one with Hugo:
|
|
|
|
```bash
|
|
hugo gen chromastyles --style=monokai > syntax.css
|
|
```
|
|
|
|
Run `hugo gen chromastyles -h` for more options. See https://help.farbox.com/pygments.html for a gallery of available styles.
|
|
|
|
|
|
## Highlight Shortcode
|
|
|
|
Highlighting is carried out via the [built-in shortcode](/content-management/shortcodes/) `highlight`. `highlight` takes exactly one required parameter for the programming language to be highlighted and requires a closing shortcode. Note that `highlight` is *not* used for client-side javascript highlighting.
|
|
|
|
### Example `highlight` Shortcode
|
|
|
|
{{< code file="example-highlight-shortcode-input.md" >}}
|
|
{{</* highlight html */>}}
|
|
<section id="main">
|
|
<div>
|
|
<h1 id="title">{{ .Title }}</h1>
|
|
{{ range .Data.Pages }}
|
|
{{ .Render "summary"}}
|
|
{{ end }}
|
|
</div>
|
|
</section>
|
|
{{</* /highlight */>}}
|
|
{{< /code >}}
|
|
|
|
|
|
|
|
## Highlight Template Func
|
|
|
|
See [Highlight](/functions/highlight/).
|
|
|
|
## Highlight in Code Fences
|
|
|
|
It is also possible to add syntax highlighting with GitHub flavored code fences. To enable this, set the `pygmentsCodeFences` to `true` in Hugo's [configuration file](/getting-started/configuration/);
|
|
|
|
````
|
|
```go-html-template
|
|
<section id="main">
|
|
<div>
|
|
<h1 id="title">{{ .Title }}</h1>
|
|
{{ range .Data.Pages }}
|
|
{{ .Render "summary"}}
|
|
{{ end }}
|
|
</div>
|
|
</section>
|
|
```
|
|
````
|
|
|
|
## List of Chroma Highlighting Languages
|
|
|
|
The full list of Chroma lexers and their aliases (which is the identifier used in the `hightlight` template func or when doing highlighting in code fences):
|
|
|
|
{{< chroma-lexers >}}
|
|
|
|
## Highlight with Pygments Classic
|
|
|
|
If you for some reason don't want to use the built-in Chroma highlighter, you can set `pygmentsUseClassic=true` in your config and add Pygments to your path.
|
|
|
|
{{% note "Disclaimers on Pygments" %}}
|
|
* Pygments is relatively slow and _causes a performance hit when building your site_, but Hugo has been designed to cache the results to disk.
|
|
* The caching can be turned off by setting the `--ignoreCache` flag to `true`.
|
|
* The languages available for highlighting depend on your Pygments installation.
|
|
{{% /note %}}
|
|
|
|
If you have never worked with Pygments before, here is a brief primer:
|
|
|
|
+ Install Python from [python.org](https://www.python.org/downloads/). Version 2.7.x is already sufficient.
|
|
+ Run `pip install Pygments` in order to install Pygments. Once installed, Pygments gives you a command `pygmentize`. Make sure it sits in your PATH; otherwise, Hugo will not be able to find and use it.
|
|
|
|
On Debian and Ubuntu systems, you may also install Pygments by running `sudo apt-get install python3-pygments`.
|
|
|
|
|
|
|
|
[Prism]: http://prismjs.com
|
|
[prismdownload]: http://prismjs.com/download.html
|
|
[Highlight.js]: http://highlightjs.org/
|
|
[Rainbow]: http://craig.is/making/rainbows
|
|
[Syntax Highlighter]: http://alexgorbatchev.com/SyntaxHighlighter/
|
|
[Google Prettify]: https://github.com/google/code-prettify
|
|
[Yandex]: http://yandex.ru/
|