管理 | 差分 || 新規作成 || カテゴリ一覧 | ページ一覧 | 更新履歴 | 差分履歴 || アンテナ || PUT || more≫ ≫omit
shortcut: FrontPage || WikiLab | StoreRoom/最新 | 日々の泡 | むず痒いパソコン日記/最新 || HelpPage ||[edit]
category: WebsiteWork/CgiPerl/KoroboRoom

WebsiteWork/CgiPerl/KoroboRoom/4 - マルチスレッドと日記スキン。2002/12/01-2002/12/15

LastModified :
[管理]

マルチスレッドと日記スキン。2002/12/01-2002/12/15

| むず痒いパソコン日記 | WebsiteWork | WebsiteWork/CgiPerl || 関連ページ:KoroboRoom |

マルチスレッドっていうのかな? のスキン。

[TOP↑] [管理]

2002/12/01(sun)

[TOP↑] [管理]

要は、view に親記事のタイトル一覧だけを出し、res に親記事と返信を表示したいというだけなんだけど。

まずはすでにある、ツリー式のスキンの view.html と res.html をコピーして叩き台を作る。とりあえず、view.html から子記事を表示する <!-- CHOP -->以下の内容を削除。

chat のオマケBBSと同じように、子記事を<ol> タグで括って記事番号とは別に連番を振る。

* * *

引用返信のリンクをつけようとしてしばし悩む。

<a href="$script?form=$form_name&res_num=$num&mode.thread=1#FORM">[quote]</a>
<textarea name="message" cols=45 rows=6 style="color:$c_color">$res_msg</textarea>

これだけでは巧く行かない。view.html では上のコードだけでメッセージが引用されたんだけど。 よく見るとタイトルには $res_subj が入っているので、根本的に間違っているのではなさそうだ。 しばらく悩んで、view.html で[返信]ボタンを押すなりして res.html に飛んだときと同じ動作だと気付く。 あれもタイトルだけが入力状態になっていて、メッセージ欄に引用はない。 res.html のメッセージ欄に引用を入れるには、何か別のやり方があるんだろうかと考えて、配布元の掲示板で「引用付き返信のやりかた」というような話が出ていたのを思い出す。過去ログ漁り。

<INPUT TYPE=CHECKBOX NAME="quote_msg" VALUE=1>引用

を、返信のFORMタグの中に加えればいいです。

おお、なるほど。NAME="quote_msg"というのがいるんだったのか。というわけで、リンク文字列を書き換え。

<a href="$script?form=$form_name&res_num=$num&quote_msg=1&mode.thread=1#FORM">[quote]</a>
* * *

さて、ツリー式とどこが違うんだというと、基本的に res 画面で全てをまかなうところ。 私が使っているツリー式のスキンは、返信すると view にもどってしまうので、これを返信しても res 画面にとどまるように変更したい。

というわけで、

<input type="hidden" name="location" value="$script?form=$form_name&res_num=$num&mode.thread=1">

ついでに、ACTION="$script#FORM"で書き込みフォームに飛ばす。 ところで、最初は location のところに mode.thread=1#FORMとしたんだけど、これで巧く行かないのは何ででしょう。引用のリンクは mode.thread=1#FORMで出来るのに。 しかも、また何か単純ミスでもやらかしたのか、最初は ACTION="$script#FORM" としたら CGIWrap がエラーを返してきてしまって、しばらく頭をひねったのだった。

* * *

細かい調整。書き込みフォームからいらないものを削除。タイトルは親記事のタイトルだけがあればいい。 デフォルトで「[$num]への返信です」と入っているところを、 <a name="FORM">subject:$subject</a> としてみる。 本当にタイトルなしになるのはアレかもしれないので、とりあえず <INPUT TYPE="hidden" NAME="subject" VALUE="$res_subj"> で送っておく。

* * *

レイアウト等の調整は後回しにして、view.html に移動。

返信件数の表示編と最終返信の日付表示編と同じように、親記事タイトルの横に情報を表示。

さて、新規書き込みのフォームを作りながら考える。 この view.html 画面で新規に書き込みをしてスレッドを作ると、当然、書き込んだ後の表示はこの画面になる。なんとか、新規に作成したスレッドの res.html に飛ばすわけには行かないでしょうか。

