Update.
[elisp/wanderlust.git] / wl / wl-refile.el
index b144b14..614c697 100644 (file)
@@ -4,7 +4,7 @@
 
 ;; Author: Yuuichi Teranishi <teranisi@gohome.org>
 ;; Keywords: mail, net news
-;; Time-stamp: <2000-04-04 11:38:57 teranisi>
+;; Time-stamp: <00/04/05 01:20:16 teranisi>
 
 ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen).
 
@@ -152,11 +152,14 @@ If RULE does not match ENTITY, returns nil."
       (setq pairs (cdr rule))
       (setq value (wl-refile-get-field-value entity (car rule)))
       (while pairs
-       (if (and (string-match
+       (if (and (stringp value)
+                (string-match
                  (car (car pairs))
                  value)
-                (setq guess (wl-refile-evaluate-rule (cdr (car pairs))
-                                                     entity)))
+                (setq guess (wl-refile-expand-newtext
+                             (wl-refile-evaluate-rule (cdr (car pairs))
+                                                      entity)
+                             value)))
            (setq pairs nil)
          (setq pairs (cdr pairs))))
       guess)
@@ -174,6 +177,39 @@ If RULE does not match ENTITY, returns nil."
                 entity)
       (elmo-msgdb-overview-entity-get-extra-field entity field))))
 
+(defun wl-refile-expand-newtext (newtext original)
+  (let ((len (length newtext))
+       (pos 0)
+       c expanded beg N did-expand)
+    (while (< pos len)
+      (setq beg pos)
+      (while (and (< pos len)
+                 (not (= (aref newtext pos) ?\\)))
+       (setq pos (1+ pos)))
+      (unless (= beg pos)
+       (push (substring newtext beg pos) expanded))
+      (when (< pos len)
+       ;; We hit a \; expand it.
+       (setq did-expand t
+             pos (1+ pos)
+             c (aref newtext pos))
+       (if (not (or (= c ?\&)
+                    (and (>= c ?1)
+                         (<= c ?9))))
+           ;; \ followed by some character we don't expand.
+           (push (char-to-string c) expanded)
+         ;; \& or \N
+         (if (= c ?\&)
+             (setq N 0)
+           (setq N (- c ?0)))
+         (when (match-beginning N)
+           (push (substring original (match-beginning N) (match-end N))
+                 expanded))))
+      (setq pos (1+ pos)))
+    (if did-expand
+       (apply (function concat) (nreverse expanded))
+      newtext)))
+
 (defun wl-refile-guess-by-rule (entity)
   (let ((rules wl-refile-rule-alist)
        guess)