X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mime-def.el;h=f362130abcebdf60e30966c118715f6ff125ccd6;hb=4a15ad0838f7f2ab125b4f766b127aefc828580c;hp=3b3156a6325db72717066b5b7772991d2d9e7d4b;hpb=eed515ec0f082365d434cb22b460cbca3f0776a0;p=elisp%2Fflim.git diff --git a/mime-def.el b/mime-def.el index 3b3156a..f362130 100644 --- a/mime-def.el +++ b/mime-def.el @@ -24,11 +24,17 @@ ;;; Code: -(defconst mime-spadework-module-version-string - "FLIM-FLAM 1.1.0 - \"韓紅花\" 4.0R4.0/14.0") +(defconst mime-library-version-string + "FLAM-DOODLE 1.9.1 - \"黄丹\" 10R5.5/14.0") + + +;;; @ variables +;;; (require 'custom) +(eval-when-compile (require 'cl)) + (defgroup mime nil "Emacs MIME Interfaces" :group 'news @@ -37,6 +43,25 @@ (custom-handle-keyword 'default-mime-charset :group 'mime 'custom-variable) +(defcustom mime-temp-directory (or (getenv "MIME_TMP_DIR") + (getenv "TM_TMP_DIR") + (getenv "TMPDIR") + (getenv "TMP") + (getenv "TEMP") + "/tmp/") + "*Directory for temporary files." + :group 'mime + :type 'directory) + +(defcustom mime-uuencode-encoding-name-list '("x-uue" "x-uuencode") + "*List of encoding names for uuencode format." + :group 'mime + :type '(repeat string)) + + +;;; @ required functions +;;; + (unless (fboundp 'butlast) (defun butlast (x &optional n) "Returns a copy of LIST with the last N elements removed." @@ -59,8 +84,28 @@ (substring string (match-end 0)) string)) +(defsubst regexp-* (regexp) + (concat regexp "*")) + +(defsubst regexp-or (&rest args) + (concat "\\(" (mapconcat (function identity) args "\\|") "\\)")) + + +;;; @ about STD 11 +;;; + +(defconst std11-quoted-pair-regexp "\\\\.") +(defconst std11-non-qtext-char-list '(?\" ?\\ ?\r ?\n)) +(defconst std11-qtext-regexp + (concat "[^" (char-list-to-string std11-non-qtext-char-list) "]")) +(defconst std11-quoted-string-regexp + (concat "\"" + (regexp-* + (regexp-or std11-qtext-regexp std11-quoted-pair-regexp)) + "\"")) + -;;; @ definitions about MIME +;;; @ about MIME ;;; (defconst mime-tspecials "][()<>@,\;:\\\"/?=") @@ -81,6 +126,198 @@ "][" quoted-printable-hex-chars "]")) +;;; @ Content-Type +;;; + +(defsubst make-mime-content-type (type subtype &optional parameters) + (list* (cons 'type type) + (cons 'subtype subtype) + (nreverse parameters)) + ) + +(defsubst mime-content-type-primary-type (content-type) + "Return primary-type of CONTENT-TYPE." + (cdr (car content-type))) + +(defsubst mime-content-type-subtype (content-type) + "Return primary-type of CONTENT-TYPE." + (cdr (cadr content-type))) + +(defsubst mime-content-type-parameters (content-type) + "Return primary-type of CONTENT-TYPE." + (cddr content-type)) + +(defsubst mime-content-type-parameter (content-type parameter) + "Return PARAMETER value of CONTENT-TYPE." + (cdr (assoc parameter (mime-content-type-parameters content-type)))) + + +(defsubst mime-type/subtype-string (type &optional subtype) + "Return type/subtype string from TYPE and SUBTYPE." + (if type + (if subtype + (format "%s/%s" type subtype) + (format "%s" type)))) + + +;;; @ Content-Disposition +;;; + +(defsubst mime-content-disposition-type (content-disposition) + "Return disposition-type of CONTENT-DISPOSITION." + (cdr (car content-disposition))) + +(defsubst mime-content-disposition-parameters (content-disposition) + "Return disposition-parameters of CONTENT-DISPOSITION." + (cdr content-disposition)) + +(defsubst mime-content-disposition-parameter (content-disposition parameter) + "Return PARAMETER value of CONTENT-DISPOSITION." + (cdr (assoc parameter (cdr content-disposition)))) + +(defsubst mime-content-disposition-filename (content-disposition) + "Return filename of CONTENT-DISPOSITION." + (mime-content-disposition-parameter content-disposition "filename")) + + +;;; @ MIME entity +;;; + +(defsubst make-mime-entity-internal (representation-type location + &optional content-type + children parent node-id + buffer + header-start header-end + body-start body-end) + (vector representation-type location + content-type nil nil children parent node-id + buffer header-start header-end body-start body-end + nil nil)) + +(defsubst mime-entity-representation-type-internal (entity) + (aref entity 0)) +(defsubst mime-entity-set-representation-type-internal (entity type) + (aset entity 0 type)) +(defsubst mime-entity-location-internal (entity) + (aref entity 1)) + +(defsubst mime-entity-content-type-internal (entity) + (aref entity 2)) +(defsubst mime-entity-set-content-type-internal (entity type) + (aset entity 2 type)) +(defsubst mime-entity-content-disposition-internal (entity) + (aref entity 3)) +(defsubst mime-entity-set-content-disposition-internal (entity disposition) + (aset entity 3 disposition)) +(defsubst mime-entity-encoding-internal (entity) + (aref entity 4)) +(defsubst mime-entity-set-encoding-internal (entity encoding) + (aset entity 4 encoding)) + +(defsubst mime-entity-children-internal (entity) + (aref entity 5)) +(defsubst mime-entity-set-children-internal (entity children) + (aset entity 5 children)) +(defsubst mime-entity-parent-internal (entity) + (aref entity 6)) +(defsubst mime-entity-node-id-internal (entity) + (aref entity 7)) + +(defsubst mime-entity-buffer-internal (entity) + (aref entity 8)) +(defsubst mime-entity-set-buffer-internal (entity buffer) + (aset entity 8 buffer)) +(defsubst mime-entity-header-start-internal (entity) + (aref entity 9)) +(defsubst mime-entity-set-header-start-internal (entity point) + (aset entity 9 point)) +(defsubst mime-entity-header-end-internal (entity) + (aref entity 10)) +(defsubst mime-entity-set-header-end-internal (entity point) + (aset entity 10 point)) +(defsubst mime-entity-body-start-internal (entity) + (aref entity 11)) +(defsubst mime-entity-set-body-start-internal (entity point) + (aset entity 11 point)) +(defsubst mime-entity-body-end-internal (entity) + (aref entity 12)) +(defsubst mime-entity-set-body-end-internal (entity point) + (aset entity 12 point)) + +(defsubst mime-entity-original-header-internal (entity) + (aref entity 13)) +(defsubst mime-entity-set-original-header-internal (entity header) + (aset entity 13 header)) +(defsubst mime-entity-parsed-header-internal (entity) + (aref entity 14)) +(defsubst mime-entity-set-parsed-header-internal (entity header) + (aset entity 14 header)) + + +;;; @ message structure +;;; + +(defvar mime-message-structure nil + "Information about structure of message. +Please use reference function `mime-entity-SLOT' to get value of SLOT. + +Following is a list of slots of the structure: + +buffer buffer includes this entity (buffer). +node-id node-id (list of integers) +header-start minimum point of header in raw-buffer +header-end maximum point of header in raw-buffer +body-start minimum point of body in raw-buffer +body-end maximum point of body in raw-buffer +content-type content-type (content-type) +content-disposition content-disposition (content-disposition) +encoding Content-Transfer-Encoding (string or nil) +children entities included in this entity (list of entity) + +If an entity includes other entities in its body, such as multipart or +message/rfc822, `mime-entity' structures of them are included in +`children', so the `mime-entity' structure become a tree.") + +(make-variable-buffer-local 'mime-message-structure) + + +;;; @ for mm-backend +;;; + +(defvar mime-entity-implementation-alist nil) + +(defmacro mm-define-backend (type &optional parents) + (if parents + `(let ((rest ',(reverse parents))) + (while rest + (set-alist 'mime-entity-implementation-alist + ',type + (copy-alist + (cdr (assq (car rest) + mime-entity-implementation-alist)))) + (setq rest (cdr rest)) + )))) + +(defmacro mm-define-method (name args &rest body) + (let* ((specializer (car args)) + (class (nth 1 specializer)) + (self (car specializer))) + `(let ((imps (cdr (assq ',class mime-entity-implementation-alist))) + (func (lambda ,(if self + (cons self (cdr args)) + (cdr args)) + ,@body))) + (if imps + (set-alist 'mime-entity-implementation-alist + ',class (put-alist ',name func imps)) + (set-alist 'mime-entity-implementation-alist + ',class + (list (cons ',name func))) + )))) + +(put 'mm-define-method 'lisp-indent-function 'defun) + + ;;; @ end ;;;