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

Re: w3m-type for w3m-0.3-m17n-20020316.tar.gz



>> On Mon, 18 Mar 2002 13:25:20 +0900 (JST)
>> 「白井」== shirai@rdmg.mgcs.mei.co.jp (Hideyuki SHIRAI (白井秀行)) said as follows:

白井> けど、化ける記事は wanderlust でも化けるし、(試していませんが)
白井> T-gnus で shimbun しても化けるんじゃないかな。w3mmee も化ける
白井> sb-*.el があると思います。

T-gnus + w3mmee で試してみましたが,とりあえず sb-zdnet.el は大丈夫で
したよ.

白井> 原因としては、w3m-m17n だと retieve 結果の buffer が *生* のバイ
白井> ト列だけど、w3m だと *生じゃない* データで、shimbun 自体は *生じゃ
白井> ない* と思って動いているからだと思います。

これ,ちょっと信じられないのですが.

    (defun shimbun-retrieve-url (url &optional no-cache no-decode)
      (let (type)
        (when (and url (setq type (w3m-retrieve url no-decode no-cache)))
          (unless no-decode
            (w3m-decode-buffer url))
          type)))

という関数定義になっているので,第3引数で明示的に指定されていない限り,
w3m-type の値に関わらず,buffer は decode されるはずなんですけど.

reed> これは、
reed> w3m-0.3-m17n-20020316.tar.gzを使うときのw3m-typeは、'w3m でよい
reed> w3m-typeが 'w3m-m17n でも文字化けせずに取れるべき

白井> おそらく後者でしょう。きっと、昔からダメだったんじゃないのかなぁ?

後者の方針での解決を希望します.

白井> ぼくが zdnet に適用した方法を全体的にうまくやればいいと思うのだ
白井> けど、ぼくには上記の様な泥臭い方法しか考え付きません。なにか、き
白井> れいな方法はあるでしょうか?

というわけで,白井さんの提案された変更にはかなり疑問を感じます.

あ,ひょっとして,以下のパッチでどうにかなったりします?
--- shimbun.el	20 Nov 2001 04:51:23 -0000	1.47
+++ shimbun.el	18 Mar 2002 14:32:57 -0000
@@ -114,7 +114,7 @@
   "Rertrieve URL contents and insert to current buffer.
 Return content-type of URL as string when retrieval succeeded."
   (let (type)
-    (when (and url (setq type (w3m-retrieve url no-decode no-cache)))
+    (when (and url (setq type (w3m-retrieve url nil no-cache)))
       (unless no-decode
 	(w3m-decode-buffer url))
       type)))
