MTの自動改行を改良
以前から不満のあったMTの自動改行を改良します。
今回はpreタグ内に空行を一行含んでいても改行等(<br />, <p>, </p>
)が挿入されないようにします。
この改良については小粋空間さんの記事「エントリーにpタグとbrタグが入る仕組み」を参考にしました。
改造箇所はmt.cgi
が/mt/mt.cgi
にある場合、/mt/lib/MT/Util.pm
の下記のソースです。
sub html_text_transform {
my $str = shift;
$str ||= '';
my @paras = split /\r?\n\r?\n/, $str;
for my $p (@paras) {
if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|blockquote|fieldset|address|div|hr)@) {
$p =~ s!\r?\n!<br />\n!g;
$p = "<p>$p</p>";
}
}
join "\n\n", @paras;
}
そこを以下のように書き換えます。インデントされてない3行を加えるだけです。
sub html_text_transform {
my $str = shift;
$str ||= '';
my @paras = split /\r?\n\r?\n/, $str;
for my $p (@paras) {
if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|blockquote|fieldset|address|div|hr)@) {
$p =~ s!\r?\n!<br />\n!g;
$p = "<p>$p</p>";
if ($p =~ m!</?pre!) { # ここから改造
$p =~ s!<(br /|/?p)>!!g;
} # ここまで改造
}
}
join "\n\n", @paras;
}
書き加えた3行を簡単に説明すると、<pre
または</pre
が含まれるブロックから<br />, <p>, </p>
を取り除くだけです。見たとおり、pre
を他のタグに書き換えれば応用が利きます。
ただ、この方法には欠点があります。空行が二箇所以上入っている場合には効果がありません。
例えば
<pre>
12345
ABCED
この方法だとこのブロックだけ助けられません。
あいうえお
アイウエオ
</pre>
上記のソースを出力すると下記のようになります。
<pre>
12345
ABCED
<p>この方法だとこのブロックだけ助けられません。</p>
あいうえお
アイウエオ
</pre>
preが含まれないブロックはどうにも出来ません。
空行を二箇所以上入れなければ問題が無いわけですが、それよりも二重処理の方が気になるな。
コメント[0]
コメント投稿フォーム
コメントを投稿するにはJavaScirptが必要です。ブラウザのJavaScriptを有効にしてください。
トラックバック[0]
トラックバックはまだありません。
コメントはまだありません。