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)
next prev parent 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).