そろそろText::Markdown::Discountについてひとこと言っておくか
Text::Markdown::Discountってどうなの?って話があったりするわけですが、Perlの人は積極的に使ったほうが良いと思うし、Discount自体はPerlに限らずおすすめだよーっていうエントリです。
これはDiscountというCのMarkdownライブラリのバインディングです。Rubyにはrdiscountという、メジャーなMarkdownのgemがありますが、これもDiscountのバインディングです。Jekyllとかで利用している人も多いでしょう。
Rubyの世界だと他にもredcarpetというgithubが採用したことで一躍有名になったMarkdownライブラリがあります。これはsundownというCのMarkdownライブラリのバインディングです。
sundownは処理が高速なのがウリらしく、PerlでもText::Markdown::Sundownを書こうかなーとか一瞬思ったのですが、リポジトリを見ると、最終更新が9ヶ月前だったり、p-rが溜まっていたり、forkも乱立してしまったりしていて最近ちょっとメンテが放置されている感があることもあり、やめました。
discountは本体のリポジトリを見ても、今も積極的にメンテされているのが伺えます。テストケースがしっかり同梱されていのもポイントが高いです。新しい機能も鋭意取り込まれていて、みんな大好きGithub Flavored Markdownと互換性も高いです。
ちなみに、brewにもformulaがあって、brew install discount
するとmarkdownコマンドが使えるようになります。
Discountの拡張記法をいくつか紹介します。
Github-flavored-markdown fenced code blocks
個人的には使わないのですが、Github styleのfenced code blockが使えます。
```
use strict
```
これは以下のようにマークアップされます。
<p><code>
use strict
</code></p>
なんで<p><code>
なのかは謎です。ちなみに従来のインデントスタイルだと、ちゃんと<pre><code>
でマークアップされます。
table
表が書けます。ヘッダ行必須です。
企業|球団
----|-----------
DeNA|ベイスターズ
楽天|イーグルス
ちなみに、同様のスタイルでGithubでも表が書けますね。
Definition List
定義リストが書けます。個人的に結構大きなポイントです。
=apple=
苹果
=banana=
香蕉
=mango=
芒果
以下のようにマークアップされます。
<dl>
<dt>apple</dt>
<dd>苹果</dd>
<dt>banana</dt>
<dd>香蕉</dd>
<dt>mango</dt>
<dd>芒果</dd>
</dl>
PHP Markdown Extraスタイルの
apple
: 苹果
という記法も使えて、こっちのほうが好みなのですが、これはconfigureオプションを渡さないといけないので、Text::Markdown::Discountでは使えないことに今気が付きました。またp-r案件かもしれません。
listをネストさせて定義リストっぽく見せるやり方はHTML厨的には好きじゃないので、定義リストが使えるのは捗る。
List Nesting
リストの入れ子も出来ますが、GFMと違って2スペース以上開けないといけないことに注意が必要です。
- 林檎
- 綺麗な林檎
- 腐った林檎
- 蜜柑
- 芒果
list markerには*
も使えますが、-
を使うのが個人的に好み。
mkd_with_html5_tags
従来のmarkdownだとhtml5のセクショニングコンンツのタグも<p>
で囲まれてしまって悲しかったりするのですが、上記を呼び出すことによって、適切な処理が可能になります。
コマンドラインだと
% markdown -5
Text::Markdown::Discontだと
Text::Markdown::Discount::with_html5_tags();
のようにすれば、内部的にmkd_with_html5_tags
を呼び出してくれます。
flagによるコントロール
いくつかのflagを渡すことにより、挙動を調整することができます。オートリンクが欲しい場合などに有用でしょう。ちなみに個人的には以下のように、<>
で括ればリンクになるので、オートリンクはそんなに必要ではありません。
<http://www.example.com>
Text::Markdown::Discountだと以下のようにしてフラグを渡すことができます。
markdown($text, Text::Markdown::Discount::MKD_AUTOLINK)
ということで、Text::Markdown::Discountイイよっていう話でした。Text::Markdown::Discontには色々p-rを投げたのですが、authorのsekimuraさんに快く対応してもらえたので、非常に感謝しております。