Mercurial > hg > xemacs-beta
diff lisp/gnus/gnus-cite.el @ 70:131b0175ea99 r20-0b30
Import from CVS: tag r20-0b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:02:59 +0200 |
parents | ec9a17fef872 |
children | 0d2f883870bc |
line wrap: on
line diff
--- a/lisp/gnus/gnus-cite.el Mon Aug 13 09:00:04 2007 +0200 +++ b/lisp/gnus/gnus-cite.el Mon Aug 13 09:02:59 2007 +0200 @@ -1,5 +1,5 @@ ;;; gnus-cite.el --- parse citations in articles for Gnus -;; Copyright (C) 1995,96,97 Free Software Foundation, Inc. +;; Copyright (C) 1995,96 Free Software Foundation, Inc. ;; Author: Per Abrahamsen <abraham@iesd.auc.dk> ;; Keywords: news, mail @@ -26,238 +26,101 @@ ;;; Code: (require 'gnus) -(require 'gnus-art) -(require 'gnus-range) +(require 'gnus-msg) +(require 'gnus-ems) +(eval-when-compile (require 'cl)) + +(eval-and-compile + (autoload 'gnus-article-add-button "gnus-vis")) ;;; Customization: -(defgroup gnus-cite nil - "Citation." - :prefix "gnus-cite-" - :link '(custom-manual "(gnus)Article Highlighting") - :group 'gnus-article) +(defvar gnus-cited-text-button-line-format "%(%{[...]%}%)\n" + "Format of cited text buttons.") -(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-text-button-line-format "%(%{[...]%}%)\n" - "Format of cited text buttons." - :group 'gnus-cite - :type 'string) +(defvar gnus-cited-lines-visible nil + "The number of lines of hidden cited text to remain visible.") -(defcustom gnus-cited-lines-visible nil - "The number of lines of hidden cited text to remain visible." - :group 'gnus-cite - :type '(choice (const :tag "none" nil) - integer)) - -(defcustom gnus-cite-parse-max-size 25000 +(defvar 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)) +Set it to nil to parse all articles.") -(defcustom gnus-cite-prefix-regexp +(defvar gnus-cite-prefix-regexp "^[]>|:}+ ]*[]>|:}+]\\(.*>\\)?\\|^.*>" - "Regexp matching the longest possible citation prefix on a line." - :group 'gnus-cite - :type 'regexp) + "Regexp matching the longest possible citation prefix on a line.") -(defcustom gnus-cite-max-prefix 20 - "Maximum possible length for a citation prefix." - :group 'gnus-cite - :type 'integer) +(defvar gnus-cite-max-prefix 20 + "Maximum possible length for a citation prefix.") -(defcustom gnus-supercite-regexp +(defvar gnus-supercite-regexp (concat "^\\(" gnus-cite-prefix-regexp "\\)? *" ">>>>> +\"\\([^\"\n]+\\)\" +==") "Regexp matching normal Supercite attribution lines. -The first grouping must match prefixes added by other packages." - :group 'gnus-cite - :type 'regexp) +The first grouping must match prefixes added by other packages.") -(defcustom gnus-supercite-secondary-regexp "^.*\"\\([^\"\n]+\\)\" +==" +(defvar 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) +The first regexp group should match the Supercite attribution.") + +(defvar gnus-cite-minimum-match-count 2 + "Minimum number of identical prefixes before we believe it's a citation.") -(defcustom gnus-cite-minimum-match-count 2 - "Minimum number of identical prefixes before we believe it's a citation." - :group 'gnus-cite - :type 'integer) +;see gnus-cus.el +;(defvar gnus-cite-face-list +; (if (eq gnus-display-type 'color) +; (if (eq gnus-background-mode 'dark) 'light 'dark) +; '(italic)) +; "Faces used for displaying different citations. +;It is either a list of face names, or one of the following special +;values: -(defcustom gnus-cite-attribution-prefix "in article\\|in <" - "Regexp matching the beginning of an attribution line." - :group 'gnus-cite - :type 'regexp) +;dark: Create faces from `gnus-face-dark-name-list'. +;light: Create faces from `gnus-face-light-name-list'. -(defcustom gnus-cite-attribution-suffix +;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-suffix "\\(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." - :group 'gnus-cite - :type 'regexp) - -(defface gnus-cite-attribution-face '((t - (:underline 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." - :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.") +The text matching the first grouping will be used as a button.") -(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.") +;see gnus-cus.el +;(defvar gnus-cite-attribution-face 'underline +; "Face used for attribution lines. +;It is merged with the face for the cited text belonging to the attribution.") -(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.") +;see gnus-cus.el +;(defvar gnus-cite-hide-percentage 50 +; "Only hide cited text if it is larger than this percent of the body.") -(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.") +;see gnus-cus.el +;(defvar gnus-cite-hide-absolute 10 +; "Only hide cited text if there is at least this number of cited lines.") -(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.") +;see gnus-cus.el +;(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.") -(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) +;see gnus-cus.el +;(defvar gnus-face-dark-name-list +; '("dark salmon" "firebrick" +; "dark green" "dark orange" "dark khaki" "dark violet" +; "dark turquoise") +; "Names of dark colors.") ;;; Internal Variables: (defvar gnus-cite-article 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) @@ -277,9 +140,9 @@ ;; PREFIX: Is the citation prefix of the attribution line(s), and ;; TAG: Is a Supercite tag, if any. -(defvar gnus-cited-text-button-line-format-alist - `((?b (marker-position beg) ?d) - (?e (marker-position end) ?d) +(defvar gnus-cited-text-button-line-format-alist + `((?b beg ?d) + (?e end ?d) (?l (- end beg) ?d))) (defvar gnus-cited-text-button-line-format-spec nil) @@ -293,11 +156,18 @@ corresponding citation merged with `gnus-cite-attribution-face'. Text is considered cited if at least `gnus-cite-minimum-match-count' -lines matches `gnus-cite-prefix-regexp' with the same prefix. +lines matches `gnus-cite-prefix-regexp' with the same prefix. Lines matching `gnus-cite-attribution-suffix' and perhaps `gnus-cite-attribution-prefix' are considered attribution lines." (interactive (list 'force)) + ;; 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)))) (save-excursion (set-buffer gnus-article-buffer) (gnus-cite-parse-maybe force) @@ -332,11 +202,11 @@ face (cdr (assoc prefix face-alist))) ;; Add attribution button. (goto-line number) - (when (re-search-forward gnus-cite-attribution-suffix - (save-excursion (end-of-line 1) (point)) - t) - (gnus-article-add-button (match-beginning 1) (match-end 1) - 'gnus-cite-toggle prefix)) + (if (re-search-forward gnus-cite-attribution-suffix + (save-excursion (end-of-line 1) (point)) + t) + (gnus-article-add-button (match-beginning 1) (match-end 1) + 'gnus-cite-toggle prefix)) ;; Highlight attribution line. (gnus-cite-add-face number skip face) (gnus-cite-add-face number skip gnus-cite-attribution-face)) @@ -371,17 +241,14 @@ (goto-char (point-min)) (forward-line (1- number)) (push (cons (point-marker) prefix) marks))) - ;; Skip to the beginning of the body. (goto-char (point-min)) (search-forward "\n\n" nil t) (push (cons (point-marker) "") marks) - ;; Find the end of the body. (goto-char (point-max)) - (gnus-article-search-signature) + (re-search-backward gnus-signature-separator nil t) (push (cons (point-marker) "") marks) - ;; Sort the marks. (setq marks (sort marks (lambda (m1 m2) (< (car m1) (car m2))))) - (let ((omarks marks)) + (let* ((omarks marks)) (setq marks nil) (while (cdr omarks) (if (= (caar omarks) (caadr omarks)) @@ -390,10 +257,7 @@ (push (car omarks) marks)) (unless (equal (cdadr omarks) "") (push (cadr omarks) marks)) - (unless (and (equal (cdar omarks) "") - (equal (cdadr omarks) "") - (not (cddr omarks))) - (setq omarks (cdr omarks)))) + (setq omarks (cdr omarks))) (push (car omarks) marks)) (setq omarks (cdr omarks))) (when (car omarks) @@ -408,19 +272,17 @@ (setcdr m (cdddr m)) (setq m (cdr m)))) marks)))) + -(defun gnus-article-fill-cited-article (&optional force width) - "Do word wrapping in the current article. -If WIDTH (the numerical prefix), use that text width when filling." - (interactive (list t current-prefix-arg)) +(defun gnus-article-fill-cited-article (&optional force) + "Do word wrapping in the current article." + (interactive (list t)) (save-excursion (set-buffer gnus-article-buffer) (let ((buffer-read-only nil) (inhibit-point-motion-hooks t) (marks (gnus-dissect-cited-text)) - (adaptive-fill-mode nil) - (filladapt-mode nil) - (fill-column (if width (prefix-numeric-value width) fill-column))) + (adaptive-fill-mode nil)) (save-restriction (while (cdr marks) (widen) @@ -432,35 +294,24 @@ (set-marker (caar marks) nil) (setq marks (cdr marks))) (when marks - (set-marker (caar marks) nil)) - ;; All this information is now incorrect. - (setq gnus-cite-prefix-alist nil - gnus-cite-attribution-alist nil - gnus-cite-loose-prefix-alist nil - gnus-cite-loose-attribution-alist nil))))) + (set-marker (caar marks) nil)))))) (defun gnus-article-hide-citation (&optional arg force) "Toggle hiding of all cited text except attribution lines. See the documentation for `gnus-article-highlight-citation'. If given a negative prefix, always show; if given a positive prefix, always hide." - (interactive (append (gnus-article-hidden-arg) (list 'force))) - (setq gnus-cited-text-button-line-format-spec - (gnus-parse-format gnus-cited-text-button-line-format + (interactive (append (gnus-hidden-arg) (list 'force))) + (setq gnus-cited-text-button-line-format-spec + (gnus-parse-format gnus-cited-text-button-line-format gnus-cited-text-button-line-format-alist t)) - (save-excursion - (set-buffer gnus-article-buffer) - (cond - ((gnus-article-check-hidden-text 'cite arg) - t) - ((gnus-article-text-type-exists-p 'cite) - (let ((buffer-read-only nil)) - (gnus-article-hide-text-of-type 'cite))) - (t + (unless (gnus-article-check-hidden-text 'cite arg) + (save-excursion + (set-buffer gnus-article-buffer) (let ((buffer-read-only nil) (marks (gnus-dissect-cited-text)) (inhibit-point-motion-hooks t) - (props (nconc (list 'article-type 'cite) + (props (nconc (list 'gnus-type 'cite) gnus-hidden-properties)) beg end) (while marks @@ -468,7 +319,7 @@ end nil) (while (and marks (string= (cdar marks) "")) (setq marks (cdr marks))) - (when marks + (when marks (setq beg (caar marks))) (while (and marks (not (string= (cdar marks) ""))) (setq marks (cdr marks))) @@ -486,16 +337,11 @@ (goto-char beg) (unless (save-excursion (search-backward "\n\n" nil t)) (insert "\n")) - (put-text-property + (gnus-article-add-button (point) - (progn - (gnus-article-add-button - (point) - (progn (eval gnus-cited-text-button-line-format-spec) (point)) - `gnus-article-toggle-cited-text (cons beg end)) - (point)) - 'article-type 'annotation) - (set-marker beg (point))))))))) + (progn (eval gnus-cited-text-button-line-format-spec) (point)) + `gnus-article-toggle-cited-text (cons beg end)) + (set-marker beg (point)))))))) (defun gnus-article-toggle-cited-text (region) "Toggle hiding the text in REGION." @@ -516,7 +362,7 @@ cited text with attributions. When called interactively, these two variables are ignored. See also the documentation for `gnus-article-highlight-citation'." - (interactive (append (gnus-article-hidden-arg) (list 'force))) + (interactive (append (gnus-hidden-arg) (list 'force))) (unless (gnus-article-check-hidden-text 'cite arg) (save-excursion (set-buffer gnus-article-buffer) @@ -530,28 +376,29 @@ (hiden 0) total) (goto-char (point-max)) - (gnus-article-search-signature) + (re-search-backward gnus-signature-separator nil t) (setq total (count-lines start (point))) (while atts (setq hiden (+ hiden (length (cdr (assoc (cdar atts) gnus-cite-prefix-alist)))) atts (cdr atts))) - (when (or force - (and (> (* 100 hiden) (* gnus-cite-hide-percentage total)) - (> hiden gnus-cite-hide-absolute))) - (setq atts gnus-cite-attribution-alist) - (while atts - (setq total (cdr (assoc (cdar atts) gnus-cite-prefix-alist)) - atts (cdr atts)) - (while total - (setq hiden (car total) - total (cdr total)) - (goto-line hiden) - (unless (assq hiden gnus-cite-attribution-alist) - (gnus-add-text-properties - (point) (progn (forward-line 1) (point)) - (nconc (list 'article-type 'cite) - gnus-hidden-properties)))))))))) + (if (or force + (and (> (* 100 hiden) (* gnus-cite-hide-percentage total)) + (> hiden gnus-cite-hide-absolute))) + (progn + (setq atts gnus-cite-attribution-alist) + (while atts + (setq total (cdr (assoc (cdar atts) gnus-cite-prefix-alist)) + atts (cdr atts)) + (while total + (setq hiden (car total) + total (cdr total)) + (goto-line hiden) + (or (assq hiden gnus-cite-attribution-alist) + (gnus-add-text-properties + (point) (progn (forward-line 1) (point)) + (nconc (list 'gnus-type 'cite) + gnus-hidden-properties))))))))))) (defun gnus-article-hide-citation-in-followups () "Hide cited text in non-root articles." @@ -576,41 +423,26 @@ gnus-cite-loose-prefix-alist nil gnus-cite-loose-attribution-alist nil) ;; Parse if not too large. - (if (and (not force) + (if (and (not force) gnus-cite-parse-max-size (> (buffer-size) gnus-cite-parse-max-size)) () (setq gnus-cite-article (cons (car gnus-article-current) (cdr gnus-article-current))) - (gnus-cite-parse-wrapper)))) - -(defun gnus-cite-parse-wrapper () - ;; Wrap chopped gnus-cite-parse - (goto-char (point-min)) - (unless (search-forward "\n\n" nil t) - (goto-char (point-max))) - (save-excursion - (gnus-cite-parse-attributions)) - ;; Try to avoid check citation if there is no reason to believe - ;; that article has citations - (if (or gnus-cite-always-check - (save-excursion - (re-search-backward gnus-cite-reply-regexp nil t)) - gnus-cite-loose-attribution-alist) - (progn (save-excursion - (gnus-cite-parse)) - (save-excursion - (gnus-cite-connect-attributions))))) + (gnus-cite-parse)))) (defun gnus-cite-parse () ;; Parse and connect citation prefixes and attribution lines. - + ;; Parse current buffer searching for citation prefixes. + (goto-char (point-min)) + (or (search-forward "\n\n" nil t) + (goto-char (point-max))) (let ((line (1+ (count-lines (point-min) (point)))) (case-fold-search t) (max (save-excursion (goto-char (point-max)) - (gnus-article-search-signature) + (re-search-backward gnus-signature-separator nil t) (point))) alist entry start begin end numbers prefix) ;; Get all potential prefixes in `alist'. @@ -621,29 +453,29 @@ start end) (goto-char begin) ;; Ignore standard Supercite attribution prefix. - (when (looking-at gnus-supercite-regexp) - (if (match-end 1) - (setq end (1+ (match-end 1))) - (setq end (1+ begin)))) + (if (looking-at gnus-supercite-regexp) + (if (match-end 1) + (setq end (1+ (match-end 1))) + (setq end (1+ begin)))) ;; Ignore very long prefixes. - (when (> end (+ (point) gnus-cite-max-prefix)) - (setq end (+ (point) gnus-cite-max-prefix))) + (if (> end (+ (point) gnus-cite-max-prefix)) + (setq end (+ (point) gnus-cite-max-prefix))) (while (re-search-forward gnus-cite-prefix-regexp (1- end) t) ;; Each prefix. (setq end (match-end 0) prefix (buffer-substring begin end)) (gnus-set-text-properties 0 (length prefix) nil prefix) (setq entry (assoc prefix alist)) - (if entry + (if entry (setcdr entry (cons line (cdr entry))) - (push (list prefix line) alist)) + (setq alist (cons (list prefix line) alist))) (goto-char begin)) (goto-char start) (setq line (1+ line))) ;; We got all the potential prefixes. Now create ;; `gnus-cite-prefix-alist' containing the oldest prefix for each ;; line that appears at least gnus-cite-minimum-match-count - ;; times. First sort them by length. Longer is older. + ;; times. First sort them by length. Longer is older. (setq alist (sort alist (lambda (a b) (> (length (car a)) (length (car b)))))) (while alist @@ -659,85 +491,72 @@ ;; Too few lines with this prefix. We keep it a bit ;; longer in case it is an exact match for an attribution ;; line, but we don't remove the line from other - ;; prefixes. - (push entry gnus-cite-prefix-alist)) + ;; prefixes. + (setq gnus-cite-prefix-alist + (cons entry gnus-cite-prefix-alist))) (t - (push entry - gnus-cite-prefix-alist) + (setq gnus-cite-prefix-alist (cons entry + gnus-cite-prefix-alist)) ;; Remove articles from other prefixes. (let ((loop alist) current) (while loop (setq current (car loop) loop (cdr loop)) - (setcdr current - (gnus-set-difference (cdr current) numbers))))))))) - -(defun gnus-cite-parse-attributions () - (let (al-alist) - ;; Parse attributions - (while (re-search-forward gnus-cite-attribution-suffix (point-max) t) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (wrote (count-lines (point-min) end)) - (prefix (gnus-cite-find-prefix wrote)) - ;; Check previous line for an attribution leader. - (tag (progn - (beginning-of-line 1) - (when (looking-at gnus-supercite-secondary-regexp) - (buffer-substring (match-beginning 1) - (match-end 1))))) - (in (progn - (goto-char start) - (and (re-search-backward gnus-cite-attribution-prefix - (save-excursion - (beginning-of-line 0) - (point)) - t) - (not (re-search-forward gnus-cite-attribution-suffix - start t)) - (count-lines (point-min) (1+ (point))))))) - (when (eq wrote in) - (setq in nil)) - (goto-char end) - ;; don't add duplicates - (let ((al (buffer-substring (save-excursion (beginning-of-line 0) - (1+ (point))) - end))) - (if (not (assoc al al-alist)) - (progn - (push (list wrote in prefix tag) - gnus-cite-loose-attribution-alist) - (push (cons al t) al-alist)))))))) - -(defun gnus-cite-connect-attributions () - ;; Connect attributions to citations - + (setcdr current + (gnus-set-difference (cdr current) numbers)))))))) ;; No citations have been connected to attribution lines yet. (setq gnus-cite-loose-prefix-alist (append gnus-cite-prefix-alist nil)) ;; Parse current buffer searching for attribution lines. + (goto-char (point-min)) + (search-forward "\n\n" nil t) + (while (re-search-forward gnus-cite-attribution-suffix (point-max) t) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (wrote (count-lines (point-min) end)) + (prefix (gnus-cite-find-prefix wrote)) + ;; Check previous line for an attribution leader. + (tag (progn + (beginning-of-line 1) + (and (looking-at gnus-supercite-secondary-regexp) + (buffer-substring (match-beginning 1) + (match-end 1))))) + (in (progn + (goto-char start) + (and (re-search-backward gnus-cite-attribution-prefix + (save-excursion + (beginning-of-line 0) + (point)) + t) + (not (re-search-forward gnus-cite-attribution-suffix + start t)) + (count-lines (point-min) (1+ (point))))))) + (if (eq wrote in) + (setq in nil)) + (goto-char end) + (setq gnus-cite-loose-attribution-alist + (cons (list wrote in prefix tag) + gnus-cite-loose-attribution-alist)))) ;; Find exact supercite citations. (gnus-cite-match-attributions 'small nil (lambda (prefix tag) - (when tag - (concat "\\`" - (regexp-quote prefix) "[ \t]*" - (regexp-quote tag) ">")))) + (if tag + (concat "\\`" + (regexp-quote prefix) "[ \t]*" + (regexp-quote tag) ">")))) ;; Find loose supercite citations after attributions. (gnus-cite-match-attributions 'small t (lambda (prefix tag) - (when tag - (concat "\\<" - (regexp-quote tag) - "\\>")))) + (if tag (concat "\\<" + (regexp-quote tag) + "\\>")))) ;; Find loose supercite citations anywhere. (gnus-cite-match-attributions 'small nil (lambda (prefix tag) - (when tag - (concat "\\<" - (regexp-quote tag) - "\\>")))) + (if tag (concat "\\<" + (regexp-quote tag) + "\\>")))) ;; Find nested citations after attributions. (gnus-cite-match-attributions 'small-if-unique t (lambda (prefix tag) @@ -752,11 +571,11 @@ (while alist (setq entry (car alist) alist (cdr alist)) - (when (< (length (cdr entry)) gnus-cite-minimum-match-count) - (setq gnus-cite-prefix-alist - (delq entry gnus-cite-prefix-alist) - gnus-cite-loose-prefix-alist - (delq entry gnus-cite-loose-prefix-alist))))) + (if (< (length (cdr entry)) gnus-cite-minimum-match-count) + (setq gnus-cite-prefix-alist + (delq entry gnus-cite-prefix-alist) + gnus-cite-loose-prefix-alist + (delq entry gnus-cite-loose-prefix-alist))))) ;; Find flat attributions. (gnus-cite-match-attributions 'first t nil) ;; Find any attributions (are we getting desperate yet?). @@ -777,8 +596,8 @@ ;; If FUN is non-nil, it will be called with the arguments (WROTE ;; PREFIX TAG) and expected to return a regular expression. Only ;; citations whose prefix matches the regular expression will be - ;; considered. - ;; + ;; considered. + ;; ;; WROTE is the attribution line number. ;; PREFIX is the attribution line prefix. ;; TAG is the Supercite tag on the attribution line. @@ -797,7 +616,7 @@ ((eq sort 'first) nil) (t (< (length (gnus-cite-find-loose prefix)) 2))) limit (if after wrote -1) - smallest 1000000 + smallest 1000000 best nil) (let ((cites gnus-cite-loose-prefix-alist) cite candidate numbers first compare) @@ -818,25 +637,27 @@ () (setq gnus-cite-loose-attribution-alist (delq att gnus-cite-loose-attribution-alist)) - (push (cons wrote (car best)) gnus-cite-attribution-alist) - (when in - (push (cons in (car best)) gnus-cite-attribution-alist)) - (when (memq best gnus-cite-loose-prefix-alist) - (let ((loop gnus-cite-prefix-alist) - (numbers (cdr best)) - current) - (setq gnus-cite-loose-prefix-alist - (delq best gnus-cite-loose-prefix-alist)) - (while loop - (setq current (car loop) - loop (cdr loop)) - (if (eq current best) - () - (setcdr current (gnus-set-difference (cdr current) numbers)) - (when (null (cdr current)) - (setq gnus-cite-loose-prefix-alist - (delq current gnus-cite-loose-prefix-alist) - atts (delq current atts))))))))))) + (setq gnus-cite-attribution-alist + (cons (cons wrote (car best)) gnus-cite-attribution-alist)) + (if in + (setq gnus-cite-attribution-alist + (cons (cons in (car best)) gnus-cite-attribution-alist))) + (if (memq best gnus-cite-loose-prefix-alist) + (let ((loop gnus-cite-prefix-alist) + (numbers (cdr best)) + current) + (setq gnus-cite-loose-prefix-alist + (delq best gnus-cite-loose-prefix-alist)) + (while loop + (setq current (car loop) + loop (cdr loop)) + (if (eq current best) + () + (setcdr current (gnus-set-difference (cdr current) numbers)) + (if (null (cdr current)) + (setq gnus-cite-loose-prefix-alist + (delq current gnus-cite-loose-prefix-alist) + atts (delq current atts))))))))))) (defun gnus-cite-find-loose (prefix) ;; Return a list of loose attribution lines prefixed by PREFIX. @@ -846,8 +667,8 @@ (setq att (car atts) line (car att) atts (cdr atts)) - (when (string-equal (gnus-cite-find-prefix line) prefix) - (push line lines))) + (if (string-equal (gnus-cite-find-prefix line) prefix) + (setq lines (cons line lines)))) lines)) (defun gnus-cite-add-face (number prefix face) @@ -856,7 +677,7 @@ (let ((inhibit-point-motion-hooks t) from to) (goto-line number) - (unless (eobp);; Sometimes things become confused. + (unless (eobp) ;; Sometimes things become confused. (forward-char (length prefix)) (skip-chars-forward " \t") (setq from (point)) @@ -882,10 +703,10 @@ gnus-hidden-properties)) ((assq number gnus-cite-attribution-alist)) (t - (gnus-add-text-properties + (gnus-add-text-properties (point) (progn (forward-line 1) (point)) - (nconc (list 'article-type 'cite) - gnus-hidden-properties)))))))) + (nconc (list 'gnus-type 'cite) + gnus-hidden-properties)))))))) (defun gnus-cite-find-prefix (line) ;; Return citation prefix for LINE. @@ -895,8 +716,8 @@ (while alist (setq entry (car alist) alist (cdr alist)) - (when (memq line (cdr entry)) - (setq prefix (car entry)))) + (if (memq line (cdr entry)) + (setq prefix (car entry)))) prefix)) (gnus-add-shutdown 'gnus-cache-close 'gnus)