単純に &res_num=$num&mode.thread=1 とすると、2ページ目の先頭にあるスレッドの返信画面に飛んでしまう。なぜ「2ページ目」なのかは解らないが、思い通りの動作をしないのにはちょっと心当たりがある。 新規書き込みを送信した時点では、$num に「その記事の$num」が入らないんじゃないでしょうか。 スクリプトを使って足し算をさせるとか、そういうことをすればできるのかなぁ。 心当たりが 真 なら出来なくはない気もするけど、偽 なら徒労だなあ。 めんどくさいなぁ。書き込んだ後、タイトルのリンクを辿って res.html でもいいかなぁ。

2002/12/02(mon)

[TOP↑] [管理]

私は個人的に、書き込んだ後、自分の書き込みを確認したい。 使ったことのあるツリー式掲示板では、新規でも返信でも、書き込んだ後ツリーの画面が表示されるので、リンクを辿って自分の書き込みを確認している。

でも「基本的に全てをレス画面でまかなう」という方針で、新規書き込みのあと「タイトルのリンクを辿って res.html」というのは不体裁だ。 いっそ、親記事の内容も表示してしまおうか。 私が「リンクを辿って自分の書き込み」を確認するのは、「ちゃんと書き込まれたこと」を目視確認したいだけで、全文を読み返したいわけでもない。 100〜200字程度で端折って、「...続きを読む」なんていうリンクを付けると、「タイトルを辿る」というよりは感覚的に「不体裁」感が減るんじゃないでしょうか。

「最初の数文字を表示する」というのは最終返信の日付表示に使った substrを使えばいいんだろうが、めんどくさいのでメインの CGI からちょっと拝借。 管理画面のメッセージ欄は正にそんな感じで、冒頭の何文字かだけを表示するようになっている。 デフォルトの 20byte 10文字ではちょっと短すぎて、どれがどのメッセージやら判別できなかったので、150byte程度に変更した。

sub admin_view の、この部分。

if (length($message) > 150) {
$message  = substr($message,0,148);
$message .= '...';
}

この、[...]の部分を、リンク文字列にすればいいと思ったんだけど、巧くいかない。

$message .= '...<a href=\"$script?res_num=$num&form=$form_name&mode.thread=1\">続きを読む</a>';

としたら、リンク先の変数が展開されず、そのまま $script?res_num=$num&form=$form_name&mode.thread=1 となってしまう。何ででしょう。ついでに、$message . のコンマって何でしょう?

さて、よく見ると右辺がシングルクォーテーションで括ってある。 細かいことは忘れたが、どこかの掲示板で「ダブルクォーテーションと動作が違う。時々どっちで括るんだったか判らなくなる」というのを読んだ記憶があるぞ。 もしかして、「変数を展開したい場合はダブルクォーテーション」というルールなのか?

$message  = "...<a href=\"$script?res_num=$num&form=$form_name&mode.thread=1\">続きを読む</a>";

というわけでダブルクォーテーションで成功。

コンマを取り払ったのは、動作がどう変わるか見たかったからなんだけど、なるほど。指定の文字数を超えると、[メッセージ+リンク]ではなく、「リンクだけ」が表示されるようになるのね。 ところが、コンマを戻すとエラーが出てしまった。[= .]の近くになんかいけないことがあるらしい。 シングルクォーテーションに戻すとエラーが出なくなったので、これもダブルクォーテーションとシングルクォーテーションの動作の違いなのかと一旦納得し、

$message  = "$message ...<a href=\"$script?res_num=$num&form=$form_name&mode.thread=1\">続きを読む</a>";

とする。が。これを書くためにエラーの内容を確認しようと、コンマとダブルクォーテーションの

$message . = "...<a href=\"$script?res_num=$num&form=$form_name&mode.thread=1\">続きを読む</a>";

に戻してみたら。 …エラー出ないじゃないの…。きっと またまた 何かタイプミスをやらかしてたんだ。 本当に敵だ、タイプミス。こんなそそっかしい人間には、とても 3行以上のスクリプトなんか書けそうにない

今日のワンポイント(にしてはちょっと長い)添付画像を代替文字列で表示。

[TOP↑] [管理]

一行掲示板でもファイルを添付したい。でも、画像を表示されるのは困る。 前に一度メインCGIを見て、画像以外のファイルを添付したときのように代替文字列で表示させる方法を考えたけど、すぐに諦めた。

不意に、配布されていたツリー式の掲示板で、添付ファイルをアイコン表示してたのを思い出した。

<KOROSCRIPT>
<!--
$gazou = $image? "<IMG SRC=\"$icon_url/$imgicon\" BORDER=\"0\">": ''; # 添付画像の有無
-->
</KOROSCRIPT>

で、$gazou でアイコンを表示している。アイコンはめんどくさいので、文字列にする。

