2004年10月16日

●エントリーにpタグとbrタグが入る仕組み(その3:textareaにbrタグを挿入しない)

その2では特定のタグに対して常に改行タグを挿入する方法について述べましたが、今回は逆に改行タグを挿入しない方法について記します。


エントリーに <textarea>~</textarea> や <pre>~</pre> 等、内部情報に改行タグを挿入したくないタグを使用する場合があります。が現状の動作では、例えばpreタグは改行タグが挿入されないよう、

    lib/MT/Util.pm

の html_text_transform の条件式に

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;
}

としっかり設定(青色部分)されていますが、直前の行が空行でなければ期待する動作になりません。textareaタグは条件式に設定すらされていないので一律挿入されます。
こういう時のため(?)に、エントリー編集画面の下に「テキストフォーマット」が用意されているようで、この選択を「Convert Line Breaks」から「なし」に変更することでエントリーには改行タグが一律設定されなくなります。


しかし逆に他のテキスト行に改行タグを自前で付与しなければならず、結構面倒です。また「なし」にしなければならない設定を「Convert Line Breaks」のまま登録してしまい、textarea内をbrタグだらけにしてしまうという失敗もやらかしました。
できればどのエントリーも「Convert Line Breaks」のまま記述でき、なおかつ特定のタグに括られた部分は改行タグを挿入したくないところです。


ということで対処してみました。前回までのような鬱陶しい説明はございません(というか既に十分長い前置きですが(笑))。
先の html_text_transform の

$p = "<p>$p</p>";

の次の行に
$p =~ s!((?:\G|<textarea>)[^<]*?)<br />!$1!g;

を追加すれば <textarea>~</textarea> 間にある改行タグを削除します。条件式にも一応 "textarea" を追加おくと良いでしょう。
なお textarea タグに属性を付与する場合は上記の <textarea> にも属性を記述して、文字列が完全にマッチするように修正してください。例えば <textarea cols="50" rows="10" readonly> というタグを記述されのであれば、スクリプトを
$p =~ s!((?:\G|<textarea cols="50" rows="10" readonly>)[^<]*?)<br />!$1!g;

とする必要があります。


他のタグを追加する場合は、追加した行の "textarea" を "(" と ")" で括り、該当のタグ文字を "|" で区切って追加します(下記はpreを追加する例です)。

$p =~ s!((?:\G|<(textarea|pre)>)[^<]*?)<br />!$1!g;

なお該当のタグ内に別のタグ(というか"<")が存在する(例えば <textarea>~<hoge>~</hoge>~</textarea>)場合は正常に動作しませんので予めご容赦ください。


このシリーズは以上です。


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

2005.03.10 追記
textareaに属性を設定する場合の説明を追加しました。

Posted by yujiro at 00:10 | Popup Comments
トラックバックURL

このエントリーのトラックバックURL:
http://yujiro.dyndns.org/blog/koikikukan/mt-tb.cgi/307

トラックバック実行後、タイムアウトした旨のメッセージが表示されることがありますが、トラックバック先の処理は(これまでの経験上)正常に終了しています。正常に送信されたかどうかはトラックバック先の個別アーカイブページ等をご確認ください(タイムアウトについてはこちらの記事を参照ください)。
また同一のトラックバックが重複してしまった場合、こちらで気がついた時に適宜削除しておりますので削除のご連絡は不要です。ただし期間が空いている場合(数日とか)は気がつかない場合がありますのでご連絡ください。

トラックバック

textareaにbrタグを挿入しない from Magic White
小粋空間 エントリーにpタグとbrタグが入る仕組みを参考に、textareaタグ... [続きを読む]

トラックバック時刻: 2004年10月16日 00:59

blockquoteとtextareaのbr from e-Groover,log
blockquote に br が入らないのと、 エントリーを保存するときにConvert Line Breaksを解除しないと textarea にbrがつい... [続きを読む]

トラックバック時刻: 2004年10月25日 18:21

テキストエリアに改行などが出ないようにする from 喜怒哀楽
前の記事で、TEXTボタンを作ったたはいいが・・・ なぜか改行タグなんかがでちゃ... [続きを読む]

トラックバック時刻: 2004年11月12日 15:54

内での改行について from 55Link.com
エントリー投稿時に †を使うと出力ページで、タグが挿入されてしまいます。こういう... [続きを読む]

トラックバック時刻: 2004年12月31日 17:25

テキストエリア内の<p>やら<br> from Spicy-Chips
昨日の”月送り横カレンダー”のエントリーでうちのテンプレを<textarea>~... [続きを読む]

トラックバック時刻: 2005年01月25日 17:10

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

トラックバック時刻: 2005年03月21日 21:45
コメント

さっそく使わせていただきました。
textareaタグ使うとbrはいるので、かなり困っていました。

これで、気軽に使えます♪

投稿者 みよたん : 2004年10月16日 00:50

