fix
[elisp/wanderlust.git] / wl / wl-highlight.el
index cfc59d0..d230b0e 100644 (file)
@@ -1,6 +1,6 @@
 ;;; wl-highlight.el -- Hilight modules for Wanderlust.
 
-;; Copyright 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
+;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
 
 ;; Author: Yuuichi Teranishi <teranisi@gohome.org>
 ;; Keywords: mail, net news
 (defvar wl-highlight-summary-refiled-regexp " *[0-9]+o")
 (defvar wl-highlight-summary-copied-regexp " *[0-9]+O")
 (defvar wl-highlight-summary-target-regexp " *[0-9]+\\*")
-;(defvar wl-highlight-summary-thread-top-regexp " *[0-9]+[^0-9][^0-9]../..\(.*\)..:.. \\[")
+;;(defvar wl-highlight-summary-thread-top-regexp " *[0-9]+[^0-9][^0-9]../..\(.*\)..:.. \\[")
 
 (defvar wl-highlight-citation-face-list
   '(wl-highlight-message-cited-text-1
                (setq fsymbol 'wl-highlight-summary-normal-face)))))
       (put-text-property bol eol 'face fsymbol)
       (if wl-use-highlight-mouse-line
-         (put-text-property bol;(1- (match-end 0))
+         (put-text-property bol
+;;; Use bol instead of (1- (match-end 0))
+;;;                         (1- (match-end 0))
                             eol 'mouse-face 'highlight))
-;      (put-text-property (match-beginning 3) (match-end 3)
-;                       'face 'wl-highlight-thread-indent-face)
+;;;   (put-text-property (match-beginning 3) (match-end 3)
+;;;                     'face 'wl-highlight-thread-indent-face)
       ;; Dnd stuff.
       (if wl-use-dnd
          (wl-dnd-set-drag-starter bol eol)))))
@@ -1018,15 +1020,16 @@ interpreted as cited text.)"
                (forward-line 1))
              (message "Highlighting...done")))))))
 