@@ -123,7 +123,7 @@
   "Return a buffer which contains the URL contents."
   (with-current-buffer (get-buffer-create " *shimbun-work*")
     (erase-buffer)
-    (if (and url (w3m-retrieve url no-decode no-cache))
+    (if (and url (w3m-retrieve url nil no-cache))
 	(inline
 	  (unless no-decode
 	    (w3m-decode-buffer url))
これ,非常にややこしくて困っているのですが,w3m-retrieve() の 第2引数 
no-decode は,漢字コードを decode しないことを指定する引数ではなく,転
送用に変換・圧縮されたコンテンツを展開するかどうかを指定する引数なんで
すね.ですから,shimbun ライブラリに限定して言えば,これを t にするこ
とが必要になることはないと思います.

もし,これがアタリでしたら,非同期化の作業をやったときに私がエンバグし
てしまったんですね.ごめんなさい.

白井> sb-tcup.el などにある、

白井> (decode-coding-region (point-min) (point-max)
白井> 			  (shimbun-coding-system-internal shimbun))

白井> をみんな設定すればいいのかな? とも思うのですが、
白井> shimbun-coding-system-internal ってどこでどうなっているのかさえ
白井> わからない。

shimbun-coding-system-internal は廃止しましょう,ということになってい
ます.詳しくは,[emacs-w3m:00952] からのスレッドを参照してください.

それで気になって,shimbun-coding-system-internal() が利用されているバッ
クエンドを見直してみました.

まず sb-gnome.el ですが,変数 shimbun-gnome-coding-system が何処にも定
義されていないので,そもそもこれは動作していないのではないでしょうか? 
以下の変更を提案します.
--- sb-gnome.el	20 Nov 2001 04:51:23 -0000	1.7
+++ sb-gnome.el	18 Mar 2002 14:09:55 -0000
@@ -46,7 +46,6 @@
     "gtk-i18n-list" "gtk-list" "gtk-perl-list" "guppi-list" "libart"
     "libart-hackers" "orbit-list" "vote" "wm-spec-list"
     "xml" "xslt"))
-(defvar shimbun-ding-coding-system 'iso-8859-1)
 
 (luna-define-method shimbun-index-url ((shimbun shimbun-gnome))
   (concat (shimbun-url-internal shimbun)
@@ -74,10 +73,7 @@
 	 (concat (shimbun-url-internal shimbun)
 		 "/" (shimbun-current-group-internal shimbun)
 		 "/" month "/date.html")
-	 'reload 'binary)
-	(set-buffer-multibyte t)
-	(decode-coding-region (point-min) (point-max)
-			      (shimbun-coding-system-internal shimbun))
+	 'reload)
 	(let (date date-next date-parsed beg end subject id)
 	  (goto-char (point-min))
 	  (while (or date-next
sb-glimpse.el でも使われているようですが,これは,sb-ding.el の読み込
みを iso-8859-1 で行うためのものですよね? でしたら,以下の変更でどうで
しょうか.
diff -u -r1.5 sb-glimpse.el
--- shimbun/sb-glimpse.el	20 Nov 2001 04:51:23 -0000	1.5
+++ shimbun/sb-glimpse.el	18 Mar 2002 14:15:02 -0000
@@ -55,10 +55,7 @@
       (dolist (aux auxs)
 	(let ((url (shimbun-expand-url (concat aux "/")
 				       (shimbun-index-url shimbun))))
-	  (shimbun-retrieve-url url 'reload 'binary)
-	  (set-buffer-multibyte t)
-	  (decode-coding-region (point-min) (point-max)
-				(shimbun-coding-system-internal shimbun))
+	  (shimbun-retrieve-url url 'reload)
 	  (shimbun-mhonarc-get-headers shimbun url headers aux))))
     headers))
 
diff -u -r1.6 sb-ding.el
--- shimbun/sb-ding.el	20 Nov 2001 04:51:23 -0000	1.6
+++ shimbun/sb-ding.el	18 Mar 2002 14:18:04 -0000
@@ -40,6 +40,13 @@
 (defvar shimbun-ding-litemplate-regexp
   "<td><strong><a name=\"\\([0-9]+\\)\" href=\"\\(msg[0-9]+.html\\)\">\\([^<]+\\)</a></strong>\n<td><em>\\([^<]+\\)</em>")
 
+(luna-define-method shimbun-get-headers
+  :around ((shimbun shimbun-ding) &optional range)
+  (let ((w3m-coding-system-priority-list
+	 (cons (shimbun-coding-system-internal shimbun)
+	       w3m-coding-system-priority-list)))
+    (luna-call-next-method)))
+
 (provide 'sb-ding)
 
 ;;; sb-ding.el ends here
これは,shimbun-article() / shimbun-headers() の大元で同様の処理を入れ
てしまった方が良いかもしれません.sb-w3m-dev.el でも同様の処理が入って
いますし,害がある変更ではないと思うので.

ついでに shimbun-retrieve-url-buffer() の使われ方も気になったので,ちょっ
と眺めてみたのですが,sb-yahoo.el はうまく動いているのでしょうか? 以下
のように変更しないと,全てのへッダを取り込めないような気がするのですが.
--- sb-yahoo.el	20 Nov 2001 04:51:23 -0000	1.12
+++ sb-yahoo.el	18 Mar 2002 14:22:30 -0000
@@ -118,7 +118,7 @@
 	  (when (re-search-forward "<a href=\"\\([^\"]+\\)\">次のページ</a>" nil t)
 	    (let ((url (match-string 1)))
 	      (erase-buffer)
-	      (shimbun-retrieve-url-buffer url t)
+	      (shimbun-retrieve-url url t)
 	      (goto-char (point-min)))))))
     headers))
 
これ以外で shimbun-retrieve-url-buffer() が使われているところ(3個所)は,

    (with-current-buffer (shimbun-retrieve-url-buffer ...) ...)

という定まった形式で使われているので,全て,

    (with-temp-buffer (shimbun-retrieve-url ...) ...)

で置き換えられると思います.

ところで,気づいていなかったのですが,ZDnet って最近に構造が変わったの
ですね? なんだか余分な広告が挿入されるようになってしまいましたし,表題
に改行が混ざってしまう,記事の日付が正常に Date: へッダに設定されない,
などの不具合が出ているようです.とりあえず,広告を削除するためのパッチ
です.
--- sb-zdnet.el	20 Nov 2001 04:51:23 -0000	1.14
+++ sb-zdnet.el	18 Mar 2002 13:50:58 -0000
@@ -125,6 +125,15 @@
 			   "-get-headers"))
 	   shimbun))
 
+(luna-define-method shimbun-make-contents :before ((shimbun shimbun-zdnet) header)
+  (let ((case-fold-search t)
+	(start))
+    (while (and (search-forward "<!-- AD START -->" nil t)
+		(setq start (match-beginning 0))
+		(search-forward "<!-- AD END -->" nil t))
+      (delete-region start (point)))
+    (goto-char (point-min))))
+
 (provide 'sb-zdnet)
 
 ;;; sb-zdnet.el ends here
なお,いずれも目でコードを追い掛けただけで動作確認せずに書いていますの
で,かなりあやしいです.動作確認をお願いします.それから,今週はオフラ
インの時間が非常に長いので,反応はかなり遅くなると思います.

-- 
土屋 雅稔  ( TSUCHIYA Masatoshi )