やること
少し興味があったのでCrystalのMarkdownライブラリmarkdを試してみたいと思います。
やっていく
markdとは?
icyleaf氏作のMarkdownライブラリで、MarkdownからHTMLへの変換が行えるようです。
JavaScriptのcommonmark.jsを参考にしているようですが、一部の機能はまだサポートされていないみたいです。
インストール
README.md
に書いてあるように、次の内容をshard.yml
に追加して、shards install
します。
dependencies:
markd:
github: icyleaf/markd
使い方
markd
をrequire
して、HTMLに変換したいMarkdownの文字列をMarkd.to_html
に渡すだけです。
require "markd"
markdown = <<-MD
# やること
少し興味があったのでCrystalのMarkdownライブラリ[markd][https://github.com/icyleaf/markd]を試してみたいと思います。
MD
html = Markd.to_html(markdown)
pp html
# => "<h1>やること</h1>\n" +
# "<p>少し興味があったのでCrystalのMarkdownライブラリ<a href=\"https://github.com/icyleaf/markd\">markd</a>を試してみたいと思います。</p>\n"
また、いくつかオプションがあって、それらを渡すと挙動が変わるみたいです。
例としてsafe
オプションを有効にしてみると、HTMLの部分がざっくり削れました。
require "markd"
markdown = <<-MD
# Twitterへのリンク
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">最近はただ、妹のことだけを考えていたい</p>— さっき作った (@make_now_just) <a href="https://twitter.com/make_now_just/status/638132806812495873?ref_src=twsrc%5Etfw">2015年8月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
MD
option = Markd::Options.new(safe: true)
html = Markd.to_html(markdown, option)
pp html
# => "<h1>Twitterへのリンク</h1>\n" +
# "<!-- raw HTML omitted -->\n"
他のオプションなどはmarkdのREADME.md
を確認してください。
また、自前でRenderer
を定義して出力をカスタマイズすることもできるみたいです。
まとめ
CrystalのMarkdownライブラリmarkdを使って、MarkdownからHTMLへ変換してみました。
実はCrystalの標準ライブラリにもMarkdown
というモジュールがあって、MarkdownからHTMLへの変換ができるのですが、実装が微妙なためMarkdownの多くの機能に対応していないのが辛いところです。
このMarkdown
モジュールは主にドキュメントジェネレーターで使われているのですが、前述した通り微妙なので、markdで置き替えようという動きがあったりします。
そのための調査を含めて使ってみたのですが、markdもまだやや機能が足りない部分がある気がしたので、機会があればコントリビュートしたいところです。
というわけでCrystal Advent Calendarの5日目でした。
6日目もいません。追いつけるのか?
最後まで読んでいただきありがとうございました。