Hugo v0.60 から既定の Markdown パーサが Goldmark になったようだ
Hugo v0.60 がリリースされた。
Hugo v0.60 から既定の Markdown パーサが yuin/goldmark になったようだ。
このサイトで試してみたが確かに速くなった! こうやって柔軟に機能を入れ替えるフットワークの軽さが Hugo のいいところだよねぇ(たまに後方互換性が壊れるのが問題だが)。 まぁ,コミュニティが活況だからできるんだろうけど。
今回の変更に伴い色々と変わった部分もあるので,以降に覚え書きとして記しておく。
パーサの選択
Markdown パーサについては,グローバル設定で新しい yuin/goldmark (既定)と旧来の russross/blackfriday のいずれかを選択できる。 旧来の russross/blackfriday を使いたいなら
[markup]
defaultMarkdownHandler = "blackfriday"
とすればよい(config.toml
に TOML 形式で記述する場合)。
パーサの設定
以降は yuin/goldmark パーサを前提に話を進める。
グローバル設定でパーサの設定を記述できる。 既定値は以下の通り。
[markup]
defaultMarkdownHandler = "goldmark"
[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
[markup.goldmark.renderer]
hardWraps = false
unsafe = false
xHTML = false
通常はこのままで問題ないが,いくつか注意点がある。
HTML 記述が混在する場合
russross/blackfriday では HTML 形式の記述を許容していたが yuin/goldmark では HTML の記述は削除されるようだ1。 しかし,これでは複雑なレイアウトの表などを書きたい場合に困るので,設定を以下のように変更する。
[markup.goldmark.renderer]
unsafe = true
これで HTML 形式の記述を許容してくれる。
この設定は入れ子の shortcode にも影響してくるので,これまでのバージョンに近い出力が欲しいなら unsafe = true
にしておくのがいいかもしれない。
Inline Code の挙動に注意
CommonMark に準拠したせいかどうかは分からないが inline code の挙動が微妙に変わっているので注意が必要である。
たとえば以下のような記述があるとする。
[`fmt`]`.println()` 関数で “Hello world” と出力する。
[`fmt`]: https://golang.org/pkg/fmt/
これを処理して
<a href="https://golang.org/pkg/fmt/"><code>fmt</code></a><code>.println()</code> 関数で “Hello world” と出力する。
となってくれることを期待するのだが(つか以前のバージョンではそうなっていた),実際には
[<code>fmt`]</code>.println()` 関数で “Hello world” と出力する。
となる。
なんでやねん orz
しょうがないので
[`fmt`].`println()` 関数で “Hello world” と出力する。
と書き直しましたよ。 これで
<a href="https://golang.org/pkg/fmt/"><code>fmt</code></a>.<code>println()</code> 関数で “Hello world” と出力する。
と(ちょっと不格好だが)なった。 ATOM で複数ファイルの内容を一括置換できてよかったね(泣)
フェンス付きコード・ブロックのハイライト表示
Hugo ではフェンス付きコード・ブロックのハイライト表示には alecthomas/chroma を使っているが,グローバル設定でより細かい設定が可能になった。 以下は既定値。
[markup.highlight]
codeFences = true
hl_Lines = ""
lineNoStart = 1
lineNos = false
lineNumbersInTable = true
noClasses = true
style = "monokai"
tabWidth = 4
従来の pygmentsUseClasses
や pygmentsCodeFences
等も効いているようだが,こちらの記述に切り替えたほうがいいだろう。
style
のサンプルは以下をどうぞ。
noClasses
を false
にすればスタイル指定を(タグへの直書きではなく)クラスで行うようになる。
スタイル指定用の CSS ファイルの作成はこんな感じでできる。
$ hugo gen chromastyles --style=tango > chroma-styles.css
行のハイライト等を行うには highlight
の組み込み shortcode を使う必要があったが, v0.60 からは
```go {hl_lines=[1, "5-7"]}
package main
import "fmt"
func main() {
fmt.Println("Hello world")
}
```
などと書けば
package main
import "fmt"
func main() {
fmt.Println("Hello world")
}
と表示されるようになった。 やっほい!
脚注について
以前は脚注部分について
<div class="footnotes">
...
</div>
と <div>
要素になっていたが, v0.60 からは
<section class="footnotes" role="doc-endnotes">
...
</section>
と <section>
要素になっている。
こちらのほうが合理的だよね。
ただし,脚注のスタイルを CSS 等で制御している場合は注意が必要である。
ブックマーク
- Configure Markup | Hugo
- Syntax Highlighting | Hugo
- Hugo v0.60以上を使うと、Markdown中のHTMLタグが「raw HTML omitted」となって消えてしまう - My External Storage
-
russross/blackfriday を使う場合でもグローバル設定で
skipHTML
項目をtrue
にすれば HTML 記述が削除されるようだ。 ↩︎