2005-06-29

Emacs-w3m で「次・前」のページへ |Emacs-w3m|HTML|

Emacs-w3m では、ちょっとした quick hack で HTML の link 要素を辿るようにできる。今回はその発展編 (?) で、link 要素のないページで「次」のページと「前」のページを推測する機能について。

rel="next/prev" を辿る

その前に Emacs-w3m の link 要素サポートに関して一言。実は、先日の hack を加えなくとも、 rel="next" (or rel="prev") だけなら Emacs-w3m はデフォールトでサポートしている。

例えば、 Google で何かを検索してみよう。 SPC を連打してページの一番下まで行く。そこでもう一回 SPC を打つと、 Emacs-w3m は「次」の検索結果ページへとジャンプする。「前」の検索結果に戻りたければ、 DEL。もし、ウェブページの全てに link 要素が (ちゃんと) 入っていれば、 Emacs-w3mSPCDEL キーだけでページを全部見れる (言いすぎ?)。

link 要素の推測

さて、 Google の検索結果ページのソースを見てみよう。ソースに、link 要素が見あたらないはず。そう、 Google は link 要素を持っていない。さっきの「次の検索結果」へのジャンプは、 Emacs-w3m の link 要素推測機能で実現されている。

Emacs-w3m の link 要素推測機能は、ページごとに link 要素を推測させるルールを追加することで実現している。ルールは変数 w3m-relationship-estimate-rules に書かれているので、新しいルールの追加は次のようにする。

(setq w3m-relationship-estimate-rules
     (cons `(ルール) w3m-relationship-estimate-rules))

ルールの書式は次の通り。

`("ルールを適用するサイトの URL"
  "「次の」リンク (を含むテキスト)"
  "「前の」リンク (を含むテキスト)"
 nil nil)
例えば、http://www.foo.bar で <a href="bar003.html">次へ</a> が「次のページ」へのリンクに、 <a href="bar001.html">前へ</a> が「前のページ」へのリンクになっていたら、次のように書く。
(setq w3m-relationship-estimate-rules
  (cons `("\\`http://www\\.foo\\.bar"
          ,(concat "<a href=" w3m-html-string-regexp ">次へ</a>")
          ,(concat "<a href=" w3m-html-string-regexp ">前へ</a>")
          nil nil)))

URL 関連は全て正規表現。なので、. (period) は \ (backslash) でエスケープ。リンク先の bar003.html は bar004.html や bar005.html なんて感じに変わるかもしんない。 Google みたいに、機械的にリンク URL を作ってるかもしんない。ここは、 Emacs-w3m が用意している URL 用の正規表現 w3m-html-string-regexp を使うのがミソ。

実際の例は、w3m.el の中にある w3m-relationship-estimate-rules のソース・コードとか、 Yahoo Search Beta in Emacs-w3m (2) を参照されたし。

ref

No comments:

Post a Comment