Markdown記法で書かれたものをHTMLに変換するGo言語コード

Markdown(マークダウン)記法で文書を書くと、すぐにHTMLに変換できて便利ですよね。ワードプレスの記事もMarkdownで書いたり、日々の記録をMarddownで書いたりすると快適になります。

当ブログではGo言語で書いたサーバプログラムでブログシステムを動作させているのですが、記事を書く際はMarkdownを採用しており『blackfriday の github ページ』というライブラリを使ってHTMLに動的に変換して記事を表示しています。

この記事では、そんな『blackfriday の github ページ』の使い方をご紹介したいと思います。

コンテンツの転載は固くお断りいたします。

用意するMarkdownファイル

今回は以下のようなMarkdownファイルを用意してみました。ファイル名は『test.md』にしておきます。


# 見出し1
テスト文字列1

## 見出し2
テスト文字列2
テスト文字列3

[テストリンク](/test)

*イタリックテスト*

**太字テスト**

* 項目1
	* 項目2
* 項目3

1. 項目1
2. 項目2
3. 項目3

---

![テスト画像](https://storage.googleapis.com/yufi.jp/image/girl-803812_1920edit.jpg)

MarkdownからHTMLに変換するGo言語コード

以下のコマンドで必要なライブラリをインストールします。


go get github.com/russross/blackfriday

変換するためのコードは以下の通りです。


package main

import (
	"fmt"
	"io/ioutil"
	"log"

	"github.com/russross/blackfriday"
)

func main() {
	md, err := ioutil.ReadFile("test.md")
	if err != nil {
		log.Fatal(err)
	}

	html := blackfriday.MarkdownBasic(md)
	fmt.Println(string(html))
}

実行して出力されたHTML

見出しや段落、リンク、イタリック、太字、リスト、横線、画像などのHTMLが出力されているのを確認できますね。


コードの解説

では、MarkdownからHTMLに変換するGo言語コードを解説していきます。

必要パッケージを指定


import (
	"fmt"
	"io/ioutil"
	"log"

	"github.com/russross/blackfriday"
)

『fmt』や『log』は文字列をコンソールに表示したりするためのもので、『io/ioutil』はMarkdownファイルを読み込むために用意しています。そして『github.com/russross/blackfriday』はMarkdownをHTMLに変換するためのものです。

Markdownファイルを読み込む


md, err := ioutil.ReadFile("test.md")
if err != nil {
    log.Fatal(err)
}

『ioutil』パッケージの『ReadFile』関数を使ってMarkdownファイルを読み込みます。引数にはそのパスを指定しており、戻り値の1つ目で読み込んだファイルデータ、次にエラーです。

HTMLに変換する


html := blackfriday.MarkdownBasic(md)
fmt.Println(string(html))

『blackfriday』パッケージの『MarkdownBasic』関数を使って変換をします。引数には先ほど読み込んだデータを渡し、戻り値として変換されたHTMLが返ってきます。

たった1行なので簡単ですね(笑)

目次を自動生成するコード

このライブラリには他にも様々な機能があるのですが、その1つである、Markdownファイル内から見出しを取得してそれを元に目次を生成する機能をご紹介します。

HTMLへの変換部分を以下のように変更します。


htmlFlags := blackfriday.HTML_TOC
renderer := blackfriday.HtmlRenderer(htmlFlags, "", "")
html := blackfriday.MarkdownOptions(md, renderer, blackfriday.Options{Extensions: 0})

『HTML_TOC』というのは、見出しを元に目次を生成するための描画オプションです。そして『HtmlRenderer』関数の第一引数に指定して、レンダーを作成します。

最後に『MarkdownOptions』関数の第一引数にMarkdownファイルデータ、二番目にレンダー、三番目に拡張オプションを指定するのですが『blackfriday.Options{Extensions: 0}』とすることでデフォルト値を指定できるようです。

結果確認

以下に出力結果を一部掲載してみます。見出し部分には『id』属性が埋め込まれ、それを元にHTMLの先頭に目次が生成されていますね。idの数字も順番に割り振られているのが確認できます。


終わりに

当記事では昨日のごく一部をご紹介しました。『blackfriday の Go Doc』を見て頂いても分かるのですが、他にも沢山の機能があります。

目次作成もこのプラグインだけで動的に作成できるので、皆さんも是非使って見てくださいね。