HTML を Markdown へ変換するときに知っておきたいライブラリ 11選 + α

Development,Web ServiceC#,JavaScript,Markdown,PHP,Python,Ruby

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

reMarked.js は、初期の Markdown 記法だけでなく table にも対応した JavaScript ライブラリです。デモサイトでは、指定した HTML テキスト を変換でき、ちょっと変換したいときに便利。pronama.jp/md で利用しています。

豊富な変換オプションも特徴です(デモサイトでは指定できません)。既定では script の内容などは出力されませんが、オプションで出力する・出力しないタグの指定もできます。


var reMarker = new reMarked({unsup_tags: {ignore: ""}}); // 出力しないタグなし
var markdown = reMarker.render(document.body);

view raw

gistfile1.js

hosted with ❤ by GitHub

to-markdown

to-markdown は、シンプルな JavaScript ライブラリです。サイトに blockquate に関する不具合などが記載されていますが、残念ながら開発が止まっているようです。

単純な HTML であれば問題なく変換でき、デモサイトですぐに試せます。変換できない内容はそのまま出力されます。

HTML2Markdown

  • JavaScript, ライセンス不明
  • デモサイトなし

HTML Parser ライブラリを利用して変換しているようです。試していません。

HTML to Markdown converter using regex

正規表現で HTML から Markdown へ変換するシンプルな JavaScript のコードが公開されています。機能は限定的ですが、拡張記法の対応も含まれています。

Markdownify

Markdownify は、Markdown Extra に対応したライブラリです。table や HTML 属性値も Markdown に変換できます。


<?php
$converter = new Markdownify\ConverterExtra;
$converter->parseString('<h1 id="md">Heading</h1>');
// Returns: # Heading {#md}
?>

view raw

gistfile1.php

hosted with ❤ by GitHub

初期の Markdown と、拡張 Markdown へ変換するクラスが用意されています。変換できない内容はそのまま出力されますが、script などの内容は出力されません。コードを読むと変換オプションも用意されていますが、変換できない内容をそのまま出力するにはコードの修正が必要です。

もっとも拡張記法に対応している印象でした(どこまできちんと変換できているかわかりませんが)。ただ、公式サイトは落ちている状態で開発も止まっています。

HTML To Markdown for PHP

  • PHP, MIT
  • デモサイトなし

HTML To Markdown for PHP は、初期 Markdown に対応した PHP ライブラリです。機能は少なめですが変換オプションもあります。

html2text

html2text は、古くからある Python ライブラリです。初期の Markdown 記法に対応しています。URL から Web ページを変換するデモが用意されていますが、ほとんど失敗する印象です。

変換できない内容は削除されます。これもコードを読むと変換オプションが用意されていますが、すべて出力設定にはできません。


import html2text
h = html2text.HTML2Text()
h.ignore_links = True
print h.handle("<p>Hello, <a href='http://earth.google.com/'>world</a>!")

view raw

gistfile1.py

hosted with ❤ by GitHub

古くからあるライブラリのためか html2text を利用しているツール類が多い印象です。OS X 向けツール Markdown Service Tools でも利用されていました。

url2markdown

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 エディターとの統合が最終目標のようです。

他にも情報や、間違いなどあれば教えてください。