X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=std11.el;h=e7e4879b0331aa82f45ed291ee75a41e5aaa53bb;hb=2316c9ade08a237d5477aaf1524c67a214f2c5ab;hp=33c8588f25c84e9d134d666211676ccaa50507c5;hpb=66eec7cca1eb73ad4719385602b28ff07b96af5a;p=elisp%2Fapel.git diff --git a/std11.el b/std11.el index 33c8588..e7e4879 100644 --- a/std11.el +++ b/std11.el @@ -4,9 +4,9 @@ ;; Author: MORIOKA Tomohiko ;; Keywords: mail, news, RFC 822, STD 11 -;; Version: $Id: std11.el,v 0.19 1996-08-28 21:01:41 morioka Exp $ +;; Version: $Id: std11.el,v 0.30 1996-09-08 18:07:44 morioka Exp $ -;; This file is part of tl (Tiny Library). +;; This file is part of MU (Message Utilities). ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as @@ -49,7 +49,7 @@ (point) ) -(defun std11-find-field-body (name &optional boundary) +(defun std11-field-body (name &optional boundary) "Return body of field NAME. If BOUNDARY is not nil, it is used as message header separator. \[std11.el]" @@ -62,7 +62,27 @@ If BOUNDARY is not nil, it is used as message header separator. (buffer-substring-no-properties (match-end 0) (std11-field-end)) ))))) -(defun std11-find-field-bodies (field-names &optional default-value boundary) +(defun std11-find-field-body (field-names &optional boundary) + "Return the first found field-body specified by FIELD-NAMES +of the message header in current buffer. If BOUNDARY is not nil, it is +used as message header separator. [std11.el]" + (save-excursion + (save-restriction + (std11-narrow-to-header boundary) + (let ((case-fold-search t) + field-name) + (catch 'tag + (while (setq field-name (car field-names)) + (goto-char (point-min)) + (if (re-search-forward (concat "^" field-name ":[ \t]*") nil t) + (throw 'tag + (buffer-substring-no-properties + (match-end 0) (std11-field-end))) + ) + (setq field-names (cdr field-names)) + )))))) + +(defun std11-field-bodies (field-names &optional default-value boundary) "Return list of each field-bodies of FIELD-NAMES of the message header in current buffer. If BOUNDARY is not nil, it is used as message header separator. [std11.el]" @@ -174,28 +194,36 @@ If BOUNDARY is not nil, it is used as message header separator. dest)))) -;;; @ parser +;;; @ quoted-string ;;; -(provide 'std11) +(defconst std11-non-qtext-char-list '(?\" ?\\ ?\r ?\n)) -(mapcar (function - (lambda (func) - (autoload func "std11-parse") - )) - '(std11-lexical-analyze - std11-parse-address std11-parse-addresses - std11-parse-address-string)) +(defun std11-wrap-as-quoted-string (string) + "Wrap STRING as RFC 822 quoted-string. [std11.el]" + (concat "\"" + (mapconcat (function + (lambda (chr) + (if (memq chr std11-non-qtext-char-list) + (concat "\\" (char-to-string chr)) + (char-to-string chr) + ) + )) str "") + "\"")) -(defun std11-parse-address-string (string) - "Parse STRING as mail address. [std11.el]" - (std11-parse-address (std11-lexical-analyze string)) - ) + +;;; @ composer +;;; (defun std11-addr-to-string (seq) + "Return string from lexical analyzed list SEQ +represents addr-spec of RFC 822. [std11.el]" (mapconcat (function (lambda (token) - (if (eq (car token) 'spaces) + (if (let ((name (car token))) + (or (eq name 'spaces) + (eq name 'comment) + )) "" (cdr token) ))) @@ -203,6 +231,8 @@ If BOUNDARY is not nil, it is used as message header separator. ) (defun std11-address-string (address) + "Return string of address part from parsed ADDRESS of RFC 822. +\[std11.el]" (cond ((eq (car address) 'group) (mapconcat (function std11-address-string) (car (cdr address)) @@ -217,6 +247,66 @@ If BOUNDARY is not nil, it is used as message header separator. ) ))))) +(defun std11-full-name-string (address) + "Return string of full-name part from parsed ADDRESS of RFC 822. +\[std11.el]" + (cond ((eq (car address) 'group) + (mapconcat (function + (lambda (token) + (cdr token) + )) + (nth 1 address) "") + ) + ((eq (car address) 'mailbox) + (let ((addr (nth 1 address)) + (comment (nth 2 address)) + phrase) + (if (eq (car addr) 'phrase-route-addr) + (setq phrase (mapconcat (function + (lambda (token) + (cdr token) + )) + (nth 1 addr) "")) + ) + (or phrase comment) + )))) + + +;;; @ parser +;;; + +(defun std11-parse-address-string (string) + "Parse STRING as mail address. [std11.el]" + (std11-parse-address (std11-lexical-analyze string)) + ) + +(defun std11-parse-addresses-string (string) + "Parse STRING as mail address list. [std11.el]" + (std11-parse-addresses (std11-lexical-analyze string)) + ) + +(defun std11-extract-address-components (string) + "Extract full name and canonical address from STRING. +Returns a list of the form (FULL-NAME CANONICAL-ADDRESS). +If no name can be extracted, FULL-NAME will be nil. [std11.el]" + (let* ((structure (car (std11-parse-address-string + (std11-unfold-string string)))) + (phrase (std11-full-name-string structure)) + (address (std11-address-string structure)) + ) + (list phrase address) + )) + +(provide 'std11) + +(mapcar (function + (lambda (func) + (autoload func "std11-parse") + )) + '(std11-lexical-analyze + std11-parse-address std11-parse-addresses + std11-parse-address-string)) + ;;; @ end ;;;