gnus-util.el (iswitchb-mode): Declare
[gnus] / lisp / flow-fill.el
index 3598318..ff5316e 100644 (file)
@@ -1,17 +1,16 @@
 ;;; flow-fill.el --- interpret RFC2646 "flowed" text
 
-;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 2000-2015 Free Software Foundation, Inc.
 
 ;; Author: Simon Josefsson <jas@pdc.kth.se>
 ;; Keywords: mail
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; 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, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, 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
@@ -19,9 +18,7 @@
 ;; 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:
 
@@ -84,23 +81,41 @@ RFC 2646 suggests 66 characters for readability."
        ;; Go through each paragraph, filling it and adding SPC
        ;; as the last character on each line.
        (while (setq end (text-property-any start (point-max) 'hard 't))
-         (let ((fill-column (eval fill-flowed-encode-column)))
-           (fill-region start end t 'nosqueeze 'to-eop))
-         (goto-char start)
-         ;; `fill-region' probably distorted end.
-         (setq end (text-property-any start (point-max) 'hard 't))
-         (while (and (< (point) end)
-                     (re-search-forward "$" (1- end) t))
-           (insert " ")
-           (setq end (1+ end))
-           (forward-char))
-         (goto-char (setq start (1+ end)))))
+         (save-restriction
+           (narrow-to-region start end)
+           (let ((fill-column (eval fill-flowed-encode-column)))
+             (fill-flowed-fill-buffer))
+           (goto-char (point-min))
+           (while (re-search-forward "\n" nil t)
+             (replace-match " \n" t t))
+           (goto-char (setq start (1+ (point-max)))))))
       t)))
 
+(defun fill-flowed-fill-buffer ()
+  (let ((prefix nil)
+       (prev-prefix nil)
+       (start (point-min)))
+    (goto-char (point-min))
+    (while (not (eobp))
+      (setq prefix (and (looking-at "[> ]+")
+                       (match-string 0)))
+      (if (equal prefix prev-prefix)
+         (forward-line 1)
+       (save-restriction
+         (narrow-to-region start (point))
+         (let ((fill-prefix prev-prefix))
+           (fill-region (point-min) (point-max) t 'nosqueeze 'to-eop))
+         (goto-char (point-max)))
+       (setq prev-prefix prefix
+             start (point))))
+    (save-restriction
+      (narrow-to-region start (point))
+      (let ((fill-prefix prev-prefix))
+       (fill-region (point-min) (point-max) t 'nosqueeze 'to-eop)))))
+
 ;;;###autoload
 (defun fill-flowed (&optional buffer delete-space)
-  (save-excursion
-    (set-buffer (or (current-buffer) buffer))
+  (with-current-buffer (or (current-buffer) buffer)
     (goto-char (point-min))
     ;; Remove space stuffing.
     (while (re-search-forward "^\\( \\|>+ $\\)" nil t)
@@ -108,8 +123,6 @@ RFC 2646 suggests 66 characters for readability."
       (forward-line 1))
     (goto-char (point-min))
     (while (re-search-forward " $" nil t)
-      (when delete-space
-       (delete-char -1))
       (when (save-excursion
              (beginning-of-line)
              (looking-at "^\\(>*\\)\\( ?\\)"))
@@ -137,6 +150,8 @@ RFC 2646 suggests 66 characters for readability."
              (replace-match (if (string= (match-string 2) " ")
                                 "" "\\2")))
            (backward-delete-char -1)
+           (when delete-space
+             (delete-char -1))
            (end-of-line))
          (unless sig
            (condition-case nil
@@ -223,5 +238,4 @@ RFC 2646 suggests 66 characters for readability."
 
 (provide 'flow-fill)
 
-;; arch-tag: addc0040-bc53-4f17-b4bc-1eb44eed6f0b
 ;;; flow-fill.el ends here