エントリーにpタグとbrタグが入る仕組み(その2:blockquoteにbrタグを挿入)

エントリーにpタグとbrタグが入る仕組み(その2:blockquoteにbrタグを挿入)

Posted at October 14,2004 12:43 PM
Tag:[Entry, Perl, Tag]

現状の Movable Type の振る舞いでは、エントリーのblockquote開始タグの直前の行に

  1. 何もない(=エントリーの先頭)
  2. 文字がある(=段落の途中にblockquoteが存在)
  3. 空行が1行ある
  4. 空行が2行ある

という状態によってpタグおよびbrタグの与えられ方が変化します。

上記のケース順に記した下記のエントリーがあるとします。

<blockquote>あいうえお
あいうえお
あいうえお</blockquote>
          ←空行
かきくけこ
<blockquote>かきくけこ
かきくけこ
かきくけこ</blockquote>
          ←空行
<blockquote>さしすせそ
さしすせそ
さしすせそ</blockquote>
          ←空行
          ←空行
<blockquote>たちつてと
たちつてと
たちつてと</blockquote>

これを保存すると、pタグおよびbrタグは次のように付与されます。

<blockquote>あいうえお
あいうえお
あいうえお</blockquote>
          ←空行
<p>かきくけこ<br />
<blockquote>かきくけこ<br />
かきくけこ<br />
かきくけこ</blockquote></p>
          ←空行
<blockquote>さしすせそ
さしすせそ
さしすせそ</blockquote>
          ←空行
<p><br />
<blockquote>たちつてと<br />
たちつてと<br />
たちつてと</blockquote></p>

2と4の場合は期待する結果になりますが、1と3の場合は改行が付与されません。いずれもエントリーにpタグとbrタグが入る仕組み(その1)に記した通りの動作です。

空行が2行の場合について補足致しますと、段落は連続した改行("\n\n"または"\r\n\r\n")で区切られるため、3つめの改行は段落内の文字として認識されます。つまりblockquoteタグの前に(空の)文字が存在する状態になるため改行タグが付与されます。2行あった空行は、後の1行が段落内の文字として扱われるため1行になります。空行下の <p><br /> に変換されている部分が昔、空行だった行です。
余談ですがこのロジックでは空行が偶数であれば改行タグが一律付与され、奇数の空行の場合は(条件に記されたタグは)付与されないという現象が発生します。

Movable Type における改行タグの挿入方法は、HTMLを記述する際に「タグの直前に空行が存在する」というお作法が前提になっていますが、エントリーに挿入した改行と同じ位置に改行タグの挿入を期待するユーザにとっては混乱を招く原因になっているように思われます。

改行を挿入する方法は他のサイトでも紹介されていますが、個人的には "blockquote" を条件式から除外別の条件式を作って br タグのみ付与する方法を採っています。

具体的には、lib/MT/Util.pmのhtml_text_transform(下記)

for my $p (@paras) {
    if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|fieldset|blockquote|address|div|hr)@) {
        $p =~ s!\r?\n!<br />\n!g;
        $p = "<p>$p</p>";
    }
}

に青色部分の

for my $p (@paras) {
    if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|fieldset|blockquote|address|div|hr)@) {
        $p =~ s!\r?\n!<br />\n!g;
        $p = "<p>$p</p>";
    } elsif ($p =~ m@^</?(?:blockquote)@) {
        $p =~ s!?r??n!<br />?n!g;
    }
}

を追加する方法を推奨します。

blockquote タグは p タグで括ることが禁止されているブロック要素ですが、この方法であれば、p タグで括られずに br タグを付与することができます。

同様に br タグのみを付与したいタグがあれば、blckquote と同様、上記の追加コードに該当のタグ名を追加してください。同様に、brタグを一律付与したいタグは条件から外すのが手っ取り早いと思います。つづく

2004.10.23 追記
3.11-ja での動作実績が下記エントリーにて報告されています。

2006.08.13 追記
blockquote 改変方法を変更しました。

関連記事
zenback
人気エントリー
トラックバックURL


トラックバック

Movable Type 3.11-ja アップグレード。【追記】 from 我楽
エントリー投稿画面で、3.01D-jaの時に加工してたやつがパーになったので、ちょちょいと変更。 ”テキストフォーマット:改行を変換する”設... [続きを読む]

Tracked on October 21, 2004 1:02 PM

