MTではエントリ作成時に「改行を変換する」にしておくと、<p>や<br />を自動で挿入してくれます。
しかし、吐き出されるソースを見てみると、気持ち悪いのですね;;
とにかく、場合によっては<div>も<hr>も<blockquote>も、<p>で囲んでしまう。
改行は、入ったり入らなかったり。
どういうことかと思っていたら、小粋空間さんが書いていらっしゃいましたv
エントリーにpタグとbrタグが入る仕組み(その1:コード解析)
エントリーにpタグとbrタグが入る仕組み(その2:blockquoteにbrタグを挿入)
エントリーにpタグとbrタグが入る仕組み(その3:textareaにbrタグを挿入しない)
後々にわからなくなりそうなので、まとめておくと・・・。
■ まず、1行の空間(\r\n\r\n or \n\n)で、段落として区切っている。
■ 区切った前後を、<p>、</p>で囲む。
■ 条件式は、lib/MT/Util.pmの295付近。(初期値↓)
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|fieldset|select|blockquote|address|div|hr)@) {
$p =~ s!\r?\n!<br />\n!g;
$p = "<p>$p</p>";
}
}
赤字部分に含まれるタグは、直前に1行の空間があっても<p>で囲まれない。
そして、自動改行されなくなる。
しかし、場合によっては囲まれる。
(実際にはブロック要素を囲むことができないので、直前直後に<p>、</p>が補完される。)
←空行
<div>文章1-1
文章1-2</div>
←空行
←空行
<div>文章2-1
文章2-2</div>
←空行
←空行
←空行
<div>文章3-1
文章3-2</div>
のときには、以下のようになる。
<div>文章1-1文章1-2</div>
<p><br />
<div>文章2-1<br />
文章2-1</div></p>
<p></p>
<div>文章3-1文章3-2</div>
<p>で囲まれれば改行するようにもなる、という訳だが、私としては<p>が嫌だ。
しかし改行は欲しい。
blockquoteについては云々ありそうです・・・。
また、pre、textareaについては、もうちょっと嫌な感じになってしまう。
(赤字部分にtextareaを足したとして)
←空行
<textarea>
文章1
</textarea>
←空行
←空行
<textarea>
文章2-1
文章2-2
</textarea>
←空行
<textarea>
文章3-1
文章3-2
</textarea>
が、以下のようになる。
<textarea>
文章1
</textarea>
<p><br />
<textarea> <br />
文章2-1 <br />
文章2-2 <br />
</textarea> </p>
<textarea>
文章3-1
<p>文章3-2<br />
</textarea><br />
</p>
<br />はテキストエリアに出てくるし、空行をつくってしまうと<p>まで出てくる。
<br />を消す方法にについては、
エントリーにpタグとbrタグが入る仕組み(その3:textareaにbrタグを挿入しない)
で書いていらっしゃいますが、空行はやはり使えない(スペースが存在すれば大丈夫)。
以上を踏まえて、私の希望する動作は、以下。
■ <p>で囲んで良いのは、むしろ文字列だけ。
■ <p>で囲まなくて良い、改行も挿入される必要がない。
→ h1、h2、h3、・・・(これは私は使用しないが)、殆どのタグ。
→ 赤字部分に入れておけばOK。
■ <p>で囲まなくて良い、改行は挿入してほしい。(このタグの中で<p><br />は使っても良い)
→ div
■ <p>で囲まなくて良い、改行したい。(このタグの中で<p><br />は使いたくない)
→ pre、textarea
ということで、試行錯誤中。
うまくいきませんな・・・。
こうなってくると、手で書いた方が早い気もしますね~・・・。
(追記)
結局、こんな感じにしてみました。
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|fieldset|select|address|hr|div|blockquote|textarea)@) {
$p =~ s!\r?\n!<br />\n!g;
$p = "<p>$p</p>";
}elsif ($p =~ m@^</?(?:div|blockquote)@){$p =~ s!\r?\n!<br />\n!g;$p;
}elsif ($p =~ m@^</?(?:textarea)@){$p =~ s!to\\n!\n!g;$p;
}
}
div、blockquoteには<br />だけ付加
textareaの場合は、指定文字(ここではto\n)で空行挿入
・・・無理矢理ですけど。
本当はtextareaの中では段落分けして欲しくないけど、ここに来る前に分けられてるんだよなぁ・・・。
もっと前から分岐させなきゃならなくなる。
preは空行は作らず、自分で<br />を書き込むんですな・・・。
中途半端な感じ(苦笑)。
スッキリしないなぁ。