« | Home | »

2005.02.22

みたびText-Formatter

text-formatterのpreの処理のまずさを修正し、http:で始まるURLはオートリンクの処置をほどこしたが、preの中味の”<“や”>”を&lt;や&gt:(便宜上”&”は全幅の文字で書いている)にエディター等を使って置換しなければならず、やっかいである。

そこで、性懲りもなく3たびUtil.pmを修正してエスケープ処理を自動で行わせるようにした。
しかし、Movabletypeのtext-formatter部は空行で分けたパラグラフ単位で処理しているので、1行づつの処理のように細かいことはできない。
結局、preの領域内で単純に&lt → &gt:   &lt → &lt:の処理を行ったが、これではpreの先頭指定の<pre> や終端の</pre>もエスケープ処理されてしまう。
また、赤字指定の&lt;font color=#ff0000&gt;と&lt;/font&gt;も変換され赤字指定が無効になる。
これらは、置き換え処理の最後に再度元に戻すという強引な方法で対処した。

だんだん、汚くなってきた。 いつか、行単位の処理で細かな処理を行うよう、全面的に書き換えた方が良いかも知れない。
しかし、細かい処理を重ねると、実行速度が低下する副作用も気になる。
ともかく、下記に追加個所を赤字にしてtext-formatter部分を修正したものを示す。
&、<ならびに>は便宜上全幅の文字で示している部分があるので要注意。

sub html_text_transform {
my $str = shift;
$str ||= '';
my @paras = split /r?nr?n/, $str;
my $preflag = 0;     # add var
for my $p (@paras) {
if($p =~ m@<pre@){   $preflag = 1;  } # add pre check.
if (!$preflag and $p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|
ol|dl|ul|menu|dir|p|pre|center|form|fieldset|
select|blockquote|address|div|hr)@) {
if (!$preflag and $p =~ m@http@ and
$p !~ m@(href|jpg|JPG|jpeg|gif)@){
$p =~ s!(http:([^x00-x20()<>x7F-xFF])*)!
&make_link($1)!gex;
}
$p =~ s!r?n!<br />n!g;
$p = "<p>$p</p>";
}
        if($preflag){
$_ = $p; s!<!&lt;!g;   s!>!&gt;!g;
s!&lt;pre&gt;!<pre>!g;  s!&lt;/pre&gt;!</pre>!g;
s!&lt;font color=#ff0000&gt;!<font color =#ff0000>!g;
s!&lt;/font&gt;!</font>!g; $p = $_;
}
if($p =~ m@</pre@){  $preflag = 0;  }
}
join "nn", @paras;
}

コメント

コメントはありません

コメントフィードを購読する

コメント投稿





コメント本文に次の(X)HTMLタグを使えます:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)