Golang のマークダウンパーサ
投稿日:
もう少し気軽にここにかけると良いなーと思いいろいろ試しているけれど、どうもやはり自作するはめになりそうな気がするので、 Golang の markdown パーサについて、少し調べた。
Go の代表的な markdown パーサ
これは russross/blackfriday になると思う。Golang 製静的サイトジェネレータで有力な Hugo も使っている。
ただし、blackfriday には、fanced code block があってもシンタックスハイライトはしてくれない。
package main
import (
"fmt"
"github.com/russross/blackfriday"
"os"
)
func main() {
str := `
日本語見出し
======================
改行の扱いは
どうなってる?
` + "```ruby" + `
foo = "bar"
puts foo
` + "```"
b := []byte(str)
if _, err := os.Stdout.Write(blackfriday.MarkdownCommon(b)); err != nil {
panic(err)
}
}
出力はこうなる:
<h1>日本語見出し</h1>
<p>改行の扱いは
どうなってる?</p>
<pre><code class="language-rb">foo = "bar"
puts foo
</code></pre>
github_flavored_markdown: GFM を真似た markdown パーサ
blackfriday の README を読んでみたら shurcooL/github_flavored_markdown というライブラリについて言及されていた。
曰く、シンタックスハイライトをしてくれるらしいが・・・どうもうまくいかないのでソースコードを見てみると:
まだごく一部しか対応していないようだ。さらにシンタックスハイライトに使っているライブラリ sourcegraph/syntaxhighlight の対応言語を調べると:
It currently uses a language-independent lexer and performs decently on JavaScript, Java, Ruby, Python, Go, and C.
と、今使っている rouge の対応言語数と比べるべくもない状態だった。
期せずして、Hugo が golang でのシンタックスハイライトは諦めている 理由が分かった。
Golang での自作のアプローチは簡単にはできなさそう
プレーンな markdown ファイルを置くと勝手にエントリが追加される仕組みを持ってるブログシステム無いだろうか。 もう少し調べて、見当たらなければ Hugo と同じくクライアントサイト JS でシンタックスハイライトさせる方式で実装しよう。
Jekyll の front-formatter も、ファイル名の規則も面倒くさいんです。