[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

w3m--get-page-anchors()



白井です。

## 英語で説明できる自信がまったくないので日本語で。

w3m--get-page-anchors() ですが、二つほど問題を見つけました。

(1) w3m-anchor-list-filter-alist で、あらゆる URL で
  "\\`cite_.*[0-9]\\'" を anchor の対象から外していますが、これ
  デフォルトでやっちゃうと wikipedia の「注釈 (cite_note_*)」
  「出典 (cite_ref_*)」が全滅になるので、やめた方がよいと思いま
  す。

  本当は、「wikipedia 以外で」と w3m-anchor-list-filter-alist を
  書きたいところですが、今のままではできません。

  個人的には nil でいいじゃんなので、深追いしません :-)

(2) (setq w3m-anchor-list-filter-alist nil) とかして、note,
    references の anchor をたどれるようにしても、『ずれた位置』
    に飛んでしまいます。

たとえば、<https://en.wikipedia.org/wiki/W3m> で

==============================================================
  Operating   OS/2,^[3]^[4] Unix & Unix-like (Solaris, SunOS, HP-UX, Linux, FreeBSD and EWS-UX (EWS-4800),^[5]
                                                                                                     return↑
  の [5] で return を押すと、

 4. ^ ^a ^b Watson, Dave (September 2001). "Text-Mode Web Browsers for OS/2". The Southern California OS/2
    User Group. Retrieved 16 August 2010.
 5. ^ w3m manual page                   ↑incorrect jump
   ↑correct position
==============================================================

となると思います。(古い?emacs-w3mでは correctの位置になって、リ
ターンだけで相互の位置が切り替わる感じに動きます)

これは、w3m-name-anchor, w3m-name-anchor2 の二つの property の使
い方を間違っているからです。昔の emacs-w3m では anchor を search
するときは次の二つのステップで位置を決めていました。

 1st step: まず、w3m-name-anchor をサーチして、合致する anchor が
 あったら、そこへ飛ぶ。

 2nd step: もし、『w3m-name-anchor に合致する anchor がなかった場
 合』のみ w3m-name-anchor2 で合致する anchor を探す

 (両方なかったら "not found")


現状の実装だと w3m-name-anchor, w3m-name-anchor2 を混ぜたあと
point を sort して小さい方の point に飛ぶので、さっきの「ここに
飛ぶ」のように期待したところの手前に移動しちゃうのでした。当時、
なんだかどうしようもなくてこういう風な二段階の実装にした記憶があ
ります。

なので、w3m--get-page-anchors() はこんな風にする必要があります。

## sort って意味あるかなぁ?

(defun w3m--get-page-anchors (&optional sub-sets sort-method)
  "Return list of page anchors, sorted by SORT-METHOD.
SUB-SETS defines from where to draw anchor information.  It defaults to
`all', but may also be `w3m-name-anchor' or `w3m-name-anchor2'.
SORT-METHOD defaults to `position', but may also be `name' or a function
that can be passed to `sort'."
  (let ((pos (point-min))
        anchor-list anchor2)
    ;; NOTE: w3m-name-anchor aggregates data from `w3m -half-dump'.
    (unless (eq sub-sets 'w3m-name-anchor2)
      (while (setq pos (next-single-property-change pos 'w3m-name-anchor))
        (push (cons (car (get-text-property pos 'w3m-name-anchor)) pos)
              anchor-list))
      (setq pos (point-min)))
    (unless (eq sub-sets 'w3m-name-anchor)
      (while (setq pos (next-single-property-change pos 'w3m-name-anchor2))
        (setq anchor2 (car (get-text-property pos 'w3m-name-anchor2)))
        (unless (assoc anchor2 anchor-list)
          (push (cons anchor2 pos) anchor-list))))
    (setq anchor-list (w3m--filter-page-anchors anchor-list))
    (sort anchor-list
          (cond
           ((or (not sort-method) (eq sort-method 'position))
            (lambda (x y) (< (cdr x) (cdr y))))
           ((eq sort-method 'name)
            (lambda (x y) (string-lessp (downcase (car x)) (downcase (car y)))))
           ((functionp sort-method) sort-method)
           (t (error "Invalid arg: SORT-METHOD"))))))

以上!

## 日本語でも説明難しかったから、英語無理 (^_^)