X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-nmz.el;h=765829d42c83d78116a7225a6d3640d237fab498;hb=4dee2f09b7c63b19e24942f13b2917addb2a6501;hp=c13e505c52aed6c56a2b8b70e191dcc2cb36a10a;hpb=cea9152916b11929a07d20d3c5c3d142fa5e4a23;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-nmz.el b/elmo/elmo-nmz.el index c13e505..765829d 100644 --- a/elmo/elmo-nmz.el +++ b/elmo/elmo-nmz.el @@ -1,4 +1,4 @@ -;;; elmo-nmz.el -- Namazu interface for ELMO. +;;; elmo-nmz.el --- Namazu interface for ELMO. ;; Copyright (C) 2000 Yuuichi Teranishi @@ -24,16 +24,19 @@ ;; ;;; Commentary: -;; +;; ;;; Code: -;; +;; +(eval-when-compile (require 'cl)) + (require 'elmo) (require 'elmo-map) (require 'mime-edit) (defcustom elmo-nmz-default-index-path "~/Mail" - "*Default index path for namazu." + "*Default index path for namazu. +If the value is a list, all elements are used as index paths for namazu." :type 'directory :group 'elmo) @@ -47,11 +50,22 @@ :type 'symbol :group 'elmo) -(defcustom elmo-nmz-args '("--all" "--list" "--early") +(defcustom elmo-nmz-args '("--all" "--list" "--late") "*Argument list for namazu to list matched files." :type '(repeat string) :group 'elmo) +(defcustom elmo-nmz-index-alias-alist nil + "*Alist of ALIAS and INDEX-PATH." + :type '(repeat (cons (string :tag "Alias Name") + (choice (directory :tag "Index Path") + (repeat (directory :tag "Index Path"))))) + :group 'elmo) + +(defvar elmo-nmz-use-drive-letter (if (memq system-type + '(OS/2 emx windows-nt)) t nil) + "*If non-nil, do a drive letter conversion (e.g. /a|/ => a:/).") + ;;; "namazu search" (eval-and-compile (luna-define-class elmo-nmz-folder @@ -61,80 +75,64 @@ (luna-define-method elmo-folder-initialize ((folder elmo-nmz-folder) name) - (with-temp-buffer - (insert "[" name) - (goto-char (point-min)) - (forward-sexp) - (elmo-nmz-folder-set-pattern-internal folder - (buffer-substring - (+ 1 (point-min)) - (- (point) 1))) - (elmo-nmz-folder-set-index-path-internal folder - (buffer-substring (point) - (point-max))) - (if (eq (length (elmo-nmz-folder-index-path-internal folder)) 0) - (elmo-nmz-folder-set-index-path-internal folder - elmo-nmz-default-index-path)) - folder)) + (when (> (length name) 0) + (with-temp-buffer + (insert "[" name) + (goto-char (point-min)) + (forward-sexp) + (elmo-nmz-folder-set-pattern-internal folder + (buffer-substring + (+ 1 (point-min)) + (- (point) 1))) + (let ((index (buffer-substring (point) (point-max)))) + (elmo-nmz-folder-set-index-path-internal + folder + (cond ((cdr (assoc index elmo-nmz-index-alias-alist))) + ((eq (length index) 0) + elmo-nmz-default-index-path) + (t + index)))))) + folder) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-nmz-folder)) (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) - (expand-file-name "nmz" elmo-msgdb-dir))) + (expand-file-name "nmz" elmo-msgdb-directory))) -(defun elmo-nmz-msgdb-create-entity (folder number) +(defun elmo-nmz-msgdb-create-entity (msgdb folder number) "Create msgdb entity for the message in the FOLDER with NUMBER." - (let ((location (elmo-map-message-location folder number)) + (let ((location (expand-file-name (elmo-map-message-location folder number))) entity uid) - (setq entity (elmo-msgdb-create-overview-entity-from-file number location)) - (unless (or (> (length (elmo-msgdb-overview-entity-get-to entity)) 0) - (> (length (elmo-msgdb-overview-entity-get-cc entity)) 0) - (not (string= (elmo-msgdb-overview-entity-get-subject entity) + (setq entity (elmo-msgdb-create-message-entity-from-file + (elmo-msgdb-message-entity-handler msgdb) number location)) + (unless (or (> (length (elmo-message-entity-field entity 'to)) 0) + (> (length (elmo-message-entity-field entity 'cc)) 0) + (not (string= (elmo-message-entity-field entity 'subject) elmo-no-subject))) - (elmo-msgdb-overview-entity-set-subject entity location) + (elmo-message-entity-set-field entity 'subject location) (setq uid (nth 2 (file-attributes location))) - (elmo-msgdb-overview-entity-set-from entity - (concat - (user-full-name uid) - " <"(user-login-name uid) "@" - (system-name) ">"))) + (elmo-message-entity-set-field entity 'from + (concat + (user-full-name uid) + " <"(user-login-name uid) "@" + (system-name) ">"))) entity)) (luna-define-method elmo-folder-msgdb-create ((folder elmo-nmz-folder) - numlist new-mark - already-mark seen-mark - important-mark - seen-list) - (let* (overview number-alist mark-alist entity - i percent num pair) + numlist flag-table) + (let ((new-msgdb (elmo-make-msgdb)) + entity mark i percent num) (setq num (length numlist)) (setq i 0) (message "Creating msgdb...") (while numlist (setq entity (elmo-nmz-msgdb-create-entity - folder (car numlist))) + new-msgdb folder (car numlist))) (when entity - (setq overview - (elmo-msgdb-append-element - overview entity)) - (setq number-alist - (elmo-msgdb-number-add number-alist - (elmo-msgdb-overview-entity-get-number - entity) - (elmo-msgdb-overview-entity-get-id - entity))) - (setq mark-alist - (elmo-msgdb-mark-append - mark-alist - (elmo-msgdb-overview-entity-get-number - entity) - (or (elmo-msgdb-global-mark-get - (elmo-msgdb-overview-entity-get-id - entity)) - new-mark)))) + (elmo-msgdb-append-entity new-msgdb entity '(new unread))) (when (> num elmo-display-progress-threshold) (setq i (1+ i)) (setq percent (/ (* i 100) num)) @@ -142,8 +140,8 @@ 'elmo-folder-msgdb-create "Creating msgdb..." percent)) (setq numlist (cdr numlist))) - (message "Creating msgdb...done.") - (list overview number-alist mark-alist))) + (message "Creating msgdb...done") + new-msgdb)) (luna-define-method elmo-folder-message-file-p ((folder elmo-nmz-folder)) t) @@ -156,8 +154,7 @@ ((folder elmo-nmz-folder)) t) -(luna-define-method elmo-folder-diff ((folder elmo-nmz-folder) - &optional numbers) +(luna-define-method elmo-folder-diff ((folder elmo-nmz-folder)) (cons nil nil)) (luna-define-method elmo-folder-message-make-temp-files ((folder @@ -165,10 +162,10 @@ numbers &optional start-number) - (let ((temp-dir (elmo-folder-make-temp-dir folder)) + (let ((temp-dir (elmo-folder-make-temporary-directory folder)) (cur-number (if start-number 0))) (dolist (number numbers) - (elmo-add-name-to-file + (elmo-copy-file (elmo-message-file-name folder number) (expand-file-name (int-to-string (if start-number (incf cur-number) number)) @@ -179,29 +176,30 @@ location strategy &optional section unseen) (when (file-exists-p location) - (insert-file-contents-as-binary location) - (unless (or (std11-field-body "To") - (std11-field-body "Cc") - (std11-field-body "Subject")) - (let (charset guess uid) - (erase-buffer) - (set-buffer-multibyte t) - (insert-file-contents location) - (setq charset (detect-mime-charset-region (point-min) - (point-max))) - (goto-char (point-min)) - (setq guess (mime-find-file-type location)) - (setq uid (nth 2 (file-attributes location))) - (insert "From: " (concat (user-full-name uid) - " <"(user-login-name uid) "@" - (system-name) ">") "\n") - (insert "Subject: " location "\n") - (insert "Content-Type: " - (concat (nth 0 guess) "/" (nth 1 guess)) - "; charset=" (upcase (symbol-name charset)) - "\nMIME-Version: 1.0\n\n") - (encode-mime-charset-region (point-min) (point-max) charset) - (set-buffer-multibyte nil))))) + (prog1 + (insert-file-contents-as-binary (expand-file-name location)) + (unless (or (std11-field-body "To") + (std11-field-body "Cc") + (std11-field-body "Subject")) + (let (charset guess uid) + (erase-buffer) + (set-buffer-multibyte t) + (insert-file-contents (expand-file-name location)) + (setq charset (detect-mime-charset-region (point-min) + (point-max))) + (goto-char (point-min)) + (setq guess (mime-find-file-type location)) + (setq uid (nth 2 (file-attributes location))) + (insert "From: " (concat (user-full-name uid) + " <"(user-login-name uid) "@" + (system-name) ">") "\n") + (insert "Subject: " location "\n") + (insert "Content-Type: " + (concat (nth 0 guess) "/" (nth 1 guess)) + "; charset=" (upcase (symbol-name charset)) + "\nMIME-Version: 1.0\n\n") + (encode-mime-charset-region (point-min) (point-max) charset) + (set-buffer-multibyte nil)))))) (luna-define-method elmo-map-folder-list-message-locations ((folder elmo-nmz-folder)) @@ -212,64 +210,47 @@ (list (encode-mime-charset-string (elmo-nmz-folder-pattern-internal folder) - elmo-nmz-charset) - (expand-file-name - (elmo-nmz-folder-index-path-internal folder))))) + elmo-nmz-charset)) + (if (listp (elmo-nmz-folder-index-path-internal folder)) + (mapcar + 'expand-file-name + (elmo-nmz-folder-index-path-internal folder)) + (list + (expand-file-name + (elmo-nmz-folder-index-path-internal folder)))))) (goto-char (point-min)) (while (not (eobp)) (beginning-of-line) + ;; convert url to file path. + (when (looking-at "^file://") + (replace-match "")) + (when (and elmo-nmz-use-drive-letter + (looking-at "^/\\([A-Za-z]\\)|/")) + (replace-match "\\1:/") + (beginning-of-line)) (setq bol (point)) (end-of-line) (setq locations (cons (buffer-substring bol (point)) locations)) (forward-line 1)) - locations))) + (nreverse locations)))) (luna-define-method elmo-folder-exists-p ((folder elmo-nmz-folder)) - t) + (elmo-nmz-folder-pattern-internal folder)) -(luna-define-method elmo-folder-search ((folder elmo-nmz-folder) - condition &optional from-msgs) - (let* ((msgs (or from-msgs (elmo-folder-list-messages folder))) - (orig msgs) - (i 0) - case-fold-search matches - percent num - (num (length msgs))) - (while msgs - (if (elmo-file-field-condition-match - (elmo-map-message-location folder (car msgs)) - condition - (car msgs) - orig) - (setq matches (cons (car msgs) matches))) - (setq i (1+ i)) - (setq percent (/ (* i 100) num)) - (elmo-display-progress - 'elmo-nmz-search "Searching..." - percent) - (setq msgs (cdr msgs))) - matches)) +(luna-define-method elmo-folder-have-subfolder-p ((folder elmo-nmz-folder)) + (null (elmo-nmz-folder-pattern-internal folder))) -;;; To override elmo-map-folder methods. -(luna-define-method elmo-folder-list-unreads-internal - ((folder elmo-nmz-folder) unread-marks &optional mark-alist) - t) - -(luna-define-method elmo-folder-unmark-important ((folder elmo-nmz-folder) - numbers) - t) - -(luna-define-method elmo-folder-mark-as-important ((folder elmo-nmz-folder) - numbers) - t) - -(luna-define-method elmo-folder-unmark-read ((folder elmo-nmz-folder) numbers) - t) +(luna-define-method elmo-folder-list-subfolders ((folder elmo-nmz-folder) + &optional one-level) + (mapcar (lambda (name) (elmo-recover-string-from-filename name)) + (directory-files (expand-file-name "nmz" elmo-msgdb-directory) + nil + (concat + "^" + (regexp-quote + (elmo-folder-prefix-internal folder)))))) -(luna-define-method elmo-folder-mark-as-read ((folder elmo-nmz-folder) numbers) - t) - (require 'product) (product-provide (provide 'elmo-nmz) (require 'elmo-version)) -;;; elmo-nmz.el ends here \ No newline at end of file +;;; elmo-nmz.el ends here