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

Re: w3m-decode-buffer



From: Katsumi Yamaoka <yamaoka@xxxxxxx>
Subject: [emacs-w3m:09407] Re: w3m-decode-buffer
Date: Wed, 25 Apr 2007 10:31:42 +0900

> >>>>> In [emacs-w3m : No.09406] 青田さん wrote:
> 

> > また、以下はパッチとは関係ないのですがw3m-decode-bufferで気になった所
> > がいくつかあります。
> > 1.about://source/時も&#nnn;、src・hrefの中の非ASCII文字をdecodeしてい
> > ること
> 
> src・href の方は *encode* ですよね?
> "http://テスト/" が "http://%83e%83X%83g/" になってしまうのは、
> 2007-02-20 の変更の副作用です。これは直そうと思います。
> 
> 逆に元が "http://%83e%83X%83g/" だったものは "http://テスト/" と
> して表示した方が良いのではないかと思うんですが、いかがでしょうか。
> 
> ぼくの勝手な解釈では、about://source/ の目的は、&#nnn; の decode
> を含めて、ソースを人間が見やすく表示することなんですよね。
> 
> 本当に生で無修正のソースが必要なとき、ぼくは w3m-download や
> wget を使いますから。
> 

はい、encodeです。w3m-decode-bufferの名前にひきずられてしまいました。
人間の可読性のためなら賛成です。他のブラウザのソース表示と同じ
イメージで考えてたので。
;; ですが、ちょっと生ソース見たい時用に切り替えられるといいかも、とも思います。

> > 2.""でくくったものはdecodeされるが、''ではされないこと
> 
> 疎くてすみません。具体的には?
> 

例えば、
<a href="日本語.html">日本語.html</a><br>
<a href='日本語.html'>日本語.html</a><br>
が、
<a href="%e6%97%a5%e6%9c%ac%e8%aa%9e.html">日本語.html</a><br>
<a href='日本語.html'>日本語.html</a><br>
となっています。

HTMLの仕様に詳しくはないのですが、htmllintにもvalidatorにもひっかからないので
''もURIをくくるのに使えると思います…が、実際に使ってるサイトは
見つけられませんでした…。とりあえず、パッチにしてあります。

また、これを実験してて気がついたのですが、リンク先がローカルファイルの時は
逆にencodeしたらだめのように思います。

解決方法として
1.ローカルな時はencodeしない
2.w3m-goto-urlで読む時にdecodeする
と2つ思いつきましたが、カーソルのせた時に日本語で表示させるため、
2のほうがよりWeb上のデータと処理が似ているため、下のパッチでは2番を使っています。

> > 3.日本語を含むURIで、#アンカーが使えなさそうなこと
> > 4.3等の理由で日本語アンカーが使えないこと
> > (3・4はサイトがHTML4.01に準拠していれば問題はないのですが…)
> 
> うーむ、これはとりあえず TODO リストに追加。
> 
> > よろしければ検討おねがいします。
> > ;; ソース読んでたらいつのまにか朝…
> 
> お疲れさまです。
> ところで、今後はなるべくご自分で ChangeLog の項目を書いて下さる
> ことをお願いします。変更の真意を一番的確に表現できるのは、何といっ
> てもご本人ですから。:)
了解しました。変な英語を書きそうですが、がんばります。

ということで、今回のパッチは
1.src='...'・href='...'の中もencodeする
2.localなURIな時はdecodeしなおす
の2点です。

2の変更時にg、Gで非ASCII文字を含むURLをいれた時にエラーになっていました。
w3m内部からの呼出しならURL encodeされている、と思うので
非ASCII文字を含む時はdecodeしないようにしてあります。

