This commit was generated by cvs2svn to compensate for changes in r293,
[elisp/tm.git] / tm-ew-d.el
1 ;;;
2 ;;; tm-ew-d.el --- RFC 1522 based multilingual MIME message header
3 ;;;                decoder for GNU Emacs
4 ;;;
5 ;;; Copyright (C) 1995 Free Software Foundation, Inc.
6 ;;; Copyright (C) 1992 ENAMI Tsugutomo
7 ;;; Copyright (C) 1993,1994,1995 MORIOKA Tomohiko
8 ;;;
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
15 ;;;
16 ;;; This file is part of tm (Tools for MIME).
17 ;;;
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.
22 ;;;
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.
27 ;;;
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.
31 ;;;
32 ;;; Code:
33
34 (require 'emu)
35 (require 'tl-822)
36 (require 'mel)
37 (require 'tm-def)
38
39
40 ;;; @ version
41 ;;;
42
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))
46
47
48 ;;; @ MIME encoded-word definition
49 ;;;
50
51 (defconst mime/encoded-text-regexp "[!->@-~]+")
52 (defconst mime/encoded-word-regexp (concat (regexp-quote "=?")
53                                            "\\("
54                                            mime/charset-regexp
55                                            "\\)"
56                                            (regexp-quote "?")
57                                            "\\(B\\|Q\\)"
58                                            (regexp-quote "?")
59                                            "\\("
60                                            mime/encoded-text-regexp
61                                            "\\)"
62                                            (regexp-quote "?=")))
63
64
65 ;;; @ for string
66 ;;;
67
68 (defun mime-eword/decode-string (str)
69   (setq str (rfc822/unfolding-string str))
70   (let ((dest "")(ew nil)
71         beg end)
72     (while (setq beg (string-match mime/encoded-word-regexp str))
73       (if (> beg 0)
74           (if (not (and (eq ew t) (string= (substring str 0 beg) " ")))
75               (setq dest (concat dest (substring str 0 beg)
76                                  ))
77             )
78         )
79       (setq end (match-end 0))
80       (setq dest (concat dest
81                          (mime/decode-encoded-word (substring str beg end))
82                          ))
83       (setq str (substring str end))
84       (setq ew t)
85       )
86     (concat dest str)
87     ))
88
89
90 ;;; @ for region
91 ;;;
92
93 (defun mime-eword/decode-region (beg end &optional unfolding)
94   (interactive "*r")
95   (save-excursion
96     (save-restriction
97       (narrow-to-region beg end)
98       (if unfolding
99           (mime/unfolding)
100         )
101       (goto-char (point-min))
102       (while (re-search-forward
103               (concat (regexp-quote "?=") "\\s +" (regexp-quote "=?"))
104               nil t)
105         (replace-match "?==?")
106         )
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 
111                    (prog1
112                        (buffer-substring (match-beginning 0) (match-end 0))
113                      (delete-region (match-beginning 0) (match-end 0))
114                      )
115                    ))
116           ))
117       )))
118
119
120 ;;; @ for message header
121 ;;;
122
123 (defun mime/decode-message-header ()
124   (interactive "*")
125   (save-excursion
126     (save-restriction
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)
130       )))
131
132 (defun mime/unfolding ()
133   (goto-char (point-min))
134   (let (field beg end)
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)
140           (save-restriction
141             (narrow-to-region (goto-char beg) end)
142             (while (re-search-forward "\n[ \t]+" nil t)
143               (replace-match " ")
144               )
145             (goto-char (point-max))
146             ))
147       )))
148
149
150 ;;; @ encoded-word decoder
151 ;;;
152
153 (defun mime/decode-encoded-word (word)
154   (or (if (string-match mime/encoded-word-regexp word)
155           (let ((charset
156                  (upcase
157                   (substring word (match-beginning 1) (match-end 1))
158                   ))
159                 (encoding
160                  (upcase
161                   (substring word (match-beginning 2) (match-end 2))
162                   ))
163                 (text
164                  (substring word (match-beginning 3) (match-end 3))
165                  ))
166             (mime/decode-encoded-text charset encoding text)
167             ))
168       word))
169
170
171 ;;; @ encoded-text decoder
172 ;;;
173
174 (defun mime/decode-encoded-text (charset encoding str)
175   (let ((dest
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)
181                   nil))))
182     (if dest
183         (mime/convert-string-to-emacs charset dest)
184       )))
185
186
187 ;;; @ end
188 ;;;
189
190 (provide 'tm-ew-d)