X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Fdrums.el;h=6b4a0d84935a4bcf4e5be8037df59614e8e12d9c;hb=88a2cbade926ab994768b63e407390a44762941c;hp=1f45a89412391b241315489da5b96d86c7f40ab6;hpb=216dd310a007e96604475319ea3087bf9e9970c7;p=elisp%2Fgnus.git- diff --git a/lisp/drums.el b/lisp/drums.el index 1f45a89..6b4a0d8 100644 --- a/lisp/drums.el +++ b/lisp/drums.el @@ -29,6 +29,7 @@ ;;; Code: (require 'time-date) +(require 'mm-util) (defvar drums-no-ws-ctl-token "\001-\010\013\014\016-\037\177" "US-ASCII control characters excluding CR, LF and white space.") @@ -50,14 +51,45 @@ (defvar drums-qtext-token (concat drums-no-ws-ctl-token "\041\043-\133\135-\177") "Non-white-space control characaters, plus the rest of ASCII excluding backslash and doublequote.") - +(defvar drums-tspecials "][()<>@,;:\\\"/?=" + "Tspecials.") + (defvar drums-syntax-table (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table))) (modify-syntax-entry ?\\ "/" table) (modify-syntax-entry ?< "(" table) (modify-syntax-entry ?> ")" table) + (modify-syntax-entry ?@ "w" table) + (modify-syntax-entry ?/ "w" table) + (modify-syntax-entry ?= " " table) + (modify-syntax-entry ?* " " table) + (modify-syntax-entry ?\; " " table) + (modify-syntax-entry ?\' " " table) table)) +(defun drums-token-to-list (token) + "Translate TOKEN into a list of characters." + (let ((i 0) + b e c out range) + (while (< i (length token)) + (setq c (mm-char-int (aref token i))) + (incf i) + (cond + ((eq c (mm-char-int ?-)) + (if b + (setq range t) + (push c out))) + (range + (while (<= b c) + (push (mm-make-char 'ascii b) out) + (incf b)) + (setq range nil)) + ((= i (length token)) + (push (mm-make-char 'ascii c) out)) + (t + (setq b c)))) + (nreverse out))) + (defsubst drums-init (string) (set-syntax-table drums-syntax-table) (insert string) @@ -90,7 +122,9 @@ (cond ((eq c ?\") (forward-sexp 1)) - ((memq c '(? ?\t)) + ((eq c ?\() + (forward-sexp 1)) + ((memq c '(? ?\t ?\n)) (delete-char 1)) (t (forward-char 1)))) @@ -110,8 +144,7 @@ (setq result (buffer-substring (1+ (point)) - (progn (forward-sexp 1) (1- (point))))) - (goto-char (point-max))) + (progn (forward-sexp 1) (1- (point)))))) (t (forward-char 1)))) result))) @@ -119,7 +152,7 @@ (defun drums-parse-address (string) "Parse STRING and return a MAILBOX / DISPLAY-NAME pair." (with-temp-buffer - (let (display-name mailbox c) + (let (display-name mailbox c display-string) (drums-init string) (while (not (eobp)) (setq c (following-char)) @@ -133,8 +166,8 @@ (push (buffer-substring (1+ (point)) (progn (forward-sexp 1) (1- (point)))) display-name)) - ((looking-at (concat "[" drums-atext-token "]")) - (push (buffer-substring (point) (progn (forward-word 1) (point))) + ((looking-at (concat "[" drums-atext-token "@" "]")) + (push (buffer-substring (point) (progn (forward-sexp 1) (point))) display-name)) ((eq c ?<) (setq mailbox @@ -146,10 +179,15 @@ (t (error "Unknown symbol: %c" c)))) ;; If we found no display-name, then we look for comments. (if display-name - (setq display-name (mapconcat 'identity (nreverse display-name) " ")) - (setq display-name (drums-get-comment string))) - (when mailbox - (cons mailbox display-name))))) + (setq display-string + (mapconcat 'identity (reverse display-name) " ")) + (setq display-string (drums-get-comment string))) + (if (not mailbox) + (when (string-match "@" display-string) + (cons + (mapconcat 'identity (nreverse display-name) "") + (drums-get-comment string))) + (cons mailbox display-string))))) (defun drums-parse-addresses (string) "Parse STRING and return a list of MAILBOX / DISPLAY-NAME pairs." @@ -163,11 +201,14 @@ ((memq c '(?\" ?< ?\()) (forward-sexp 1)) ((eq c ?,) - (push (drums-parse-address (buffer-substring beg (1- (point)))) + (push (drums-parse-address (buffer-substring beg (point))) pairs) + (forward-char 1) (setq beg (point))) (t (forward-char 1)))) + (push (drums-parse-address (buffer-substring beg (point))) + pairs) (nreverse pairs)))) (defun drums-unfold-fws () @@ -179,8 +220,23 @@ (defun drums-parse-date (string) "Return an Emacs time spec from STRING." - (encode-time (parse-time-string string))) - + (apply 'encode-time (parse-time-string string))) + +(defun drums-narrow-to-header () + "Narrow to the header section in the current buffer." + (narrow-to-region + (goto-char (point-min)) + (if (search-forward "\n\n" nil 1) + (1- (point)) + (point-max))) + (goto-char (point-min))) + +(defun drums-quote-string (string) + "Quote string if it needs quoting to be displayed in a header." + (if (not (string-match (concat "[^" drums-atext-token "]") string)) + (concat "\"" string "\"") + string)) + (provide 'drums) ;;; drums.el ends here