2 ;;; tm-ew-d.el --- RFC 1522 based multilingual MIME message header
3 ;;; decoder for GNU Emacs
5 ;;; Copyright (C) 1995 Free Software Foundation, Inc.
6 ;;; Copyright (C) 1992 ENAMI Tsugutomo
7 ;;; Copyright (C) 1993,1994,1995 MORIOKA Tomohiko
9 ;;; Author: ENAMI Tsugutomo <enami@sys.ptg.sony.co.jp>
10 ;;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
11 ;;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
12 ;;; Created: 1993/6/3 (1995/10/3 obsolete tiny-mime.el)
13 ;;; Version: $Revision: 7.6 $
14 ;;; Keywords: mail, news, MIME, RFC 1522, multilingual, encoded-word
16 ;;; This file is part of tm (Tools for MIME).
18 ;;; This program is free software; you can redistribute it and/or
19 ;;; modify it under the terms of the GNU General Public License as
20 ;;; published by the Free Software Foundation; either version 2, or
21 ;;; (at your option) any later version.
23 ;;; This program is distributed in the hope that it will be useful,
24 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
25 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26 ;;; General Public License for more details.
28 ;;; You should have received a copy of the GNU General Public License
29 ;;; along with This program. If not, write to the Free Software
30 ;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
43 (defconst tm-ew-d/RCS-ID
44 "$Id: tm-ew-d.el,v 7.6 1995/12/06 08:15:51 morioka Exp $")
45 (defconst mime/eword-decoder-version (get-version-string tm-ew-d/RCS-ID))
48 ;;; @ MIME encoded-word definition
51 (defconst mime/encoded-text-regexp "[!->@-~]+")
52 (defconst mime/encoded-word-regexp (concat (regexp-quote "=?")
60 mime/encoded-text-regexp
68 (defun mime-eword/decode-string (str)
69 (setq str (rfc822/unfolding-string str))
70 (let ((dest "")(ew nil)
72 (while (setq beg (string-match mime/encoded-word-regexp str))
74 (if (not (and (eq ew t) (string= (substring str 0 beg) " ")))
75 (setq dest (concat dest (substring str 0 beg)
79 (setq end (match-end 0))
80 (setq dest (concat dest
81 (mime/decode-encoded-word (substring str beg end))
83 (setq str (substring str end))
93 (defun mime-eword/decode-region (beg end &optional unfolding)
97 (narrow-to-region beg end)
101 (goto-char (point-min))
102 (while (re-search-forward
103 (concat (regexp-quote "?=") "\\s +" (regexp-quote "=?"))
105 (replace-match "?==?")
107 (goto-char (point-min))
108 (let (charset encoding text)
109 (while (re-search-forward mime/encoded-word-regexp nil t)
110 (insert (mime/decode-encoded-word
112 (buffer-substring (match-beginning 0) (match-end 0))
113 (delete-region (match-beginning 0) (match-end 0))
120 ;;; @ for message header
123 (defun mime/decode-message-header ()
127 (narrow-to-region (goto-char (point-min))
128 (progn (re-search-forward "^$" nil t) (point)))
129 (mime-eword/decode-region (point-min) (point-max) t)
132 (defun mime/unfolding ()
133 (goto-char (point-min))
135 (while (re-search-forward rfc822/field-top-regexp nil t)
136 (setq beg (match-beginning 0))
137 (setq end (rfc822/field-end))
138 (setq field (buffer-substring beg end))
139 (if (string-match mime/encoded-word-regexp field)
141 (narrow-to-region (goto-char beg) end)
142 (while (re-search-forward "\n[ \t]+" nil t)
145 (goto-char (point-max))
150 ;;; @ encoded-word decoder
153 (defun mime/decode-encoded-word (word)
154 (or (if (string-match mime/encoded-word-regexp word)
157 (substring word (match-beginning 1) (match-end 1))
161 (substring word (match-beginning 2) (match-end 2))
164 (substring word (match-beginning 3) (match-end 3))
166 (mime/decode-encoded-text charset encoding text)
171 ;;; @ encoded-text decoder
174 (defun mime/decode-encoded-text (charset encoding str)
176 (cond ((string= "B" encoding)
177 (base64-decode-string str))
178 ((string= "Q" encoding)
179 (q-encoding-decode-string str))
180 (t (message "unknown encoding %s" encoding)
183 (mime/convert-string-to-emacs charset dest)