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

Re: html 記事中の name アンカー



青田です。

ちょっと時間がとれたので白井さんのをベースに書いてみました。 白井さんの
案から変更した部分は以下の通りです。

Hideyuki SHIRAI (白井秀行) <shirai@xxxxxxxxxxx> writes:

> From: Katsumi Yamaoka <yamaoka@xxxxxxx> さん曰く
> Subject: [emacs-w3m:10336] html 記事中の name アンカー
> Message-ID: <b4mtzd9iqjc.fsf@xxxxxxx>
> Date: Mon, 25 Aug 2008 14:59:03 +0900
>
>> html 記事の中に
>>
>> <a href="#a">...</a>
>>
>> のようなリンクがある場合に、これが指し示す同じ記事の中の
>>
>> <a name="a">...</a>
>>
>> という場所に移動することができません (少なくとも Gnus では)。
>
> (1) base url で "buffer://" とか新しいものを導入して、
>     (w3m-region pos1 pos2 "buffer://") という感じで実行する。

"buffer://" という url を導入していますが、 w3m-region() の外から url と
して渡すのではなく、 w3m-region() の中で url が nil の時に url を
"buffer://"として扱うようにしています。

> (2) href が "buffer://" なら、view-this-url などでそれなりの処理
>     をする。

w3m-view-this-url() はそのまま通してしまうので問題はないのですが、
w3m-safe-view-this-url() が "buffer://*" を安全でないとみなすことがあるの
で "buffer://*" は常に安全とするようにしてあります。

> (3) name anchor なら良いけど、他のファイルだとどうするんだろう。

とりあえず他のファイルの時は default-directory で展開するようにしてみまし
た。

> というぐらいしか考え付きませんでした。ううぅむ。

とりあえずの実装ですのでいくつか問題も残っています。

- buffer の2個所以上で w3m-region している時の処理
-- 同名アンカーが複数の region にある場合、別の region のアンカーに移動
   してしまう
- 普通の w3m buffer で "buffer://" を同様に処理してしまってもよいのか。

# shimbun 用で使う分には気にすることもないでしょうけど ^^;

--
青田

Index: w3m.el
===================================================================
RCS file: /storage/cvsroot/emacs-w3m/w3m.el,v
retrieving revision 1.1380
diff -u -r1.1380 w3m.el
--- w3m.el	1 Sep 2008 10:14:41 -0000	1.1380
+++ w3m.el	5 Sep 2008 15:58:03 -0000
@@ -8494,6 +8494,11 @@
 			       (setq w3m-modeline-title-timer nil))))
 			 (current-buffer)))))))
 
+(defconst w3m-buffer-local-url "buffer://")
+(defun w3m-buffer-local-url-p (url)
+  (save-match-data
+    (string-match (concat "^" w3m-buffer-local-url) url)))
+
 ;;;###autoload
 (defun w3m-goto-url (url &optional reload charset post-data referer handler
 			 element)
@@ -8576,6 +8581,22 @@
 				 (eval w3m-local-find-file-function))
 			       file)))))
       (error nil)))
+   ;; process buffer-local url
+   ((w3m-buffer-local-url-p url)
+    (let (file-part fragment-part)
+      (w3m-string-match-url-components url)
+      (setq file-part (concat (match-string 4 url)
+			      (match-string 5 url))
+	    fragment-part (match-string 9 url))
+      (cond
+       ((and (string= file-part "")
+	     fragment-part)
+	(w3m-search-name-anchor fragment-part))
+       ((not (string= file-part ""))
+	(w3m-goto-url (w3m-expand-url (substring url (match-beginning 4))
+				      (concat "file://" default-directory))
+		      reload charset post-data referer handler element))
+       (t (w3m-message "No URL at point")))))
    ((w3m-url-valid url)
     (w3m-buffer-setup)			; Setup buffer.
     (w3m-arrived-setup)			; Setup arrived database.
@@ -9195,7 +9216,9 @@
     (let ((w3m-current-buffer (current-buffer)))
       (unless charset
 	(setq charset (w3m-correct-charset (w3m-detect-meta-charset))))
-      (setq w3m-current-url url
+      (setq url (or url
+		    w3m-buffer-local-url)
+	    w3m-current-url url
 	    w3m-current-base-url url
 	    w3m-current-coding-system
 	    (if charset
@@ -10037,6 +10060,7 @@
      (url
       (setq safe-regexp (get-text-property (point) 'w3m-safe-url-regexp))
       (if (or (not safe-regexp)
+	      (w3m-buffer-local-url-p url)
 	      (string-match safe-regexp url)
 	      (and force
 		   (or (not (interactive-p))
@@ -10071,6 +10095,7 @@
 	(let ((safe-regexp (get-text-property (point) 'w3m-safe-url-regexp))
 	      (use-dialog-box t))
 	  (when (or (not safe-regexp)
+		    (w3m-buffer-local-url-p url)
 		    (string-match safe-regexp url)
 		    (y-or-n-p "\
 This link is considered to be unsafe; continue? "))