;;; spam-stat.el --- detecting spam based on statistics
-;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 2002-2013 Free Software Foundation, Inc.
;; Author: Alex Schroeder <alex@gnu.org>
;; Keywords: network
;; This file is part of GNU Emacs.
-;; This is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
-;; This is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
-;; License for more details.
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; 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, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
:type 'file
:group 'spam-stat)
-(defcustom spam-stat-install-hooks t
- "Whether spam-stat should install its hooks in Gnus.
-This is set to nil if you use spam-stat through spam.el."
- :type 'boolean
- :group 'spam-stat)
-
(defcustom spam-stat-unknown-word-score 0.2
"The score to use for unknown words.
Also used for words that don't appear often enough."
(defcustom spam-stat-score-buffer-user-functions nil
"List of additional scoring functions.
-Called one by one on the buffer.
+Called one by one on the buffer.
If all of these functions return non-nil answers, these numerical
answers are added to the computed spam stat score on the buffer. If
(null spam-stat-last-saved-at)
(not (equal spam-stat-last-saved-at
(nth 5 (file-attributes spam-stat-file)))))
- (progn
+ (progn
(load-file spam-stat-file)
(setq spam-stat-dirty nil
- spam-stat-last-saved-at
+ spam-stat-last-saved-at
(nth 5 (file-attributes spam-stat-file)))))
- (t (message "Spam stat file not loaded: no change in disk..")))))
+ (t (message "Spam stat file not loaded: no change in disk.")))))
(defun spam-stat-to-hash-table (entries)
"Turn list ENTRIES into a hash table and store as `spam-stat'.
(setcdr (nthcdr 14 result) nil)
result))
+(eval-when-compile
+ (defmacro spam-stat-called-interactively-p (kind)
+ (condition-case nil
+ (progn
+ (eval '(called-interactively-p 'any))
+ ;; Emacs >=23.2
+ `(called-interactively-p ,kind))
+ ;; Emacs <23.2
+ (wrong-number-of-arguments '(called-interactively-p))
+ ;; XEmacs
+ (void-function '(interactive-p)))))
+
(defun spam-stat-score-buffer ()
"Return a score describing the spam-probability for this buffer.
Add user supplied modifications if supplied."
- (interactive) ; helps in debugging.
+ (interactive) ; helps in debugging.
(setq spam-stat-score-data (spam-stat-buffer-words-with-scores))
(let* ((probs (mapcar 'cadr spam-stat-score-data))
(prod (apply #'* probs))
- (score0
+ (score0
(/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x))
probs)))))
(score1s
(error nil)))
(ans
(if score1s (+ score0 score1s) score0)))
- (when (interactive-p)
+ (when (spam-stat-called-interactively-p 'any)
(message "%S" ans))
ans))
(defun spam-stat-score-buffer-user (&rest args)
(let* ((scores
- (mapcar
- (lambda (fn)
+ (mapcar
+ (lambda (fn)
(apply fn args))
spam-stat-score-buffer-user-functions)))
- (if (memq nil scores) nil
+ (if (memq nil scores) nil
(apply #'+ scores))))
(defun spam-stat-split-fancy ()
;; Testing
(defun spam-stat-strip-xref ()
- "Strip the the Xref header."
+ "Strip the Xref header."
(save-restriction
(mail-narrow-to-head)
(when (re-search-forward "^Xref:.*\n" nil t)
(delete-region (match-beginning 0) (match-end 0)))))
+(autoload 'time-to-number-of-days "time-date")
+
(defun spam-stat-process-directory (dir func)
"Process all the regular files in directory DIR using function FUNC."
(let* ((files (directory-files dir t "^[^.]"))
(add-hook 'gnus-select-article-hook
'spam-stat-store-gnus-article-buffer))
-(when spam-stat-install-hooks
- (spam-stat-install-hooks-function))
-
(defun spam-stat-unload-hook ()
"Uninstall the spam-stat function hooks."
(interactive)
(provide 'spam-stat)
-;;; arch-tag: ff1d2200-8ddb-42fb-bb7b-1b5e20448554
;;; spam-stat.el ends here