カラクリサイクル

『輝かしい青春』なんて無かった人の雑記

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