diff options
Diffstat (limited to 'lisp/gnus/qp.el')
-rw-r--r-- | lisp/gnus/qp.el | 84 |
1 files changed, 45 insertions, 39 deletions
diff --git a/lisp/gnus/qp.el b/lisp/gnus/qp.el index cb0b4bb4a7e..a5993de136f 100644 --- a/lisp/gnus/qp.el +++ b/lisp/gnus/qp.el @@ -89,52 +89,58 @@ the form expected by `skip-chars-forward'. If `mm-use-ultra-safe-encoding' is set, fold lines unconditionally and encode lines starting with \"From\"." (interactive "r") - ;; Fixme: what should this do in XEmacs/Mule? - (if (fboundp 'find-charset-region) ; else XEmacs, non-Mule - (if (delq 'unknown ; Emacs 20 unibyte - (delq 'eight-bit-graphic ; Emacs 21 - (delq 'eight-bit-control - (delq 'ascii (find-charset-region from to))))) - (error "Multibyte character in QP encoding region"))) (unless class - (setq class "^\000-\007\013\015-\037\200-\377=")) + ;; Avoid using 8bit characters. = is \075. + ;; Equivalent to "^\000-\007\013\015-\037\200-\377=" + (setq class "\010-\012\014\040-\074\076-\177")) (if (fboundp 'string-as-multibyte) (setq class (string-as-multibyte class))) (save-excursion (save-restriction (narrow-to-region from to) - ;; Encode all the non-ascii and control characters. - (goto-char (point-min)) - (while (and (skip-chars-forward class) - (not (eobp))) - (insert - (prog1 - (format "=%02x" (upcase (char-after))) - (delete-char 1)))) - ;; Encode white space at the end of lines. - (goto-char (point-min)) - (while (re-search-forward "[ \t]+$" nil t) - (goto-char (match-beginning 0)) - (while (not (eolp)) + (mm-with-unibyte-current-buffer-mule4 + ;; Fixme: what should this do in XEmacs/Mule? + (if (fboundp 'find-charset-region) ; else XEmacs, non-Mule + (if (delq 'unknown ; Emacs 20 unibyte + (delq 'eight-bit-graphic ; Emacs 21 + (delq 'eight-bit-control + (delq 'ascii + (find-charset-region from to))))) + (error "Multibyte character in QP encoding region"))) + ;; Encode all the non-ascii and control characters. + (goto-char (point-min)) + (while (and (skip-chars-forward class) + (not (eobp))) (insert (prog1 - (format "=%02x" (upcase (char-after))) - (delete-char 1))))) - (let ((mm-use-ultra-safe-encoding - (and (boundp 'mm-use-ultra-safe-encoding) - mm-use-ultra-safe-encoding))) - (when (or fold mm-use-ultra-safe-encoding) - ;; Fold long lines. - (let ((tab-width 1)) ; HTAB is one character. - (goto-char (point-min)) - (while (not (eobp)) - ;; In ultra-safe mode, encode "From " at the beginning - ;; of a line. - (when mm-use-ultra-safe-encoding - (beginning-of-line) - (when (looking-at "From ") - (replace-match "From=20" nil t))) - (end-of-line) + (format "=%02X" (char-after)) + (delete-char 1)))) + ;; Encode white space at the end of lines. + (goto-char (point-min)) + (while (re-search-forward "[ \t]+$" nil t) + (goto-char (match-beginning 0)) + (while (not (eolp)) + (insert + (prog1 + (format "=%02X" (char-after)) + (delete-char 1))))) + (let ((mm-use-ultra-safe-encoding + (and (boundp 'mm-use-ultra-safe-encoding) + mm-use-ultra-safe-encoding))) + (when (or fold mm-use-ultra-safe-encoding) + ;; Fold long lines. + (let ((tab-width 1)) ; HTAB is one character. + (goto-char (point-min)) + (while (not (eobp)) + ;; In ultra-safe mode, encode "From " at the beginning + ;; of a line. + (when mm-use-ultra-safe-encoding + (beginning-of-line) + (if (looking-at "From ") + (replace-match "From=20" nil t) + (if (looking-at "-") + (replace-match "=2D" nil t)))) + (end-of-line) (while (> (current-column) 76) ; tab-width must be 1. (beginning-of-line) (forward-char 75) ; 75 chars plus an "=" @@ -142,7 +148,7 @@ encode lines starting with \"From\"." (insert "=\n") (end-of-line)) (unless (eobp) - (forward-line))))))))) + (forward-line)))))))))) (defun quoted-printable-encode-string (string) "Encode the STRING as quoted-printable and return the result." |