掲示板で引用文の色を変えるには?

[上に] [前に] [次に]
yb 1999/05/24(月) 16:01:06
いつもこのラウンジで勉強させてもらっています。
新ラウンジでは、引用文の色が変わるようになりましたが、
とほほさんの掲示板で、引用文の色を変えるにはどうすれば
良いのでしょう?

とほほ 1999/05/24(月) 23:08:58
下記の、「s/^(>...」の行を追加してみてください。

while (<IN>) {
   s/^(&gt;.*$)/<FONT COLOR=green><I>$1<\/I><\/FONT>/;
   print;
}


mm 1999/05/25(火) 00:05:00
>とほほさんの掲示板で、引用文の色を変えるには
と仰ってるんで、とほほさんの方法では、第1行目の引用行が
うまく変わりませんね(笑い)
応急措置としては、
$allow_html = 0;
と設定してあるとして、283行目あたりの該当個所に
s/^(<BR>)?(&gt;.*$)/$1<FONT COLOR=green><I>$2<\/I><\/FONT>/;
を挿入してみて下さい。


ひゅどる 1999/05/25(火) 00:27:16
こんな話題の時にしか入れないから(笑
とりあえず、209行目の
print OUT "<BR>$FORM{'MESSAGE'}\n";
を、

$message = $FORM{'MESSAGE'};
$message = &ChangeColors($message, '&gt;|>', '#00ff00', 0, 1);
print OUT "<BR>$message\n";
にして、文末に以下のサブルーチンを入れる。

sub ChangeColors {
local($msgs, $char, $color, $bold, $italic) = @_;
local($bs, $be, $is, $ie);
if($bold) { $bs = '<b>'; $be = '</b>'; }
if($italic) { $is = '<i>'; $ie = '</i>'; }
$cs = "<font color=$color>"; $ce = '</font>';
if ($msgs =~ m/$char/) {
$msgs =~ s/^($char)([^\n]*)/$bs$is$cs$1$2$ce$ie$be/g;
$msgs =~ s/(\s)($char)([^\n]*)/$1$bs$is$cs$2$3$ce$ie$be/g;
$msgs =~ s/( )($char)([^\n]*)/$1$bs$is$cs$2$3$ce$ie$be/g;
}
return $msgs;
}

コレを使えば、2つ目の引数さえ変えれば
「@」だろうが「♪」だろうがなんでもいけます。
おまけに太字、斜体も選択可!(^^
# 太字、斜体はスタイルシート使えって言われそぅだけどまぁいぃや(笑


mm 1999/05/25(火) 01:52:00
ひゅどるさんのスクリプトでちょっと気になった点です。

"<font color=$color>" は "<font color=\"$color\">" の方がよいと
思います。

サブルーチン内で、
$char =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g;
としておかないと、
&ChangeColors($message, 'ー', '#00ff00', 0, 1);
等とした場合に、実行時エラーになったり変換できないことがあります。

$message = '>ABC >DEF >GHI';
の場合にタグが入れ子になるのは仕様でしょうか?


mm 1999/05/25(火) 01:59:35
>$char =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g;
は、文字コードがShift-JISの場合です。

ひゅどる 1999/05/25(火) 12:19:57
ありゃりゃ(^^;
こりゃどーも >mmさん

まずは自己レス。
209行目じゃ遅いですね。(改行が反映されないから)
198行目位にさし込んどきましょう。
# Write current message. の直後ですね。

んで...。
ひゅどるは普段から<font color=#000000>って書いてました(^^ゞ
でも正しい書き方じゃないみたいですね。 直しておきます。

「ー」は使ったことが無かったんで、知りませんでした。
今やってみたらエラーになりました。
ところが今度は「&gt;|>」や「#|#」には気付いてくれませんでした(TДT

最後のは仕様でもなんでもありません。 気付かなかっただけです(−−;

sub ChangeColors {
local($msgs, $char, $color, $bold, $italic) = @_;
local($bs, $be, $is, $ie);
if($bold) { $bs = '<b>'; $be = '</b>'; }
if($italic) { $is = '<i>'; $ie = '</i>'; }
$cs = "<font color=\"$color\">"; $ce = '</font>';

# よくわかってないんでまだ保留。
# $char =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g;

if ($msgs =~ m/$char/) {
$msgs =~ s/^($char)([^\n]*)/$bs$is$cs$1$2$ce$ie$be/g;
$msgs =~ s/(\n+\ *)($char)([^\n]*)/$1$bs$is$cs$2$3$ce$ie$be/g;
$msgs =~ s/(\n+ *)($char)([^\n]*)/$1$bs$is$cs$2$3$ce$ie$be/g;
}
return $msgs;
}

まだ直しようがあるみたい。

mm 1999/05/25(火) 13:20:12
そうか、$message = $FORM{'MESSAGE'}; だから改行も入って
いるんですね。
だとすると、
>$msgs =~ s/^($char)([^\n]*)/$bs$is$cs$1$2$ce$ie$be/g;
は、/g が付いてるから、各行頭という意味でしょうか。
そうであれば、perl4なら、
$* = 1;
$msgs =~ s/^($char)([^\n]*)/$bs$is$cs$1$2$ce$ie$be/g;
$* = 0;
perl5なら、
$msgs =~ s/^($char)([^\n]*)/$bs$is$cs$1$2$ce$ie$be/mg;
とする必要があります。

># よくわかってないんでまだ保留。
># $char =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g;
出典を書き忘れました(^^;
このラウンジのソースの検索の部分から引っ張って来ました。

Shift-JISの場合に、「ー―‐/+−±ゼソゾタボポマ」など
や「啓充深措端納票房蚕十申貼能表暴予禄転脳評望余…」など
の若干の漢字で、第2バイトが正規表現のメタキャラクタに
該当するので問題になります。
(「&gt;|>」や「#|#」は問題ありません)

そうそう、Shift-JISの場合と書きましたが、これに限らず、
半角のメタキャラクタ自身を指定した場合は、同様に
エスケープする必要がありますね。


ひゅどる 1999/05/25(火) 23:04:11
お手間をかけました(^^;

sub ChangeColors {
local($msgs, $char, $color, $bold, $italic) = @_;
local($bs, $be, $is, $ie);
if($bold) { $bs = '<b>'; $be = '</b>'; }
if($italic) { $is = '<i>'; $ie = '</i>'; }
$cs = "<font color=\"$color\">"; $ce = '</font>';

$char =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g;
if ($msgs =~ m/$char/) {
$msgs =~ s/^(\ *)($char)([^\n]*)/$1$bs$is$cs$2$3$ce$ie$be/mg;
$msgs =~ s/^(( )*)($char)([^\n]*)/$1$bs$is$cs$3$4$ce$ie$be/mg;
}
return $msgs;
}

>ところが今度は「&gt;|>」や「#|#」には気付いてくれませんでした(TДT
マッチしなかった理由は「\|」ってしていたために、
「&gt;|>」という文字列にしかマッチしなかったからです。
だから「|」は使えなくなりました(^^;
$message = &ChangeColors($message, '&gt;', '#00ff00', 0, 1);
$message = &ChangeColors($message, '>'  , '#00ff00', 0, 1);
で同様の結果を得られるはずです。

>>$msgs =~ s/^($char)([^\n]*)/$bs$is$cs$1$2$ce$ie$be/g;
>は、/g が付いてるから、各行頭という意味でしょうか。
そぅいぅ意味ではありませんでした(^^;
御指摘感謝致します。m(_~_)m


mm 1999/05/26(水) 01:22:27
>マッチしなかった理由は「\|」ってしていたために、
>「&gt;|>」という文字列にしかマッチしなかったからです。
なるほど、確かにそうですね。それをすっかり忘れてました(^^;

ところで、↓じゃダメ?
ChangeColors(\$message,'#ff0000','<I><B>','</B></I>','&gt;','>');
sub ChangeColors {
my($msg, $color, $in, $out, @char) = @_;
foreach (@char) { s/[-+*.?^\$[\]|()\\]/\\$&/g; }
my($char) = join('|', @char);
$$msg =~ s%^(( | )*)($char)(.*)%$1$in<font color="$color">$3$4</font>$out%mg;
}

ということで、ybさん、お分かり頂けましたでしょうか?
とほほさんと私の先のモノが表示の色だけを変えるやり方で、
ひゅどるさんのは、データ自体を書き換えるやり方です。


yb 1999/05/26(水) 11:25:43
とほほさん、mmさん、ひゅどるさん、ありがとうございました。
ひゅどるさんのがうまく動かなかった(私が悪いんだと思いますが)ので
mmさんの方法で出来ました。

ところで、掲示板のデータが
−−−−−−−−−−
<BR>&gt;てすと<BR>
あういえお
−−−−−−−−−−
の場合は良いのですが、改造した掲示板のデータが
−−−−−−−−−−
<BR>&gt;てすと<BR>あういえお
−−−−−−−−−−
となっている場合に、全文の色が変わってしまいます。(^^ゞ
しばらく考えたのですが、初心者の私にはわかりません。
何か方法はありますでしょうか?

ひゅどる 1999/05/26(水) 15:40:14
>ひゅどるさんのがうまく動かなかった(私が悪いんだと思いますが)ので
ありゃ(^^;
たぶん改行コードかな?
ひゅどるの場合は改行コードは\nに統一してたんで。
mmさんの掲示板から頂いた方法では、
# 改行コードの統一。 (\r\n\n:IE3.01+Mac, \n:Lynx, \r:NN+Mac)
$value =~ s/\r\n\n|\r\n|[\r\n]/\n/g;

ところで、データが1行の場合ではうまくいかないのは、
s/^(<BR>)?(&gt;.*)(<BR>)/$1<FONT COLOR=green><I>$2<\/I><\/FONT>$3/g;
でうまくいかないですかね?


mm 1999/05/26(水) 23:43:06
<BR>が行の区切り文字であって、他にはタグが混じるおそれがないなら、
s/<BR>(&gt;[^<]*)/<BR><FONT COLOR=green><I>$1<\/I><\/FONT>/g;
でいいと思います。
末尾にも<BR>が付くなら、perl5の最小マッチや先読みも使えるかな…

>$value =~ s/\r\n\n|\r\n|[\r\n]/\n/g;
フォームで送られて来る改行の種類は、このラウンジで教わった
貴重な財産です(笑い)


yb 1999/05/27(木) 12:02:25
ひゅどるさん、mmさん、ありがとうございました。

>s/<BR>(&gt;[^<]*)/<BR><FONT COLOR=green><I>$1<\/I><\/FONT>/g;
これで解決しました。m(__)m

s/<BR>(&gt;[^<]*)/<BR><FONT COLOR=green><I>$1<\/I><\/FONT>/g;
s/<BR>(>[^<]*)/<BR><FONT COLOR=green><I>$1<\/I><\/FONT>/g;
s/<BR>(>[^<]*)/<BR><FONT COLOR=green><I>$1<\/I><\/FONT>/g;
って3行並べました。(^^ゞ

[上に] [前に] [次に]