<KOROSCRIPT>
<!--
$att_link = $image? "[attached_file]": ''; # 添付画像の有無
-->
</KOROSCRIPT>

リンクを張るにはどうしたらいいんだとメインのCGIを漁る。 <a href="$image_url/$image_file"> らしい。

さて、これでよしと思ったが、添付ファイルの種類がわからなくなってしまう。 ブラウザ側の機能で、ポイントすればリンク先の URL が表示されるので、構わないといえば構わないが、 せっかく gazou 以外のときはファイル名が表示されてたのに。 ファイル名を入れるにはどうしたらいいんだろうというわけで、再びメインのCGIを漁る。 さっきリンク先の URL を引っ張ってきた部分、

} else {
$attached_file = "<A HREF=\"$image_url/$image_file\" TARGET=\"$file_link_target\">".
                 "$file_icon<B>$image_file</B></A>" . $after_file_link;
}

このelse というのは、多分「添付ファイルが画像以外なら」という条件のはず。 これで見ると $image_file がファイル名ということになる。

…あら? さっきの <a href="$image_url/$image_file">$att_link</a>$att_link$image_file に入れ替えるとなると、$att_link = $image? "[attached_file]": ''; の立場は…? もしかして、最初から <a href="$image_url/$image_file">$image_file</a> だけでよかったんでしょうか…? ところがそうでもないらしい。なぜか添付がない場合には none.gif が表示されるようになってしまった。 ということは…。考え試行すること十数分。できました。

<KOROSCRIPT>
<!--
$att_link = $image? "$image_file": ''; # 添付画像の有無
-->
</KOROSCRIPT>
<a href="$image_url/$image_file">$att_link</a>

今日のワンポイント2。本文内に見出し。

[TOP↑] [管理]

他で使っているツリー式の掲示板は、行頭に設定で指定した記号を置くと指定の方法で表示してくれて、ちょっと便利。 korobo でも、行頭に返信の [>]と[>]があるときは色を変えてくれる。 ソレを頼りに「指定の記号で指定の表示」って出来そうな予感。 760行目あたりの $message =~ s/((?:^|<BR>)(?: )*)((>|>|&gt;)[^<]*)/$1<FONT CLASS=res>$2<\/FONT>/g; この部分が引用行の表示。 多分、「行頭か改行の後に >|>|&gt; があったら」という処理なんだろう。ここの下に2行追加。

$message =~ s/((?:^|<BR>)(?: )*)((■|●|▲|▼|◆|◎)[^<]*)/$1<span class="h1">$2<\/span>/g; $message =~ s/((?:^|<BR>)(?: )*)((□|○|△|▽|◇)[^<]*)/$1<span class="h2">$2<\/span>/g;

((?:^|<BR>)(?: )*) とか [^<] とかトコは何だ? 余分なんじゃないか? という感じもするが、まあ 動きゃいいんだよ ということで放っておこう…。

どうでもいいが、引用行を括る<FONT> タグがちょっと気になるので、<span>に変更。メインCGIにあんまり手を入れると、バージョンアップしたときに面倒になるけど。

ただ気になるのが、スキンで指定できない部分の korobor が吐く HTML があまり「厳格」でないこと。 <FONT><CENTER>タグなんかの物理要素が多いのもそうだけど、数値でない属性値もダブルクォーテーションで括っていなかったり、16進数のアタマに # がなかったりもする (# はただの「お約束」という記述をどこかで読んだが、NN4.xでは実際変な表示になることがある)。 さらに細かいことを言うと、タグがみんな大文字。個人的には小文字のほうが好きなので、HTMLソースを見ると自分で書いたところと流用しているところと、大文字小文字が入り乱れててちょっとヘン。 でも、ヘンだと思う程度には細かいことを気にする性質だが、小文字に統一する程には神経質でない。

それと、これは仕方のないことだけど、たまにデフォルトで使われている class 名と、勝手につけた class 名がかぶってしまうことがある。 書き込みフォーム全体を <div class="form"> でくくったらエライことになった。 view と res のスキンはもちろん変更したんだけど、検索画面のほうを忘れていた。 検索画面のテキストボックス一つ一つに class="form" が使われていたので、全体を括った form の margin や padding の指定が効いてしまって収集の付かないレンダリングをされてしまった。

めも1。

[TOP↑] [管理]

本格的に 2ch 風の掲示板にする試み。

タイトル一覧は、JavaScriptで埋め込む。 参考は、配布元のFAQ。タイトル一覧の viwe.html を作って、本体の viwe.html 先頭に埋め込んでる。 子記事を「後ろから10こだけ」切り出すスクリプトって?

