;;; gnus-logic.el --- advanced scoring code for Gnus
-;; Copyright (C) 1996 Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000
+;; Free Software Foundation, Inc.
-;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; This file is part of GNU Emacs.
;;; Code:
-(require 'gnus-load)
+(eval-when-compile (require 'cl))
+
+(require 'gnus)
(require 'gnus-score)
(require 'gnus-util)
-;;; Internal variables.
+;;; Internal variables.
(defvar gnus-advanced-headers nil)
-;; To avoid having 8-bit charaters in the source file.
+;; To avoid having 8-bit characters in the source file.
(defvar gnus-advanced-not (intern (format "%c" 172)))
(defconst gnus-advanced-index
("subject" 1 gnus-advanced-string)
("from" 2 gnus-advanced-string)
("date" 3 gnus-advanced-date)
- ("message-id" 4 gnus-advanced-string)
- ("references" 5 gnus-advanced-string)
- ("chars" 6 gnus-advanced-integer)
- ("lines" 7 gnus-advanced-integer)
+ ("message-id" 4 gnus-advanced-string)
+ ("references" 5 gnus-advanced-string)
+ ("chars" 6 gnus-advanced-integer)
+ ("lines" 7 gnus-advanced-integer)
("xref" 8 gnus-advanced-string)
("head" nil gnus-advanced-body)
("body" nil gnus-advanced-body)
(eval-and-compile
(autoload 'parse-time-string "parse-time"))
-
+
(defun gnus-score-advanced (rule &optional trace)
"Apply advanced scoring RULE to all the articles in the current group."
(let ((headers gnus-newsgroup-headers)
(if (setq score (assq (mail-header-number gnus-advanced-headers)
gnus-newsgroup-scored))
(setcdr score
- (+ (cdr score)
+ (+ (cdr score)
(or (nth 1 rule)
gnus-score-interactive-default-score)))
(push (cons (mail-header-number gnus-advanced-headers)
- (or (nth 1 rule)
- gnus-score-interactive-default-score))
+ (or (nth 1 rule)
+ gnus-score-interactive-default-score))
gnus-newsgroup-scored)
(when trace
(push (cons "A file" rule)
(defun gnus-advanced-score-rule (rule)
"Apply RULE to `gnus-advanced-headers'."
(let ((type (car rule)))
- (cond
+ (cond
;; "And" rule.
((or (eq type '&) (eq type 'and))
(pop rule)
(if (not rule)
t ; Empty rule is true.
(while (and rule
- (gnus-advanced-score-rule (pop rule))))
+ (gnus-advanced-score-rule (car rule)))
+ (pop rule))
;; If all the rules were true, then `rule' should be nil.
(not rule)))
;; "Or" rule.
;; This is a `1-'-type redirection rule.
((and (symbolp type)
(string-match "^[0-9]+-$\\|^\\^+$" (symbol-name type)))
- (let ((gnus-advanced-headers
+ (let ((gnus-advanced-headers
(gnus-parent-headers
gnus-advanced-headers
(if (string-match "^\\([0-9]+\\)-$" (symbol-name type))
(let* ((type (or type 's))
(case-fold-search (not (eq (downcase (symbol-name type))
(symbol-name type))))
- (header (aref gnus-advanced-headers index)))
+ (header (or (aref gnus-advanced-headers index) "")))
(cond
((memq type '(r R regexp Regexp))
(string-match match header))
(funcall type match (or (aref gnus-advanced-headers index) 0))))
(defun gnus-advanced-date (index match type)
- (let ((date (encode-time (parse-time-string
- (aref gnus-advanced-headers index))))
- (match (encode-time (parse-time-string match))))
- (cond
+ (let ((date (apply 'encode-time (parse-time-string
+ (aref gnus-advanced-headers index))))
+ (match (apply 'encode-time (parse-time-string match))))
+ (cond
((eq type 'at)
(equal date match))
((eq type 'before)
- (gnus-time-less match date))
+ (time-less-p match date))
((eq type 'after)
- (gnus-time-less date match))
+ (time-less-p date match))
(t
(error "No such date score type: %s" type)))))
ofunc article)
;; Not all backends support partial fetching. In that case,
;; we just fetch the entire article.
- (unless (gnus-check-backend-function
+ (unless (gnus-check-backend-function
(intern (concat "request-" header))
gnus-newsgroup-name)
(setq ofunc request-func)
;; If just parts of the article is to be searched and the
;; backend didn't support partial fetching, we just narrow
;; to the relevant parts.
- (if ofunc
- (if (eq ofunc 'gnus-request-head)
- (narrow-to-region
- (point)
- (or (search-forward "\n\n" nil t) (point-max)))
+ (when ofunc
+ (if (eq ofunc 'gnus-request-head)
(narrow-to-region
- (or (search-forward "\n\n" nil t) (point))
- (point-max))))
+ (point)
+ (or (search-forward "\n\n" nil t) (point-max)))
+ (narrow-to-region
+ (or (search-forward "\n\n" nil t) (point))
+ (point-max))))
(let* ((case-fold-search (not (eq (downcase (symbol-name type))
(symbol-name type))))
- (search-func
+ (search-func
(cond ((memq type '(r R regexp Regexp))
're-search-forward)
((memq type '(s S string String))
'search-forward)
(t
- (error "Illegal match type: %s" type)))))
+ (error "Invalid match type: %s" type)))))
(goto-char (point-min))
(prog1
(funcall search-func match nil t)