-(defun wl-highlight-headers ()
+(defun wl-highlight-headers (&optional for-draft)
   (let ((beg (point-min))
        (end (or (save-excursion (re-search-forward "^$" nil t)
                                 (point))
                 (point-max))))
     (wl-highlight-message beg end nil)
-    (wl-highlight-message-add-buttons-to-header beg end)
-    (and wl-highlight-x-face-func
-        (funcall wl-highlight-x-face-func beg end))
+    (unless for-draft
+      (wl-highlight-message-add-buttons-to-header beg end)
+      (and wl-highlight-x-face-func
+          (funcall wl-highlight-x-face-func beg end)))
     (run-hooks 'wl-highlight-headers-hook)))
 
 (defun wl-highlight-message-add-buttons-to-header (start end)
@@ -1068,7 +1071,7 @@ interpreted as cited text.)"
   (wl-highlight-message beg end t t))
 
 (defun wl-highlight-signature-search-simple (beg end)
-  "Search signature area in the body message between beg and end.
+  "Search signature area in the body message between BEG and END.
 Returns start point of signature."
   (save-excursion
     (goto-char end)
@@ -1079,7 +1082,7 @@ Returns start point of signature."
       end)))
 
 (defun wl-highlight-signature-search (beg end)
-  "Search signature area in the body message between beg and end.
+  "Search signature area in the body message between BEG and END.
 Returns start point of signature."
   (save-excursion
     (goto-char end)
@@ -1136,116 +1139,115 @@ part of the message (this is because signatures are often incorrectly
 interpreted as cited text.)"
   (if (< end start)
       (let ((s start)) (setq start end end s)))
-  (let* ((too-big (and wl-highlight-max-message-size
-                      (> (- end start)
-                         wl-highlight-max-message-size)))
-        (real-end end)
-        current  beg
-        e p hend)
-    (save-excursion
-      (save-restriction
-       (widen)
-       ;; take off signature
-       (if (and hack-sig (not too-big))
-           (setq end (funcall wl-highlight-signature-search-func
-                              (- end wl-max-signature-size) end)))
-       (if hack-sig
-           (put-text-property end (point-max)
-                              'face 'wl-highlight-message-signature))
-       (narrow-to-region start end)
-
+  (let ((too-big (and wl-highlight-max-message-size
+                     (> (- end start)
+                        wl-highlight-max-message-size)))
+       (real-end end)
+       current  beg
+       e p hend)
+    (if too-big
+       nil
+      (save-excursion
        (save-restriction
-         ;; narrow down to just the headers...
-         (goto-char start)
-         ;; If this search fails then the narrowing performed above
-         ;; is sufficient
-         (if (re-search-forward (format
-                                 "^$\\|%s"
-                                 (regexp-quote mail-header-separator)) nil t)
-             (narrow-to-region (point-min) (point)))
-         (goto-char start)
-         (while (and (not body-only)
-                     (not (eobp)))
-           (cond
-            ((looking-at "^\\([^ \t\n:]+[ \t]*:\\) *\\(.*\\(\n[ \t].*\\)*\n\\)")
-             (setq hend (match-end 0))
-             (put-text-property (match-beginning 1) (match-end 1)
-                                'face 'wl-highlight-message-headers)
-             (setq p (match-end 1))
-             (cond
-              ((catch 'match
-                 (let ((regexp-alist wl-highlight-message-header-alist))
-                   (while regexp-alist
-                     (when (save-match-data
-                             (looking-at (caar regexp-alist)))
-                       (put-text-property
-                        (match-beginning 2) (match-end 2)
-                        'face
-                        (cdar regexp-alist))
-                       (throw 'match t))
-                     (setq regexp-alist (cdr regexp-alist)))
-                   (throw 'match nil))))
-              (t
-               (put-text-property
-                (match-beginning 2) (match-end 2)
-                'face 'wl-highlight-message-header-contents)))
-             (goto-char hend))
-            ((looking-at mail-header-separator)
-             (put-text-property (match-beginning 0) (match-end 0)
-                                'face 'wl-highlight-header-separator-face)
-             (goto-char (match-end 0)))
-            ;; ignore non-header field name lines
-            (t (forward-line 1)))))
-       ;; now do the body, unless it's too big....
-       (if too-big
-           nil
+         (widen)
+         ;; take off signature
+         (if (and hack-sig (not too-big))
+             (setq end (funcall wl-highlight-signature-search-func
+                                (- end wl-max-signature-size) end)))
+         (if hack-sig
+             (put-text-property end (point-max)
+                                'face 'wl-highlight-message-signature))
+         (narrow-to-region start end)
+         (save-restriction
+           ;; narrow down to just the headers...
+           (goto-char start)
+           ;; If this search fails then the narrowing performed above
+           ;; is sufficient
+           (if (re-search-forward (format
+                                   "^$\\|%s"
+                                   (regexp-quote mail-header-separator))
+                                  nil t)
+               (narrow-to-region (point-min) (match-beginning 0)))
+           ;; highlight only when header is not too-big.
+           (when (or (null wl-highlight-max-header-size)
+                     (< (point) wl-highlight-max-header-size))
+             (goto-char start)
+             (while (and (not body-only)
+                         (not (eobp)))
+               (cond
+                ((looking-at "^[^ \t\n:]+[ \t]*:")
+                 (put-text-property (match-beginning 0) (match-end 0)
+                                    'face 'wl-highlight-message-headers)
+                 (setq p (match-end 0))
+                 (setq hend (save-excursion (std11-field-end end)))
+                 (cond
+                  ((catch 'match
+                     (let ((regexp-alist wl-highlight-message-header-alist))
+                       (while regexp-alist
+                         (when (save-match-data
+                                 (looking-at (caar regexp-alist)))
+                           (put-text-property p hend 'face
+                                              (cdar regexp-alist))
+                           (throw 'match t))
+                         (setq regexp-alist (cdr regexp-alist)))
+                       (throw 'match nil))))
+                  (t
+                   (put-text-property
+                    p hend 'face 'wl-highlight-message-header-contents)))
+                 (goto-char hend))
+                ;; ignore non-header field name lines
+                (t (forward-line 1))))))
          (let (prefix prefix-face-alist pair end)
-         (while (not (eobp))
-           (cond
-            ((null wl-highlight-force-citation-header-regexp)
-             nil)
-            ((looking-at wl-highlight-force-citation-header-regexp)
-             (setq current 'wl-highlight-message-citation-header)
-             (setq end (match-end 0)))
-            ((null wl-highlight-citation-prefix-regexp)
-             nil)
-            ((looking-at wl-highlight-citation-prefix-regexp)
-             (setq prefix (buffer-substring (point)
-                                            (match-end 0)))
-             (setq pair (assoc prefix prefix-face-alist))
-             (unless pair
-               (setq prefix-face-alist
-                     (append prefix-face-alist
-                             (list
-                              (setq pair
-                                    (cons
-                                     prefix
-                                     (nth
-                                      (% (length prefix-face-alist)
-                                         (length
-                                          wl-highlight-citation-face-list))
-                                      wl-highlight-citation-face-list)))))))
-             (unless wl-highlight-highlight-citation-too
+           (while (not (eobp))
+             (cond
+              ((looking-at mail-header-separator)
+               (put-text-property (match-beginning 0) (match-end 0)
+                                  'face 'wl-highlight-header-separator-face)
                (goto-char (match-end 0)))
-             (setq current (cdr pair)))
-            ((null wl-highlight-citation-header-regexp)
-             nil)
-            ((looking-at wl-highlight-citation-header-regexp)
-             (setq current 'wl-highlight-message-citation-header)
-             (setq end (match-end 0)))
-            (t (setq current nil)))
-           (cond (current
-                  (setq p (point))
-                  (forward-line 1) ; this is to put the \n in the face too
-                  (let ();(inhibit-read-only t))
-                    (put-text-property p (or end (point))
-                                       'face current)
-                    (setq end nil))
-                  (forward-char -1)))
-           (forward-line 1)))
+              ((null wl-highlight-force-citation-header-regexp)
+               nil)
+              ((looking-at wl-highlight-force-citation-header-regexp)
+               (setq current 'wl-highlight-message-citation-header)
+               (setq end (match-end 0)))
+              ((null wl-highlight-citation-prefix-regexp)
+               nil)
+              ((looking-at wl-highlight-citation-prefix-regexp)
+               (setq prefix (buffer-substring (point)
+                                              (match-end 0)))
+               (setq pair (assoc prefix prefix-face-alist))
+               (unless pair
+                 (setq prefix-face-alist
+                       (append prefix-face-alist
+                               (list
+                                (setq pair
+                                      (cons
+                                       prefix
+                                       (nth
+                                        (% (length prefix-face-alist)
+                                           (length
+                                            wl-highlight-citation-face-list))
+                                        wl-highlight-citation-face-list)))))))
+               (unless wl-highlight-highlight-citation-too
+                 (goto-char (match-end 0)))
+               (setq current (cdr pair)))
+              ((null wl-highlight-citation-header-regexp)
+               nil)
+              ((looking-at wl-highlight-citation-header-regexp)
+               (setq current 'wl-highlight-message-citation-header)
+               (setq end (match-end 0)))
+              (t (setq current nil)))
+             (cond (current
+                    (setq p (point))
+                    (forward-line 1) ; this is to put the \n in the face too
+                    (let ()
+;;;                   ((inhibit-read-only t))
+                      (put-text-property p (or end (point))
+                                         'face current)
+                      (setq end nil))
+                    (forward-char -1)))
+             (forward-line 1)))
          (run-hooks 'wl-highlight-message-hook))))))
 
-
 ;; highlight-mouse-line for folder mode
 
 (defun wl-highlight-folder-mouse-line ()