HTML を Markdown へ変換するときに知っておきたいライブラリ 11選 + α
HTML を Markdown 記法に変換するライブラリいくつかとツール少しを調べました。
<h2>Foo</h2> → ## Foo
きっかけはアプリに組み込みたいというわけではなく、単に WordPress で Markdown に移行する前の記事を再編集したいときや、何かの不具合で投稿の本文が Markdown から変換後の HTML だけになってしまったときに戻したいという要望です。調べていたらいろいろ見つけてしまいました。
ライブラリ 11 + ツール & エディタ 比較
ライブラリ特徴一覧です。
名前 | 言語 | ライセンス | 拡張記法 |
---|---|---|---|
reMarked.js | JavaScript | MIT | ○ |
to-markdown | JavaScript | MIT | × |
HTML2Markdown | JavaScript | 不明 | × |
Simple HTML to Markdown Extra converter with regex | JavaScrpt | GPLv3 | ○ |
Markdownify | PHP | LGPL | ○ |
HTML To Markdown for PHP | PHP | MIT | × |
html2text | Python | GPLv3 | × |
url2markdown (html2text 利用) | Python | GPLv3 | × |
reverse_markdown | Ruby | WTFPL | ○ |
html2markdown | Ruby | MIT | × |
Html2Markdown | C# | 不明 | × |
Pandoc (多様な形式に対応した変換ツール) | - | - | ○ |
Markable (オンラインエディタ) | - | - | × |
※ 少し試したものもありますが、きちんと不具合なく変換できるかは未検証です。拡張記法はいろいろあるので少し対応している感じであれば「○」にしました。
変換動作で注意したいのは、WordPress の本文のように Markdown + HTML 混在可能なものは、script タグなども変換後そのまま HTML として出力されないと情報が消えてしまいます。きちんとした(?)ライブラリは、文書として意味のない script タグなどは削除する動作が含まれていたり、逆にシンプルな変換のライブラリは、HTML タグを置換しているだけで対応できないタグはそのまま出力されたりします。
以下、初期の Markdown と表現しているのは、拡張を含まない Markdown 1.0.1 のことです。実際にライブラリが 100% 準拠しているかはわかりません。
reMarked.js
- JavaScript, MIT
- デモ
reMarked.js は、初期の Markdown 記法だけでなく table にも対応した JavaScript ライブラリです。デモサイトでは、指定した HTML テキスト を変換でき、ちょっと変換したいときに便利。pronama.jp/md で利用しています。
豊富な変換オプションも特徴です(デモサイトでは指定できません)。既定では script の内容などは出力されませんが、オプションで出力する・出力しないタグの指定もできます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var reMarker = new reMarked({unsup_tags: {ignore: ""}}); // 出力しないタグなし | |
var markdown = reMarker.render(document.body); |
to-markdown
- JavaScript, MIT
- デモ
to-markdown は、シンプルな JavaScript ライブラリです。サイトに blockquate に関する不具合などが記載されていますが、残念ながら開発が止まっているようです。
単純な HTML であれば問題なく変換でき、デモサイトですぐに試せます。変換できない内容はそのまま出力されます。
HTML2Markdown
- JavaScript, ライセンス不明
- デモサイトなし
HTML Parser ライブラリを利用して変換しているようです。試していません。
HTML to Markdown converter using regex
- JavaScript, GPLv3
- デモ
正規表現で HTML から Markdown へ変換するシンプルな JavaScript のコードが公開されています。機能は限定的ですが、拡張記法の対応も含まれています。
Markdownify
- PHP, LGPL
- デモサイトなし
- http://markdownrules.com/ が Markdownify を利用した変換サービスのようです
Markdownify は、Markdown Extra に対応したライブラリです。table や HTML 属性値も Markdown に変換できます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$converter = new Markdownify\ConverterExtra; | |
$converter->parseString('<h1 id="md">Heading</h1>'); | |
// Returns: # Heading {#md} | |
?> |
初期の Markdown と、拡張 Markdown へ変換するクラスが用意されています。変換できない内容はそのまま出力されますが、script などの内容は出力されません。コードを読むと変換オプションも用意されていますが、変換できない内容をそのまま出力するにはコードの修正が必要です。
もっとも拡張記法に対応している印象でした(どこまできちんと変換できているかわかりませんが)。ただ、公式サイトは落ちている状態で開発も止まっています。
HTML To Markdown for PHP
- PHP, MIT
- デモサイトなし
HTML To Markdown for PHP は、初期 Markdown に対応した PHP ライブラリです。機能は少なめですが変換オプションもあります。
html2text
- Python, GPLv3
- デモ
html2text は、古くからある Python ライブラリです。初期の Markdown 記法に対応しています。URL から Web ページを変換するデモが用意されていますが、ほとんど失敗する印象です。
変換できない内容は削除されます。これもコードを読むと変換オプションが用意されていますが、すべて出力設定にはできません。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import html2text | |
h = html2text.HTML2Text() | |
h.ignore_links = True | |
print h.handle("<p>Hello, <a href='http://earth.google.com/'>world</a>!") |
古くからあるライブラリのためか html2text を利用しているツール類が多い印象です。OS X 向けツール Markdown Service Tools でも利用されていました。
url2markdown
- Python, GPLv3
- デモ
url2markdownは、URL から Web ページを取得し Markdown に変換するライブラリです。変換部分は html2text です。ただ、Web ページの取得に Readability の Parser API を利用していて、結果が古かったり、情報が落ちていたりするので参考程度に。
reverse_markdown
- Ruby, WTFPL
- デモサイトなし
reverse_markdown は、gem 形式の Ruby ライブラリです。実際に試していませんが、説明によると table も対応しています。
html2markdown
- Ruby, MIT
- デモサイトなし
html2markdown も、gem 形式の Ruby ライブラリです。「Simple html to Markdown」とあるように簡易な変換のみ対応しています。Bitbucket にもありました。
Html2Markdown
- C#, ライセンス不明
- デモサイトなし
Html2Markdown は、C# のライブラリで、Nuget でも公開されています。コードを見るとかなりシンプルな変換をしています。
Pandoc (変換ツール)
Pandoc は、さまざまなドキュメント形式を変換できるツールです。HTML から Markdown も可能です。多種の Markdown 記法に対応しています。ただ、table の結果は列が消えて微妙でした。Pandoc については下記が詳しいです。
HTML – 多様なフォーマットに対応!ドキュメント変換ツールPandocを知ろう – Qiita
Markable (オンラインエディタ)
Markable は、オンラインの Markdown エディタです。HTML から Markdown 変換機能が付いていたので紹介します。アカウントを登録すると HTML インポート機能が使えます。HTML からの変換は初期の Markdown 記法のみ対応のようですが、Markdown から HTML 変換機能は table などの拡張記法も対応しています。
調べたオンラインエディタでは Markable のみ HTML からの変換に対応してました。
おわりに
最初は数ライブラリだけ見つけて動作確認してたのですが、よく検索するとたくさん出てきますね。みんな作っちゃうんですねぇ。
ちょっと変換したいときは reMarked.js のデモサイトが便利。reMarked.js 自体は、既存の WYSIWYG HTML エディターとの統合が最終目標のようです。
他にも情報や、間違いなどあれば教えてください。