きちんとした記事を書く余裕がないので,伝えたいことだけを最小限の記述で。(質問は歓迎)
Ruby で Markdown テキストを扱うのに commonmarker って gem を使いますよね。
で,Markdown テキスト中にコードブロックがあってシンタックスハイライトもやりたい,となると,commonmarker-rouge という gem を併用することに。
簡単に使えて,多数の言語に対応しているので,便利。
ここまでが前置き。
commonmarker のバージョンが上がって正常に動かなくなった
commonmarker 0.17.13 を使っていたのですが,0.18.1 が出たので bundle update
したら正常に動かなくなった。
正常な場合,
gem 'commonmarker', '0.17.13'
require 'commonmarker'
gem 'commonmarker-rouge', '1.4.0'
require 'commonmarker/rouge'
source = "```rb\nx\n```"
puts CommonMarker::Rouge.render_html(source)
で,
<div class="highlighter-rouge language-rb"><span class="n">x</span>
</div>
が出力される。
ところが commonmarker のバージョンを上げて
gem 'commonmarker', '0.18.1'
とすると,なんと出力が
<!-- raw HTML omitted -->
になってしまう。
そんな殺生な〜
なんかどうも,commonmarker の 0.18 でのセキュリティー上の理由による仕様変更に commonmarker-rouge が対応してなかったのが原因だったぽい。
解決
当初 commonmarker 側に
Code block vanishes in latest with commonmarker-rouge · Issue #85 · gjtorikian/commonmarker
という issue を(超デタラメ英語で)立てたのですが,どうもこれは commonmarker-rouge 側でどうにかすべきものだったようなので,
Code block vanishes with commonmarker 0.18.x · Issue #4 · sandfoxme/commonmarker-rouge
という(英語力的に)やる気のない issue を立てたところ,なんかすぐに直してくれました。
結果,両者を最新の
gem 'commonmarker', '0.18.2'
gem 'commonmarker-rouge', '1.5.0'
のようにしたところ,問題なく変換されました。