掲示板で発見、一応メモ。但し最終投稿のみ表示する方法。2003/01/18(sat)

[TOP↑] [管理]
<!-- CHOP -->
<!-- スレッド開始 No.$num -->
<KOROSCRIPT>
<!--
   $last_name = $name;
   $last_date = $date;
-->
</KOROSCRIPT>
[$num] $subject

<!-- CHOP -->
<!-- レス記事開始 No.$num -->
<KOROSCRIPT>
<!--
    $last_name = $name;
    $last_date = $date;
-->
</KOROSCRIPT>
<!-- レス記事終わり -->
<!-- CHOP -->

→ 最後の書き込み者 : $last_name ( $last_date )<br>
<!-- スレッド終わり -->
<!-- CHOP -->

めも2。

[TOP↑] [管理]

名前・タイトルが未入力の場合に、代替文字列を挿入。

参考。チャットで master のメッセージを入れる方法。

めも3。2002/12/05(Thu)

[TOP↑] [管理]

編集画面から送信して *.res.html に飛ばす方法がわからない。

<input type="hidden" name="locatioon" value="$script?form=&form_name&res_num=$num&mode.thread=1">

ではだめらしい。

日記用スキン。

[TOP↑] [管理]

2002/12/14(sat)

[TOP↑] [管理]

この数日、何となく日記を書きたい気分だったので、日記用のスキンを作る。 まあ、日記というよりは「雑記帳」の部分のほうが大きいとは思うが。 今は wiki を雑記帳にしてるんだけど、HTML を書くよりは手軽でも、掲示板よりは煩雑だ。

その前に、なんかスキンの数がどんどん増えてきて煩雑なので、 公開しているのと別に個人用の korobo を設置する。

1ページに 1ヶ月にしたいが、親記事数でページを割り振られてしまうので、 1ページに 1スレッド、親記事一つを 1ヶ月、子記事に日にちを割り振ることにする。

ページインデックスで躓いた。ページ番号を月にしたいんだけど、どうすればいいのでしょう。 例によってスクリプトを書けば出来そうな気はするけど、よく解らない。

1月から書き始めようと思っているので、ソートを古い順にするとちょうどいいような気がしたんだけど、どういうわけか返信が巧くいかない。古いほうに書き込んでも、一番新しく作ったスレッドに返信されてしまう。日記なので、古い月に書き足すことはないような気もするが、「巧く動いてない」というのは気に入らない。とりあえず、日記用の日付順ソートにしておく。

2002/12/15(sun)

[TOP↑] [管理]

昨日の続きをしようと思ったら、いきなり Internal Server error。なんでだろ。 昨日最後にリロードしたときは何ともなかったぞ? 現に、昨日作業をしていたほうのパソコンをスタンバイから復帰させると、 起動したままのブラウザにちゃんと作りかけの日記が表示されている。 「なぜ?」というのはとても気になるが、全く心当たりがないので特定は困難。 もう一度公開用の koro.main.cgi をコピーする。

昨日は view.html を2つ作って、書き込み用と閲覧用にしたんだけど、考えてみたら1ページ1スレッドってことは、res.html が使えるのか。ちょっとヘンな構成だけど、res.html を閲覧用にする。

ところが困ったことになった。検索ページから戻ると、view.html の書き込み用の画面が出てしまう。 うーん、ここは「楽屋裏」なのであまり見せたくないんだけどなあ。 …いや、楽屋裏も何も、どちらも自分以外は見ないので、書き込み用の view.html だけあればいいといえばいいんだけど。実際のことより、「巧く動いてない」のが気に入らない。 res.html から新規の書込みってできるんだっけ? 考えるのも試すのも面倒になって、とりあえず書き込み用のパスを設ける。

昨日躓いていた、ページインデックスの件。 閲覧用に res.html を使ってしまったので、ページインデックスの機能そのものが使えなくなった。 いっそスッキリして、手動で 1月 2月...のインデックスを入れる。 まあ、月頭にリンクに記事ナンバーを入れるくらい大した手間でもないし。

| むず痒いパソコン日記 | WebsiteWork | WebsiteWork/CgiPerl |

shortcut: FrontPage || WikiLab | StoreRoom/最新 | 日々の泡 | むず痒いパソコン日記/最新 || HelpPage || [edit]
select css: default | sakura | mono | greenheck | snow | NN4.x用(多分) || LinuZau!! | VikiWiki!? || others |

管理 | 差分 || 新規作成 || カテゴリ一覧 | ページ一覧 | 更新履歴 | 差分履歴 || PUT