Configure Markup
Configure Markup
See Goldmark for settings related to the default Markdown handler in Hugo.
Below are all markup related configuration in Hugo with their default settings:
markup:
blackFriday:
angledQuotes: false
extensions: null
extensionsMask: null
footnoteAnchorPrefix: ""
footnoteReturnLinkContents: ""
fractions: true
hrefTargetBlank: false
latexDashes: true
nofollowLinks: false
noreferrerLinks: false
plainIDAnchors: true
skipHTML: false
smartDashes: true
smartypants: true
smartypantsQuotesNBSP: false
taskLists: true
defaultMarkdownHandler: goldmark
goldmark:
extensions:
definitionList: true
footnote: true
linkify: true
strikethrough: true
table: true
taskList: true
typographer: true
parser:
attribute: true
autoHeadingID: true
autoHeadingIDType: github
renderer:
hardWraps: false
unsafe: false
xhtml: false
highlight:
codeFences: true
guessSyntax: false
hl_Lines: ""
lineNoStart: 1
lineNos: false
lineNumbersInTable: true
noClasses: true
style: monokai
tabWidth: 4
tableOfContents:
endLevel: 3
ordered: false
startLevel: 2
[markup]
defaultMarkdownHandler = "goldmark"
[markup.blackFriday]
angledQuotes = false
footnoteAnchorPrefix = ""
footnoteReturnLinkContents = ""
fractions = true
hrefTargetBlank = false
latexDashes = true
nofollowLinks = false
noreferrerLinks = false
plainIDAnchors = true
skipHTML = false
smartDashes = true
smartypants = true
smartypantsQuotesNBSP = false
taskLists = true
[markup.goldmark]
[markup.goldmark.extensions]
definitionList = true
footnote = true
linkify = true
strikethrough = true
table = true
taskList = true
typographer = true
[markup.goldmark.parser]
attribute = true
autoHeadingID = true
autoHeadingIDType = "github"
[markup.goldmark.renderer]
hardWraps = false
unsafe = false
xhtml = false
[markup.highlight]
codeFences = true
guessSyntax = false
hl_Lines = ""
lineNoStart = 1
lineNos = false
lineNumbersInTable = true
noClasses = true
style = "monokai"
tabWidth = 4
[markup.tableOfContents]
endLevel = 3
ordered = false
startLevel = 2
{
"markup": {
"blackFriday": {
"angledQuotes": false,
"extensions": null,
"extensionsMask": null,
"footnoteAnchorPrefix": "",
"footnoteReturnLinkContents": "",
"fractions": true,
"hrefTargetBlank": false,
"latexDashes": true,
"nofollowLinks": false,
"noreferrerLinks": false,
"plainIDAnchors": true,
"skipHTML": false,
"smartDashes": true,
"smartypants": true,
"smartypantsQuotesNBSP": false,
"taskLists": true
},
"defaultMarkdownHandler": "goldmark",
"goldmark": {
"extensions": {
"definitionList": true,
"footnote": true,
"linkify": true,
"strikethrough": true,
"table": true,
"taskList": true,
"typographer": true
},
"parser": {
"attribute": true,
"autoHeadingID": true,
"autoHeadingIDType": "github"
},
"renderer": {
"hardWraps": false,
"unsafe": false,
"xhtml": false
}
},
"highlight": {
"codeFences": true,
"guessSyntax": false,
"hl_Lines": "",
"lineNoStart": 1,
"lineNos": false,
"lineNumbersInTable": true,
"noClasses": true,
"style": "monokai",
"tabWidth": 4
},
"tableOfContents": {
"endLevel": 3,
"ordered": false,
"startLevel": 2
}
}
}
See each section below for details.
Goldmark
Goldmark is from Hugo 0.60 the default library used for Markdown. It’s fast, it’s CommonMark compliant and it’s very flexible. Note that the feature set of Goldmark vs Blackfriday isn’t the same; you gain a lot but also lose some, but we will work to bridge any gap in the upcoming Hugo versions.
This is the default configuration:
markup:
goldmark:
extensions:
definitionList: true
footnote: true
linkify: true
strikethrough: true
table: true
taskList: true
typographer: true
parser:
attribute: true
autoHeadingID: true
autoHeadingIDType: github
renderer:
hardWraps: false
unsafe: false
xhtml: false
[markup]
[markup.goldmark]
[markup.goldmark.extensions]
definitionList = true
footnote = true
linkify = true
strikethrough = true
table = true
taskList = true
typographer = true
[markup.goldmark.parser]
attribute = true
autoHeadingID = true
autoHeadingIDType = "github"
[markup.goldmark.renderer]
hardWraps = false
unsafe = false
xhtml = false
{
"markup": {
"goldmark": {
"extensions": {
"definitionList": true,
"footnote": true,
"linkify": true,
"strikethrough": true,
"table": true,
"taskList": true,
"typographer": true
},
"parser": {
"attribute": true,
"autoHeadingID": true,
"autoHeadingIDType": "github"
},
"renderer": {
"hardWraps": false,
"unsafe": false,
"xhtml": false
}
}
}
}
Some settings explained:
- unsafe
- By default, Goldmark does not render raw HTMLs and potentially dangerous links. If you have lots of inline HTML and/or JavaScript, you may need to turn this on.
- typographer
- This extension substitutes punctuations with typographic entities like smartypants.
- autoHeadingIDType (“github”)
- The strategy used for creating auto IDs (anchor names). Available types are
github
,github-ascii
andblackfriday
.github
produces GitHub-compatible IDs,github-ascii
will drop any non-Ascii characters after accent normalization, andblackfriday
will make the IDs work as with Blackfriday, the default Markdown engine before Hugo 0.60. Note that if Goldmark is your default Markdown engine, this is also the strategy used in the anchorize template func.
Blackfriday
Blackfriday was Hugo’s default Markdown rendering engine, now replaced with Goldmark. But you can still use it: Just set defaultMarkdownHandler
to blackfriday
in your top level markup
config.
This is the default config:
markup:
blackFriday:
angledQuotes: false
extensions: null
extensionsMask: null
footnoteAnchorPrefix: ""
footnoteReturnLinkContents: ""
fractions: true
hrefTargetBlank: false
latexDashes: true
nofollowLinks: false
noreferrerLinks: false
plainIDAnchors: true
skipHTML: false
smartDashes: true
smartypants: true
smartypantsQuotesNBSP: false
taskLists: true
[markup]
[markup.blackFriday]
angledQuotes = false
footnoteAnchorPrefix = ""
footnoteReturnLinkContents = ""
fractions = true
hrefTargetBlank = false
latexDashes = true
nofollowLinks = false
noreferrerLinks = false
plainIDAnchors = true
skipHTML = false
smartDashes = true
smartypants = true
smartypantsQuotesNBSP = false
taskLists = true
{
"markup": {
"blackFriday": {
"angledQuotes": false,
"extensions": null,
"extensionsMask": null,
"footnoteAnchorPrefix": "",
"footnoteReturnLinkContents": "",
"fractions": true,
"hrefTargetBlank": false,
"latexDashes": true,
"nofollowLinks": false,
"noreferrerLinks": false,
"plainIDAnchors": true,
"skipHTML": false,
"smartDashes": true,
"smartypants": true,
"smartypantsQuotesNBSP": false,
"taskLists": true
}
}
}
Highlight
This is the default highlight
configuration. Note that some of these settings can be set per code block, see Syntax Highlighting.
markup:
highlight:
codeFences: true
guessSyntax: false
hl_Lines: ""
lineNoStart: 1
lineNos: false
lineNumbersInTable: true
noClasses: true
style: monokai
tabWidth: 4
[markup]
[markup.highlight]
codeFences = true
guessSyntax = false
hl_Lines = ""
lineNoStart = 1
lineNos = false
lineNumbersInTable = true
noClasses = true
style = "monokai"
tabWidth = 4
{
"markup": {
"highlight": {
"codeFences": true,
"guessSyntax": false,
"hl_Lines": "",
"lineNoStart": 1,
"lineNos": false,
"lineNumbersInTable": true,
"noClasses": true,
"style": "monokai",
"tabWidth": 4
}
}
}
For style
, see these galleries:
For CSS, see Generate Syntax Highlighter CSS.
Table Of Contents
markup:
tableOfContents:
endLevel: 3
ordered: false
startLevel: 2
[markup]
[markup.tableOfContents]
endLevel = 3
ordered = false
startLevel = 2
{
"markup": {
"tableOfContents": {
"endLevel": 3,
"ordered": false,
"startLevel": 2
}
}
}
These settings only works for the Goldmark renderer:
- startLevel
- The heading level, values starting at 1 (
h1
), to start render the table of contents. - endLevel
- The heading level, inclusive, to stop render the table of contents.
- ordered
- Whether or not to generate an ordered list instead of an unordered list.
Markdown Render Hooks
Note that this is only supported with the Goldmark renderer.
These Render Hooks allow custom templates to render links and images from markdown.
You can do this by creating templates with base names render-link
and/or render-image
inside layouts/_default/_markup
.
You can define Output-Format- and language-specific templates if needed.1 Your layouts
folder may look like this:
layouts
└── _default
└── _markup
├── render-image.html
├── render-image.rss.xml
└── render-link.html
Some use cases for the above:
- Resolve link references using
.GetPage
. This would make links portable as you could translate./my-post.md
(and similar constructs that would work on GitHub) into/blog/2019/01/01/my-post/
etc. - Add
target=_blank
to external links. - Resolve and process images.
Render Hook Templates
Both render-link
and render-image
templates will receive this context:
- Page
- The Page being rendered.
- Destination
- The URL.
- Title
- The title attribute.
- Text
- The rendered (HTML) link text.
- PlainText
- The plain variant of the above.
Link with title Markdown example :
[Text](https://www.gohugo.io "Title")
Here is a code example for how the render-link.html template could look:
<a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank" rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>
Image Markdown example:
![Text](https://d33wubrfki0l68.cloudfront.net/c38c7334cc3f23585738e40334284fddcaf03d5e/2e17c/images/hugo-logo-wide.svg "Title")
Here is a code example for how the render-image.html template could look:
<p class="md__image">
<img src="{{ .Destination | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} />
</p>
It’s currently only possible to have one set of render hook templates, e.g. not per
Type
orSection
. We may consider that in a future version. ↩︎