トップ>Perl&CGI>基本編目次>INCMプラグインで覚えるPerl講座15

INCMプラグインで覚えるPerl講座

第15回 ルート判定と本文取得

前回までの状態でもタイトルと発言者は取得できていると思います。 問題はスレッドが繋がらないことと、本文が取得できていないことです。

ルート判定

親記事の場合子記事の場合で処理を振り分けて、CMTファイルに書き込む内容を変えることでスレッドを繋げます。

前回、途中まで作成したプラグインの65行目を見て下さい。 if文がありますが、そこにコメントで返信ボタンがあればルートと書かれてますね。 このブロックの中にかかれている処理が、ルート記事の場合に実行されます。

何をしているのか見てみましょう。まずは66行目です。

$root=$num; $rnum="*";  $atclcnt+=1;

3つの文があります。まず一つ目は$root$numに代入されている記事番号を代入しています。 変数名からも分かるかもしれませんが、ルート記事と判定されたのでその記事番号を親記事番号として一時保存しているわけです。

2つ目は$rnumという変数に*という文字列を代入しています。88行目で

  print  "S:$num,$rnum,$date,\n",$head;

として記事のヘッダを出力していますが、ここで$rnumが使われています。$numが記事番号で$rnumは親記事番号になります。 ルート記事に親記事は存在しないので、その場合はCMT形式では*と記述することになっています。

3つ目は$atclcnt1を加算していますね。 時系列では1記事ずつ加算していましたが、Joy Loadではスレッド単位の指定で次のページに進むので、ここで加算しているのです。

67行目は単に巡回ウィンドウへの出力をしています。

子記事の場合の処理は68行目のelseブロック内に書かれています。 70行目は巡回ウィンドウへの出力ですが、69行目で

$rnum=$root;

として、ルート記事の処理で保存しておいた親記事番号$rnumに代入しています。

記事番号は取得できているわけですから、65行目のifの条件式をJoy Loadに対応したものに書き換えれば上手く行くはずです。

Joy Loadのルート記事にしか存在しないものは何でしょう? 今回のプラグインの改造元のYY-Boardと同じで返信リンクなんです。 その部分のHTMLを見て下さい。

<a href="./pjload.cgi?resmode=on&resnum=1&mode=resform"><small>*Res*</small></a>

<a〜>を使えば良さそうですね。 <a href="[^\n\?]+\?まではYY-Boardのままで問題ないでしょう。 resnumの値以外は固定値のようです。resnumは記事の番号のようですから、\d+としておきます。 というわけで条件式は

/<a href="[^\n\?]+\?resmode=on&resnum=\d+&mode=resform\">/

となります。これで前回取り込み済みの記事を削除して巡回してみて下さい。 きちんとスレッドが繋がっているはずです。

本文の取得

HTMLソース上の本文はどうなっているでしょう?

</td><td><font color="#65baa0">本文</font></td></tr></table>

親記事、子記事ともに同じ形式のようです。これを元に自分の思い付く正規表現を書いて見て下さい。 プラグインでは85行目の

/<blockquote>([^\xff]*?)<\/blockquote>/i;

の部分が本文をマッチさせる処理をしています。

私が思い付いたのは

<\/td><td>([^\xff]*?)<\/td>

です。とりあえず試しに巡回してみて下さい。 私の場合は上手く行きましたが、皆さんはいかがでしたか?

今回はここまでです、次回は複数ページ対応地域の取得です。

Prev : Next


トップ>Perl&CGI>基本編目次>INCMプラグインで覚えるPerl講座15

©Copyright 2002 GETWILD'74 All Rights Reserved
E-Mail:getwild@mail.wind.ne.jp