Index: ChangeLog
===================================================================
RCS file: /storage/cvsroot/emacs-w3m/ChangeLog,v
retrieving revision 1.2998
diff -u -r1.2998 ChangeLog
--- ChangeLog	25 Apr 2007 11:38:55 -0000	1.2998
+++ ChangeLog	25 Apr 2007 11:54:47 -0000
@@ -1,3 +1,9 @@
+2007-04-25  Naohiro Aota  <nao.aota@xxxxxxxxx>
+
+	* w3m.el (w3m-decode-buffer): Encode urls containing non-ASCII
+	characters quoted with '' as well as those quoted with "".
+	(w3m-goto-url): Decode urls when url is local.
+
 2007-04-25  Katsumi Yamaoka  <yamaoka@xxxxxxx>
 
 	* w3m.el (w3m-decode-buffer): Don't encode urls containing non-ASCII
Index: w3m.el
===================================================================
RCS file: /storage/cvsroot/emacs-w3m/w3m.el,v
retrieving revision 1.1270
diff -u -r1.1270 w3m.el
--- w3m.el	25 Apr 2007 11:38:55 -0000	1.1270
+++ w3m.el	25 Apr 2007 11:55:37 -0000
@@ -4376,19 +4376,34 @@
 <[\t\n\r ]*\\(?:\\(a\\)\\|\\(img\\)\\)[\t\n\r ]+\
 \\(?:[\000-\075\077-\177]*[^\000-\177]+\\)+[\000-\075\077-\177]*>"
 				  nil t)
-	  (when (if (match-end 1)
-		    (re-search-backward "[\t\n\r ]href[\t\n\r ]*=[\t\n\r ]*\
+	  (save-match-data
+	    (save-excursion
+	      (when (if (match-end 1)
+			(re-search-backward "[\t\n\r ]href[\t\n\r ]*=[\t\n\r ]*\
 \"\\(\\(?:[\000-\041\043-\177]*[^\000-\177]+\\)+[\000-\041\043-\177]*\\)"
-					(match-end 1) t)
-		  (re-search-backward "[\t\n\r ]src[\t\n\r ]*=[\t\n\r ]*\
+					    (match-end 1) t)
+		      (re-search-backward "[\t\n\r ]src[\t\n\r ]*=[\t\n\r ]*\
 \"\\(\\(?:[\000-\041\043-\177]*[^\000-\177]+\\)+[\000-\041\043-\177]*\\)"
-				      (match-end 2) t))
-	    (insert (w3m-url-encode-string
-		     (prog1
-			 (match-string 1)
-		       (delete-region (goto-char (match-beginning 1))
-				      (match-end 1)))
-		     w3m-current-coding-system))))))))
+					  (match-end 2) t))
+		(insert (w3m-url-encode-string
+			 (prog1
+			     (match-string 1)
+			   (delete-region (goto-char (match-beginning 1))
+					  (match-end 1)))
+			 w3m-current-coding-system)))))
+	  (when (if (match-end 1)
+			(re-search-backward "[\t\n\r ]href[\t\n\r ]*=[\t\n\r ]*\
+'\\(\\(?:[\000-\046\048-\177]*[^\000-\177]+\\)+[\000-\046\048-\177]*\\)"
+					    (match-end 1) t)
+		      (re-search-backward "[\t\n\r ]src[\t\n\r ]*=[\t\n\r ]*\
+'\\(\\(?:[\000-\046\048-\177]*[^\000-\177]+\\)+[\000-\046\048-\177]*\\)"
+					  (match-end 2) t))
+		(insert (w3m-url-encode-string
+			 (prog1
+			     (match-string 1)
+			   (delete-region (goto-char (match-beginning 1))
+					  (match-end 1)))
+			 w3m-current-coding-system))))))))
 
 (defun w3m-x-moe-decode-buffer ()
   (let ((args '("-i" "-cs" "x-moe-internal"))
@@ -7989,6 +8004,9 @@
   (unless (or (w3m-url-local-p url)
 	      (string-match "\\`about:" url))
     (setq url (w3m-url-transfer-encode-string url w3m-default-coding-system)))
+  (when (and (w3m-url-local-p url)
+	     (not(string-match "[^\000-\177]" url)))
+    (setq url (w3m-url-decode-string url)))
   (cond
    ;; process mailto: protocol
    ((string-match "\\`mailto:" url)