RedcarpetはマークダウンをパースしてHTMLを出力するのに使うgem。
動作確認
入れる
gem install redcarpet
使う
[2] pry(main)> require 'redcarpet'
=> true
[3] pry(main)> Redcarpet
=> Redcarpet
[4] pry(main)> text = "# Markdown\nMarkdown is great."
=> "# Markdown\nMarkdown is great."
[6] pry(main)> renderer = Redcarpet::Render::HTML.new
=> #<Redcarpet::Render::HTML:0x007fc54ce196f0>
[7] pry(main)> markdown_parser = Redcarpet::Markdown.new(renderer, extensions = {})
=> #<Redcarpet::Markdown:0x007fc54cc28af8 @renderer=#<Redcarpet::Render::HTML:0x007fc54ce196f0>>
[8] pry(main)> markdown_parser.render(text)
=> "<h1>Markdown</h1>\n\n<p>Markdown is great.</p>\n"
何をしているのか
目的は、マークダウンテキストからHTMLへの変換。ちゃんと、markdown_parser.render(text)
でHTMLが返ってきてる。
このサンプルではオブジェクトを2つ作っていて、1つはRedcarpet::Render::HTML
というHTMLを描画するためのオブジェクト。もう1つは、Redcarpet::Markdown
というマークダウンをパースするためのオブジェクト。
パーサーのインスタンスを作るときにレンダラーのオブジェクトを渡している。レンダラーにはHTMLを描画する時のオプションを渡せて、パーサーの2つ目の引数にはパースする時のオプションを渡せる。
実はさっきまでちょっとハマってた。パーサーに渡すはずのオプションをレンダラーに渡していて、「あれー、適用されないなーおかしいなー。」とか頭抱えていた。情けない。
markdown.rb
def markdown(text)
options = {
fenced_code_blocks: true,
...
}
extensions = {
...
}
renderer = Redcarpet::Render::HTML.new(options)
markdown = Redcarpet::Markdown.new(renderer, extensions)
markdown.render(text)
end
上のコードでは:fenced_code_blocksが有効にならない。このオプションはパーサーのコンストラクタに渡さないと。レンダラーじゃない。
ときどきこういう些細な勘違いで時間を浪費する。道具の役割をちゃんと把握しないとこういうことになるみたいな教訓得られてよかった。あと知りたいことはたいていREADMEに書いてあるので無駄にぐぐるのも良くないっぽい。