2005.02.22
みたびText-Formatter・・・(Movabletype)
text-formatterのpreの処理のまずさを修正し、http:で始まるURLはオートリンクの処置をほどこしたが、preの中味の”<“や”>”を&lt;や&gt:(便宜上”&”は全幅の文字で書いている)にエディター等を使って置換しなければならず、やっかいである。
そこで、性懲りもなく3たびUtil.pmを修正してエスケープ処理を自動で行わせるようにした。
しかし、Movabletypeのtext-formatter部は空行で分けたパラグラフ単位で処理しているので、1行づつの処理のように細かいことはできない。
結局、preの領域内で単純に< → &gt: < → &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; }
コメント
コメントフィードを購読する
コメント投稿