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-w3m は SPC と DEL キーだけでページを全部見れる (言いすぎ?)。
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
- [2005-06-27] Link 要素
- [2005-06-26] Yahoo Search Beta in Emacs-w3m (2)
No comments:
Post a Comment