X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mel.el;h=c8764a9cd04873a76337e64fc38170248da95677;hb=99c158b34f006c5840785347fc7e711a6b246c0c;hp=16bc0e0276cedcc7397e5a40a59f4db9c52bb12c;hpb=a0a1ddc99e2a091b842f608db40de667b57858d2;p=elisp%2Fflim.git diff --git a/mel.el b/mel.el index 16bc0e0..c8764a9 100644 --- a/mel.el +++ b/mel.el @@ -25,8 +25,8 @@ ;;; Code: -(require 'emu) (require 'mime-def) +(require 'poem) (defcustom mime-encoding-list '("7bit" "8bit" "binary" "base64" "quoted-printable") @@ -34,10 +34,10 @@ :group 'mime :type '(repeat string)) -(defvar mel-encoding-module-alist nil) - (defun mime-encoding-list (&optional service) - "Return list of Content-Transfer-Encoding." + "Return list of Content-Transfer-Encoding. +If SERVICE is specified, it returns available list of +Content-Transfer-Encoding for it." (if service (let (dest) (mapatoms (lambda (sym) @@ -72,43 +72,14 @@ ))) (defsubst mel-find-function (service encoding) - (let* ((oba (symbol-value (intern (format "%s-obarray" service)))) - (f (intern-soft encoding oba))) - (or f - (let ((rest (cdr (assoc encoding mel-encoding-module-alist)))) - (while (and rest - (progn - (require (car rest)) - (null (setq f (intern-soft encoding oba))) - )) - (setq rest (cdr rest)) - ) - f)))) + (mel-find-function-from-obarray + (symbol-value (intern (format "%s-obarray" service))) encoding)) ;;; @ setting for modules ;;; -(defvar base64-dl-module - (and (fboundp 'dynamic-link) - (let ((path (expand-file-name "base64.so" exec-directory))) - (and (file-exists-p path) - path)))) - - -(mel-use-module 'mel-b '("base64" "B")) -(mel-use-module 'mel-q '("quoted-printable" "Q")) -(mel-use-module 'mel-g '("x-gzip64")) -(mel-use-module 'mel-u '("x-uue" "x-uuencode")) - -(if (featurep 'mule) - (mel-use-module 'mel-ccl '("base64" "quoted-printable" "B" "Q")) - ) - -(if base64-dl-module - (mel-use-module 'mel-b-dl '("base64" "B")) - ) - +(mel-define-backend "7bit") (mel-define-method-function (mime-encode-string string (nil "7bit")) 'identity) (mel-define-method-function (mime-decode-string string (nil "7bit")) @@ -121,29 +92,78 @@ start end filename (nil "7bit")) 'write-region-as-binary) -(mel-define-method-function (mime-encode-string string (nil "8bit")) - 'identity) -(mel-define-method-function (mime-decode-string string (nil "8bit")) - 'identity) -(mel-define-method mime-encode-region (start end (nil "8bit"))) -(mel-define-method mime-decode-region (start end (nil "8bit"))) -(mel-define-method-function (mime-insert-encoded-file filename (nil "8bit")) - 'insert-file-contents-as-binary) -(mel-define-method-function (mime-write-decoded-region - start end filename (nil "8bit")) - 'write-region-as-binary) +(mel-define-backend "8bit" ("7bit")) + +(mel-define-backend "binary" ("8bit")) + +(defvar mel-b-builtin + (and (fboundp 'base64-encode-string) + (subrp (symbol-function 'base64-encode-string)))) + +(when mel-b-builtin + (mel-define-backend "base64") + (mel-define-method-function (mime-encode-string string (nil "base64")) + 'base64-encode-string) + (mel-define-method-function (mime-decode-string string (nil "base64")) + 'base64-decode-string) + (mel-define-method-function (mime-encode-region start end (nil "base64")) + 'base64-encode-region) + (mel-define-method-function (mime-decode-region start end (nil "base64")) + 'base64-decode-region) + (mel-define-method mime-insert-encoded-file (filename (nil "base64")) + "Encode contents of file FILENAME to base64, and insert the result. +It calls external base64 encoder specified by +`base64-external-encoder'. So you must install the program (maybe +mmencode included in metamail or XEmacs package)." + (interactive (list (read-file-name "Insert encoded file: "))) + (insert (base64-encode-string + (with-temp-buffer + (set-buffer-multibyte nil) + (insert-file-contents-as-binary filename) + (buffer-string)))) + (or (bolp) + (insert "\n")) + ) + + (mel-define-method-function (encoded-text-encode-string string (nil "B")) + 'base64-encode-string) + (mel-define-method encoded-text-decode-string (string (nil "B")) + (if (and (string-match B-encoded-text-regexp string) + (string= string (match-string 0 string))) + (base64-decode-string string) + (error "Invalid encoded-text %s" string))) + ) -(mel-define-method-function (mime-encode-string string (nil "binary")) - 'identity) -(mel-define-method-function (mime-decode-string string (nil "binary")) - 'identity) -(mel-define-method mime-encode-region (start end (nil "binary"))) -(mel-define-method mime-decode-region (start end (nil "binary"))) -(mel-define-method-function (mime-insert-encoded-file filename (nil "binary")) - 'insert-file-contents-as-binary) -(mel-define-method-function (mime-write-decoded-region - start end filename (nil "binary")) - 'write-region-as-binary) +(mel-use-module 'mel-b-el '("base64" "B")) +(mel-use-module 'mel-q '("quoted-printable" "Q")) +(mel-use-module 'mel-g '("x-gzip64")) +(mel-use-module 'mel-u '("x-uue" "x-uuencode")) + +(defvar mel-b-ccl-module + (and (featurep 'mule) + (progn + (require 'path-util) + (module-installed-p 'mel-b-ccl) + ))) + +(defvar mel-q-ccl-module + (and (featurep 'mule) + (progn + (require 'path-util) + (module-installed-p 'mel-q-ccl) + ))) + +(if mel-b-ccl-module + (mel-use-module 'mel-b-ccl '("base64" "B")) + ) + +(if mel-q-ccl-module + (mel-use-module 'mel-q-ccl '("quoted-printable" "Q")) + ) + +(if base64-dl-module + (mel-use-module 'mel-b-dl '("base64" "B")) + ) ;;; @ region