Browse code
2007-09-20 Ahmon Dancy <dancy@dancy>
layer authored on 20/09/2007 18:22:42
Showing 2 changed files
Showing 2 changed files
... | ... |
@@ -1,3 +1,10 @@ |
1 |
+2007-09-20 Ahmon Dancy <dancy@dancy> |
|
2 |
+ |
|
3 |
+ * rfe7462: rfc2822.cl (extract-email-addresses): New 'compact' |
|
4 |
+ keyword arg to return results in a simpler format. Also |
|
5 |
+ includes a parsing bugfix for some unusual but legal |
|
6 |
+ addresses. |
|
7 |
+ |
|
1 | 8 |
2007-08-02 Ahmon Dancy <dancy@dancy> |
2 | 9 |
|
3 | 10 |
* mime-parse.cl: |
... | ... |
@@ -14,7 +14,7 @@ |
14 | 14 |
;; merchantability or fitness for a particular purpose. See the GNU |
15 | 15 |
;; Lesser General Public License for more details. |
16 | 16 |
;; |
17 |
-;; $Id: rfc2822.cl,v 1.9 2007/06/06 16:59:01 layer Exp $ |
|
17 |
+;; $Id: rfc2822.cl,v 1.10 2007/09/20 18:22:42 layer Exp $ |
|
18 | 18 |
|
19 | 19 |
#+(version= 8 0) |
20 | 20 |
(sys:defpatch "rfc2822" 0 |
... | ... |
@@ -22,9 +22,9 @@ |
22 | 22 |
:type :system |
23 | 23 |
:post-loadable t) |
24 | 24 |
|
25 |
-#+(version= 8 1 beta) |
|
25 |
+#+(version= 8 1) |
|
26 | 26 |
(sys:defpatch "rfc2822" 1 |
27 |
- "v0: New extract-email-addresses function." |
|
27 |
+ "v1: extract-email-addresses enhancements & parsing fix." |
|
28 | 28 |
:type :system |
29 | 29 |
:post-loadable t) |
30 | 30 |
|
... | ... |
@@ -141,9 +141,12 @@ domain. |
141 | 141 |
;; (:mailbox display-name user domain) |
142 | 142 |
;; or |
143 | 143 |
;; (:group display-name mailbox-list) |
144 |
+;; or, if 'compact' keyword arg is true, returns a flattened list of |
|
145 |
+;; user@domain strings. |
|
144 | 146 |
|
145 | 147 |
(defun extract-email-addresses (string &key (start 0) (end (length string)) |
146 |
- (require-domain t) (errorp t)) |
|
148 |
+ (require-domain t) (errorp t) |
|
149 |
+ compact) |
|
147 | 150 |
(declare (optimize (speed 3)) |
148 | 151 |
(fixnum start end)) |
149 | 152 |
(with-underlying-simple-vector (string string disp) |
... | ... |
@@ -168,8 +171,28 @@ domain. |
168 | 171 |
then (if errorp |
169 | 172 |
(error "Failed to parse: ~s" (subseq string start end))) |
170 | 173 |
nil |
174 |
+ elseif compact |
|
175 |
+ then (compact-extracted-addresses res) |
|
171 | 176 |
else res)))) |
172 | 177 |
|
178 |
+(defun compact-extracted-addresses (list) |
|
179 |
+ (declare (optimize (speed 3))) |
|
180 |
+ (let (res) |
|
181 |
+ (dolist (entry list) |
|
182 |
+ (let ((type (car entry))) |
|
183 |
+ (ecase type |
|
184 |
+ (:mailbox |
|
185 |
+ (let ((user (third entry)) |
|
186 |
+ (domain (fourth entry))) |
|
187 |
+ (push (if* domain |
|
188 |
+ then (concatenate 'string user "@" domain) |
|
189 |
+ else user) |
|
190 |
+ res))) |
|
191 |
+ (:group |
|
192 |
+ (dolist (addr (compact-extracted-addresses (third entry))) |
|
193 |
+ (push addr res)))))) |
|
194 |
+ (nreverse res))) |
|
195 |
+ |
|
173 | 196 |
(macrolet ((parse-special (char skip-ws) |
174 | 197 |
`(multiple-value-bind (type value newpos) |
175 | 198 |
(rfc2822-lex string start end ,skip-ws) |
... | ... |
@@ -281,7 +304,7 @@ domain. |
281 | 304 |
(setf first nil) |
282 | 305 |
(setf start newpos) |
283 | 306 |
else (return))) |
284 |
- (if (and res (match-re "^\\s" (first res))) |
|
307 |
+ (if (and (stringp res) (match-re "^\\s" (first res))) |
|
285 | 308 |
(pop res)) |
286 | 309 |
(if res |
287 | 310 |
(values (list-to-delimited-string (nreverse res) "") start)))) |