X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mcs-om.el;h=17f6ec1cb0ccd1fddbd00a2b49151ef486f5d532;hb=949cf1afa5fed82d6385182a8df585fa5fdd6432;hp=9c8c05ea629b371054a2810b1ac137a5c89e21de;hpb=6fa6bab7e56cdf040e936f2913435d9fa305ff55;p=elisp%2Fapel.git diff --git a/mcs-om.el b/mcs-om.el index 9c8c05e..17f6ec1 100644 --- a/mcs-om.el +++ b/mcs-om.el @@ -26,22 +26,38 @@ (require 'poem) -(defun encode-mime-charset-region (start end charset) +(defsubst lbt-to-string (lbt) + (cdr (assq lbt '((nil . nil) + (CRLF . "\r\n") + (CR . "\r") + (dos . "\r\n") + (mac . "\r")))) + ) + +(defun encode-mime-charset-region (start end charset &optional lbt) "Encode the text between START and END as MIME CHARSET." - (let ((cs (mime-charset-to-coding-system charset))) + (let ((cs (mime-charset-to-coding-system charset lbt))) (if cs (code-convert start end *internal* cs) - ))) + (if (and lbt (setq cs (mime-charset-to-coding-system charset))) + (let ((newline (lbt-to-string lbt))) + (save-excursion + (save-restriction + (narrow-to-region start end) + (code-convert (point-min) (point-max) *internal* cs) + (if newline + (goto-char (point-min)) + (while (search-forward "\n" nil t) + (replace-match newline)))))))))) (defun decode-mime-charset-region (start end charset &optional lbt) "Decode the text between START and END as MIME CHARSET." - (let ((cs (mime-charset-to-coding-system charset lbt)) - newline) + (let ((cs (mime-charset-to-coding-system charset lbt))) (if cs (code-convert start end cs *internal*) (if (and lbt (setq cs (mime-charset-to-coding-system charset))) - (progn - (if (setq newline (cdr (assq lbt '((CRLF . "\r\n") (CR . "\r"))))) + (let ((newline (lbt-to-string lbt))) + (if newline (save-excursion (save-restriction (narrow-to-region start end) @@ -51,29 +67,39 @@ (code-convert (point-min) (point-max) cs *internal*)) (code-convert start end cs *internal*))))))) -(defun encode-mime-charset-string (string charset) +(defun encode-mime-charset-string (string charset &optional lbt) "Encode the STRING as MIME CHARSET." - (let ((cs (mime-charset-to-coding-system charset))) + (let ((cs (mime-charset-to-coding-system charset lbt))) (if cs (code-convert-string string *internal* cs) - string))) + (if (and lbt (setq cs (mime-charset-to-coding-system charset))) + (let ((newline (lbt-to-string lbt))) + (if newline + (with-temp-buffer + (insert string) + (code-convert (point-min) (point-max) *internal* cs) + (goto-char (point-min)) + (while (search-forward "\n" nil t) + (replace-match newline)) + (buffer-string)) + (decode-coding-string string cs))) + string)))) (defun decode-mime-charset-string (string charset &optional lbt) "Decode the STRING which is encoded in MIME CHARSET." - (let ((cs (mime-charset-to-coding-system charset lbt)) - newline) + (let ((cs (mime-charset-to-coding-system charset lbt))) (if cs (decode-coding-string string cs) (if (and lbt (setq cs (mime-charset-to-coding-system charset))) - (progn - (if (setq newline (cdr (assq lbt '((CRLF . "\r\n") (CR . "\r"))))) + (let ((newline (lbt-to-string lbt))) + (if newline (with-temp-buffer - (insert string) - (goto-char (point-min)) - (while (search-forward newline nil t) - (replace-match "\n")) - (code-convert (point-min) (point-max) cs *internal*) - (buffer-string)) + (insert string) + (goto-char (point-min)) + (while (search-forward newline nil t) + (replace-match "\n")) + (code-convert (point-min) (point-max) cs *internal*) + (buffer-string)) (decode-coding-string string cs))) string)))) @@ -119,6 +145,10 @@ )) (defsubst mime-charset-to-coding-system (charset &optional lbt) + "Return coding-system corresponding with CHARSET. +CHARSET is a symbol whose name is MIME charset. +If optional argument LBT (`CRLF', `LF', `CR', `unix', `dos' or `mac') +is specified, it is used as line break code type of coding-system." (if (stringp charset) (setq charset (intern (downcase charset))) ) @@ -191,15 +221,23 @@ It is used when MIME-charset is not specified. It must be symbol.") +(defvar default-mime-charset-for-write + default-mime-charset + "Default value of MIME-charset for encoding. +It is used when suitable MIME-charset is not found. +It must be symbol.") + (defun detect-mime-charset-region (start end) "Return MIME charset for region between START and END." - (charsets-to-mime-charset - (cons lc-ascii (find-charset-region start end)))) + (or (charsets-to-mime-charset + (cons lc-ascii (find-charset-region start end))) + default-mime-charset-for-write)) ;;; @ end ;;; -(provide 'mcs-om) +(require 'product) +(product-provide (provide 'mcs-om) (require 'apel-ver)) ;;; mcs-om.el ends here