JavaScript - Markdownパーサーのshowdown.js、markdown-js、markedを簡単比較
主に比較したいこと
- 使い方
- 変換結果の見た目の印象
- table記法を解釈できるか
- コードブロックの解釈
動作確認の前提
- MarkdownはQuick Markdown Exampleから一部引用しています
- 使用したテキストはGistに置いておきます
- CSSはTwitter Bootstrapを使っています
- クライアントで使う場合を想定しています(=node.jsでの使用例ではない)
- HTMLはどれも次のコードを基本としています
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <link href="bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <div id="content">hoge</div> </div> <!-- ここは該当ライブラリごとに読み込みjsを変える。以下はmarkedの場合 --> <script src="marked.js"></script> <!-- ここにライブラリを使うための処理を記述する --> <script src="sample.js"></script> </body> </html>
showdown.js
使い方
- jsを読み込む
<script src="showdown.js"></script>
- 変換する
new Showdown.converter().makeHtml(plain_text);
結果
特徴
- イケてる
- イケてない
- 可読性が低い(らしい)
- 標準だとtable記法に対応していない
- 「~~~」でのコードブロックに対応していない
拡張を使えばtable記法を使える?
extensionsフォルダにあります。
- jsを読み込む
<script src="showdown.js"></script> <script src="table.js"></script> <script src="github.js"></script>
- 変換する
new Showdown.converter({extensions: ['table', 'github']}).makeHtml(plain_text);
READMEには {extensions: 'table'}
と文字列渡しになっているけど、配列ですね。
文字列渡しだと落ちます。
結果
うーん、できない。
markdown-js
使い方
- jsを読み込む
<script src="markdown.js"></script>
- 変換する
markdown.toHTML(plain_text);
結果
特徴
- イケてる
- 可読性が高い(らしい)
- 拡張しやすい(らしい)
- 上記の理由から「showdownよりmarkdown-jsがいい」って人がちらほら
- イケてない
- 「```」コードブロックが惜しい
- 標準だとtable記法に対応していない
- 「~~~」でのコードブロックに対応していない
marked
使い方
- jsを読み込む
<script src="marked.js"></script>
- 変換する
marked(plain_text);
結果
オプション設定
GFM対応にするか、table記法のOn/Offとかを設定できます。
marked.setOptions({ gfm: true, tables: true, breaks: false, pedantic: false, sanitize: true, smartLists: true, smartypants: false, langPrefix: 'language-', highlight: function(code, lang) { // hogehoge return code; } });
詳しくはREADMEを参照。
特徴
- イケてる
- デフォルトでtable記法に対応している
- デフォルトでコードブロックに対応している
- イケてない
- 今のところ特になし
markedとハイライト系のjsを連携する
オプションのlangPrefixはcodeタグのclassに「{langPrefix}{言語タイプ}」で利用されます。
例えば langPrefix: 'lang-'
にしていると、pythonのコードブロックは class="lang-python"
になります。
これを利用することで、ハイライト系jsとの連携が簡単にできます。
例としてHIGHLIGHT.JSを利用してみます。
<link rel="stylesheet" href="styles/monokai.css"> <script src="marked.js"></script> <script src="sample.js"></script> <script src="highlight.pack.js"></script> <script>hljs.initHighlightingOnLoad();</script>
- 変換する
// 言語名がそのままclass名になればいいので、langPrefixは空文字にする marked.setOptions({ langPrefix: '' }); marked(plain_text);
ちなみに、markedのhighlightオプションにはcallbackを渡せます。
こちらでいじることも可能だと思います。
結果
Twitter Bootstrap当てているのでpreタグの背景色も効いているのはご愛嬌。
結論
簡単に試しただけですが、今のところ個人的にはmarkedがいい感じ。