X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mime-def.el;h=78b7bf09604a9d0ac9f32d17161b0494af51b193;hb=8a9f12b1721a934379766fbe2c237004e25680bf;hp=e20a0ca19dedc5844d0db0afe3c58647ae963b74;hpb=d0151a1816cd74641699b606365bc7ae083b7129;p=elisp%2Fflim.git diff --git a/mime-def.el b/mime-def.el index e20a0ca..78b7bf0 100644 --- a/mime-def.el +++ b/mime-def.el @@ -24,8 +24,7 @@ ;;; Code: -(defconst mime-spadework-module-version-string - "FLIM 1.2.1 - \"Kamitobaguchi\"") +(defconst mime-library-version-string "FLIM 1.5.0 - \"Mukaijima\"") ;;; @ variables @@ -33,6 +32,8 @@ (require 'custom) +(eval-when-compile (require 'cl)) + (defgroup mime nil "Emacs MIME Interfaces" :group 'news @@ -77,8 +78,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 "][()<>@,\;:\\\"/?=") @@ -99,9 +120,32 @@ "][" quoted-printable-hex-chars "]")) -;;; @ utility +;;; @ 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 @@ -110,6 +154,102 @@ (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." + (std11-strip-quoted-string + (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 (buffer + header-start header-end body-start body-end + &optional node-id + content-type content-disposition + encoding children) + (vector buffer header-start header-end body-start body-end + node-id content-type content-disposition encoding nil + children nil)) + +(defsubst mime-entity-buffer (entity) (aref entity 0)) +(defsubst mime-entity-header-start (entity) (aref entity 1)) +(defsubst mime-entity-header-end (entity) (aref entity 2)) +(defsubst mime-entity-body-start (entity) (aref entity 3)) +(defsubst mime-entity-body-end (entity) (aref entity 4)) +(defsubst mime-entity-node-id (entity) (aref entity 5)) +(defsubst mime-entity-content-type (entity) (aref entity 6)) +(defsubst mime-entity-content-disposition (entity) (aref entity 7)) +(defsubst mime-entity-encoding (entity) (aref entity 8)) +(defsubst mime-entity-original-header (entity) (aref entity 9)) +(defsubst mime-entity-children (entity) (aref entity 10)) +(defsubst mime-entity-parsed-header (entity) (aref entity 11)) + +(defsubst mime-entity-set-original-header (entity header) + (aset entity 9 header)) +(defsubst mime-entity-set-parsed-header (entity header) + (aset entity 11 header)) + +(defsubst mime-entity-number (entity) + (reverse (mime-entity-node-id entity))) + +(defalias 'mime-entity-point-min 'mime-entity-header-start) +(defalias 'mime-entity-point-max 'mime-entity-body-end) + +(defsubst mime-entity-media-type (entity) + (mime-content-type-primary-type (mime-entity-content-type entity))) +(defsubst mime-entity-media-subtype (entity) + (mime-content-type-subtype (mime-entity-content-type entity))) +(defsubst mime-entity-parameters (entity) + (mime-content-type-parameters (mime-entity-content-type entity))) + +(defsubst mime-entity-type/subtype (entity-info) + (mime-type/subtype-string (mime-entity-media-type entity-info) + (mime-entity-media-subtype entity-info))) + + +;;; @ 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) + + ;;; @ end ;;;