3.1にしたらおかしくなった。 from Hitori-goto
第3弾くらいかな?? 今度は、変にPタグが付くんです! の、巻。 Block Quoteで、Pが付いたり、で、 何か、おかしいのです。 (スタイルシートで気づい... [続きを読む]

Tracked on October 23, 2004 8:31 PM

pタグとbrタグ from mocha
MTって妙なところでややこしいんです。素直じゃないっつーか。マニュアルによるとテ... [続きを読む]

Tracked on October 30, 2004 9:12 PM

リヌってみました from dimanche
IEだと問題はなかったのですが、Firefoxだと表示がおかしくなっちゃってどうしたものかと思ってたんです。今日は朝から... [続きを読む]

Tracked on November 12, 2004 2:41 PM

blockquoteタグの中での改行 from Internet Zone::Movable TypeでBlog生活
MT 3.11-jpじゃあ“blockquoteタグの中では改行タグが効かないなあ…”と諦めていたのですが、解決策があることを知りました。さっそく挑戦してみます... [続きを読む]

Tracked on November 14, 2004 3:38 PM

blockquoteタグの中での改行 from Internet Zone::Movable TypeでBlog生活
MT 3.11-jpじゃあ“blockquoteタグの中では改行タグが効かないなあ…”と諦めていたのですが、解決策があることを知りました。さっそく挑戦してみます... [続きを読む]

Tracked on November 16, 2004 10:03 AM

MTでのblockquoteタグ from Notebook :: Hibi no Note
Movable Type を 2.66 → 3.11 にバージョンアップして、す... [続きを読む]

Tracked on November 20, 2004 5:53 PM

MTクイックポストで引用を正しく表示させる2 from Sato-Tetsuya BLOG
さらに、引用文中の改行を正しく反映させるためにこちらの説明どおりにカスタマイズし... [続きを読む]

Tracked on December 14, 2004 11:05 PM

ほんのちょっぴり from Dybbuk Debugs.
以前からblockquoteを使用したときに改行が入ったり入らなかったりする気がして少し調べてみたら小粋空間さんに対応策が掲載されていたので、早速取り入れてみた... [続きを読む]

Tracked on January 6, 2005 3:53 PM

【blockquote】内の改行方法を変更 from MandraChips
以前から、【blockquote】内の改行がエントリー入力時とは同じ位置に挿入さ... [続きを読む]

Tracked on February 12, 2005 10:46 AM

[カ]変な改行の修正。 from 惜賭馬 Blog
以前のブログにて、スロのテンプレを作るのに、<ul>とか<dt... [続きを読む]

Tracked on March 21, 2005 9:45 PM

ダイナミックパブリッシングとblockquoteのbr from e-Groover,log
以前、小粋空間さんの エントリーにpタグとbrタグが入る仕組み(その2:bloc... [続きを読む]

Tracked on April 7, 2005 9:17 PM

div内でも改行できるように from Project MultiBurst
以前、カスタマイズで「エントリー画面でdivを挿入する」というのを書いたのですが、 div内の文章の改行が無くなってしまうんです。 理由がわからず、結局スタイル... [続きを読む]

Tracked on August 12, 2005 11:17 PM

引用文も自動的に改行したい from いろんなことが起こる
エントリーに書く文章は「改行を変換する」設定にしているんだけど(設定 > 新規投... [続きを読む]

Tracked on October 31, 2005 9:00 AM

blockquoteタグ利用時のbrタグ付与法則変更 from ネコの為に鈴は鳴る。 - After☆Taste Blog
MTでは改行自動変換時、なにやら変わった法則に則ってbrタグを付与している模様。... [続きを読む]

Tracked on November 17, 2005 11:08 AM

MT3.2 blockquote 要素 その 2 from LaCoocanでMT3.2の導入・カスタマイズ
小粋空間: エントリーにpタグとbrタグが入る仕組み(その2:blockquot... [続きを読む]

Tracked on February 9, 2006 7:14 PM

Movable Type エントリー内で divタグ を使う from log
エントリーの中で<div>タグを使用すると、その中に書いた記事で改行したときに反映せず、横つながりになってしまう。そのままでは困るので調べたと... [続きを読む]

Tracked on July 5, 2006 5:08 PM

Movable TypeのBlockquoteタグ from *cosmos* blog
blockquoteタグが面倒だったんです。 改行をしてくれないために、わざわざ自分でタグを入れたりして。 なんとかならんのか!?と思って調べたら・・・... [続きを読む]

Tracked on March 25, 2008 12:12 PM
コメント

yujiroさんこんにちは。
このTips1?3は僕の積年抱えている問題を解決してくれそうです。ありがとうございます。

[1] Posted by kaminogoya : October 20, 2004 9:00 AM

はじめまして。
ネタ稼ぎに書いたのですがお役に立てたようで幸いです。

3.11用テンプレート作成の際にはHINAGATAさんの記事を参考にさせていただきたいと思ってます。
それでは今後ともどうぞよろしくお願い致します。

[2] Posted by yujiro : October 20, 2004 1:56 PM

TBがうまくいかず、などもTBを送ることになってしまい、申し訳ありませんでした。blockquoteタグの中の改行処理がうまくゆかず悩んでおりましたが、これで悩み解消です。ありがとうございました。

[3] Posted by GAKU : November 14, 2004 3:40 PM

>GAKUさん
はじめまして。
記事参照くださりありがとうございました!

またBlogPeople登録ありがとうございました。
こちらからも登録させて頂きましたので、今後ともどうぞよろしくお願い致します。
#TB重複は削除しておきました。お気遣いなく。

[4] Posted by yujiro : November 15, 2004 1:36 AM

いつもながら、大変助かりました。
すばらしい情報をありがとうございます!

[5] Posted by showBOO : August 12, 2005 11:12 PM

>showBOOさん
こんばんは。
コメント&トラックバックありがとうございました。
お役にたてたようで良かったです。

ではでは!

[6] Posted by yujiro : August 13, 2005 10:00 PM

こんにちは。

改行変換処理をより使いやすくにするプラグインを作ってみました。

http://www.h-fj.com/blog/archives/2005/08/28-160725.php

テキストフィルターを追加する形になりますので、必要に応じてMT標準の改行変換処理と使い分けることができます。

[7] Posted by : August 28, 2005 4:22 PM

>壱さん
こんばんはー。
ご連絡ありがとうございました!

こちらも機会をみて使ってみたいと思います。

[8] Posted by yujiro : August 29, 2005 1:15 AM

yujiroさん、こんにちは。
いつもわかりやすい解説をしていただいてありがとうございます。
これで引用時やリスト時の悩みから解放されそうです。
どうもありがとうございました。

[9] Posted by みっく : November 17, 2005 11:16 AM

>みっくさん
こんにちは。
お役にたったようでよかったです。
ご連絡&トラックバックありがとうございました。

[10] Posted by yujiro : November 18, 2005 12:15 PM

こんにちは。

こちらの記事の件で、質問をさせてください。
Movable Type 3.2を使って作成しているのですが、
エントリーの表示でどうしても空行を反映することが
出来ず苦しんでおります。

 ●改行設定: 改行を変換にする
としておりますが、うまく反映されません。
CSSのine-height:140%も反映されず
MTの問題というよりも私の間違えのような
気もするのですが。。。

突然で申し訳ございませんが、
 よろしくお願いいたします。

[11] Posted by しゅん : March 9, 2006 9:29 AM

>しゅんさん
はじめまして。
ご質問の件ですが、HTMLを拝見させて頂いたところ、マークアップは正しく、こちらでソースを拝借して line-height を変更してみたところ、正常に機能するようです。
推測ですが、以前のスタイルがキャッシュに残っているのではないでしょうか。

ということで、強制リロードを行うか、ブラウザの履歴のクリア・キャッシュのクリア・一時ファイルの削除等を行ってみてください。
ブラウザのキャッシュをクリアするも参考になれば幸いです。

以上です。
それではよろしくお願い致します。

[12] Posted by yujiro : March 9, 2006 8:14 PM

ドコモからの投稿の際、途中で文章が途切れてしまう現象はこのパラグラフタグが関係してるんでしょうか。その場合、上記のように設定すれば、今後ドコモでメール投稿しても文章途切れ現象が回避されますか?

[13] Posted by pika : March 8, 2007 5:00 PM

>pikaさん
こんにちは。
ご質問の件ですが、「携帯からの投稿で、投稿した本文が途中で途切れた形で公開される」という解釈でよろしいでしょうか。
パラグラフが付加されるのは投稿後の処理ですので、途切れる原因は、携帯からのフォーム送信ではひとつのテキストエリアから送信できるバイト数に制限があるからではないでしょうか。
質問の解釈が誤ってましたらお許しください。
それではよろしくお願い致します。

[14] Posted by yujiro : March 8, 2007 5:30 PM

Util.pmの<br />を<br>にしたら、
終了タグのつもりなのか末尾の</p>直前に</br>が入るように……

MTをHTML形式で扱いたい人はほとんどここでつまずいているのではと思う。

[15] Posted by ton : May 6, 2008 3:22 PM

>tonさん
こんにちは。
これは単なるボヤキと解釈しましたが、ご要望等ありましたら再度ご連絡ください。

[16] Posted by yujiro logo : May 8, 2008 5:20 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)