WalWiki/カスタマイズに移動します。
同一ページ内複数コメント
最新の実装はWalWiki/カスタマイズの方をご覧下さい。とりあえずここも残しておきます。
グローバル変数を使ってるのがちょっと気にくわないんだけどこれ以上スマートな実装を思いつかなかった…
もっとスマートな実装方法があれば教えて下さい。
こんな感じに動作します。
グローバル変数定義
- グローバル変数定義に下記の変数を追加してついでに-1に初期化
my $comment_no = -1;
inline()内の変更
- inline() 内で $embed_comment、$embed_rcomment に対しては %link_cache を使用しないように変更
- 2003/05/22 ちょっと実装がまずかったので修正
# yakty add [multi comment] start
# $line =~ s!(
# (\Q$embed_comment\E)
# |
# (\Q$embed_rcomment\E)
# )
# !
# &make_link($1)
# !gex;
# yakty add [multi comment] end
$line =~ s!
(
((mailto|http|https|ftp):([^\x00-\x20()<>\x7F-\xFF])*) # Direct http://...
|
($bracket_name) # [[likethis]], [[#comment]], [[Friend:remotelink]]
|
($interwiki_definition) # [[Friend http://somewhere/?q=sjis($1)]]
|
($wiki_name) # LocalLinkLikeThis
)
!
# &make_link($1) # Walrus del [link cache]
# (defined($link_cache{$1})) ? $link_cache{$1} : (length($_ = &make_link($1)) < 1024) ? ($link_cache{$1} = $_) : $_ # Walrus add [link cache] # yakty del [multi comment]
(defined($link_cache{$1})) ? $link_cache{$1} : # yakty add [multi comment]
($1 eq $embed_comment or $1 eq $embed_rcomment) ? &make_link($1) : # yakty add [multi comment]
(length($_ = &make_link($1)) < 1024) ? ($link_cache{$1} = $_) : $_ # yakty add [multi comment]
!gex;
embedded_to_html()内の変更
- embedded_to_html() で コメントの場合には $comment_no をインクリメントし、フォームのhidden属性に name="mycmtno" value="$comment_no" を追加
my $lastmodified = &get_info($form{mypage}, $info_LastModified);
$comment_no++; # yakty add [multi comment]
return <<"EOD";
<form action="$url_cgi" method="post">
<input type="hidden" name="mycmd" value="comment">
<input type="hidden" name="mypage" value="$escapedmypage">
<input type="hidden" name="myLastModified" value="$lastmodified">
<input type="hidden" name="mytouch" value="on">
<input type="hidden" name="mycmtno" value="$comment_no">
$resource{yourname}
<input type="text" name="myname" value="" size="10">
<input type="text" name="mymsg" value="" size="80">
<input type="submit" value="$resource{commentbutton}">
</form>
EOD
do_comment()内の変更
- do_comment() で $form{mycmtno} 分だけ、コメントのブロックを読み飛ばしてから
追加されたコメントを付加
- 同じページ内の整形済みテキストエリアにコメントのブロックがあるとそこにコメントを埋め込んでしまう問題があった(元々の実装の問題)のでdo_comment()の実装を一端行単位に分割してから処理するように変更。
- ちょっとバグがあったので修正。2003/06/04
sub do_comment {
my ($content) = $database{$form{mypage}};
my $datestr = &get_now;
my $namestr = $form{myname} ? " ''[[$form{myname}]]'' : " : " ";
# yakty del [multi comment] start
#if ($content =~ s/(\Q$embed_comment\E)/- $datestr$namestr$form{mymsg}\n$1/) {
# ;
#} else {
# $content =~ s/(\Q$embed_rcomment\E)/$1\n- $datestr$namestr$form{mymsg}/;
#}
# yakty del [multi comment] end
# yakty add [multi comment] start
my (@txt) = split(/\n/, $content);
my $cmtno = 0 + $form{mycmtno};
my $cmtcnt = 0;
#for(my $i=0; $i<$#txt; $i++){
for(my $i=0; $i<=$#txt; $i++){ # ちょっと間違えてた
my $line = $txt[$i];
next if($line =~ /^\s.*$/);
if($cmtcnt < $cmtno){
if($line =~ /((\Q$embed_comment\E)|(\Q$embed_rcomment\E))/){
$cmtcnt++;
}
} else {
if($line =~ /((\Q$embed_comment\E)|(\Q$embed_rcomment\E))/){
if($1 eq $embed_comment){
$line =~ s/(\Q$embed_comment\E)/- $datestr$namestr$form{mymsg}\n$1/;
} elsif($1 eq $embed_rcomment){
$line =~ s/(\Q$embed_rcomment\E)/$1\n- $datestr$namestr$form{mymsg}/;
}
$txt[$i] = $line;
last;
}
}
}
$content = join("\n", @txt);
# yakty add [multi comment] end
if ($form{mymsg}) {
$form{mymsg} = $content;
$form{mytouch} = 'on';
&do_write;
} else {
$form{mycmd} = 'read';
&do_read;
}
}
ご意見等
ご意見等があればこちらにどうぞ。
[[#rcomment]]
- 2003-05-23 (Fri) 01:43:28 ブースカ? : yaktyさん、こんばんわ。ブースカです。同一ページ内の複数1行コメントの設置のカスタマイズ、おがけさまで私のサイト「WikiFan」(URL : http://www2u.biglobe.ne.jp/~fsasaki/WikiFan/wiki.cgi?WikiFan)でも設置に成功しました。この機能の公開ありがとうございました。お礼申し上げます。実は、私もricaさんと一緒で、コメントボックスの前にページタイトルが表示される不具合と、コメントの書き込みに失敗する不具合に悩まされていました。私のサイトもけっこう手をいれているので、そのせいか、またはカスタマイズの作業の問題だろうと思って、後でゆっくり調べてみようと思っていましたが、さきほどこのページを覗いてみたら、カスタマイズ方法の修正が載っており、早速手直しをして設置に成功しました。昨日(5/22)のyaktyさんとricaさんの怒濤のようなやり取りのようすと、その結果、設置に成功した経過が生々しく、あらためてお二人ともお疲れさまでした。では.....
- 2003-05-22 (Thu) 12:04:51 rica : できましたっ。公開 wiki のほうも無事差し替えが済みました。本当にお世話になりました。
- 2003-05-22 (Thu) 10:05:46 yakty : 今度こそOKのはずです〜。どうぞお試しください。
- 2003-05-22 (Thu) 09:50:10 rica : 最初、私の改造のせいかと思ったんですが、[multi comment] の修正だけ加えたものでも WikiName だと巧く行かないことが解り、ホッとして(違)報告に参りましたが、既にお気づきでしたか。ええと厚かましいようですが、何とか修正していただく方向で、よろしくご検討くださいっ。
- 2003-05-22 (Thu) 09:36:27 yakty : そうなんですよ。実は私も今ソースを眺めていて(仕事しろよ…(爆))私の改造が甘かった事に気が付きました(^^;私はWikiNameを無効にしてたからこの改造で動いてたんですよね。さーて、どうしようかな?
- 2003-05-22 (Thu) 09:18:38 rica : 少しナゾな事が解りました。FrontPage や CommentTest のページ名だと a タグが入ってしまってたのですが、たまたま「むず痒いパソコン日記」という日本語名のページにコメント欄を作ってみたら巧く行きました。他の日本語名のページでも巧く行きます。
- 2003-05-22 (Thu) 08:28:41 rica : お言葉に甘えてしまいます。value の件、下の通りで、a タグ入りのものになってしまいます。編集画面の print_editform のところは $escapedmypage でちゃんとページ名になっているんですが。inline の修正をコメントアウトすると正常になるってことは…と考えて全く解らず、他にごちゃごちゃと改造をしてるので、もしかして何か関係があるのかもしれないと、今新しい WalWiki に [multi comment] の修正だけ加えたものを上げてみたら、正常に動作しました。…嫌な予感がしてきました…。
- 2003-05-22 (Thu) 07:30:33 yakty : 構いませんよ〜。私は楽しんでますので(笑)。mypageで引っ掛かったってのはどういう事でしょう?↓で書いてるコメントの通りですか?(valueの値が不正)
- 2003-05-22 (Thu) 07:14:17 rica : というわけで、mycmtno の value はちゃんとカウントされるようになりましたが、今度は mypage で引っ掛かってしまいました。my $escapedmypage = &escape($form{mypage}); <input type="hidden" name="mypage" value="$escapedmypage"> で合っているような気がするんですが。長々と場所を取ってしまってすみません。
- 2003-05-22 (Thu) 07:09:01 rica : なぜそんなマヌケなことになったかと言うと、最初にいじっていたときに、<input type="hidden" name="mypage"> の value の値が value="<a title="***" href="index.cgi?FrontPage">FrontPage</a>" という不正なものになってしまい、個人用として稼動中の wiki だったので、とりあえずコメントアウトしてそのまま使っていたのでした。これを自分のページにも書き漏らしてすっかり忘れてしまって、先日はこのページと wiki.cgi 並べて表示して、一行ずつ間違いがないか見比べてたんですが、行頭の # には気付かなかったということのようです…。
- 2003-05-22 (Thu) 07:02:19 rica : …すみません。おっしゃる通りです。inline()、修正はしたんですが、全てコメントアウトしてました…。
- 2003-05-21 (Wed) 21:48:47 yakty : もう一つ原因になりそうな事を思いつきました。inline()の修正ってしました?%link_cacheを使っちゃうと全部同じリンクになっちゃうんで、コメントのブロックだけは常にmake_link()をコールするようにしないといけないんですけど。
- 2003-05-21 (Wed) 11:56:03 rica : ええっ。何だかお手数の掛けすぎで申し訳ないです。とりあえず、時間を見つけてもう一度最初からやってみて、それでもダメだったらお願いしてもいいですか(…改造で小汚くなってしまったソースを見せるのが恥ずかしいという話も…)。
- 2003-05-20 (Tue) 07:22:29 yakty : むむ?違いますか…多分その動かないソースを見せてもらえればさくっと分かるんですけどねえ。メールメールでそのソースを送ってもらえるなら見ましょうか?
- 2003-05-20 (Tue) 02:04:57 rica : お騒がせしてどうもすみません。「グローバルの定義以外のところで、myを付けて変数を局所化」というのは、$comment_no++; の辺りが my $comment_no++; になってたり、ということでしょうか。確認してみましたが、大丈夫でした。
- 2003-05-19 (Mon) 18:12:40 yakty : よく考えると↑の現象は元々の仕様ですね。[[#comment]]がソースのコメントに書いてあったからダメなんですね。
- 2003-05-19 (Mon) 18:04:14 yakty : もしかしたらですけど、うまく動かない原因はグローバルの定義以外のところで、myを付けて変数を局所化してしまっているとかじゃないですかね?
- 2003-05-19 (Mon) 07:29:44 yakty : とりあえず↑のは面白いので放置…(爆)
- 2003-05-19 (Mon) 07:29:12 yakty : あ、ひとつ問題発覚してますね…(^^;直さなきゃ(笑)さて、どんなロジックにしようか…
- 2003-05-19 (Mon) 02:32:22 rica : ごめんなさい! 1回目の書き込みが反映されず、同じ文面をもう一度書き込んだんですが、最初の書き込み、なぜか上のコードのところに紛れ込んでしまって、書き込みフォームも現れているようなんですが…。正確に元の状態に戻す自信がないので、現状のままにしておきます。お手数かけて申し訳ありません。
- 2003-05-19 (Mon) 01:57:40 rica : 一行コメントの件、書き込みありがとうございました! 早速やってみたんですが、今度は全部 value="0" になってしまいました…。何を間違えているのやら、また後日、落ち着いて最初からやり直してみます。