🦄

マークダウン記法gem比較( gem 'redcarpet' / gem 'kramdown' /gem 'qiita markdown )

2024/07/16に公開

はじめに

現在Ruby on Railsで記事投稿アプリを作成しております。
記事投稿アプリのため、マークダウン記法での出力を可能にしたいという思いから、表記3つのgemを比較しました。
技術検証をした上で、今回はgem 'kramdown', gem 'kramdown-parser-gfm'を使用しております。
GitHubのissueやはてなブログには今回の内容を投稿しておりましたが、改めてZennでもまとめたいと思います。

gem 'kramdown', gem 'kramdown-parser-gfm'を選んだ理由

はじめに何故gem 'kramdown', gem 'kramdown-parser-gfm'を採用したのか、理由を書きたいと思います。

GitHubのstar数、contributors数はgem 'redcarpet'が一番多かったのですが、技術検証してみて、
gem 'redcarpet'では、下記が不便と感じ不採用になりました。

  • オプションでマークダウン記法を追記する数が多いこと
  • デフォルトで装備されているマークダウン数がgem 'kramdown'より少ないこと

2024/7現在のstar数、contribution数になります。

gem star数、contribution数
gem 'redcarpet' star: 5k / contributors: 108
gem 'kramdown' star: 1.7k / contributors: 76
gem 'qiita markdown' star: 392 / contributors: 25

gemのstar数の多さから安易にgem選択をしてはいけないと、改めて感じました。
自分でもなぜそのgemを選んだのか、を言語化できるとてもいい機会になりました。

具体的なそれぞれのgemの比較

下記は技術検証して感じた個人の意見となりますので、ご了承ください。

gem 'kramdown'

  • 純粋なRubyで書かれており、拡張性が高いこと
  • 多機能で、複雑なMarkdown記法にも対応
  • 依存関係が少ないことからも、このgemを採用いたしました。

gem 'kramdown-parser-gfm'

  • GitHub Flavored Markdown (GFM)のMarkdown ドキュメントを HTML に変換する、kramdownのパーサー。
  • gem 'kramdown'では、使用したいマークダウン記法に不足あり、kramdownのパーサーである gem 'kramdown-parser-gfm'を採用。

パーサーとは?:パーサーとは、プログラムがテキストやデータを理解するための「翻訳者」みたいなもの。
例えば、kramdown-parser-gfmというgemは、GitHub Flavored Markdown (GFM)という特定の形式のMarkdownをHTMLに変換するパーサー。Markdownは、テキストを簡単にフォーマットするための記法で、見出しやリスト、リンクなどを簡単に書ける。パーサーはそのMarkdownの記法を理解して、対応するHTMLに変換する役割を持っている。
つまり、kramdown-parser-gfmを使うことで、Markdownで書かれた文章をウェブページで表示できるHTMLに変換してくれる役割を果たす。   (ChatGPT回答)

gem 'redcarpet'

  • 個人記事が豊富であり、導入に困っても日本語で解説を読める。
  • デフォルトで入っているマークダウン記法は種類が少なく、optionでマークダウン記法の種類を追記していく形になる。(未検証のマークダウン記法もあるので、確認不足の可能性はあります)

下記、app/helpers/application_helper.rbに記載したオプションの一部です。

autolink: true, # URLやメールアドレスを自動的にリンクに変換、gyazo,通常のリンクテキスト対応

space_after_headers: true, #見出し後の文字の大きさ変換。
fenced_code_blocks: true, #コードブロックで表示
tables: true,
hard_wrap: true, # 改行を <br> タグに変換
lax_html_blocks: true, # HTMLブロックを緩やかに解析するオプション。
no_intra_emphasis: true, #語句の強調。「**強調**」で強調される。(**の後にスペースなし)
strikethrough: true, # 打ち消し線(ストライクスルー)。「~~打ち消し線~~」で打ち消し線が入る

上記以外のオプション(チェックリスト等)はここには入っていないため、より広範な範囲をカバーするにはもっとオプションが必要かと思います。
(私自身は上記で辞めてしまったので、もしかしたらチェックリストはredcarpetにないオプションの可能性もあります。未検証のためこちらは不確かです。)
個人的には、オプションで追加する手間、またコードの見にくさわかりづらさを感じました。

gem 'qiita markdown

  • qiitaに特化したマークダウンが出力できる。
  • どの範囲までqiitaがカバーしているマークダウンか、私自身確認ができなかった。依存関係も多く、他のgemも2つほど導入しました。その導入したgemは容量が大きかったようで、導入時に忠告文が出ておりました。

最後に

今回はマークダウン記法に関するgem比較内容を記載させていただきました。
個人的に感じたgemの使用感になりますので、個人の意見としてご覧いただけますと幸いです。
ありがとうございました。

参考文献

Discussion