Move image files to etc/gnus.
[gnus] / lisp / gnus-cite.el
index a289c9f..acbd0bb 100644 (file)
@@ -1,8 +1,9 @@
-;;; gnus-cite.el --- parse citations in articles for Gnus
-;; Copyright (C) 1995 Free Software Foundation, Inc.
+;;; gnus-cite.el --- parse citations in articles for Gnus  -*- coding: iso-latin-1 -*-
 
-;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
-;; Keywords: news, mail
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000
+;;        Free Software Foundation, Inc.
+
+;; Author: Per Abhiddenware
 
 ;; This file is part of GNU Emacs.
 
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
 
 ;;; Commentary:
 
 ;;; Code:
 
-(require 'gnus)
-(require 'gnus-msg)
+(eval-when-compile (require 'cl))
 
-(eval-and-compile
-  (autoload 'gnus-article-add-button "gnus-vis")
-  )
+(require 'gnus)
+(require 'gnus-art)
+(require 'gnus-range)
+(require 'message)     ; for message-cite-prefix-regexp
 
 ;;; Customization:
 
-(defvar gnus-cite-prefix-regexp 
-    "^[]>|:}+ ]*[]>|:}+]\\(.*>\\)?\\|^.*>"
-  "Regexp matching the longest possible citation prefix on a line.")
-
-(defvar gnus-cite-max-prefix 20
-  "Maximal possible length for a citation prefix.")
-
-(defvar gnus-supercite-regexp 
-  (concat "^\\(" gnus-cite-prefix-regexp "\\)? *"
+(defgroup gnus-cite nil
+  "Citation."
+  :prefix "gnus-cite-"
+  :link '(custom-manual "(gnus)Article Highlighting")
+  :group 'gnus-article)
+
+(defcustom gnus-cite-reply-regexp
+  "^\\(Subject: Re\\|In-Reply-To\\|References\\):"
+  "*If headers match this regexp it is reasonable to believe that
+article has citations."
+  :group 'gnus-cite
+  :type 'string)
+
+(defcustom gnus-cite-always-check nil
+  "Check article always for citations.  Set it t to check all articles."
+  :group 'gnus-cite
+  :type '(choice (const :tag "no" nil)
+                (const :tag "yes" t)))
+
+(defcustom gnus-cited-opened-text-button-line-format "%(%{[-]%}%)\n"
+  "Format of opened cited text buttons."
+  :group 'gnus-cite
+  :type 'string)
+
+(defcustom gnus-cited-closed-text-button-line-format "%(%{[+]%}%)\n"
+  "Format of closed cited text buttons."
+  :group 'gnus-cite
+  :type 'string)
+
+(defcustom gnus-cited-lines-visible nil
+  "The number of lines of hidden cited text to remain visible.
+Or a pair (cons) of numbers which are the number of lines at the top
+and bottom of the text, respectively, to remain visible."
+  :group 'gnus-cite
+  :type '(choice (const :tag "none" nil)
+                integer
+                (cons :tag "Top and Bottom" integer integer)))
+
+(defcustom gnus-cite-parse-max-size 25000
+  "Maximum article size (in bytes) where parsing citations is allowed.
+Set it to nil to parse all articles."
+  :group 'gnus-cite
+  :type '(choice (const :tag "all" nil)
+                integer))
+
+(defcustom gnus-cite-max-prefix 20
+  "Maximum possible length for a citation prefix."
+  :group 'gnus-cite
+  :type 'integer)
+
+(defcustom gnus-supercite-regexp
+  (concat "^\\(" message-cite-prefix-regexp "\\)? *"
          ">>>>> +\"\\([^\"\n]+\\)\" +==")
-  "Regexp matching normal SuperCite attribution lines.
-The first regexp group should match a prefix added by another package.")
-
-(defvar gnus-supercite-secondary-regexp "^.*\"\\([^\"\n]+\\)\" +=="
-  "Regexp matching mangled SuperCite attribution lines.
-The first regexp group should match the SuperCite attribution.")
-
-(defvar gnus-cite-minimum-match-count 2
-  "Minimal number of identical prefix'es before we believe it is a citation.")
-
-(defvar gnus-cite-face-list '(italic)
-  "Faces used for displaying different citations.
-It is either a list of face names, or one of the following special
-values:
-
-dark: Create faces from `gnus-face-dark-name-list'.
-light: Create faces from `gnus-face-light-name-list'.
-
-The variable `gnus-make-foreground' determines whether the created
-faces change the foreground or the background colors.")
-
-(defvar gnus-cite-attribution-prefix "in article\\|in <"
-  "Regexp matching the beginning of an attribution line.")
-
-(defvar gnus-cite-attribution-postfix
-  "\\(wrote\\|writes\\|said\\|says\\):[ \t]*$"
-  "Regexp matching the end of an attribution line.
-The text matching the first grouping will be used as a button.")
-
-(defvar gnus-cite-attribution-face 'underline
+  "*Regexp matching normal Supercite attribution lines.
+The first grouping must match prefixes added by other packages."
+  :group 'gnus-cite
+  :type 'regexp)
+
+(defcustom gnus-supercite-secondary-regexp "^.*\"\\([^\"\n]+\\)\" +=="
+  "Regexp matching mangled Supercite attribution lines.
+The first regexp group should match the Supercite attribution."
+  :group 'gnus-cite
+  :type 'regexp)
+
+(defcustom gnus-cite-minimum-match-count 2
+  "Minimum number of identical prefixes before we believe it's a citation."
+  :group 'gnus-cite
+  :type 'integer)
+
+(defcustom gnus-cite-attribution-prefix
+  "In article\\|in <\\|On \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\),\\|-----Original Message-----"
+  "*Regexp matching the beginning of an attribution line."
+  :group 'gnus-cite
+  :type 'regexp)
+
+(defcustom gnus-cite-attribution-suffix
+  "\\(\\(wrote\\|writes\\|said\\|says\\|>\\)\\(:\\|\\.\\.\\.\\)\\|-----Original Message-----\\)[ \t]*$"
+  "*Regexp matching the end of an attribution line.
+The text matching the first grouping will be used as a button."
+  :group 'gnus-cite
+  :type 'regexp)
+
+(defface gnus-cite-attribution-face '((t
+                                      (:italic t)))
+  "Face used for attribution lines.")
+
+(defcustom gnus-cite-attribution-face 'gnus-cite-attribution-face
   "Face used for attribution lines.
-It is merged with the face for the cited text belonging to the attribution.")
-
-(defvar gnus-cite-hide-percentage 50
-  "Only hide cited text if it is larger than this percent of the body.")
-
-(defvar gnus-cite-hide-absolute 10
-  "Only hide cited text if there is at least this number of cited lines.")
-
-(defvar gnus-face-light-name-list
-  '("light blue" "light cyan" "light yellow" "light pink"
-    "pale green" "beige" "orange" "magenta" "violet" "medium purple"
-    "turquoise")
-  "Names of light colors.")
-
-(defvar gnus-face-dark-name-list
-  '("blue" "dark salmon" "firebrick"
-    "dark green" "dark orange" "dark khaki" "dark violet"
-    "dark turquoise")
-  "Names of dark colors.")
+It is merged with the face for the cited text belonging to the attribution."
+  :group 'gnus-cite
+  :type 'face)
+
+(defface gnus-cite-face-1 '((((class color)
+                             (background dark))
+                            (:foreground "light blue"))
+                           (((class color)
+                             (background light))
+                            (:foreground "MidnightBlue"))
+                           (t
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-2 '((((class color)
+                             (background dark))
+                            (:foreground "light cyan"))
+                           (((class color)
+                             (background light))
+                            (:foreground "firebrick"))
+                           (t
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-3 '((((class color)
+                             (background dark))
+                            (:foreground "light yellow"))
+                           (((class color)
+                             (background light))
+                            (:foreground "dark green"))
+                           (t
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-4 '((((class color)
+                             (background dark))
+                            (:foreground "light pink"))
+                           (((class color)
+                             (background light))
+                            (:foreground "OrangeRed"))
+                           (t
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-5 '((((class color)
+                             (background dark))
+                            (:foreground "pale green"))
+                           (((class color)
+                             (background light))
+                            (:foreground "dark khaki"))
+                           (t
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-6 '((((class color)
+                             (background dark))
+                            (:foreground "beige"))
+                           (((class color)
+                             (background light))
+                            (:foreground "dark violet"))
+                           (t
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-7 '((((class color)
+                             (background dark))
+                            (:foreground "orange"))
+                           (((class color)
+                             (background light))
+                            (:foreground "SteelBlue4"))
+                           (t
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-8 '((((class color)
+                             (background dark))
+                            (:foreground "magenta"))
+                           (((class color)
+                             (background light))
+                            (:foreground "magenta"))
+                           (t
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-9 '((((class color)
+                             (background dark))
+                            (:foreground "violet"))
+                           (((class color)
+                             (background light))
+                            (:foreground "violet"))
+                           (t
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-10 '((((class color)
+                              (background dark))
+                             (:foreground "medium purple"))
+                            (((class color)
+                              (background light))
+                             (:foreground "medium purple"))
+                            (t
+                             (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-11 '((((class color)
+                              (background dark))
+                             (:foreground "turquoise"))
+                            (((class color)
+                              (background light))
+                             (:foreground "turquoise"))
+                            (t
+                             (:italic t)))
+  "Citation face.")
+
+(defcustom gnus-cite-face-list
+  '(gnus-cite-face-1 gnus-cite-face-2 gnus-cite-face-3 gnus-cite-face-4
+                    gnus-cite-face-5 gnus-cite-face-6 gnus-cite-face-7 gnus-cite-face-8
+                    gnus-cite-face-9 gnus-cite-face-10 gnus-cite-face-11)
+  "*List of faces used for highlighting citations.
+
+When there are citations from multiple articles in the same message,
+Gnus will try to give each citation from each article its own face.
+This should make it easier to see who wrote what."
+  :group 'gnus-cite
+  :type '(repeat face))
+
+(defcustom gnus-cite-hide-percentage 50
+  "Only hide excess citation if above this percentage of the body."
+  :group 'gnus-cite
+  :type 'number)
+
+(defcustom gnus-cite-hide-absolute 10
+  "Only hide excess citation if above this number of lines in the body."
+  :group 'gnus-cite
+  :type 'integer)
 
 ;;; Internal Variables:
 
-(defvar gnus-article-length nil)
-;; Length of article last time we parsed it.
+(defvar gnus-cite-article nil)
+(defvar gnus-cite-overlay-list nil)
 
 (defvar gnus-cite-prefix-alist nil)
-;; Alist of citation prefixes.  
+;; Alist of citation prefixes.
 ;; The cdr is a list of lines with that prefix.
 
 (defvar gnus-cite-attribution-alist nil)
@@ -118,38 +283,42 @@ It is merged with the face for the cited text belonging to the attribution.")
 ;; WROTE: is the attribution line number
 ;; IN: is the line number of the previous line if part of the same attribution,
 ;; PREFIX: Is the citation prefix of the attribution line(s), and
-;; TAG: Is a SuperCite tag, if any.
+;; TAG: Is a Supercite tag, if any.
+
+(defvar gnus-cited-opened-text-button-line-format-alist
+  `((?b (marker-position beg) ?d)
+    (?e (marker-position end) ?d)
+    (?n (count-lines beg end) ?d)
+    (?l (- end beg) ?d)))
+(defvar gnus-cited-opened-text-button-line-format-spec nil)
+(defvar gnus-cited-closed-text-button-line-format-alist
+  gnus-cited-opened-text-button-line-format-alist)
+(defvar gnus-cited-closed-text-button-line-format-spec nil)
+
 
 ;;; Commands:
 
-(defun gnus-article-highlight-citation ()
+(defun gnus-article-highlight-citation (&optional force)
   "Highlight cited text.
 Each citation in the article will be highlighted with a different face.
 The faces are taken from `gnus-cite-face-list'.
-Attribution lines are highlighted with the sameface as the
+Attribution lines are highlighted with the same face as the
 corresponding citation merged with `gnus-cite-attribution-face'.
 
-Text is concidered cited if at least `gnus-cite-minimum-match-count'
-lines matches `gnus-cite-prefix-regexp' with the same prefix.  
+Text is considered cited if at least `gnus-cite-minimum-match-count'
+lines matches `message-cite-prefix-regexp' with the same prefix.
 
-Lines matching `gnus-cite-attribution-postfix' and perhaps
-`gnus-cite-attribution-prefix' are concidered attribution lines."
-  (interactive)
-  ;; Create dark or light faces if necessary.
-  (cond ((eq gnus-cite-face-list 'light)
-        (setq gnus-cite-face-list
-            (mapcar 'gnus-make-face gnus-face-light-name-list)))
-       ((eq gnus-cite-face-list 'dark)
-        (setq gnus-cite-face-list
-            (mapcar 'gnus-make-face gnus-face-dark-name-list))))
+Lines matching `gnus-cite-attribution-suffix'&nb