[Mew-Win32 03255] Re: 日本語ファイル名のファイルの添付
Hideyuki SHIRAI ( 白井秀行 )
shirai at example.com
2001年 5月 28日 (月) 17:42:19 JST
えっと、もとは semi-gnus ML からです。
From: Shun-ichi GOTO <gotoh at example.com> さん曰く
Subject: Re: 日本語ファイル名のファイルの添付
Message-ID: <20010516.161616.132849953.gotoh at example.com>
Date: Wed, 16 May 2001 16:16:16 +0900 (JST)
水> 私は今でもそうやってますけど、そういう方には自己解凍書庫って
水> やつを送るようにしています。
事故回答^H^H^H^H自己解凍な zip ってどうやって作るのかわからなかっ
たんですが、
後> これを自動化するcode を書く、という手もありますよね。archive 名を新たに
後> (英字ファイルで)入力させて、自動的にZIPファイルなりを作って添付しなおし
後> てくれる(MIME構造を再構成する)とか。
後> # x-gzip64 がおおっぴらに使えないので、こういったものが前々から欲しかっ
後> # たりするのだけど。誰か既に作ってたりしないのかなぁ。。。
# これ、同意見だし。
後> ## 閲覧時にも、zip fileに複数のファイルがあればそれをmultipart かのごと
後> ## く扱えるというのも欲しいカモ。
## そんなにかっこ良くないけど。
水> # つまり、上のコードはこれからも使う予定はありません。^^;;
後> ## 私は(別のcode ですが)業務でたまに使ってます。
以前書き散らかした code を公開してみます。もともと *.gz な
app/oct が直接見れないのがいやで mew-summary-insert-uncompress()
を作って、やっぱ bzip2 や tar も見たいとかいって改造して、そのう
ち送る方も作ろう、というので mew-attach-copy-with-compress() を
作って、やっぱ Win 相手は ZIP だわさ、で mew-attach-copy-with-zip()
を書いて。。。
という感じで、書き足し、書き足しなので、めちゃくちゃ汚いですけど。
## 改善は大歓迎。
--
白井秀行 (mailto:shirai at example.com)
(add-hook
'mew-summary-mode-hook
(lambda ()
(define-key mew-summary-mode-map "\C-c\C-u" 'mew-summary-insert-uncompress)))
(defun mew-summary-insert-uncompress (&optional arg)
"Application/Octet-Stream などで gzip または bzip2 された part を表示する。
ついでに tar/zip の中身も見てみる。
ちなみに、C-u で coding-system の指定もできる。"
(interactive "P")
(mew-summary-part
(let* ((fld (mew-current-get-fld (mew-frame-id)))
(msg (mew-current-get-msg (mew-frame-id)))
(part (mew-syntax-nums))
(cache (mew-cache-hit fld msg 'must-hit))
(syntax (mew-cache-decode-syntax cache))
(stx (mew-syntax-get-entry syntax part))
(ctl (mew-syntax-get-ct stx))
(cte (mew-syntax-get-cte stx))
(cdpl (mew-syntax-get-cdp stx))
(file (mew-syntax-get-filename cdpl ctl))
(begin (mew-syntax-get-begin stx))
(end (mew-syntax-get-end stx))
(buf (current-buffer))
(prog "gzip")
(opts (list "-c" "-d"))
(base64 (if (and cte (string-match "64$" cte)) (setq base64 t)))
(tocs mew-cs-autoconv)
(tarfile nil))
(unwind-protect
(progn
(mew-summary-toggle-disp-msg 'on)
(mew-window-configure 'message)
;; message buffer
(mew-elet
(mew-summary-display-preamble)
(mew-flet
(insert-buffer-substring cache begin end))
(when base64
(condition-case nil
(base64-decode-region (point-min) (point-max))
(error nil)))
(goto-char (point-min))
(cond
;; gzip or bzip2
((or (looking-at (concat "^"
(char-to-string 31)
(char-to-string 139))) ;; gzip ?
(and (looking-at "^BZh") ;; bzip2 ?
(setq prog "bzip2" opts (list "-d"))))
(progn
(message "\"%s\" uncompress ..." (upcase prog))
(mew-plet
(apply (function call-process-region)
(point-min) (point-max)
prog t t nil opts))
(message "\"%s\" uncompress ... done." (upcase prog))
(goto-char (point-min))
(when (and file
(string-match "\\.tar\\.\\|\\.tgz$" file)
(y-or-n-p "View tar ? "))
(setq tarfile
(mew-make-temp-name
(concat (substring file 0 (match-beginning 0)) ".tar")))
(mew-flet
(write-region (point-min) (point-max) tarfile nil 'nomsg)))))
;; zip
((and (re-search-forward "^PK\003\004" nil t)
(y-or-n-p "View ZIP ? "))
(unless file (setq file "tmp.zip"))
(setq tarfile (mew-make-temp-name file))
(mew-flet
(write-region (point-min) (point-max) tarfile nil 'nomsg)))
((and file ;; tar のみ
(string-match "\\.tar$" file)
(y-or-n-p "View tar ? "))
(setq tarfile
(mew-make-temp-name
(concat (substring file 0 (match-beginning 0)) ".tar")))
(mew-flet
(write-region (point-min) (point-max) tarfile nil 'nomsg))))
(goto-char (point-min))
(if arg (setq tocs (read-coding-system "Coding-system: ")))
(mew-cs-decode-region (point-min) (point-max) tocs)
;; (mew-highlight-body)
(mew-summary-display-postscript 'no-hook)))
(mew-pop-to-buffer buf)
(if tarfile (view-file-other-window tarfile))))))
(add-hook
'mew-draft-mode-hook
(lambda ()
(define-key mew-draft-attach-map "g" 'mew-attach-copy-with-compress)
(define-key mew-draft-attach-map "z" 'mew-attach-copy-with-zip)))
(defun mew-attach-copy-with-compress (&optional arg)
"file を gzip または C-u で bzip2 して attach する。
directory なら tar もする。"
(interactive "P")
(let ((prog (if arg "bzip2" "gzip"))
frompath compfile)
(while (or (null frompath)
(and (file-directory-p (file-chase-links frompath))
(not (y-or-n-p (format "\"%s\" is directory. tar + %s ? "
frompath prog)))))
(setq frompath (mew-draft-input-file-name
(format "Copy with %s from: "
(if arg "bzip2" "gzip")))))
(if (not (file-directory-p (file-chase-links frompath)))
(setq compfile (expand-file-name
(file-name-nondirectory frompath) mew-temp-dir))
(setq compfile
(expand-file-name
(concat (file-name-nondirectory
(directory-file-name
(file-name-as-directory frompath)))
".tar")
mew-temp-dir)))
(when (and (file-exists-p compfile) (file-writable-p compfile))
(delete-file compfile))
(if (file-directory-p frompath)
(with-temp-buffer
(setq frompath (file-name-as-directory frompath))
(let ((default-directory (file-name-directory
(directory-file-name frompath))))
(setq frompath (file-name-nondirectory (directory-file-name frompath)))
(message "tar ...")
(mew-flet
(apply (function call-process)
"tar" nil t nil
(list "cf" "-" frompath))
(write-region (point-min) (point-max) compfile nil 'nomsg))))
(copy-file frompath compfile))
(message "%s ..." prog)
(apply (function call-process) prog nil nil nil
(delq nil (list (if (string-match prog "gzip") "-9") compfile)))
(setq compfile (concat compfile (if arg ".bz2" ".gz")))
(message "%s ... done" prog)
(mew-attach-duplicate (function copy-file) "copy" t compfile)
(when (and (file-exists-p compfile) (file-writable-p compfile))
(delete-file compfile))))
(defun mew-attach-copy-with-zip ()
"file/directory を zip して attach する。"
(interactive)
(let (frompath compfile dir args)
(while (or (null frompath)
(and (file-directory-p (file-chase-links frompath))
(not (y-or-n-p (format "\"%s\" is directory. OK ? "
frompath)))))
(setq frompath (mew-draft-input-file-name "Copy with ZIP from: ")))
(setq compfile
(expand-file-name
(concat (file-name-nondirectory
(directory-file-name
(file-name-as-directory frompath)))
".zip")
mew-temp-dir))
(if (file-directory-p (file-chase-links frompath))
(progn
(setq args "-9qr")
(setq frompath (file-name-as-directory frompath))
(setq dir (file-name-directory (directory-file-name frompath)))
(setq frompath (file-name-nondirectory (directory-file-name frompath))))
(setq args "-9q")
(setq dir (file-name-directory frompath))
(setq frompath (file-name-nondirectory frompath)))
(with-temp-buffer
(let ((default-directory dir))
(message "ZIP ...")
(mew-flet
(apply (function call-process)
"zip" nil t nil
(list args "-" frompath))
(write-region (point-min) (point-max) compfile nil 'nomsg))))
(mew-attach-duplicate (function copy-file) "copy" t compfile)
(when (and (file-exists-p compfile) (file-writable-p compfile))
(delete-file compfile))))
Mew-win32 メーリングリストの案内