emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/gnus/gnus-mlspl.el [gnus-5_10-branch


From: Andreas Schwab
Subject: [Emacs-diffs] Changes to emacs/lisp/gnus/gnus-mlspl.el [gnus-5_10-branch]
Date: Thu, 22 Jul 2004 13:14:14 -0400

Index: emacs/lisp/gnus/gnus-mlspl.el
diff -c /dev/null emacs/lisp/gnus/gnus-mlspl.el:1.8.2.1
*** /dev/null   Thu Jul 22 16:46:20 2004
--- emacs/lisp/gnus/gnus-mlspl.el       Thu Jul 22 16:45:47 2004
***************
*** 0 ****
--- 1,232 ----
+ ;;; gnus-mlspl.el --- a group params-based mail splitting mechanism
+ 
+ ;; Copyright (C) 1998, 1999, 2000, 2001, 2002
+ ;;        Free Software Foundation, Inc.
+ 
+ ;; Author: Alexandre Oliva <address@hidden>
+ ;; Keywords: news, mail
+ 
+ ;; This file is part of GNU Emacs.
+ 
+ ;; 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 2, or (at your
+ ;; option) any later version.
+ 
+ ;; 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 this program; 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:
+ 
+ (eval-when-compile (require 'cl))
+ (require 'gnus)
+ (require 'gnus-sum)
+ (require 'gnus-group)
+ (require 'nnmail)
+ 
+ (defvar gnus-group-split-updated-hook nil
+   "Hook called just after nnmail-split-fancy is updated by
+ gnus-group-split-update.")
+ 
+ (defvar gnus-group-split-default-catch-all-group "mail.misc"
+   "Group name (or arbitrary fancy split) with default splitting rules.
+ Used by gnus-group-split and gnus-group-split-update as a fallback
+ split, in case none of the group-based splits matches.")
+ 
+ ;;;###autoload
+ (defun gnus-group-split-setup (&optional auto-update catch-all)
+   "Set up the split for nnmail-split-fancy.
+ Sets things up so that nnmail-split-fancy is used for mail
+ splitting, and defines the variable nnmail-split-fancy according with
+ group parameters.
+ 
+ If AUTO-UPDATE is non-nil (prefix argument accepted, if called
+ interactively), it makes sure nnmail-split-fancy is re-computed before
+ getting new mail, by adding gnus-group-split-update to
+ nnmail-pre-get-new-mail-hook.
+ 
+ A non-nil CATCH-ALL replaces the current value of
+ gnus-group-split-default-catch-all-group.  This variable is only used
+ by gnus-group-split-update, and only when its CATCH-ALL argument is
+ nil.  This argument may contain any fancy split, that will be added as
+ the last split in a `|' split produced by gnus-group-split-fancy,
+ unless overridden by any group marked as a catch-all group.  Typical
+ uses are as simple as the name of a default mail group, but more
+ elaborate fancy splits may also be useful to split mail that doesn't
+ match any of the group-specified splitting rules.  See
+ `gnus-group-split-fancy' for details."
+   (interactive "P")
+   (setq nnmail-split-methods 'nnmail-split-fancy)
+   (when catch-all
+     (setq gnus-group-split-default-catch-all-group catch-all))
+   (gnus-group-split-update)
+   (when auto-update
+     (add-hook 'nnmail-pre-get-new-mail-hook 'gnus-group-split-update)))
+ 
+ ;;;###autoload
+ (defun gnus-group-split-update (&optional catch-all)
+   "Computes nnmail-split-fancy from group params and CATCH-ALL, by
+ calling (gnus-group-split-fancy nil nil CATCH-ALL).
+ 
+ If CATCH-ALL is nil, gnus-group-split-default-catch-all-group is used
+ instead.  This variable is set by gnus-group-split-setup."
+   (interactive)
+   (setq nnmail-split-fancy
+       (gnus-group-split-fancy
+        nil (null nnmail-crosspost)
+        (or catch-all gnus-group-split-default-catch-all-group)))
+   (run-hooks 'gnus-group-split-updated-hook))
+ 
+ ;;;###autoload
+ (defun gnus-group-split ()
+   "Uses information from group parameters in order to split mail.
+ See `gnus-group-split-fancy' for more information.
+ 
+ gnus-group-split is a valid value for nnmail-split-methods."
+   (let (nnmail-split-fancy)
+     (gnus-group-split-update)
+     (nnmail-split-fancy)))
+ 
+ ;;;###autoload
+ (defun gnus-group-split-fancy
+   (&optional groups no-crosspost catch-all)
+   "Uses information from group parameters in order to split mail.
+ It can be embedded into `nnmail-split-fancy' lists with the SPLIT
+ 
+ \(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL\)
+ 
+ GROUPS may be a regular expression or a list of group names, that will
+ be used to select candidate groups.  If it is omitted or nil, all
+ existing groups are considered.
+ 
+ if NO-CROSSPOST is omitted or nil, a & split will be returned,
+ otherwise, a | split, that does not allow crossposting, will be
+ returned.
+ 
+ For each selected group, a SPLIT is composed like this: if SPLIT-SPEC
+ is specified, this split is returned as-is (unless it is nil: in this
+ case, the group is ignored).  Otherwise, if TO-ADDRESS, TO-LIST and/or
+ EXTRA-ALIASES are specified, a regexp that matches any of them is
+ constructed (extra-aliases may be a list).  Additionally, if
+ SPLIT-REGEXP is specified, the regexp will be extended so that it
+ matches this regexp too, and if SPLIT-EXCLUDE is specified, RESTRICT
+ clauses will be generated.
+ 
+ If CATCH-ALL is nil, no catch-all handling is performed, regardless of
+ catch-all marks in group parameters.  Otherwise, if there is no
+ selected group whose SPLIT-REGEXP matches the empty string, nor is
+ there a selected group whose SPLIT-SPEC is 'catch-all, this fancy
+ split (say, a group name) will be appended to the returned SPLIT list,
+ as the last element of a '| SPLIT.
+ 
+ For example, given the following group parameters:
+ 
+ nnml:mail.bar:
+ \((to-address . \"address@hidden")
+  (split-regexp . \"address@hidden"))
+ nnml:mail.foo:
+ \((to-list . \"address@hidden")
+  (extra-aliases \"address@hidden" \"address@hidden")
+  (split-exclude \"bugs-foo\" \"rambling-foo\")
+  (admin-address . \"address@hidden"))
+ nnml:mail.others:
+ \((split-spec . catch-all))
+ 
+ Calling (gnus-group-split-fancy nil nil \"mail.others\") returns:
+ 
+ \(| (& (any \"\\\\(address@hidden|address@hidden)\"
+          \"mail.bar\")
+       (any \"\\\\(address@hidden|address@hidden|address@hidden)\"
+          - \"bugs-foo\" - \"rambling-foo\" \"mail.foo\"))
+    \"mail.others\")"
+   (let* ((newsrc (cdr gnus-newsrc-alist))
+        split)
+     (dolist (info newsrc)
+       (let ((group (gnus-info-group info))
+           (params (gnus-info-params info)))
+       ;; For all GROUPs that match the specified GROUPS
+       (when (or (not groups)
+                 (and (listp groups)
+                      (memq group groups))
+                 (and (stringp groups)
+                      (string-match groups group)))
+         (let ((split-spec (assoc 'split-spec params)) group-clean)
+           ;; Remove backend from group name
+           (setq group-clean (string-match ":" group))
+           (setq group-clean
+                 (if group-clean
+                     (substring group (1+ group-clean))
+                   group))
+           (if split-spec
+               (when (setq split-spec (cdr split-spec))
+                 (if (eq split-spec 'catch-all)
+                     ;; Emit catch-all only when requested
+                     (when catch-all
+                       (setq catch-all group-clean))
+                   ;; Append split-spec to the main split
+                   (push split-spec split)))
+             ;; Let's deduce split-spec from other params
+             (let ((to-address (cdr (assoc 'to-address params)))
+                   (to-list (cdr (assoc 'to-list params)))
+                   (extra-aliases (cdr (assoc 'extra-aliases params)))
+                   (split-regexp (cdr (assoc 'split-regexp params)))
+                   (split-exclude (cdr (assoc 'split-exclude params))))
+               (when (or to-address to-list extra-aliases split-regexp)
+                 ;; regexp-quote to-address, to-list and extra-aliases
+                 ;; and add them all to split-regexp
+                 (setq split-regexp
+                       (concat
+                        "\\("
+                        (mapconcat
+                         'identity
+                         (append
+                          (and to-address (list (regexp-quote to-address)))
+                          (and to-list (list (regexp-quote to-list)))
+                          (and extra-aliases
+                               (if (listp extra-aliases)
+                                   (mapcar 'regexp-quote extra-aliases)
+                                 (list extra-aliases)))
+                          (and split-regexp (list split-regexp)))
+                         "\\|")
+                        "\\)"))
+                 ;; Now create the new SPLIT
+                 (push (append
+                        (list 'any split-regexp)
+                        ;; Generate RESTRICTs for SPLIT-EXCLUDEs.
+                        (if (listp split-exclude)
+                            (apply #'append
+                                   (mapcar (lambda (arg) (list '- arg))
+                                           split-exclude))
+                          (list '- split-exclude))
+                        (list group-clean))
+                       split)
+                 ;; If it matches the empty string, it is a catch-all
+                 (when (string-match split-regexp "")
+                   (setq catch-all nil)))))))))
+     ;; Add catch-all if not crossposting
+     (if (and catch-all no-crosspost)
+       (push catch-all split))
+     ;; Move it to the tail, while arranging that SPLITs appear in the
+     ;; same order as groups.
+     (setq split (reverse split))
+     ;; Decide whether to accept cross-postings or not.
+     (push (if no-crosspost '| '&) split)
+     ;; Even if we can cross-post, catch-all should not get
+     ;; cross-posts.
+     (if (and catch-all (not no-crosspost))
+       (setq split (list '| split catch-all)))
+     split))
+ 
+ (provide 'gnus-mlspl)
+ 
+ ;;; arch-tag: 62b3381f-1e45-4b61-be1a-29fb27703322
+ ;;; gnus-mlspl.el ends here




reply via email to

[Prev in Thread] Current Thread [Next in Thread]