X-Git-Url: https://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Fqp.el;h=c55cb9eec6a37e2470cb1897c6175733a97947d2;hb=f9f8b950285f558727771fb259fb569f3871c1b6;hp=467145109b5b6b81fc207b3a9d25e837411cee5d;hpb=132f08d63c68a2de71ed9bdd9b66bfbeb2b922b2;p=gnus diff --git a/lisp/qp.el b/lisp/qp.el index 467145109..c55cb9eec 100644 --- a/lisp/qp.el +++ b/lisp/qp.el @@ -1,5 +1,5 @@ ;;; qp.el --- Quoted-Printable functions -;; Copyright (C) 1998 Free Software Foundation, Inc. +;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen ;; This file is part of GNU Emacs. @@ -23,73 +23,126 @@ ;;; Code: +(require 'mm-util) + (defvar quoted-printable-encoding-characters - (mapcar 'identity "0123456789ABCDEF")) + (mapcar 'identity "0123456789ABCDEFabcdef")) -(defun quoted-printable-decode-region (from to) - "Decode quoted-printable in the region between FROM and TO." +(defun quoted-printable-decode-region (from to &optional charset) + "Decode quoted-printable in the region between FROM and TO. +If CHARSET is non-nil, decode the region with charset." (interactive "r") (save-excursion - (goto-char from) - (while (search-forward "=" to t) - (cond ((eq (char-after) ?\n) - (delete-char -1) - (delete-char 1)) - ((and - (memq (char-after) quoted-printable-encoding-characters) - (memq (char-after (1+ (point))) - quoted-printable-encoding-characters)) - (subst-char-in-region - (1- (point)) (point) ?= - (string-to-number - (buffer-substring (point) (+ 2 (point))) - 16)) - (delete-char 2)) - ((looking-at "=") - (delete-char 1)) - ((message "Malformed MIME quoted-printable message")))))) - -(defun quoted-printable-decode-string (string) - "Decode the quoted-printable-encoded STRING and return the results." - (with-temp-buffer - (insert string) - (quoted-printable-decode-region (point-min) (point-max)) - (buffer-string))) + (save-restriction + (let (start) + (narrow-to-region from to) + (goto-char from) + (while (not (eobp)) + (cond + ((eq (char-after) ?=) + (delete-char 1) + (unless start + (setq start (point))) + (cond + ;; End of the line. + ((eq (char-after) ?\n) + (delete-char 1)) + ;; Encoded character. + ((and + (memq (char-after) quoted-printable-encoding-characters) + (memq (char-after (1+ (point))) + quoted-printable-encoding-characters)) + (insert + (string-to-number + (buffer-substring (point) (+ 2 (point))) + 16)) + (delete-char 2)) + ;; Quoted equal sign. + ((eq (char-after) ?=) + (forward-char 1)) + ;; End of buffer. + ((eobp)) + ;; Invalid. + (t + (message "Malformed MIME quoted-printable message")))) + ((and charset start (not (eq (mm-charset-after) 'ascii))) + (mm-decode-coding-region start (point) charset) + (setq start nil) + (forward-char 1)) + (t + (forward-char 1)))) + (if (and charset start) + (mm-decode-coding-region start (point) charset)))))) + +(defun quoted-printable-decode-string (string &optional charset) + "Decode the quoted-printable-encoded STRING and return the results. +If CHARSET is non-nil, decode the region with charset." + (with-temp-buffer + (insert string) + (quoted-printable-decode-region (point-min) (point-max) charset) + (buffer-string))) (defun quoted-printable-encode-region (from to &optional fold class) "QP-encode the region between FROM and TO. -If FOLD, fold long lines. If CLASS, translate the characters -matched by that regexp." + +If FOLD fold long lines. If CLASS, translate the characters +matched by that regexp. + +If `mm-use-ultra-safe-encoding' is set, fold unconditionally and +encode lines starting with \"From\"." (interactive "r") (save-excursion - (save-restriction - (narrow-to-region from to) - (mm-encode-body) - (goto-char (point-min)) - (while (and (skip-chars-forward - (or class "^\000-\007\013\015-\037\200-\377=")) - (not (eobp))) - (insert - (prog1 - (upcase (format "=%x" (char-after))) - (delete-char 1)))) - (when fold - ;; Fold long lines. + (mm-with-unibyte-current-buffer + (save-restriction + (narrow-to-region from to) + ;; (mm-encode-body) + ;; Encode all the non-ascii and control characters. + (goto-char (point-min)) + (while (and (skip-chars-forward + ;; Avoid using 8bit characters. = is \075. + ;; Equivalent to "^\000-\007\013\015-\037\200-\377=" + (or class "\010-\012\014\040-\074\076-\177")) + (not (eobp))) + (insert + (prog1 + (upcase (format "=%02x" (char-after))) + (delete-char 1)))) + ;; Encode white space at the end of lines. (goto-char (point-min)) - (end-of-line) - (while (> (current-column) 72) - (beginning-of-line) - (forward-char 72) - (search-backward "=" (- (point) 2) t) - (insert "=\n") - (end-of-line)))))) + (while (re-search-forward "[ \t]+$" nil t) + (goto-char (match-beginning 0)) + (while (not (eolp)) + (insert + (prog1 + (upcase (format "=%02x" (char-after))) + (delete-char 1))))) + (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) + (while (> (current-column) 76);; tab-width must be 1. + (beginning-of-line) + (forward-char 75);; 75 chars plus an "=" + (search-backward "=" (- (point) 2) t) + (insert "=\n") + (end-of-line)) + (unless (eobp) + (forward-line))))))))) (defun quoted-printable-encode-string (string) - "QP-encode STRING and return the results." - (mm-with-unibyte-buffer - (insert string) - (quoted-printable-encode-region (point-min) (point-max)) - (buffer-string))) + "QP-encode STRING and return the results." + (mm-with-unibyte-buffer + (insert string) + (quoted-printable-encode-region (point-min) (point-max)) + (buffer-string))) (provide 'qp)