早々のご利用&TBありがとうございます。
私もこれでやっと楽に投稿できるかなと。
追加した途端に使う機会がなくなったりして…。

投稿者 yujiro : 2004年10月16日 01:21

何度も参上いたして、恐縮です。

MTを設置して初めてTEXTタグを使った際、エリア内に改行タグなど出てしまい解決策がココにあったので、感激しています!

こちらの記事の通りに設定しましたが、テキストエリア内に空行があると、再び改行タグが表れてしまうんですね・・・。
これは、どうにもなりませんよね?

投稿者 ミッチ [TypeKey Profile Page] : 2004年11月12日 16:05

>ミッチさん
こんばんはー。
参照ありがとうございます。
おっしゃる通り、空行があるとその前の処理で</p>が挿入されてしまい、記事の最後に書いてあるケースに該当してしまうので、処理が正常に行われなくなります。

とりあえず空行に半角文字を挿入する等で対処願えますでしょうか。
よろしくお願い致します。

投稿者 yujiro : 2004年11月12日 22:11

はじめまして。
いつも色々と参考にさせていただいてます。
ありがとうございます。
トラックバックも送らせていただきます。
これからも宜しくお願いします。

投稿者 malilyn [TypeKey Profile Page] : 2005年01月25日 17:00

>malilynさん
こんにちは。
はじめまして。
記事参照&TBありがとうございます!
こちらこそ、今後ともどうぞよろしくお願い致します。

投稿者 yujiro : 2005年01月26日 09:19

はじめまして。
大変お世話になっています。
どうしても、できないので聞いていただけないでしょうか?

問題のページ、テキストエリアに改行がはいってしまいます。
Util.pmで追加したところは
if ($p !~ m@^ 条件に「textarea」を追加

$p =~ s!((?:\G|<textarea>)[^ を
$p = "<p>$p</p>";の次に追加

何回読んでも間違いはないと思っているのですが
改行タグがはいってしまします。
(私のエントリーで半角チルダが全角になってしまっているのは
ブザウザのみで、Util.pmはきちんと半角です。)
(こちらのコメント部分の<>は、わざとです。)
3.151なんですが、原因わかりますでしょうか?
お願いします。

投稿者 misato [TypeKey Profile Page] : 2005年03月09日 03:35

>misatoさん
こんばんは。
こちらこそお世話になります。

ご質問の件ですが、textarea に属性を設定されている場合は属性を含めた形、例えば

    <textarea cols="20" readonly>
のような形で追加してください。また「"」(上の例であれば2ヶ所)の前に「\」をつけてエスケープする必要があるかも知れません。なおこの点につきましては説明が不十分でしたので、本文に追加致しました。参考になれば幸いです。

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

投稿者 yujiro : 2005年03月10日 00:51

yujiro さん、ありがとうございます。
<textarea cols="20" readonly>にするのは
毎回、大変なので
cssで高さを設定して
<textarea>だけにしてやったら、できました。
ありがとうございました。

これからもっといっぱい参考にしてカスタマイズさせていただきます。

投稿者 misato [TypeKey Profile Page] : 2005年03月10日 01:26

>misatoさん
こんばんは。
ご連絡ありがとうございました。
うまくできたようでなによりです。

それでは今後ともどうぞよろしくお願い致します。

投稿者 yujiro : 2005年03月10日 01:55

参照・引用・トラックバック、そして導入させて頂きました。
mt新規立ち上げに際し、
テンプレ使わず、自力でのカスタマイズ途中にて、
少し手を加えて見栄えをチェックしようとする度に、
ping飛んじゃう模様で・・・
申し訳御座いません。(汗)

投稿者 NOV_oh : 2005年03月23日 10:05

>NOV_ohさん
はじめまして。
コメントありがとうございます。

管理メニューの「ウェブログの設定」→「設定」の「トラックバック先の自動検出を動作させる」のチェックをはずしておけばトラックバックを自動的に送信することはなくなりますよ。
それでは今後ともどうぞよろしくお願い致します。

投稿者 yujiro : 2005年03月24日 01:44

をうっと。 設定項目がちゃんとあったのですね。(汗)
ご教示有り難う御座います。
早速、チェックを外しておきました。

こちらこそ、今後とも宜しくお願い致します。

投稿者 NOV_oh : 2005年03月25日 11:53

>NOV_ohさん
こんばんは。
ご連絡くださりありがとうございました。
ではでは!

投稿者 yujiro : 2005年03月26日 01:45
コメントする




保存しますか?

(書式を変更するような一部のHTMLタグを使うことができます)

コメントありがとうございます。投稿が反映されるまでに時間がかかる場合がありますが「投稿」ボタンを続けてクリックされないようお願い致します。またコメント投稿処理が終了しない場合、トップページに反映されない場合がありますがコメントは正常に投稿されています(サーバ側の不具合のようです。こちらで操作してページに反映させています)。また1回のクリックでも重複してしまう場合がありますが適宜削除しておりますのでご連絡は不要です。