概要: Markdown から変換した HTML をもう一度 Markdown に戻す方法。
Tumblr では記法として Markdown を使えたりするんだけど、API 経由では元の Markdown が取得できず、 HTML に変換されたものしか取れないので、仕方なく HTML を Markdown に戻す方法を模索してみた。
んで、以下のコードで大体元の Markdown に戻せると思う。
use strict; use warnings; use HTML::WikiConverter; use HTML::Entities qw( decode_entities ); my $html = q{Markdownから変換されたHTML}; my $converter = HTML::WikiConverter->new( dialect => 'Markdown', ); my $source = $converter->html2wiki( $html ); $source = decode_entities( $source ); $source = "\n${source}\n"; $source =~ s{\n [[`]] ( [[\s\S]] +?) [[`]] \n}{ my $match = $1; $match = "\n$match\n"; $match =~ s{\n}{\n }g; $match =~ s{^\n*|\s*$}{}g; $match .= "\n"; "\n$match\n" }gse; print $source;
動作にはHTML::WikiConverter
とHTML::WikiConverter::Markdown
が必要。
引数なんかは各モジュールの POD を参照。
HTML::WikiConverter
+ HTML::WikiConverter::Markdown
で一発変換できるかと思ったんだけど、
整形済みテキスト(pre 要素と code 要素で囲まれたテキスト)が元に戻せなかったので正規表現で置換してる。
あと実際に使ってるコードでは出力される構文が気に喰わないとかなんとかで、
HTML::WikiConverter::Markdown
を継承して部分的に書き換えて使ってるけど。