CommonMark と Hugo 0.68

no extension

先日 Hugo 0.68.x がリリースされたのだが

どうもまた markdown 周りの挙動が変わったようだ。 例えば

[string] を [][rune] に変換する。

[string]: http://golang.org/ref/spec#String_types
[rune]: http://blog.golang.org/strings "Strings, bytes, runes and characters in Go - The Go Blog"

をレンダリングすると

<a href="http://golang.org/ref/spec#String_types">string</a><a href="http://blog.golang.org/strings" title="Strings, bytes, runes and characters in Go - The Go Blog"></a> に変換する。
string に変換する。

てな感じに [] 記述がまるっと抜け落ちて <a> 要素の中身も空になってしまう。 てっきり yuin/goldmark パーサのバグだと思っていたのだが,どうやらこれは CommonMark の仕様のようだ。

具体的には

[foo][bar]

[bar]: http://bar

と記述すると

<a href="http://bar">foo</a>

のように [bar] で生成される <a> 要素の中身を foo に置き換えるらしい。 じゃあ今までがバグだったってこと?

これを回避するには

\[foo][bar]

[bar]: http://bar

とエスケープすれば

[foo]<a href="http://bar">bar</a>
[foo]bar

と意図通りにレンダリングしてくれる。 なので最初の記述も

[string] を \[][rune] に変換する。

[string]: http://golang.org/ref/spec#String_types
[rune]: http://blog.golang.org/strings "Strings, bytes, runes and characters in Go - The Go Blog"

とすれば

<a href="http://golang.org/ref/spec#String_types">string</a> を []<a href="http://blog.golang.org/strings" title="Strings, bytes, runes and characters in Go - The Go Blog">rune</a> に変換する。
string を []rune に変換する。

とできた。

私のブログでは影響が出たのが(結果的には)一箇所のみだったので直すのは簡単だったが,特に Go 言語では [] はスライスを意味する記述なので,今後は気をつけないとなぁ。 まぁ <code> 要素(`...`)で囲むのが無難か。

改めて CommonMark の仕様を眺めてみたが,不可思議な記述が沢山ある。 たとえば

[bar][]

[bar]: http://bar

と書くと

<a href="http://bar">bar</a>

てな感じに,これまた [] が吸い込まれる。 しかも

[bar][foo]

[bar]: http://bar

とすると,今度は <a> 要素が外れてただの

[bar][foo]

となる。 なんだよそれ orz

雑すぎんだろ! 一度ちゃんと文法を整理したほうがいいんじゃないのか?