― Web Technology and Life ―

Text::MultiMarkdownにdecodeさせた文字列を投げ込むと定義リストの解釈に失敗する

2011-11-17
Text::MultiMarkdown 1.000034を使っていて、定義リスト(dl,dt,dd)にするのがdecode文字列だとうまくいかない原因がText::MultiMarkdownにあるみたいなんだけど、理由がよくわからないからパッチが送りづらい。【追記】makamakaさんに勇気もらってパッチ送りました。

文字列のdecode/encodeに関するText::MultiMarkdownの定義リストの解釈の問題

Text::MultiMarkdown 1.000034で以下のコードを叩いてみると以下のようにおかしな出力になります。

サンプルコード

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Text::MultiMarkdown 'markdown';
use Encode;

my $text = '

定義タイトルA
: 定義説明文A


定義タイトルB
: 定義説明文B1
: 定義説明文B2
: 定義説明文B3

';

warn markdown(encode('utf8',$text));
warn markdown($text);

出力結果

##成功例

<dl>
<dt>定義タイトルA</dt>
<dd>
定義説明文A
</dd>
<dt>定義タイトルB</dt>
<dd>
定義説明文B1
</dd>
<dd>
定義説明文B2
</dd>
<dd>
定義説明文B3
</dd>
</dl>

##失敗例

<p>定義タイトル<dl>
<dt>A</dt>
<dd>
定義説明文A
</dd></p>
<p>定義タイトル<dt>B</dt>
<dd>
定義説明文B1
</dd>
<dd>
定義説明文B2
</dd>
<dd>
定義説明文B3
</dd></p>
<p></dl></p>

Text::MultiMarkdown上の問題コード

Text::MultiMarkdownの_DoDefinitionListsメソッドの以下、389行目の正規表現を以下のように変更するとうまくいきます。

現状

    my $term = qr{
        $line_start
        [^:\s][^\n]*\n
    }sx;

変更

    my $term = qr{
        $line_start
        [^: ][^\n]*\n
    }sx;

最終的に上記の正規表現以外にもいろいろゴチャゴチャ組み合わせた正規表現をテキストに当てているんだけど、どうも「\s」を「 」(半角スペース)に置き換えてうまくいく理由がわかりません。

まとめ

Perlの正規表現で日本語文字列がdecodeされたものとencodeされたもので、それぞれ「\s」と「 」(半角スペース)の解釈が違うのはどういうわけでしょうか?

Text::MultiMarkdownにdecodeさせた文字列を投げたいから、上記の変更のパッチを送って出来れば取り込んでもらう(無理でも、パッチ当てたものを使用する)ようにしたいんだけど、イマイチこれで良いのか確信が持てないとアクションが起こせず。。。

わかるかたいらっしゃいましたら、どうか教えて下さいましー。

【追記】
makamakaさんに「\sはdecode文字列に対しては、全角スペースへのマッチ等通常と挙動が異なるからでは?」とご指摘頂きました。それで、具体的にはよくわからないけど、上記パッチをオーサーに送っておきました。ありがとうございます!取り込まれなくても、なんか対応してくれたらうれしいなー。

Perl update_at : 2011-11-24T17:09:01
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus