概要: 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
を継承して部分的に書き換えて使ってるけど。
#FIXME