カラクリスタ

「輝かしい青春」なんて失かった人のブログ

HTMLをMarkdownに変換する

概要: 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::WikiConverterHTML::WikiConverter::Markdownが必要。 引数なんかは各モジュールの POD を参照。

HTML::WikiConverter + HTML::WikiConverter::Markdownで一発変換できるかと思ったんだけど、 整形済みテキスト(pre 要素と code 要素で囲まれたテキスト)が元に戻せなかったので正規表現で置換してる。

あと実際に使ってるコードでは出力される構文が気に喰わないとかなんとかで、 HTML::WikiConverter::Markdownを継承して部分的に書き換えて使ってるけど。

FIXME