;;; gnus-logic.el --- advanced scoring code for Gnus
-;; Copyright (C) 1996 Free Software Foundation, Inc.
+;; Copyright (C) 1996,97 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
;; Keywords: news
;;; Code:
-(require 'gnus-load)
+(require 'gnus)
(require 'gnus-score)
-;(require 'parse-time)
(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)
("all" 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 ((date (encode-time (parse-time-string
(aref gnus-advanced-headers index))))
(match (encode-time (parse-time-string match))))
- (cond
+ (cond
((eq type 'at)
(equal date match))
((eq type 'before)
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))