[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 メーリングリストの案内