Mercurial > emacs
annotate lisp/gnus/rfc2231.el @ 67086:7ae3d744378e
(Custom-reset-standard): Make it handle Custom group
buffers correctly. (It used to throw an error in such buffers.)
Make it ask for confirmation in group buffers and other Custom
buffers containing more than one customization item.
author | Luc Teirlinck <teirllm@auburn.edu> |
---|---|
date | Tue, 22 Nov 2005 23:28:28 +0000 |
parents | fafd692d1e40 |
children | 28264c86d408 2d92f5c9d6ae |
rev | line source |
---|---|
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
1 ;;; rfc2231.el --- Functions for decoding rfc2231 headers |
31717 | 2 |
64754
fafd692d1e40
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64671
diff
changeset
|
3 ;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, |
fafd692d1e40
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64671
diff
changeset
|
4 ;; 2005 Free Software Foundation, Inc. |
31717 | 5 |
6 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org> | |
7 ;; This file is part of GNU Emacs. | |
8 | |
9 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
10 ;; it under the terms of the GNU General Public License as published by | |
11 ;; the Free Software Foundation; either version 2, or (at your option) | |
12 ;; any later version. | |
13 | |
14 ;; GNU Emacs is distributed in the hope that it will be useful, | |
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 ;; GNU General Public License for more details. | |
18 | |
19 ;; You should have received a copy of the GNU General Public License | |
20 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
64085 | 21 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
22 ;; Boston, MA 02110-1301, USA. | |
31717 | 23 |
24 ;;; Commentary: | |
25 | |
26 ;;; Code: | |
27 | |
33121
228696a7231c
2000-11-01 ShengHuo ZHU <zsh@cs.rochester.edu>
Dave Love <fx@gnu.org>
parents:
31717
diff
changeset
|
28 (eval-when-compile (require 'cl)) |
31717 | 29 (require 'ietf-drums) |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
30 (require 'rfc2047) |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
31 (autoload 'mm-encode-body "mm-bodies") |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
32 (autoload 'mail-header-remove-whitespace "mail-parse") |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
33 (autoload 'mail-header-remove-comments "mail-parse") |
31717 | 34 |
35 (defun rfc2231-get-value (ct attribute) | |
36 "Return the value of ATTRIBUTE from CT." | |
37 (cdr (assq attribute (cdr ct)))) | |
38 | |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
39 (defun rfc2231-parse-qp-string (string) |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
40 "Parse QP-encoded string using `rfc2231-parse-string'. |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
41 N.B. This is in violation with RFC2047, but it seem to be in common use." |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
42 (rfc2231-parse-string (rfc2047-decode-string string))) |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
43 |
31717 | 44 (defun rfc2231-parse-string (string) |
45 "Parse STRING and return a list. | |
46 The list will be on the form | |
47 `(name (attribute . value) (attribute . value)...)" | |
48 (with-temp-buffer | |
49 (let ((ttoken (ietf-drums-token-to-list ietf-drums-text-token)) | |
50 (stoken (ietf-drums-token-to-list ietf-drums-tspecials)) | |
51 (ntoken (ietf-drums-token-to-list "0-9")) | |
52 (prev-value "") | |
53 display-name mailbox c display-string parameters | |
54 attribute value type subtype number encoded | |
64671
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
55 prev-attribute prev-encoded) |
31717 | 56 (ietf-drums-init (mail-header-remove-whitespace |
57 (mail-header-remove-comments string))) | |
58 (let ((table (copy-syntax-table ietf-drums-syntax-table))) | |
59 (modify-syntax-entry ?\' "w" table) | |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
60 (modify-syntax-entry ?* " " table) |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
61 (modify-syntax-entry ?\; " " table) |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
62 (modify-syntax-entry ?= " " table) |
31717 | 63 ;; The following isn't valid, but one should be liberal |
64 ;; in what one receives. | |
65 (modify-syntax-entry ?\: "w" table) | |
66 (set-syntax-table table)) | |
67 (setq c (char-after)) | |
68 (when (and (memq c ttoken) | |
69 (not (memq c stoken))) | |
70 (setq type (downcase (buffer-substring | |
71 (point) (progn (forward-sexp 1) (point))))) | |
72 ;; Do the params | |
73 (while (not (eobp)) | |
74 (setq c (char-after)) | |
75 (unless (eq c ?\;) | |
76 (error "Invalid header: %s" string)) | |
77 (forward-char 1) | |
78 ;; If c in nil, then this is an invalid header, but | |
79 ;; since elm generates invalid headers on this form, | |
80 ;; we allow it. | |
81 (when (setq c (char-after)) | |
82 (if (and (memq c ttoken) | |
83 (not (memq c stoken))) | |
84 (setq attribute | |
85 (intern | |
86 (downcase | |
87 (buffer-substring | |
88 (point) (progn (forward-sexp 1) (point)))))) | |
89 (error "Invalid header: %s" string)) | |
90 (setq c (char-after)) | |
91 (when (eq c ?*) | |
92 (forward-char 1) | |
93 (setq c (char-after)) | |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
94 (if (not (memq c ntoken)) |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
95 (setq encoded t |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
96 number nil) |
31717 | 97 (setq number |
98 (string-to-number | |
99 (buffer-substring | |
100 (point) (progn (forward-sexp 1) (point))))) | |
101 (setq c (char-after)) | |
102 (when (eq c ?*) | |
103 (setq encoded t) | |
104 (forward-char 1) | |
105 (setq c (char-after))))) | |
106 ;; See if we have any previous continuations. | |
107 (when (and prev-attribute | |
108 (not (eq prev-attribute attribute))) | |
64671
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
109 (push (cons prev-attribute |
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
110 (if prev-encoded |
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
111 (rfc2231-decode-encoded-string prev-value) |
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
112 prev-value)) |
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
113 parameters) |
31717 | 114 (setq prev-attribute nil |
64671
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
115 prev-value "" |
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
116 prev-encoded nil)) |
31717 | 117 (unless (eq c ?=) |
118 (error "Invalid header: %s" string)) | |
119 (forward-char 1) | |
120 (setq c (char-after)) | |
121 (cond | |
122 ((eq c ?\") | |
123 (setq value | |
124 (buffer-substring (1+ (point)) | |
125 (progn (forward-sexp 1) (1- (point)))))) | |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
126 ((and (or (memq c ttoken) |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
127 (> c ?\177)) ;; EXTENSION: Support non-ascii chars. |
31717 | 128 (not (memq c stoken))) |
129 (setq value (buffer-substring | |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
130 (point) (progn (forward-sexp) (point))))) |
31717 | 131 (t |
132 (error "Invalid header: %s" string))) | |
133 (if number | |
134 (setq prev-attribute attribute | |
64671
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
135 prev-value (concat prev-value value) |
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
136 prev-encoded encoded) |
59089
22da0004ae3c
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750
Miles Bader <miles@gnu.org>
parents:
56927
diff
changeset
|
137 (push (cons attribute |
22da0004ae3c
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750
Miles Bader <miles@gnu.org>
parents:
56927
diff
changeset
|
138 (if encoded |
22da0004ae3c
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750
Miles Bader <miles@gnu.org>
parents:
56927
diff
changeset
|
139 (rfc2231-decode-encoded-string value) |
22da0004ae3c
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750
Miles Bader <miles@gnu.org>
parents:
56927
diff
changeset
|
140 value)) |
22da0004ae3c
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750
Miles Bader <miles@gnu.org>
parents:
56927
diff
changeset
|
141 parameters)))) |
31717 | 142 |
143 ;; Take care of any final continuations. | |
144 (when prev-attribute | |
59089
22da0004ae3c
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750
Miles Bader <miles@gnu.org>
parents:
56927
diff
changeset
|
145 (push (cons prev-attribute |
64671
89073e52939c
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-503
Miles Bader <miles@gnu.org>
parents:
64085
diff
changeset
|
146 (if prev-encoded |
59089
22da0004ae3c
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750
Miles Bader <miles@gnu.org>
parents:
56927
diff
changeset
|
147 (rfc2231-decode-encoded-string prev-value) |
22da0004ae3c
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750
Miles Bader <miles@gnu.org>
parents:
56927
diff
changeset
|
148 prev-value)) |
22da0004ae3c
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750
Miles Bader <miles@gnu.org>
parents:
56927
diff
changeset
|
149 parameters)) |
31717 | 150 |
151 (when type | |
152 `(,type ,@(nreverse parameters))))))) | |
153 | |
154 (defun rfc2231-decode-encoded-string (string) | |
155 "Decode an RFC2231-encoded string. | |
156 These look like \"us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A\"." | |
157 (with-temp-buffer | |
158 (let ((elems (split-string string "'"))) | |
159 ;; The encoded string may contain zero to two single-quote | |
160 ;; marks. This should give us the encoded word stripped | |
161 ;; of any preceding values. | |
162 (insert (car (last elems))) | |
163 (goto-char (point-min)) | |
164 (while (search-forward "%" nil t) | |
165 (insert | |
166 (prog1 | |
167 (string-to-number (buffer-substring (point) (+ (point) 2)) 16) | |
168 (delete-region (1- (point)) (+ (point) 2))))) | |
169 ;; Encode using the charset, if any. | |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
170 (when (and (mm-multibyte-p) |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
171 (> (length elems) 1) |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
172 (not (equal (intern (downcase (car elems))) 'us-ascii))) |
31717 | 173 (mm-decode-coding-region (point-min) (point-max) |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
174 (intern (downcase (car elems))))) |
31717 | 175 (buffer-string)))) |
176 | |
177 (defun rfc2231-encode-string (param value) | |
178 "Return and PARAM=VALUE string encoded according to RFC2231." | |
179 (let ((control (ietf-drums-token-to-list ietf-drums-no-ws-ctl-token)) | |
180 (tspecial (ietf-drums-token-to-list ietf-drums-tspecials)) | |
181 (special (ietf-drums-token-to-list "*'%\n\t")) | |
182 (ascii (ietf-drums-token-to-list ietf-drums-text-token)) | |
183 (num -1) | |
184 spacep encodep charsetp charset broken) | |
185 (with-temp-buffer | |
186 (insert value) | |
187 (goto-char (point-min)) | |
188 (while (not (eobp)) | |
189 (cond | |
190 ((or (memq (following-char) control) | |
191 (memq (following-char) tspecial) | |
192 (memq (following-char) special)) | |
193 (setq encodep t)) | |
194 ((eq (following-char) ? ) | |
195 (setq spacep t)) | |
196 ((not (memq (following-char) ascii)) | |
197 (setq charsetp t))) | |
198 (forward-char 1)) | |
199 (when charsetp | |
200 (setq charset (mm-encode-body))) | |
201 (cond | |
202 ((or encodep charsetp) | |
203 (goto-char (point-min)) | |
204 (while (not (eobp)) | |
205 (when (> (current-column) 60) | |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
206 (insert ";\n") |
31717 | 207 (setq broken t)) |
208 (if (or (not (memq (following-char) ascii)) | |
209 (memq (following-char) control) | |
210 (memq (following-char) tspecial) | |
211 (memq (following-char) special) | |
212 (eq (following-char) ? )) | |
213 (progn | |
214 (insert "%" (format "%02x" (following-char))) | |
215 (delete-char 1)) | |
216 (forward-char 1))) | |
217 (goto-char (point-min)) | |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
218 (insert (symbol-name (or charset 'us-ascii)) "''") |
31717 | 219 (goto-char (point-min)) |
220 (if (not broken) | |
221 (insert param "*=") | |
222 (while (not (eobp)) | |
56927
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
223 (insert (if (>= num 0) " " "\n ") |
55fd4f77387a
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Miles Bader <miles@gnu.org>
parents:
52401
diff
changeset
|
224 param "*" (format "%d" (incf num)) "*=") |
31717 | 225 (forward-line 1)))) |
226 (spacep | |
227 (goto-char (point-min)) | |
228 (insert param "=\"") | |
229 (goto-char (point-max)) | |
230 (insert "\"")) | |
231 (t | |
232 (goto-char (point-min)) | |
233 (insert param "="))) | |
234 (buffer-string)))) | |
235 | |
236 (provide 'rfc2231) | |
237 | |
52401 | 238 ;;; arch-tag: c3ab751d-d108-406a-b301-68882ad8cd63 |
31717 | 239 ;;; rfc2231.el ends here |