X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-mime.el;h=5ccc1d2bf8fcadcb01725fdb41c01043d86e39d0;hb=acd82f4cf41e83cb2aab45ece9ff29842c6574b1;hp=c3ddca36d534e4a2651e3cae5f0ffadee4991aee;hpb=12f1baf26945a43185396ef6f3285eb8f71aa444;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-mime.el b/elmo/elmo-mime.el index c3ddca3..5ccc1d2 100644 --- a/elmo/elmo-mime.el +++ b/elmo/elmo-mime.el @@ -33,6 +33,11 @@ (require 'mmimap) (require 'mime-view) +(eval-when-compile + (require 'luna) + (require 'elmo) ; elmo-folder-do-each-message-entity + (require 'cl)) + ;; MIME-Entity (eval-and-compile (luna-define-class elmo-mime-entity)) @@ -104,11 +109,13 @@ use for keymap of representation buffer.") (defvar elmo-message-sorted-field-list nil) (defvar elmo-mime-display-header-analysis t) -(defcustom elmo-mime-header-max-column fill-column +(defcustom elmo-mime-header-max-column 'fill-column "*Header max column number. Default is `fill-colmn'. +If a symbol of variable is specified, use its value in message buffer. If a symbol of function is specified, the function is called and its return value is used." :type '(choice (integer :tag "Column Number") + (variable :tag "Variable") (function :tag "Function")) :group 'elmo) @@ -127,67 +134,64 @@ value is used." visible-fields sort-fields) (let ((the-buf (current-buffer)) - (mode-obj (mime-find-field-presentation-method 'wide)) - field-decoder - f-b p f-e field-name field field-body - vf-alist (sl sort-fields)) + (max-column (cond ((functionp elmo-mime-header-max-column) + (funcall elmo-mime-header-max-column)) + ((and (symbolp elmo-mime-header-max-column) + (boundp elmo-mime-header-max-column)) + (symbol-value elmo-mime-header-max-column)) + (t + elmo-mime-header-max-column))) + vf-alist) (save-excursion (set-buffer buffer) (save-restriction (narrow-to-region start end) (goto-char start) (while (re-search-forward std11-field-head-regexp nil t) - (setq f-b (match-beginning 0) - p (match-end 0) - field-name (buffer-substring f-b p) - f-e (std11-field-end)) - (when (mime-visible-field-p field-name - visible-fields invisible-fields) - (setq field (intern - (capitalize (buffer-substring f-b (1- p)))) - field-body (buffer-substring p f-e) - field-decoder - (if elmo-mime-display-header-analysis - (inline (mime-find-field-decoder-internal - field mode-obj)) - (inline (lambda (x y z) x)))) - (setq vf-alist (append (list - (cons field-name - (list field-body field-decoder))) - vf-alist)))) - (and vf-alist - (setq vf-alist - (sort vf-alist - (function (lambda (s d) - (let ((n 0) re - (sf (car s)) - (df (car d))) - (catch 'done - (while (setq re (nth n sl)) - (setq n (1+ n)) - (and (string-match re sf) - (throw 'done t)) - (and (string-match re df) - (throw 'done nil))) - t))))))) - (with-current-buffer the-buf - (while vf-alist - (let* ((vf (car vf-alist)) - (field-name (car vf)) - (field-body (car (cdr vf))) - (field-decoder (car (cdr (cdr vf))))) - (insert field-name) - (insert (if field-decoder - (funcall field-decoder field-body - (string-width field-name) - (if (functionp elmo-mime-header-max-column) - (funcall elmo-mime-header-max-column) - elmo-mime-header-max-column)) - ;; Don't decode - field-body)) - (insert "\n")) - (setq vf-alist (cdr vf-alist))) - (run-hooks 'mmelmo-header-inserted-hook)))))) + (let* ((field-start (match-beginning 0)) + (name-end (match-end 0)) + (field-name (buffer-substring field-start name-end))) + (when (mime-visible-field-p field-name + visible-fields invisible-fields) + (let* ((field (intern + (capitalize + (buffer-substring field-start (1- name-end))))) + (field-body (buffer-substring name-end (std11-field-end))) + (field-decoder + (and elmo-mime-display-header-analysis + (inline (mime-find-field-decoder field 'wide))))) + (setq vf-alist (cons (list field-name field-body field-decoder) + vf-alist))))))) + (and vf-alist + (setq vf-alist + (sort vf-alist + (lambda (s d) + (let ((sf (car s)) + (df (car d))) + (catch 'done + (dolist (re sort-fields) + (when (string-match re sf) + (throw 'done t)) + (when (string-match re df) + (throw 'done nil))) + t)))))) + (set-buffer the-buf) + (while vf-alist + (let* ((vf (car vf-alist)) + (field-name (nth 0 vf)) + (field-body (nth 1 vf)) + (field-decoder (nth 2 vf))) + (insert field-name) + (insert (or (and field-decoder + (ignore-errors + (funcall field-decoder field-body + (string-width field-name) + max-column))) + ;; Don't decode + field-body)) + (insert "\n")) + (setq vf-alist (cdr vf-alist))) + (run-hooks 'mmelmo-header-inserted-hook)))) (luna-define-generic elmo-mime-insert-sorted-header (entity &optional invisible-fields @@ -306,7 +310,7 @@ If third optional argument ENTIRE is non-nil, fetch entire message at once." (mime-entity-content-type message) "id")))) (elmo-message-reassembled-mime-entity folder id rawbuf - (elmo-message-entity-field entity 'subject 'decode) + (elmo-message-entity-field entity 'subject) ignore-cache unread)) message @@ -405,7 +409,7 @@ If third optional argument ENTIRE is non-nil, fetch entire message at once." (elmo-folder-do-each-message-entity (entity folder) (when (string-match subject-regexp - (elmo-message-entity-field entity 'subject 'decode)) + (elmo-message-entity-field entity 'subject)) (erase-buffer) (let* ((message (elmo-message-mime-entity-internal folder