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

w3mmee 対応



# やっぱ、全部コミットしよっと ^^;;;

最近 w3mmee 遊びをしているのですが、有史以来のバグを発見しました。

(1) w3m-w3m-parse-header() で `w3m-document-charset' を見ている
    ところがあるが、headers に `w3m-document-charset' が入ってい
    ないのでいつも nil となる。

 => html 中の META をみて、x-moe-internal になっていた模様。

(2) w3m-w3m-parse-header() で content-type の charset があれば、
    以降すべてその charset を使っているが、例えば、

    http://www.info.pmda.go.jp/go/pack/1319730Q1206_1_03 

    を w3mmee で見ると、

・header
W3M-Document-Charset: x-moe-internal
Content-Type: text/html;charset=EUC-JP

・html
<html><head><meta http-equiv="Content-Type" content="text/html; charset=x-moe-internal">

  となっていて、本来は W3M-Document-Charset を使って
  x-moe-internal にしないといけないが、euc-jp で扱ってしまい文字
  化けする。

という問題です。

........

もう一丁ついでに(というかもともとこっちの遊びをしていたの)ですが、

(3) x-w3m-content-encoding があったら、w3m-type によらずその値を
    使用する。

(4) charset が x-moe-internal なるだったら、w3m-type によらず、
    w3m-x-moe-decode-buffer() を召喚する。

というのを入れています。これをやっておくと、

(a) 普段は素の w3m(-m17n) を使っている。
(b) w3mmee with libmoe を "w3mmee" という名前でインストールして
    おく。
(c) frame があったときだけ、自動的に w3mmee で retrieve して
    frame を表示する。

というのができます。

(add-hook 'w3m-display-hook 'w3m-frame-view)

(defun w3m-frame-view (url)
  (when (and (fboundp 'w3m-retrieve-with-w3mmee)
	     (string-match "\\`https?://" url))
    (let ((headers (w3m-cache-request-header url))
	  (case-fold-search nil)
	  (regex "^ *--\\(FRAME\\)--\n")
	  (rep "FRAME-RENDERING with w3mmee")
	  frame)
      (if (or (string-match "\nX-W3M-" headers)
	      (string-match "\nW3M-Document-Charset: x-moe-internal" headers))
	  (save-excursion
	    (goto-char (point-min))
	    (if (re-search-forward regex nil t)
		(w3m-message "Frame rendering...MISS")
	      (w3m-message "Frame rendering...done")))
	(save-excursion
	  (goto-char (point-min))
	  (let ((buffer-read-only nil))
	    (when (re-search-forward regex nil t)
	      (setq frame t)
	      (put-text-property 0 (length rep) 'face 'w3m-bold rep)
	      (goto-char (match-beginning 1))
	      (delete-region (match-beginning 1) (match-end 1))
	      (insert rep)
	      (while (re-search-forward regex nil t)
		(goto-char (match-beginning 1))
		(delete-region (match-beginning 1) (match-end 1))
		(insert rep)))))
	(when frame
	  (w3m-retrieve-with-w3mmee)
	  (w3m-message "Frame rendering..."))))))

(defun w3m-retrieve-with-w3mmee (&optional url)
  (interactive)
  (when (or (string-match "\\`https?://" w3m-current-url)
	    url)
    (setq w3m-halfdump-command (w3m-which-command "w3m"))
    (let ((w3m-type 'w3mmee)
	  (w3m-command "w3mmee")
	  (w3m-add-user-agent nil)
	  (w3m-command-arguments
	   `("-F" "-o" "concurrent=0"
	     "-header" "Accept-Language: ja; q=1.0 en; q=0.5"
	     "-header" "User-Agent:Emacs-w3m/cvs w3m/mee+moe"))
	  (w3m-dump-head-source-command-arguments '("-dump=extra,head,source")))
      (if (and url
	       (y-or-n-p (format "View %s with w3mmee? " url)))
	  (w3m-view-this-url)
	(w3m-reload-this-page)))))


上記中の

      (if (or (string-match "\nX-W3M-" headers)
	      (string-match "\nW3M-Document-Charset: x-moe-internal" headers))
	  (save-excursion
	    (goto-char (point-min))
	    (if (re-search-forward regex nil t)
		(w3m-message "Frame rendering...MISS")

は w3mmee でも frame の表示に失敗するときがあるので、無限ループ
作らないようにガードで入れています。例えば、
http://www.geocities.jp/suku_domo/ は失敗します。

-- 
白井秀行 (mailto:shirai@xxxxxxxxxxx)