[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
w3mmee 対応
- From: Hideyuki SHIRAI (白井秀行) <shirai@xxxxxxxxxxx>
- Date: Wed, 04 Mar 2009 14:20:46 +0900 (JST)
- X-ml-name: emacs-w3m
- X-mail-count: 10745
# やっぱ、全部コミットしよっと ^^;;;
最近 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)