Navi2ch でインラインに画像を表示する (Referer もつける)
最近の Emacs は画像をインラインに表示できるが、Navi2ch そのものは掲示板の画像をインラインで見ることができない。しかし、《2chログ:Navi2ch for Emacs (Part 11)》の 888 の記事にインライン表示をする elisp とそれ用のシェルスクリプトが書いてあった。
それを Meadow と Cygwin の bash を使って走らせることにする。Cygwin の ImageMagickも使えるようにしておかねばならない。
#!/bin/sh
#### 引数で与えられた画像をダウンロードし縮小したファイル名を返す ####
#### $2 には referer が入る。
tmp=${TMPDIR:-/tmp}/navi2ch-thumbnails
errimage=/cygdrive/c/WINDOWS/pchealth/helpctr/System/images/error.gif
thumbsize="300x150"
origfile="$tmp/${1#*tp://}"
thumbfile="$origfile.jpg"
# すでにテンポラリにあるイメージは再利用する。
if [ ! -f $origfile ]; then
if [ -z "$2" ]; then
/usr/bin/wget "$1" -q -N -x -P $tmp
else
/usr/bin/wget --referer="$2" "$1" -q -N -x -P $tmp
fi
fi
if [ ! -f $origfile ]; then
echo -n "$errimage"
exit
fi
# アニメ Gif は scene 0 だけ取り出す。
scene=`identify -format "%n" "$origfile"`
if [ ! -s $thumbfile -o $thumbfile -ot $origfile ]; then
if [ $scene -gt 1 ]; then
convert -scene 0 -sample $thumbsize "$origfile" "$origfile-%d.jpg" > /dev/null 2>&1
mv "$origfile-0.jpg" $thumbfile > /dev/null 2>&1
else
convert -sample $thumbsize "$origfile" "$origfile.jpg" > /dev/null 2>&1
fi
fi
echo -n "$thumbfile"
|
(eval-after-load "navi2ch"
'(progn
(defvar my-navi2ch-show-image-queue nil)
(defvar my-navi2ch-check-host t
"t なら同じホストの場合のみ連続読み込み時にイメージも読み込む。")
(make-variable-buffer-local 'my-navi2ch-show-image-queue)
(defun my-navi2ch-article-insert-image (proc file)
"FILE で渡された画像をスレに挿入する.PROC が終了すると呼ばれる."
(let ((buf (buffer-name (process-buffer proc))))
(set-process-buffer proc nil)
(unless (file-exists-p file)
(setq my-navi2ch-show-image-queue nil)
(message "画像の取得または作成に失敗しました。"))
(when (and buf
(file-exists-p file))
(with-current-buffer buf
(save-excursion
(let ((buffer-read-only nil)
(orig (file-name-sans-extension file)))
(goto-char (process-mark proc))
(forward-line)
(insert-image (create-image file))
(add-text-properties (1- (point)) (point)
(if (string< navi2ch-version "1.8.0")
(list 'link t 'link-head t
'url orig 'help-echo orig)
(list 'navi2ch-link-type 'url
'navi2ch-link orig
'help-echo orig)))
(insert "\n")
(when my-navi2ch-show-image-queue
(let ((fun (car my-navi2ch-show-image-queue)))
(setq my-navi2ch-show-image-queue
(cdr my-navi2ch-show-image-queue))
(apply (car fun) (cdr fun))))))))))
(defun my-navi2ch-article-show-image ()
"非同期で画像を縮小しインラインに表示する."
(interactive)
(let* ((point (point))
(board (cdr (assq 'uri navi2ch-article-current-board)))
(url (if (string< navi2ch-version "1.8.0")
(get-text-property point 'url)
(get-text-property point 'navi2ch-link)))
(ext (when url
(file-name-extension url)))
(proc (get-buffer-process (current-buffer)))
(stat (and proc (process-status proc))))
(when (and stat (eq stat 'run))
(message "以前のプロセスがまだ動いています。"))
(when (and ext
(not (and stat (eq stat 'run)))
(member (downcase ext) navi2ch-browse-url-image-extentions))
;; Cygwin を使う場合はあったほうがいいのでは?
(setenv "BASH_ENV" "~/.bash_profile")
(setq proc
(start-process "navi2ch.thumb" (current-buffer)
"c:\\cygwin\\bin\\bash.exe"
"-c"
(concat "navi2ch.makethumb " url " " board)))
(set-process-filter proc 'my-navi2ch-article-insert-image)
(set-marker (process-mark proc) point))))
(defun my-navi2ch-article-add-property-and-next-image (beg end force)
(add-text-properties beg end '(my-navi2ch "shown"))
(my-navi2ch-article-show-next-images force))
(defun my-navi2ch-article-show-next-images (&optional force)
"カーソル以下のイメージを連続的に読み込む。"
(interactive "P")
(save-excursion
(let* ((num (navi2ch-article-get-current-number))
(board (cdr (assq 'uri navi2ch-article-current-board))))
(if (re-search-forward
(concat "h?ttp://\\([^ \t\n\r]+\\.\\("
(mapconcat (lambda (s) s)
navi2ch-browse-url-image-extentions "\\|")
"\\)\\)") nil t)
(let ((url (concat "http://" (match-string 1)))
(beg (match-beginning 0))
(end (match-end 0))
(func 'my-navi2ch-article-add-property-and-next-image)
(prop (get-text-property (match-beginning 1)
'my-navi2ch)))
(when (and (or force
(not my-navi2ch-check-host)
(string= (navi2ch-url-to-host url)
(navi2ch-url-to-host board)))
(not (string= prop "shown")))
(goto-char beg)
(my-navi2ch-article-show-image)
(setq my-navi2ch-show-image-queue
(append my-navi2ch-show-image-queue
(list (list func beg end force))))))))))
;; スレを読みにいったときに自動的にイメージを挿入するようにして
;; おく。my-navi2ch-check-host を t にしておけば安心。
(add-hook 'navi2ch-article-mode-hook
'my-navi2ch-article-show-next-images)
;; "T" でその URL だけ強制的に表示。
(define-key navi2ch-article-mode-map "T" 'my-navi2ch-article-show-image)
;; 通常はそのホストのイメージは読み込んでるはずだから、"I" で連
;; 続読みをするときは強制的に全部読む。
(define-key navi2ch-article-mode-map "I"
(lambda () (interactive)
(my-navi2ch-article-show-next-images t)))
))
|
ちなみに、どの掲示板見てるかバレそうだけど、次のようにするとダーティだけど HTTP ヘッダに付けるリファラが設定できたりする。
(eval-after-load "navi2ch"
'(progn
;; 一部リファラがないとアクセスできない掲示板に対応。
(defadvice navi2ch-net-make-request-header
(around navi2ch-net-make-request-header-with-referer
(header-alist) activate)
(let ((header ad-do-it)
(board (or navi2ch-article-current-board
navi2ch-board-current-board)))
(unless (assoc "Referer" header-alist)
(if board
(setq header
(concat header "Referer: " (cdr (assq 'uri board))
"\r\n"))))
(setq ad-return-value header)))
;; document.write だけしかしない javascript なら対応できる。
(setq navi2ch-article-filter-list
(cons
(lambda ()
(goto-char (point-min))
(while (re-search-forward "document\\.write('\\([^']*\\)');" nil t)
(replace-match "\\1")))
navi2ch-article-filter-list))
;; <br /> に対応。
(setq navi2ch-replace-html-tag-alist
(append navi2ch-replace-html-tag-alist
'(("<br />" . "\n"))))
(navi2ch-update-html-tag-regexp)
))
|
おっと、ただし、これらは cygwin-mount.el (説明ページ) が必須です。.emacs に次の行があるのをご確認を。動作の軽い cygwin-mount-mw32.el (説明ページ) というものもあります。
(require 'cygwin-mount) (cygwin-mount-activate) |
| ■ |
追記 (2010-07-01)
|
どうも navi2ch のバージョンアップにより、get-text-property で得る値が変わっているらしい。行儀が悪いが、とりあえずの弥縫策 を反映した。また私が行っているサイトでは <br /> が使われているので、それに対応した。
| 更新: | 06/03/04,2010-07-01 |
| 初公開: | 2006年03月04日 06:44:27 |
| 最新版: | 2010年07月01日 20:21:58 |
2006-03-04 06:44:26 (JST) in Emacs/Meadow Cygwin | 固定リンク | コメント (2) | トラックバック (0)
トラックバック
他サイトなどからこの記事に自薦された関連記事(トラックバック)はまだありません。
» JRF のソフトウェア Tips:Navi2ch でインラインに画像を表示する (Referer もつける) (この記事)
コメント
よろしくです。
投稿: ゆか | 2010-02-04 18:28:57 (JST)
投稿: JRF | 2010-07-01 10:12:41 (JST)