電卓片手に

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 = &quot;bar&quot;
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 も、ファイル名の規則も面倒くさいんです。