45式::雑記
45式::雑記は、日々の事を記してないから日記ではなく雑記です。

MTの自動改行を改良

コメント
0件
トラックバック
0件

以前から不満のあった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]

トラックバックはまだありません。

カテゴリ
アーカイブ
ヘルプ
Feed

フィードとは