Gnus development mailing list
 help / color / mirror / Atom feed
From: Katsumi Yamaoka <yamaoka@jpl.org>
To: ding@gnus.org
Subject: Re: default mime for attaching files
Date: Mon, 19 Feb 2007 21:22:00 +0900	[thread overview]
Message-ID: <b4mhctimj6f.fsf@jpl.org> (raw)
In-Reply-To: <877iug6szc.fsf@catnip.gol.com>

[-- Attachment #1: Type: text/plain, Size: 2285 bytes --]

>>>>> In <877iug6szc.fsf@catnip.gol.com> Miles Bader wrote:

> Katsumi Yamaoka <yamaoka@jpl.org> writes:
>> By default, Gnus uses the "inline" disposition for an attachment of
>> which the MIME type is text/* except text/rtf[1].  So, the reason
>> seems to be that the text/* MIME type is specified in your system
>> for *.csv files.  You know how to customize it already. ;-)

> Actually I've always thought that this behavior of Gnus was sort of dumb
> -- I don't think it really makes sense to inline random text/ sub-types.
> Glancing through the list of text/ sub-types in /etc/mime.types, most
> look like the sort of thing I wouldn't want inline; in practice I also
> find that I usually have to override the default (the one which annoys
> most often is text/x-diff).

> Instead I think Gnus should default to "attach", and have a list of
> text/ sub-types which _should_ be inlined (bonus for making it a real
> configurable list, not hardwired in the code...).

I made such one for a trial.  Is this worth implementing in Gnus?

--8<---------------cut here---------------start------------->8---
mml-content-disposition-alist is a variable defined in `mml.el'.
Its value is 
((text
  (rtf . "attachment")
  (t . "inline"))
 (t . "attachment"))

Documentation:
Alist of MIME types or regexps matching file names and default dispositions.
Each element should be one of the following three forms:

  (REGEXP . DISPOSITION)
  (TYPE (SUBTYPE . DISPOSITION) (SUBTYPE . DISPOSITION)...)
  (TYPE . DISPOSITION)

Where REGEXP is a string which matches the file name (if any) of an
attachment, TYPE is a MIME type and SUBTYPE is a MIME subtype of an
attachment, and DISPOSITION should be either "attachment" or "inline".
The value t for TYPE or SUBTYPE matches any MIME types or MIME
subtypes.  The first match found will be used.
--8<---------------cut here---------------end--------------->8---

I did set the default value so as not to change the present
behavior of Gnus.  For instance, Sebastian may want to use the
following:

--8<---------------cut here---------------start------------->8---
(add-to-list 'mml-content-disposition-alist
	     '("\\.csv\\'" . "attachment"))
--8<---------------cut here---------------end--------------->8---

Here's a patch to the Gnus CVS trunk:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 5289 bytes --]

--- mml.el~	2007-01-24 07:13:23 +0000
+++ mml.el	2007-02-19 12:19:12 +0000
@@ -70,6 +70,51 @@
   :type '(repeat (symbol :tag "Parameter"))
   :group 'message)
 
+(defcustom mml-content-disposition-alist
+  '((text (rtf . "attachment") (t . "inline"))
+    (t . "attachment"))
+  "Alist of MIME types or regexps matching file names and default dispositions.
+Each element should be one of the following three forms:
+
+  (REGEXP . DISPOSITION)
+  (TYPE (SUBTYPE . DISPOSITION) (SUBTYPE . DISPOSITION)...)
+  (TYPE . DISPOSITION)
+
+Where REGEXP is a string which matches the file name (if any) of an
+attachment, TYPE is a MIME type and SUBTYPE is a MIME subtype of an
+attachment, and DISPOSITION should be either \"attachment\" or \"inline\".
+The value t for TYPE or SUBTYPE matches any MIME types or MIME
+subtypes.  The first match found will be used."
+  :version "23.0" ;; No Gnus
+  :type (let ((dispositions '(radio :format "DISPOSITION: %v"
+				    :value "attachment"
+				    (const :format "\"%v\" " "attachment")
+				    (const :format "\"%v\" " "inline")
+				    (const :format "\"\"\n" ""))))
+	  `(repeat
+	    :offset 0
+	    (choice :format "%[Value Menu%]%v"
+		    (cons :tag "(REGEXP . DISPOSITION)"
+			  :extra-offset 4
+			  (regexp :tag "REGEXP" :value ".*")
+			  ,dispositions)
+		    (cons :tag "(TYPE (SUBTYPE . DISPOSITION)...)"
+			  :indent 0
+			  (symbol :tag "    TYPE" :value text)
+			  (repeat :format "%v%i\n"
+				  :extra-offset 4
+				  :offset 0
+				  (cons :format "%v"
+					:extra-offset 5
+					(symbol :tag "SUBTYPE"
+						:value t)
+					,dispositions)))
+		    (cons :tag "(TYPE . DISPOSITION)"
+			  :extra-offset 4
+			  (symbol :tag "TYPE" :value t)
+			  ,dispositions))))
+  :group 'message)
+
 (defcustom mml-insert-mime-headers-always nil
   "If non-nil, always put Content-Type: text/plain at top of empty parts.
 It is necessary to work against a bug in certain clients."
@@ -667,6 +712,30 @@
 	    "")
 	  mml-base-boundary))
 
+(defun mml-content-disposition (type &optional filename)
+  "Return a default disposition name suitable to TYPE or FILENAME."
+  (let ((defs mml-content-disposition-alist)
+	disposition def types)
+    (while (and (not disposition) defs)
+      (setq def (pop defs))
+      (cond ((stringp (car def))
+	     (when (and filename
+			(string-match (car def) filename))
+	       (setq disposition (cdr def))))
+	    ((consp (cdr def))
+	     (when (string= (car (setq types (split-string type "/")))
+			    (car def))
+	       (setq type (cadr types)
+		     types (cdr def))
+	       (while (and (not disposition) types)
+		 (setq def (pop types))
+		 (when (or (eq (car def) t) (string= type (car def)))
+		   (setq disposition (cdr def))))))
+	    (t
+	     (when (or (eq (car def) t) (string= type (car def)))
+	       (setq disposition (cdr def))))))
+    disposition))
+
 (defun mml-insert-mime-headers (cont type charset encoding flowed)
   (let (parameters id disposition description)
     (setq parameters
@@ -697,7 +766,9 @@
 	   cont mml-content-disposition-parameters))
     (when (or (setq disposition (cdr (assq 'disposition cont)))
 	      parameters)
-      (insert "Content-Disposition: " (or disposition "inline"))
+      (insert "Content-Disposition: "
+	      (or disposition
+		  (mml-content-disposition type (cdr (assq 'filename cont)))))
       (when parameters
 	(mml-insert-parameter-string
 	 cont mml-content-disposition-parameters))
@@ -1056,16 +1127,13 @@
       (setq description nil))
     description))
 
-(defun mml-minibuffer-read-disposition (type &optional default)
-  (unless default (setq default
-                        (if (and (string-match "\\`text/" type)
-                                 (not (string-match "\\`text/rtf\\'" type)))
-                            "inline"
-                          "attachment")))
+(defun mml-minibuffer-read-disposition (type &optional default filename)
+  (unless default
+    (setq default (mml-content-disposition type filename)))
   (let ((disposition (completing-read
-                      (format "Disposition (default %s): " default)
-                      '(("attachment") ("inline") (""))
-                      nil t nil nil default)))
+		      (format "Disposition (default %s): " default)
+		      '(("attachment") ("inline") (""))
+		      nil t nil nil default)))
     (if (not (equal disposition ""))
 	disposition
       default)))
@@ -1157,7 +1225,7 @@
    (let* ((file (mml-minibuffer-read-file "Attach file: "))
 	  (type (mml-minibuffer-read-type file))
 	  (description (mml-minibuffer-read-description))
-	  (disposition (mml-minibuffer-read-disposition type)))
+	  (disposition (mml-minibuffer-read-disposition type nil file)))
      (list file type description disposition)))
   (save-excursion
     (unless (message-in-body-p) (goto-char (point-max)))
@@ -1188,7 +1256,7 @@
 	(when (memq 'description mml-dnd-attach-options)
 	  (setq description (mml-minibuffer-read-description)))
 	(when (memq 'disposition mml-dnd-attach-options)
-	  (setq disposition (mml-minibuffer-read-disposition type)))
+	  (setq disposition (mml-minibuffer-read-disposition type nil file)))
 	(mml-attach-file file type description disposition)))))
 
 (defun mml-attach-buffer (buffer &optional type description)

  reply	other threads:[~2007-02-19 12:22 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-02-09  0:52 Sebastian P. Luque
2007-02-09  2:00 ` Katsumi Yamaoka
2007-02-09  5:22   ` Sebastian P. Luque
2007-02-09  5:47     ` Katsumi Yamaoka
2007-02-17 23:46       ` Sebastian P. Luque
2007-02-18  0:34         ` Katsumi Yamaoka
2007-02-18  3:32           ` Miles Bader
2007-02-19 12:22             ` Katsumi Yamaoka [this message]
2007-02-19 19:49               ` Reiner Steib
2007-02-19 23:27                 ` Katsumi Yamaoka
2007-02-19 23:49                   ` Sebastian P. Luque

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b4mhctimj6f.fsf@jpl.org \
    --to=yamaoka@jpl.org \
    --cc=ding@gnus.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).