From a7647f812ea284a12c515bffc4f76d981437ace5 Mon Sep 17 00:00:00 2001 From: yamaoka Date: Thu, 17 Oct 2002 23:20:20 +0000 Subject: [PATCH] Synch with Oort Gnus. --- lisp/ChangeLog | 28 ++++++ lisp/gnus-agent.el | 7 +- lisp/gnus-art.el | 7 +- lisp/gnus-cache.el | 3 +- lisp/gnus-msg.el | 3 +- lisp/nndiary.el | 8 +- lisp/nnfolder.el | 8 +- lisp/nnheader.el | 240 ++++++++++++++++++++++++++++------------------------ lisp/nnimap.el | 7 +- lisp/nnmaildir.el | 3 +- lisp/nnml.el | 16 ++-- texi/ChangeLog | 8 ++ texi/gnus-ja.texi | 23 ++++- texi/gnus.texi | 20 ++++- 14 files changed, 227 insertions(+), 154 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index e995b1b..36f7dcc 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,31 @@ +2002-10-17 TSUCHIYA Masatoshi + + * nnheader.el (nnheader-parse-naked-head): New function. + (nnheader-parse-head): Use the above function, in order to handle + continuation lines properly. + (nnheader-remove-body): New function. + (nnheader-remove-cr-followed-by-lf): New function. + (nnheader-ms-strip-cr): Use the above function. + + * gnus-agent.el (gnus-agent-regenerate-group): Call + `nnheader-remove-body'; use `nnheader-parse-naked-head' instead of + `nnheader-parse-head'. + * gnus-cache.el (gnus-cache-possibly-enter-article): Ditto. + + * gnus-msg.el (gnus-inews-yank-articles): Do not unfold + continuation lines by itself; call `nnheader-parse-naked-head' + instead of `nnheader-parse-head'. + * nndiary.el (nndiary-parse-head): Ditto. + * nnfolder.el (nnfolder-parse-head): Ditto. + * nnimap.el (nnimap-retrieve-headers-progress): Ditto. + * nnmaildir.el (nnmaildir--update-nov): Ditto. + * nnml.el (nnml-parse-head): Ditto. + +2002-10-17 Steve Youngs + + * gnus-art.el (gnus-button-man-handler): Add 'manual-entry' for + XEmacs, default to it if featurep 'xemacs. + 2002-10-16 Katsumi Yamaoka * spam-stat.el: Check for the existence of hash functions instead diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el index e64a348..e3af154 100644 --- a/lisp/gnus-agent.el +++ b/lisp/gnus-agent.el @@ -2046,11 +2046,8 @@ and GROUP without FORCE is not supported." (mm-with-unibyte-buffer (nnheader-insert-file-contents (concat dir (number-to-string (car arts)))) - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (delete-region (point) (point-max)) - (goto-char (point-max))) - (setq header (nnheader-parse-head t))) + (nnheader-remove-body) + (setq header (nnheader-parse-naked-head))) (mail-header-set-number header (car arts)) (nnheader-insert-nov header) (setq changed t) diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index 9a0e3fe..5ba656f 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -5814,11 +5814,14 @@ after replacing with the original article." :group 'gnus-article-buttons :type 'regexp) -(defcustom gnus-button-man-handler 'man +(defcustom gnus-button-man-handler (if (featurep 'xemacs) + 'manual-entry + 'man) "Function to use for displaying man pages. The function must take at least one argument with a string naming the man page." - :type '(choice (function-item :tag "Man" man) + :type '(choice (function-item :tag "Man (Emacs)" man) + (function-item :tag "Man (XEmacs)" manual-entry) (function-item :tag "Woman" woman) (function :tag "Other")) :group 'gnus-article-buttons) diff --git a/lisp/gnus-cache.el b/lisp/gnus-cache.el index 207f096..799b01a 100644 --- a/lisp/gnus-cache.el +++ b/lisp/gnus-cache.el @@ -183,7 +183,8 @@ it's not cached." (when (> (buffer-size) 0) (gnus-write-buffer-as-coding-system gnus-cache-write-file-coding-system file) - (setq headers (nnheader-parse-head t)) + (nnheader-remove-body) + (setq headers (nnheader-parse-naked-head)) (mail-header-set-number headers number) (gnus-cache-change-buffer group) (set-buffer (cdr gnus-cache-buffer)) diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index 799bac1..aa3676e 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -762,8 +762,7 @@ yanked." (with-current-buffer gnus-article-copy (save-restriction (nnheader-narrow-to-headers) - (ietf-drums-unfold-fws) - (nnheader-parse-head t))))) + (nnheader-parse-naked-head))))) (message-yank-original) (setq beg (or beg (mark t)))) (when articles diff --git a/lisp/nndiary.el b/lisp/nndiary.el index b3b7cf3..0484dc8 100644 --- a/lisp/nndiary.el +++ b/lisp/nndiary.el @@ -1123,13 +1123,7 @@ all. This may very well take some time.") (narrow-to-region (goto-char (point-min)) (if (search-forward "\n\n" nil t) (1- (point)) (point-max)))) - ;; Fold continuation lines. - (goto-char (point-min)) - (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) - (replace-match " " t t)) - ;; Remove any tabs; they are too confusing. - (subst-char-in-region (point-min) (point-max) ?\t ? ) - (let ((headers (nnheader-parse-head t))) + (let ((headers (nnheader-parse-naked-head))) (mail-header-set-chars headers chars) (mail-header-set-number headers number) headers)))) diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 013fb40..02ccc09 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -1151,13 +1151,7 @@ This command does not work if you use short group names." (if (search-forward "\n\n" e t) (setq e (1- (point))))) (with-temp-buffer (insert-buffer-substring buf b e) - ;; Fold continuation lines. - (goto-char (point-min)) - (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) - (replace-match " " t t)) - ;; Remove any tabs; they are too confusing. - (subst-char-in-region (point-min) (point-max) ?\t ? ) - (let ((headers (nnheader-parse-head t))) + (let ((headers (nnheader-parse-naked-head))) (mail-header-set-chars headers chars) (mail-header-set-number headers number) headers))))) diff --git a/lisp/nnheader.el b/lisp/nnheader.el index 7290f6a..e163cdb 100644 --- a/lisp/nnheader.el +++ b/lisp/nnheader.el @@ -600,6 +600,11 @@ given, the return value will not contain the last newline." ;; Parsing headers and NOV lines. +(defsubst nnheader-remove-cr-followed-by-lf () + (goto-char (point-max)) + (while (search-backward "\r\n" nil t) + (delete-char 1))) + (defsubst nnheader-header-value () (let ((pt (point))) (prog2 @@ -607,116 +612,126 @@ given, the return value will not contain the last newline." (buffer-substring (point) (std11-field-end)) (goto-char pt)))) -(defun nnheader-parse-head (&optional naked) +(defun nnheader-parse-naked-head (&optional number) + ;; This function unfolds continuation lines in this buffer + ;; destructively. When this side effect is unwanted, use + ;; `nnheader-parse-head' instead of this function. (let ((case-fold-search t) - (cur (current-buffer)) (buffer-read-only nil) - in-reply-to lines p ref) - (goto-char (point-min)) - (when naked - (insert "\n")) - ;; Search to the beginning of the next header. Error messages - ;; do not begin with 2 or 3. + (cur (current-buffer)) + (p (point-min)) + in-reply-to lines ref) + (nnheader-remove-cr-followed-by-lf) + (ietf-drums-unfold-fws) + (subst-char-in-region (point-min) (point-max) ?\t ? ) + (goto-char p) + (insert "\n") (prog1 - (when (or naked (re-search-forward "^[23][0-9]+ " nil t)) - ;; This implementation of this function, with nine - ;; search-forwards instead of the one re-search-forward and - ;; a case (which basically was the old function) is actually - ;; about twice as fast, even though it looks messier. You - ;; can't have everything, I guess. Speed and elegance - ;; don't always go hand in hand. - (make-full-mail-header - ;; Number. - (if naked - (progn - (setq p (point-min)) - 0) - (prog1 - (read cur) - (end-of-line) - (setq p (point)) - (narrow-to-region (point) - (or (and (search-forward "\n.\n" nil t) - (- (point) 2)) - (point))))) - ;; Subject. - (progn - (goto-char p) - (if (search-forward "\nsubject:" nil t) - (nnheader-header-value) "(none)")) - ;; From. - (progn - (goto-char p) - (if (search-forward "\nfrom:" nil t) - (nnheader-header-value) "(nobody)")) - ;; Date. - (progn - (goto-char p) - (if (search-forward "\ndate:" nil t) - (nnheader-header-value) "")) - ;; Message-ID. - (progn - (goto-char p) - (if (search-forward "\nmessage-id:" nil t) - (buffer-substring - (1- (or (search-forward "<" (gnus-point-at-eol) t) - (point))) - (or (search-forward ">" (gnus-point-at-eol) t) (point))) - ;; If there was no message-id, we just fake one to make - ;; subsequent routines simpler. - (nnheader-generate-fake-message-id))) - ;; References. - (progn - (goto-char p) - (if (search-forward "\nreferences:" nil t) - (nnheader-header-value) - ;; Get the references from the in-reply-to header if there - ;; were no references and the in-reply-to header looks - ;; promising. - (if (and (search-forward "\nin-reply-to:" nil t) - (setq in-reply-to (nnheader-header-value)) - (string-match "<[^\n>]+>" in-reply-to)) - (let (ref2) - (setq ref (substring in-reply-to (match-beginning 0) - (match-end 0))) - (while (string-match "<[^\n>]+>" - in-reply-to (match-end 0)) - (setq ref2 (substring in-reply-to (match-beginning 0) - (match-end 0))) - (when (> (length ref2) (length ref)) - (setq ref ref2))) - ref) - nil))) - ;; Chars. - 0 - ;; Lines. - (progn - (goto-char p) - (if (search-forward "\nlines: " nil t) - (if (numberp (setq lines (read cur))) - lines 0) - 0)) - ;; Xref. - (progn - (goto-char p) - (and (search-forward "\nxref:" nil t) - (nnheader-header-value))) - - ;; Extra. - (when nnmail-extra-headers - (let ((extra nnmail-extra-headers) - out) - (while extra - (goto-char p) - (when (search-forward - (concat "\n" (symbol-name (car extra)) ":") nil t) - (push (cons (car extra) (nnheader-header-value)) - out)) - (pop extra)) - out)))) - (when naked - (goto-char (point-min)) - (delete-char 1))))) + ;; This implementation of this function, with nine + ;; search-forwards instead of the one re-search-forward and a + ;; case (which basically was the old function) is actually + ;; about twice as fast, even though it looks messier. You + ;; can't have everything, I guess. Speed and elegance don't + ;; always go hand in hand. + (make-full-mail-header + ;; Number. + (or number 0) + ;; Subject. + (progn + (goto-char p) + (if (search-forward "\nsubject:" nil t) + (nnheader-header-value) "(none)")) + ;; From. + (progn + (goto-char p) + (if (search-forward "\nfrom:" nil t) + (nnheader-header-value) "(nobody)")) + ;; Date. + (progn + (goto-char p) + (if (search-forward "\ndate:" nil t) + (nnheader-header-value) "")) + ;; Message-ID. + (progn + (goto-char p) + (if (search-forward "\nmessage-id:" nil t) + (buffer-substring + (1- (or (search-forward "<" (gnus-point-at-eol) t) + (point))) + (or (search-forward ">" (gnus-point-at-eol) t) (point))) + ;; If there was no message-id, we just fake one to make + ;; subsequent routines simpler. + (nnheader-generate-fake-message-id))) + ;; References. + (progn + (goto-char p) + (if (search-forward "\nreferences:" nil t) + (nnheader-header-value) + ;; Get the references from the in-reply-to header if + ;; there were no references and the in-reply-to header + ;; looks promising. + (if (and (search-forward "\nin-reply-to:" nil t) + (setq in-reply-to (nnheader-header-value)) + (string-match "<[^\n>]+>" in-reply-to)) + (let (ref2) + (setq ref (substring in-reply-to (match-beginning 0) + (match-end 0))) + (while (string-match "<[^\n>]+>" + in-reply-to (match-end 0)) + (setq ref2 (substring in-reply-to (match-beginning 0) + (match-end 0))) + (when (> (length ref2) (length ref)) + (setq ref ref2))) + ref) + nil))) + ;; Chars. + 0 + ;; Lines. + (progn + (goto-char p) + (if (search-forward "\nlines: " nil t) + (if (numberp (setq lines (read cur))) + lines 0) + 0)) + ;; Xref. + (progn + (goto-char p) + (and (search-forward "\nxref:" nil t) + (nnheader-header-value))) + ;; Extra. + (when nnmail-extra-headers + (let ((extra nnmail-extra-headers) + out) + (while extra + (goto-char p) + (when (search-forward + (concat "\n" (symbol-name (car extra)) ":") nil t) + (push (cons (car extra) (nnheader-header-value)) + out)) + (pop extra)) + out))) + (goto-char p) + (delete-char 1)))) + +(defun nnheader-parse-head (&optional naked) + (let ((cur (current-buffer)) num beg end) + (when (if naked + (setq num 0 + beg (point-min) + end (point-max)) + (goto-char (point-min)) + ;; Search to the beginning of the next header. Error + ;; messages do not begin with 2 or 3. + (when (re-search-forward "^[23][0-9]+ " nil t) + (end-of-line) + (setq num (read cur) + beg (point) + end (if (search-forward "\n.\n" nil t) + (- (point) 2) + (point))))) + (with-temp-buffer + (insert-buffer-substring cur beg end) + (nnheader-parse-naked-head num))))) (defmacro nnheader-nov-skip-field () '(search-forward "\t" eol 'move)) @@ -1191,6 +1206,13 @@ list of headers that match SEQUENCE (see `nntp-retrieve-headers')." (point-max))) (goto-char (point-min))) +(defun nnheader-remove-body () + "Remove the body from an article in this current buffer." + (goto-char (point-min)) + (when (or (search-forward "\n\n" nil t) + (search-forward "\n\r\n" nil t)) + (delete-region (point) (point-max)))) + (defun nnheader-set-temp-buffer (name &optional noerase) "Set-buffer to an empty (possibly new) buffer called NAME with undo disabled." (set-buffer (get-buffer-create name)) @@ -1422,9 +1444,7 @@ without formatting." (defun nnheader-ms-strip-cr () "Strip ^M from the end of all lines." (save-excursion - (goto-char (point-min)) - (while (re-search-forward "\r$" nil t) - (delete-backward-char 1)))) + (nnheader-remove-cr-followed-by-lf))) (defun nnheader-file-size (file) "Return the file size of FILE or 0." diff --git a/lisp/nnimap.el b/lisp/nnimap.el index e7098ce..9e09f44 100644 --- a/lisp/nnimap.el +++ b/lisp/nnimap.el @@ -530,12 +530,7 @@ If EXAMINE is non-nil the group is selected read-only." (with-temp-buffer (buffer-disable-undo) (insert headers) - (nnheader-fold-continuation-lines) - (subst-char-in-region (point-min) (point-max) ?\t ? ) - (nnheader-ms-strip-cr) - (nnheader-fold-continuation-lines) - (subst-char-in-region (point-min) (point-max) ?\t ? ) - (let ((head (nnheader-parse-head 'naked))) + (let ((head (nnheader-parse-naked-head))) (mail-header-set-number head uid) (mail-header-set-chars head chars) (mail-header-set-lines head lines) diff --git a/lisp/nnmaildir.el b/lisp/nnmaildir.el index 7738d94..f514f5c 100644 --- a/lisp/nnmaildir.el +++ b/lisp/nnmaildir.el @@ -371,8 +371,7 @@ by nnmaildir-request-article.") (setq nov-mid 0)) (goto-char (point-min)) (delete-char 1) - (nnheader-fold-continuation-lines) - (setq nov (nnheader-parse-head 'naked) + (setq nov (nnheader-parse-naked-head) field (or (mail-header-lines nov) 0))) (unless (or (zerop field) (nnmaildir--param pgname 'distrust-Lines:)) (setq nov-mid field)) diff --git a/lisp/nnml.el b/lisp/nnml.el index 7a1b531..ac65283 100644 --- a/lisp/nnml.el +++ b/lisp/nnml.el @@ -708,16 +708,12 @@ marks file will be regenerated properly by Gnus.") (unless (zerop (buffer-size)) (narrow-to-region (goto-char (point-min)) - (if (re-search-forward "\n\r?\n" nil t) (1- (point)) (point-max)))) - ;; Fold continuation lines. - (goto-char (point-min)) - (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) - (replace-match " " t t)) - ;; Remove any tabs; they are too confusing. - (subst-char-in-region (point-min) (point-max) ?\t ? ) - ;; Remove any ^M's; they are too confusing. - (subst-char-in-region (point-min) (point-max) ?\r ? ) - (let ((headers (nnheader-parse-head t))) + (if (search-forward "\n\n" nil t) + (1- (point)) + (if (search-forward "\n\r\n" nil t) + (- (point) 2) + (point-max))))) + (let ((headers (nnheader-parse-naked-head))) (mail-header-set-chars headers chars) (mail-header-set-number headers number) headers)))) diff --git a/texi/ChangeLog b/texi/ChangeLog index 00fb340..39f7962 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,11 @@ +2002-10-17 Kai Gro,A_(Bjohann + + * gnus.texi (Other Marks): Document gnus-downloadable-mark and + gnus-undownloaded-mark. Adapted idea from Sriram Karra + . + (Formatting Fonts): Say that guillemets are wrong. (How to enter + guillemets in Texinfo files?) + 2002-10-12 Simon Josefsson * message.texi (Movement): Add. diff --git a/texi/gnus-ja.texi b/texi/gnus-ja.texi index 761d80f..2437316 100644 --- a/texi/gnus-ja.texi +++ b/texi/gnus-ja.texi @@ -5657,6 +5657,22 @@ gnus $B<+BN$O2D;k5-;v$r4|8B@Z$l>C5n$7$^$;$s(B) $B$N$G!"1J1s$K5-;v$rJ]B8$7$F$* $B$9(B (@code{gnus-unseen-mark})$B!#(B@code{gnus-recent-mark} $B$H8+Hf$Y$F2<$5$$!#(B @item +@vindex gnus-undownloaded-mark +gnus $B%(!<%8%'%s%H(B @pxref{Agent Basics} $B$r;H$C$F$$$k$H$-!"$$$/$D$+$N5-;v(B +$B$O%@%&%s%m!<%I$5$l$F$$$J$$$+$b$7$l$^$;$s!#%*%U%i%$%s(B (unplugged) $B$N>uBV(B +$B$G$O$=$N$h$&$J5-;v$r8+$k$3$H$,$G$-$^$;$s!#$=$l$i$N5-;v$K$O:G=i$N7e(B +$B$K(B @samp{@@} $B$N0u$,IU$-$^$9!#(B($BJQ?t(B @code{gnus-undownloaded-mark} $B$G$I$N(B +$BJ8;z$r;H$&$+$r@)8f$7$^$9!#(B) + +@item +@vindex gnus-downloadable-mark +gnus $B%(!<%8%'%s%H(B @pxref{Agent Basics} $B$O$$$/$D$+$N5-;v$r<+F0E*$K%@%&%s(B +$B%m!<%I$7$^$9$,!"<+F0E*$K%@%&%s%m!<%I$5$l$J$$5-;v$K$b%@%&%s%m!<%I$N$?$a$N(B +$BL@<(E*$J0u$rIU$1$k$3$H$O2DG=$G$9!#$=$N$h$&$JL@<(E*$K0u$,IU$1$i$l$?5-;v$K(B +$B$O!":G=i$N7e$K(B @samp{%} $B$N0u$,IU$-$^$9!#(B($BJQ(B +$B?t(B @code{gnus-downloadable-mark} $B$G$I$NJ8;z$r;H$&$+$r@)8f$7$^$9!#(B) + +@item @vindex gnus-not-empty-thread-mark @vindex gnus-empty-thread-mark $B$b$7(B @samp{%e} $B$N;EMM$,;H$o$l$k$H!"%9%l%C%I$,$"$k$+$I$&$+$O!";07eL\(B @@ -19024,7 +19040,12 @@ gnus $B$O4X?t(B @code{gnus-user-format-function-}@samp{foo} $B$r8F$S=P$7$^$9! $B%7%s%\%k$N$I$A$i$+$G$"$kI,MW$,$"$j$^$9!#%^%&%9$,%W%m%Q%F%#$N@_Dj$5$l$F$$(B $B$k%F%-%9%H$N>e$rDL2a$9$k$H!"%P%k!<%s%&%#%s%I%&$,8=$l$F!"J8;zNs$rI=<($7$^(B $B$9!#$3$l$N>\$7$$>pJs$O(B @ref{(emacs)Help Echo} (GNU Emacs) $B$^$?(B -$B$O(B @code{balloon-help-mode} (XEmacs) $B$N@bL@J8;zNs$r;2>H$7$F$/$@$5$$!#(B +$B$O(B @code{balloon-help-mode} (XEmacs) $B$N@bL@J8;zNs$r;2>H$7$F$/$@$5$$!#(B($B5;(B +$B=QE*$JM}M3$N$?$a$K!"%.%#%a(B (guillemets: @footnote{guillemets ($BJ)8l(B) $B$O%.%e(B +$B%a$H$bI=5-$5$l$^$9!#F|K\8l$N!V!W$KEv$?$k$b$N$G!"8}F,I=8=$rI=5-$7$?$j!"6/(B +$BD4$7$?$$C18l$r0O$`!"2?$+$+$i$N0zMQItJ,$r0O$`!"=qJ*Ey$N%?%$%H%k$r5-$9EyMM!9(B +$B$K;H$o$l$^$9!#(B}) $B$O$3$N@a$G$O(B @samp{<<} $B$*$h$S(B @samp{>>} $B$H$7$F6a;w$5$l(B +$B$^$7$?!#(B) $B$3$l$O%0%k!<%W%P%C%U%!$NBeBX>} in this paragraph.) Here's an alternative recipe for the group buffer: -- 1.7.10.4