LoginSignup
4
4

More than 5 years have passed since last update.

Redcarpetの:fenced_code_blocksが有効にならなくてちょっとハマった

Posted at

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に書いてあるので無駄にぐぐるのも良くないっぽい。

4
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4