From 2526f423795632d123f3cd99e9aa45065b41745b Mon Sep 17 00:00:00 2001 From: Gnus developers Date: Wed, 20 Oct 2010 22:29:38 +0000 Subject: [PATCH] Merge changes made in Gnus trunk. nnimap.el (nnimap-insert-partial-structure): Fix boundary detection. spam.el (spam-list-of-processors): Mark as obsolete. gnus-art.el (gnus-blocked-images): New function. Allow the `gnus-blocked-images' to be a function. gnus-art.el (gnus-article-wash-function): Remove it, and use `mm-text-html-renderer' instead. mm-decode.el (mm-inline-text-html-renderer): Removed. mm-decode.el (mm-inline-media-tests): Removed use. mm-view.el (mm-inline-text-html): Removed use. mm-view.el (mm-text-html-renderer-alist): Add the `shr' and `gnus-w3m' symbols. gnus.texi (Article Washing): shr and gnus-w3m, not the direct function names. gnus-art.el (article-wash-html): Simplify and remove the charset stuff. Use the normal html rendering code instead of the special html washing code. mm-view.el (mm-text-html-washer-alist): Removed. gnus-news.texi: Mention that mm-text-html-renderer is the only HTML variable now. shr.el (shr-tag-table): Remove useless nconc. --- doc/misc/ChangeLog | 6 ++ doc/misc/gnus-news.texi | 3 + doc/misc/gnus.texi | 22 ++--- lisp/gnus/ChangeLog | 27 +++++++ lisp/gnus/gnus-art.el | 144 +++++++-------------------------- lisp/gnus/gnus-html.el | 6 +- lisp/gnus/mm-decode.el | 19 ++--- lisp/gnus/mm-view.el | 24 ++---- lisp/gnus/nnimap.el | 6 +- lisp/gnus/nnrss.el | 1 - lisp/gnus/shr.el | 173 ++++++++++++++++++++-------------------- lisp/gnus/spam.el | 1 + 12 files changed, 182 insertions(+), 250 deletions(-) diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog index 1737ce35703..2272f6a3296 100644 --- a/doc/misc/ChangeLog +++ b/doc/misc/ChangeLog @@ -1,3 +1,9 @@ +2010-10-20 Lars Magne Ingebrigtsen + + * gnus.texi (HTML): Document the function value of + gnus-blocked-images. + (Article Washing): shr and gnus-w3m, not the direct function names. + 2010-10-20 Julien Danjou * emacs-mime.texi (Flowed text): Add a note about mml-enable-flowed diff --git a/doc/misc/gnus-news.texi b/doc/misc/gnus-news.texi index 1136d52e51d..19483f51426 100644 --- a/doc/misc/gnus-news.texi +++ b/doc/misc/gnus-news.texi @@ -124,6 +124,9 @@ Customization}. @itemize @bullet +@item There's now only one variable that determines how @acronym{HTML} +is rendered: @code{mm-text-html-renderer}. + @item Gnus now supports sticky article buffers. Those are article buffers that are not reused when you select another article. @xref{Sticky Articles}. diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index 39693204da3..2cd45b4f2e0 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -9803,19 +9803,16 @@ If a prefix is given, a charset will be asked for. If it is a number, the charset defined in @code{gnus-summary-show-article-charset-alist} (@pxref{Paging the Article}) will be used. -@vindex gnus-article-wash-function The default is to use the function specified by @code{mm-text-html-renderer} (@pxref{Display Customization, ,Display Customization, emacs-mime, The Emacs MIME Manual}) to convert the -@acronym{HTML}, but this is controlled by the -@code{gnus-article-wash-function} variable. Pre-defined functions you -can use include: +@acronym{HTML}. Pre-defined functions you can use include: @table @code -@item mm-shr +@item shr Use Gnus simple html renderer. -@item gnus-article-html +@item gnus-w3m Use Gnus rendered based on w3m. @item w3 @@ -12462,15 +12459,20 @@ that's based on @code{w3m}. @item gnus-blocked-images @vindex gnus-blocked-images -Images that have @acronym{URL}s that match this regexp won't be -fetched and displayed. For instance, do block all @acronym{URL}s that -have the string ``ads'' in them, do the following: +External images that have @acronym{URL}s that match this regexp won't +be fetched and displayed. For instance, do block all @acronym{URL}s +that have the string ``ads'' in them, do the following: @lisp (setq gnus-blocked-images "ads") @end lisp -The default is to block all external images. +This can also be a function to be evaluated. If so, it will be +called with the group name as the parameter. The default value is +@code{gnus-block-private-groups}, which will return @samp{"."} for +anything that isn't a newsgroup. This means that no external images +will be fetched as a result of reading mail, so that nobody can use +web bugs (and the like) to track whether you've read email. @item gnus-html-cache-directory @vindex gnus-html-cache-directory diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index fc005614634..235fc71943d 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,6 +1,33 @@ +2010-10-20 Katsumi Yamaoka + + * shr.el (shr-tag-table): Remove useless nconc. + +2010-10-20 Lars Magne Ingebrigtsen + + * gnus-art.el (article-wash-html): Simplify and remove the charset + stuff. Use the normal html rendering code instead of the special html + washing code. + + * mm-view.el (mm-text-html-renderer-alist): Add the `shr' and + `gnus-w3m' symbols. + (mm-text-html-washer-alist): Removed. + + * mm-decode.el (mm-inline-text-html-renderer): Removed. + (mm-inline-media-tests): Removed use. + (mm-text-html-renderer): Change default to the `shr' symbol. + + * mm-view.el (mm-inline-text-html): Removed use. + + * gnus-art.el (gnus-blocked-images): New function. Allow the + `gnus-blocked-images' to be a function. + (gnus-article-wash-function): Removed. + 2010-10-20 Julien Danjou + * spam.el (spam-list-of-processors): Mark as obsolete. + * nnimap.el (nnimap-request-article): Fix BODYSTRUCTURE retrieval. + (nnimap-insert-partial-structure): Fix boundary detection. 2010-10-20 Andreas Seltenreich diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index 537ae4da8aa..530e72ff5ea 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -1621,9 +1621,6 @@ It is a string, such as \"PGP\". If nil, ask user." :type 'string :group 'mime-security) -(defvar gnus-article-wash-function nil - "Function used for converting HTML into text.") - (defcustom gnus-use-idna (and (condition-case nil (require 'idna) (file-error)) (mm-coding-system-p 'utf-8) (executable-find idna-program)) @@ -1639,8 +1636,11 @@ This requires GNU Libidn, and by default only enabled if it is found." :group 'gnus-article :type 'boolean) -(defcustom gnus-blocked-images "." - "Images that have URLs matching this regexp will be blocked." +(defcustom gnus-blocked-images 'gnus-block-private-groups + "Images that have URLs matching this regexp will be blocked. +This can also be a function to be evaluated. If so, it will be +called with the group name as the parameter, and should return a +regexp." :version "24.1" :group 'gnus-art :type 'regexp) @@ -2694,118 +2694,16 @@ If READ-CHARSET, ask for a coding system." (when (interactive-p) (gnus-treat-article nil)))) - -(defun article-wash-html (&optional read-charset) - "Format an HTML article. -If READ-CHARSET, ask for a coding system. If it is a number, the -charset defined in `gnus-summary-show-article-charset-alist' is used." - (interactive "P") - (save-excursion - (let ((inhibit-read-only t) - charset) - (if read-charset - (if (or (and (numberp read-charset) - (setq charset - (cdr - (assq read-charset - gnus-summary-show-article-charset-alist)))) - (setq charset (mm-read-coding-system "Charset: "))) - (let ((gnus-summary-show-article-charset-alist - (list (cons 1 charset)))) - (with-current-buffer gnus-summary-buffer - (gnus-summary-show-article 1))) - (error "No charset is given")) - (when (gnus-buffer-live-p gnus-original-article-buffer) - (with-current-buffer gnus-original-article-buffer - (let* ((ct (gnus-fetch-field "content-type")) - (ctl (and ct (mail-header-parse-content-type ct)))) - (setq charset (and ctl - (mail-content-type-get ctl 'charset))) - (when (stringp charset) - (setq charset (intern (downcase charset))))))) - (unless charset - (setq charset gnus-newsgroup-charset))) - (article-goto-body) - (save-window-excursion - (save-restriction - (narrow-to-region (point) (point-max)) - (let* ((func (or gnus-article-wash-function mm-text-html-renderer)) - (entry (assq func mm-text-html-washer-alist))) - (when entry - (setq func (cdr entry))) - (cond - ((functionp func) - (funcall func)) - (t - (apply (car func) (cdr func)))))))))) - -;; External. -(declare-function w3-region "ext:w3-display" (st nd)) - -(defun gnus-article-wash-html-with-w3 () - "Wash the current buffer with w3." - (mm-setup-w3) - (let ((w3-strict-width (window-width)) - (url-standalone-mode t) - (url-gateway-unplugged t) - (w3-honor-stylesheets nil)) - (condition-case () - (w3-region (point-min) (point-max)) - (error)))) - -;; External. -(declare-function w3m-region "ext:w3m" (start end &optional url charset)) - -(defun gnus-article-wash-html-with-w3m () - "Wash the current buffer with emacs-w3m." - (mm-setup-w3m) - (let ((w3m-safe-url-regexp mm-w3m-safe-url-regexp) - w3m-force-redisplay) - (w3m-region (point-min) (point-max))) - ;; Put the mark meaning this part was rendered by emacs-w3m. - (put-text-property (point-min) (point-max) 'mm-inline-text-html-with-w3m t) - (when (and mm-inline-text-html-with-w3m-keymap - (boundp 'w3m-minor-mode-map) - w3m-minor-mode-map) - (if (and (boundp 'w3m-link-map) - w3m-link-map) - (let* ((start (point-min)) - (end (point-max)) - (on (get-text-property start 'w3m-href-anchor)) - (map (copy-keymap w3m-link-map)) - next) - (set-keymap-parent map w3m-minor-mode-map) - (while (< start end) - (if on - (progn - (setq next (or (text-property-any start end - 'w3m-href-anchor nil) - end)) - (put-text-property start next 'keymap map)) - (setq next (or (text-property-not-all start end - 'w3m-href-anchor nil) - end)) - (put-text-property start next 'keymap w3m-minor-mode-map)) - (setq start next - on (not on)))) - (put-text-property (point-min) (point-max) 'keymap w3m-minor-mode-map)))) - -(defvar charset) ;; Bound by `article-wash-html'. - -(defun gnus-article-wash-html-with-w3m-standalone () - "Wash the current buffer with w3m." - (if (mm-w3m-standalone-supports-m17n-p) - (progn - (unless (mm-coding-system-p charset) ;; Bound by `article-wash-html'. - ;; The default. - (setq charset 'iso-8859-1)) - (let ((coding-system-for-write charset) - (coding-system-for-read charset)) - (call-process-region - (point-min) (point-max) - "w3m" t t nil "-dump" "-T" "text/html" - "-I" (symbol-name charset) "-O" (symbol-name charset)))) - (mm-inline-wash-with-stdin nil "w3m" "-dump" "-T" "text/html"))) +(defun article-wash-html () + "Format an HTML article." + (interactive) + (let ((handles nil) + (buffer-read-only nil)) + (when (gnus-buffer-live-p gnus-original-article-buffer) + (setq handles (mm-dissect-buffer t t))) + (article-goto-body) + (delete-region (point) (point-max)) + (mm-inline-text-html handles))) (defvar gnus-article-browse-html-temp-list nil "List of temporary files created by `gnus-article-browse-html-parts'. @@ -6896,6 +6794,18 @@ If given a prefix, show the hidden text instead." (point)) (set-buffer buf)))))) +(defun gnus-block-private-groups (group) + (if (gnus-news-group-p group) + ;; Block nothing in news groups. + nil + ;; Block everything anywhere else. + ".")) + +(defun gnus-blocked-images () + (if (functionp gnus-blocked-images) + (funcall gnus-blocked-images gnus-newsgroup-name) + gnus-blocked-images)) + ;;; ;;; Article editing ;;; diff --git a/lisp/gnus/gnus-html.el b/lisp/gnus/gnus-html.el index c1472118cf8..861ad73d089 100644 --- a/lisp/gnus/gnus-html.el +++ b/lisp/gnus/gnus-html.el @@ -205,8 +205,8 @@ CHARS is a regexp-like character alternative (e.g., \"[)$]\")." url (if (buffer-live-p gnus-summary-buffer) (with-current-buffer gnus-summary-buffer - gnus-blocked-images) - gnus-blocked-images)) + (gnus-blocked-images)) + (gnus-blocked-images))) (progn (widget-convert-button 'link start end @@ -491,7 +491,7 @@ This only works if the article in question is HTML." (defun gnus-html-prefetch-images (summary) (when (buffer-live-p summary) (let ((blocked-images (with-current-buffer summary - gnus-blocked-images))) + (gnus-blocked-images)))) (save-match-data (while (re-search-forward "]+src=[\"']\\([^\"']+\\)" nil t) (let ((url (gnus-html-encode-url (match-string 1)))) diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el index d35319e151b..5b79b20eb8d 100644 --- a/lisp/gnus/mm-decode.el +++ b/lisp/gnus/mm-decode.el @@ -105,8 +105,8 @@ ,disposition ,description ,cache ,id)) (defcustom mm-text-html-renderer - (cond ((fboundp 'libxml-parse-html-region) 'mm-shr) - ((executable-find "w3m") 'gnus-article-html) + (cond ((fboundp 'libxml-parse-html-region) 'shr) + ((executable-find "w3m") 'gnus-w3m) ((executable-find "links") 'links) ((executable-find "lynx") 'lynx) ((locate-library "w3") 'w3) @@ -115,8 +115,8 @@ "Render of HTML contents. It is one of defined renderer types, or a rendering function. The defined renderer types are: -`mm-shr': use Gnus simple HTML renderer; -`gnus-article-html' : use Gnus renderer based on w3m; +`shr': use Gnus simple HTML renderer; +`gnus-w3m' : use Gnus renderer based on w3m; `w3m' : use emacs-w3m; `w3m-standalone': use w3m; `links': use links; @@ -125,8 +125,8 @@ The defined renderer types are: `html2text' : use html2text; nil : use external viewer (default web browser)." :version "24.1" - :type '(choice (const mm-shr) - (const gnus-article-html) + :type '(choice (const shr) + (const gnus-w3m) (const w3) (const w3m :tag "emacs-w3m") (const w3m-standalone :tag "standalone w3m" ) @@ -137,10 +137,6 @@ nil : use external viewer (default web browser)." (function)) :group 'mime-display) -(defvar mm-inline-text-html-renderer nil - "Function used for rendering inline HTML contents. -It is suggested to customize `mm-text-html-renderer' instead.") - (defcustom mm-inline-text-html-with-images nil "If non-nil, Gnus will allow retrieving images in HTML contents with the tags. It has no effect on Emacs/w3. See also the @@ -245,8 +241,7 @@ before the external MIME handler is invoked." ("text/html" mm-inline-text-html (lambda (handle) - (or mm-inline-text-html-renderer - mm-text-html-renderer))) + mm-text-html-renderer)) ("text/x-vcard" mm-inline-text-vcard (lambda (handle) diff --git a/lisp/gnus/mm-view.el b/lisp/gnus/mm-view.el index 11e475d21ec..abe761ba9f9 100644 --- a/lisp/gnus/mm-view.el +++ b/lisp/gnus/mm-view.el @@ -50,29 +50,19 @@ (defvar w3m-minor-mode-map) (defvar mm-text-html-renderer-alist - '((w3 . mm-inline-text-html-render-with-w3) + '((shr . mm-shr) + (w3 . mm-inline-text-html-render-with-w3) (w3m . mm-inline-text-html-render-with-w3m) (w3m-standalone . mm-inline-text-html-render-with-w3m-standalone) + (gnus-w3m . gnus-article-html) (links mm-inline-render-with-file mm-links-remove-leading-blank "links" "-dump" file) - (lynx mm-inline-render-with-stdin nil - "lynx" "-dump" "-force_html" "-stdin" "-nolist") - (html2text mm-inline-render-with-function html2text)) + (lynx mm-inline-render-with-stdin nil + "lynx" "-dump" "-force_html" "-stdin" "-nolist") + (html2text mm-inline-render-with-function html2text)) "The attributes of renderer types for text/html.") -(defvar mm-text-html-washer-alist - '((w3 . gnus-article-wash-html-with-w3) - (w3m . gnus-article-wash-html-with-w3m) - (w3m-standalone . gnus-article-wash-html-with-w3m-standalone) - (links mm-inline-wash-with-file - mm-links-remove-leading-blank - "links" "-dump" file) - (lynx mm-inline-wash-with-stdin nil - "lynx" "-dump" "-force_html" "-stdin" "-nolist") - (html2text html2text)) - "The attributes of washer types for text/html.") - (defcustom mm-fill-flowed t "If non-nil a format=flowed article will be displayed flowed." :type 'boolean @@ -426,7 +416,7 @@ (buffer-string))))) (defun mm-inline-text-html (handle) - (let* ((func (or mm-inline-text-html-renderer mm-text-html-renderer)) + (let* ((func mm-text-html-renderer) (entry (assq func mm-text-html-renderer-alist)) (inhibit-read-only t)) (if entry diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el index 5e4e051a4ce..d6ad40eeae8 100644 --- a/lisp/gnus/nnimap.el +++ b/lisp/gnus/nnimap.el @@ -565,9 +565,9 @@ textual parts.") (pop bstruc)) (setq type (car bstruc)) (setq bstruc (car (cdr bstruc))) - (when (and (stringp (car bstruc)) - (string= (downcase (car bstruc)) "boundary")) - (setq boundary (cadr bstruc)))) + (let ((has-boundary (member "boundary" bstruc))) + (when has-boundary + (setq boundary (cadr has-boundary))))) (when subp (insert (format "Content-type: multipart/%s; boundary=%S\n\n" (downcase type) boundary))) diff --git a/lisp/gnus/nnrss.el b/lisp/gnus/nnrss.el index ebe8c514cb3..e3ce6db7c56 100644 --- a/lisp/gnus/nnrss.el +++ b/lisp/gnus/nnrss.el @@ -198,7 +198,6 @@ used to render text. If it is nil, text will simply be folded.") t) (defvar mm-text-html-renderer) -(defvar mm-text-html-washer-alist) (deffoo nnrss-request-article (article &optional group server buffer) (setq group (nnrss-decode-group-name group)) diff --git a/lisp/gnus/shr.el b/lisp/gnus/shr.el index e632b689a3f..acf47aa254a 100644 --- a/lisp/gnus/shr.el +++ b/lisp/gnus/shr.el @@ -631,93 +631,92 @@ Return a string with image data." (nbody (if body (shr-max-columns body))) (nfooter (if footer (shr-max-columns footer)))) (shr-tag-table-1 - (nconc - (if caption - (if header - (if footer - ;; caption + hader + body + footer - (if (= nheader nbody) - (if (= nbody nfooter) - `((tr (td ,@caption)) - (tr (td (table (tbody ,@header ,@body ,@footer))))) - (if (= nfooter 1) - `((tr (td ,@caption)) - (tr (td (table (tbody ,@header ,@body)))) - ,@footer) - `((tr (td ,@caption)) - (tr (td (table (tbody ,@header ,@body)))) - (tr (td (table (tbody ,@footer))))))) - (if (= nbody nfooter) - `((tr (td ,@caption)) - (tr (td (table (tbody ,@header)))) - (tr (td (table (tbody ,@body ,@footer))))) - (if (= nfooter 1) - `((tr (td ,@caption)) - (tr (td (table (tbody ,@header)))) - (tr (td (table (tbody ,@body)))) - ,@footer) - `((tr (td ,@caption)) - (tr (td (table (tbody ,@header)))) - (tr (td (table (tbody ,@body)))) - (tr (td (table (tbody ,@footer)))))))) - ;; caption + header + body - (if (= nheader nbody) - `((tr (td ,@caption)) - (tr (td (table (tbody ,@header ,@body))))) - (if (= nheader 1) - `((tr (td ,@caption)) - ,@header (tr (td (table (tbody ,@body))))) - `((tr (td ,@caption)) - (tr (td (table (tbody ,@header)))) - (tr (td (table (tbody ,@body)))))))) - (if footer - ;; caption + body + footer - (if (= nbody nfooter) - `((tr (td (table (tbody ,@body ,@footer))))) - (if (= nfooter 1) - `((tr (td (table (tbody ,@body)))) ,@footer) - `((tr (td (table (tbody ,@body)))) - (tr (td (table (tbody ,@footer))))))) - ;; caption + body - `((tr (td ,@caption)) - (tr (td (table (tbody ,@body))))))) - (if header - (if footer - ;; header + body + footer - (if (= nheader nbody) - (if (= nbody nfooter) - `((tr (td (table (tbody ,@header ,@body ,@footer))))) - (if (= nfooter 1) - `((tr (td (table (tbody ,@header ,@body)))) - ,@footer) - `((tr (td (table (tbody ,@header ,@body)))) - (tr (td (table (tbody ,@footer))))))) - (if (= nbody nfooter) - `((tr (td (table (tbody ,@header)))) - (tr (td (table (tbody ,@body ,@footer))))) - (if (= nfooter 1) - `((tr (td (table (tbody ,@header)))) - (tr (td (table (tbody ,@body)))) - ,@footer) - `((tr (td (table (tbody ,@header)))) - (tr (td (table (tbody ,@body)))) - (tr (td (table (tbody ,@footer)))))))) - ;; header + body - (if (= nheader nbody) - `((tr (td (table (tbody ,@header ,@body))))) - (if (= nheader 1) - `(,@header (tr (td (table (tbody ,@body))))) - `((tr (td (table (tbody ,@header)))) - (tr (td (table (tbody ,@body)))))))) - (if footer - ;; body + footer - (if (= nbody nfooter) - `((tr (td (table (tbody ,@body ,@footer))))) - (if (= nfooter 1) - `((tr (td (table (tbody ,@body)))) ,@footer) - `((tr (td (table (tbody ,@body)))) - (tr (td (table (tbody ,@footer))))))) - body))))))) + (if caption + (if header + (if footer + ;; caption + hader + body + footer + (if (= nheader nbody) + (if (= nbody nfooter) + `((tr (td ,@caption)) + (tr (td (table (tbody ,@header ,@body ,@footer))))) + (if (= nfooter 1) + `((tr (td ,@caption)) + (tr (td (table (tbody ,@header ,@body)))) + ,@footer) + `((tr (td ,@caption)) + (tr (td (table (tbody ,@header ,@body)))) + (tr (td (table (tbody ,@footer))))))) + (if (= nbody nfooter) + `((tr (td ,@caption)) + (tr (td (table (tbody ,@header)))) + (tr (td (table (tbody ,@body ,@footer))))) + (if (= nfooter 1) + `((tr (td ,@caption)) + (tr (td (table (tbody ,@header)))) + (tr (td (table (tbody ,@body)))) + ,@footer) + `((tr (td ,@caption)) + (tr (td (table (tbody ,@header)))) + (tr (td (table (tbody ,@body)))) + (tr (td (table (tbody ,@footer)))))))) + ;; caption + header + body + (if (= nheader nbody) + `((tr (td ,@caption)) + (tr (td (table (tbody ,@header ,@body))))) + (if (= nheader 1) + `((tr (td ,@caption)) + ,@header (tr (td (table (tbody ,@body))))) + `((tr (td ,@caption)) + (tr (td (table (tbody ,@header)))) + (tr (td (table (tbody ,@body)))))))) + (if footer + ;; caption + body + footer + (if (= nbody nfooter) + `((tr (td (table (tbody ,@body ,@footer))))) + (if (= nfooter 1) + `((tr (td (table (tbody ,@body)))) ,@footer) + `((tr (td (table (tbody ,@body)))) + (tr (td (table (tbody ,@footer))))))) + ;; caption + body + `((tr (td ,@caption)) + (tr (td (table (tbody ,@body))))))) + (if header + (if footer + ;; header + body + footer + (if (= nheader nbody) + (if (= nbody nfooter) + `((tr (td (table (tbody ,@header ,@body ,@footer))))) + (if (= nfooter 1) + `((tr (td (table (tbody ,@header ,@body)))) + ,@footer) + `((tr (td (table (tbody ,@header ,@body)))) + (tr (td (table (tbody ,@footer))))))) + (if (= nbody nfooter) + `((tr (td (table (tbody ,@header)))) + (tr (td (table (tbody ,@body ,@footer))))) + (if (= nfooter 1) + `((tr (td (table (tbody ,@header)))) + (tr (td (table (tbody ,@body)))) + ,@footer) + `((tr (td (table (tbody ,@header)))) + (tr (td (table (tbody ,@body)))) + (tr (td (table (tbody ,@footer)))))))) + ;; header + body + (if (= nheader nbody) + `((tr (td (table (tbody ,@header ,@body))))) + (if (= nheader 1) + `(,@header (tr (td (table (tbody ,@body))))) + `((tr (td (table (tbody ,@header)))) + (tr (td (table (tbody ,@body)))))))) + (if footer + ;; body + footer + (if (= nbody nfooter) + `((tr (td (table (tbody ,@body ,@footer))))) + (if (= nfooter 1) + `((tr (td (table (tbody ,@body)))) ,@footer) + `((tr (td (table (tbody ,@body)))) + (tr (td (table (tbody ,@footer))))))) + body)))))) (defun shr-find-elements (cont type) (let (result) diff --git a/lisp/gnus/spam.el b/lisp/gnus/spam.el index 448a0088fb8..097299f30c4 100644 --- a/lisp/gnus/spam.el +++ b/lisp/gnus/spam.el @@ -1287,6 +1287,7 @@ variable. When the processor variable is nil, just the classification and spam-use-* check variable are used. This is superseded by the new spam backend code, so it's only consulted for backwards compatibility.") +(make-obsolete-variable 'spam-list-of-processors nil "22.1") (defun spam-group-processor-p (group backend &optional classification) "Checks if GROUP has a BACKEND with CLASSIFICATION registered. -- 2.39.5