Text::MultiMarkdownがfenced code blockに対応していないのをなんとかするこのエントリーをはてなブックマークに追加

|

CPANモジュールのText::MultiMarkdownはMultiMarkdownと言いながらfenced code block(```で囲むやつ)に対応していなくて、なんとなく変換してくれてるように見えるのはインラインコード扱いになるのでpでくくられてしまっておかしくなる。

各行をインデントするコードブロックは動作するのでそちらを使えばいいのだけど、元データを他と使い回したいことがあったのでなんとかしようとした結果、とりあえずなんとかなったので記録。

真っ当にやるならMultiMarkdown.pmを継承していじるのが正しいのだけど、これは大変なので前処理でなんとかすることに。インデントするコードブロックは動作するので、```で囲まれた部分をインデントに変換したものを本体に食わせる方向性にした。

あんまり凝った正規表現を書いたことがなかったのだけど、MultiMarkdown.pmを参考にして書いた結果がこれ。use Text::MultiMarkdown;して使う。

sub make_markdown {
    my $md = shift;

    $md =~ s{
    \n([ \t]*)```([a-z]*)\n
    (.*?)
    \n([ \t]*)```\n
      }{
    my $indent = $1;
    my $codeblock = "\n" . $3;
    my $result;
    $codeblock =~ s/\n/\n$indent\t/g;
    $result = $codeblock .  "\n";
    $result;
    }egsx;

    my $html = markdown($md);

    return $html;
}

言語指定部分は無視することになるけどまあこれは仕方がない。これを直すなら本体いじる必要あるし。そんなにテストしてないけど今のところ自分の環境では動いてるので、おかしいことが起きたらまた考える方向で。