[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
まず記事見出しを取得する対象となるウェブページを決めることから始めます。
フレーム表示されている場合は、フレームの中で必要なページだけを単独で指し
示す URL を特定するべきです。特定できたら、新たに作成す
る `shimbun' モジュールの中で luna-define-method
を使い、
shimbun-index-url
の定義を作成しましょう。単純に URL を返すように
すれば良いですよ。後で説明しますので、変
数 shimbun-foobar-groups
も用意しておきましょ
う(15)。
(defvar shimbun-foobar-url "http://www.foobar.net") (luna-define-method shimbun-index-url ((shimbun shimbun-foobar)) shimbun-foobar-url) (defvar shimbun-foobar-groups '("news")) |
shimbun-headers
メソッドは `shimbun.el' の中に既に定義されて
いますから、`sb-foobar.el' で shimbun-index-url
メソッドの定
義を作成すればウェブページのソースの取得ができるようになります。
shimbun-headers
はウェブページのソースを取得した後、
shimbun-get-headers
メソッドを呼び、ヘッダ情報の収集に入ります。
`shimbun.el' の中には shimbun-get-headers
のメソッド宣言があ
りせんから、`sb-foobar.el' の中で独自にメソッドを作成しなければなり
ません。
`sb-foobar.el' に shimbun-get-headers
のメソッドを作成するた
めに、取得したページのソースを分析しましょう。どのような正規表現で記事の
ヘッダ情報を収集するかを検討します。記事の見出しとして特に必要な情報は、
標題、日付、作成者、その記事の URL、そして message-id
です。これ
らの情報は、それぞれの MUA において、Subject, Date, From, Xref,
Message-ID として表示されます。例えば、下記の
<a href="030530.html">5月30日の話題(投稿者-みきお <foo@bar.net>)</a> |
のような行を集めて記事にしたいのでしたら、
"<a href=\"\\(\\([0-9][0-9][0-9][0-9]\\)[0-9][0-9]\\.html\\)\">\\([^<(]+\\)(投稿者-\\([^<]+\\))<\/a>" |
のような正規表現になるでしょう。そして記事の Xref の値は
(match-string 1)
で取得できます、Date は
(match-string 2)
の値を加工すれば良いでしょう。Subject は
(match-string 3)
で取得できますね。From は
(match-string 4)
を加工すれば良いでしょう。これらの値
は MUA で見易いように更に加工しても構いません。`sb-muchy.el' では結
構凝った Subject を作っていますので一度見て下さい。
上記のように記事の URL が相対パス表示されている場合は、
shimbun-expand-url
を使用し、絶対パス表示に変更してからヘッダに収
めましょう。記事の URL がヘッダの URL と同じ、つまり記事毎に
個別に URL を持たない構造のウェブページもあります。この場合は少しやっか
いで、ヘッダ情報取得の段階で、記事の内容も取得しておき、Emacs のメモリに
収めておく必要があります。具体的には `sb-palmfan.el',
`sb-dennou.el', `sb-tcup.el' の `shimbun-headers' メソッ
ドの定義を参照して下さい。
ウェブページによっては Date が特定できないものがあります。そういう場合は
無理に特定せずとも ""
を入れておけば OK です。記事の内容を見て初
めて Date が特定できるなら、shimbun-make-contents
メソッドの中で
改めてヘッダに Date の情報を入れても OK です。それから、From を決め打ち
しても良い場合もあります。
message-id
の作成には注意を要します。一部の記事が読めなかったりし
ますので(16)、必
ず単一性 (uniqueness) を保証しなければなりません。日付やドメイン、そのペー
ジの URL の一部を使って文字列を生成することで単一性を確保しましょう。そ
の他、message-id
の一部に必ず `@' を含めるようにし、逆
に `:' は含まないようにしましょう。このルールを守らないとインライン
画像がきちんと出力されませんよ。詳しくは RFC2387, RFC822 を参照して下さ
い。
苦労して取得したこれらの情報は shimbun-create-header
という関数を
利用してヘッダに収めます。
結局 `sb-foobar.el' の中での shimbun-get-headers
の定義の骨
組みはこんな風になりますね。
(luna-define-method shimbun-get-headers ((shimbun shimbun-foobar) &optional range) (let ((regexp "....") subject from date id url headers) ... (catch 'stop (while (re-search-forward regexp nil t nil) ... (when (shimbun-search-id shimbun id) (throw 'stop nil)) (push (shimbun-create-header 0 subject from date id "" 0 0 url) headers))) headers)) |
なお、このメソッドの中では shimbun
という一時変数で、
`shimbun' モジュール `shimbun-foobar' のインスタンスにアクセス
できます。
ところで、先程保留にした変数 shimbun-foobar-groups
について説明し
ましょう。
仮に http://www.foobar.net の中に読みたい記事グループが二つあっ
て、それぞれの記事のヘッダ情報を得るウェブページが別々の場所にあったとし
ましょう。http://www.foobar.net/whatsnew/index.hmtl にサイト
の更新情報が、http://www.foobar.net/ml/index.html に ML の記
事アーカイブの一覧があるときなどです。こういう場合は、`shimbun' モ
ジュール foobar
のグループとして、foobar.whatsnew
,
`foobar.ml' としてアクセスできると便利ですよね。そういう場合は下記
のようにしてみましょう。
(defvar shimbun-foobar-url "http://www.foobar.net") (defvar shimbun-foobar-group-path-alist '(("whatsnew" . "/whatsnew/index.html") ("ml" . "/ml/index.html"))) (defvar shimbun-foobar-groups (mapcar 'car shimbun-foobar-group-path-alist)) (luna-define-method shimbun-index-url ((shimbun shimbun-foobar)) (concat shimbun-foobar-url (cdr (assoc (shimbun-current-group-internal shimbun) shimbun-foobar-group-path-alist)))) |
現在ユーザがアクセスしているグループに
は shimbun-current-group-internal
を使えば分かります。
shimbun-get-headers
などでもグループが違えば作業内容が違ってくる
可能性もありますね。
なお、`shimbun' モジュール一つにつき、最低でも一つのグループが必要 です。グループの名前の決め方に特に決まりはありませんが、グループ名に悩ん だら、`news' とか `main' などと付けておきましょう。