Mercurial > hg > xemacs-beta
diff lisp/rmail/undigest.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 0293115a14e9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/rmail/undigest.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,136 @@ +;;; undigest.el --- digest-cracking support for the RMAIL mail reader + +;; Copyright (C) 1985, 1986, 1994 Free Software Foundation, Inc. + +;; Maintainer: FSF +;; Keywords: mail + +;; This file is part of XEmacs. + +;; XEmacs 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. + +;; XEmacs 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 XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Synched up with: FSF 19.30. + +;;; Commentary: + +;; See Internet RFC 934 + +;;; Code: + +(require 'rmail) + +(defun undigestify-rmail-message () + "Break up a digest message into its constituent messages. +Leaves original message, deleted, before the undigestified messages." + (interactive) + (widen) + (let ((buffer-read-only nil) + (msg-string (buffer-substring (rmail-msgbeg rmail-current-message) + (rmail-msgend rmail-current-message)))) + (goto-char (rmail-msgend rmail-current-message)) + (narrow-to-region (point) (point)) + (insert msg-string) + (narrow-to-region (point-min) (1- (point-max)))) + (let ((error t) + (buffer-read-only nil)) + (unwind-protect + (progn + (save-restriction + (goto-char (point-min)) + (delete-region (point-min) + (progn (search-forward "\n*** EOOH ***\n") + (point))) + (insert "\^_\^L\n0, unseen,,\n*** EOOH ***\n") + (narrow-to-region (point) + (point-max)) + (let* ((fill-prefix "") + (case-fold-search t) + start + (digest-name + (mail-strip-quoted-names + (or (save-restriction + (search-forward "\n\n") + (setq start (point)) + (narrow-to-region (point-min) (point)) + (goto-char (point-max)) + (or (mail-fetch-field "Reply-To") + (mail-fetch-field "To") + (mail-fetch-field "Apparently-To") + (mail-fetch-field "From"))) + (error "Message is not a digest--bad header"))))) + (save-excursion + (goto-char (point-max)) + (skip-chars-backward " \t\n") + (let (found) + ;; compensate for broken un*x digestifiers. Sigh Sigh. + (while (and (> (point) start) (not found)) + (forward-line -1) + (if (looking-at (concat "End of.*Digest.*\n" + (regexp-quote "*********") "*" + "\\(\n------*\\)*")) + (setq found t))) + (if (not found) + (error "Message is not a digest--no end line")))) + (re-search-forward (concat "^" (make-string 55 ?-) "-*\n*")) + (replace-match "\^_\^L\n0, unseen,,\n*** EOOH ***\n") + (save-restriction + (narrow-to-region (point) + (progn (search-forward "\n\n") + (point))) + (if (mail-fetch-field "To") nil + (goto-char (point-min)) + (insert "To: " digest-name "\n"))) + (while (re-search-forward + (concat "\n\n" (make-string 27 ?-) "-*\n*") + nil t) + (replace-match "\n\n\^_\^L\n0, unseen,,\n*** EOOH ***\n") + (save-restriction + (if (looking-at "End ") + (insert "To: " digest-name "\n\n") + (narrow-to-region (point) + (progn (search-forward "\n\n" + nil 'move) + (point)))) + (if (mail-fetch-field "To") + nil + (goto-char (point-min)) + (insert "To: " digest-name "\n"))) + ;; Digestifiers may insert `- ' on lines that start with `-'. + ;; Undo that. + (save-excursion + (goto-char (point-min)) + (if (re-search-forward + "\n\n----------------------------*\n*" + nil t) + (let ((end (point-marker))) + (goto-char (point-min)) + (while (re-search-forward "^- " end t) + (delete-char -2))))) + ))) + (setq error nil) + (message "Message successfully undigestified") + (let ((n rmail-current-message)) + (rmail-forget-messages) + (rmail-show-message n) + (rmail-delete-forward) + (if (rmail-summary-exists) + (rmail-select-summary + (rmail-update-summary))))) + (cond (error + (narrow-to-region (point-min) (1+ (point-max))) + (delete-region (point-min) (point-max)) + (rmail-show-message rmail-current-message)))))) + +;;; undigest.el ends here