X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=ew-unit.el;h=e7808539c401c488fd5d8500ac4d971128d68e51;hb=eb9783f46dee7de4c9372e428a26e384e04d60f8;hp=f115fab9d9e60db50eeaa30d744b6b840c16acd5;hpb=3a12cf12b2cb6949dc169140932edc6356a068b7;p=elisp%2Fflim.git diff --git a/ew-unit.el b/ew-unit.el index f115fab..e780853 100644 --- a/ew-unit.el +++ b/ew-unit.el @@ -1,48 +1,23 @@ (require 'closure) (require 'ew-line) (require 'ew-quote) -(require 'mel) +(require 'ew-bq) (provide 'ew-unit) -(defconst ew-anchored-encoded-word-regexp - (concat "\\`" ew-encoded-word-regexp "\\'")) - -(defconst ew-b-regexp - (concat "\\`\\(" - "[A-Za-z0-9+/]" - "[A-Za-z0-9+/]" - "[A-Za-z0-9+/]" - "[A-Za-z0-9+/]" - "\\)*" - "[A-Za-z0-9+/]" - "[A-Za-z0-9+/]" - "\\(==\\|" - "[A-Za-z0-9+/]" - "[A-Za-z0-9+/=]" - "\\)\\'")) - -(defconst ew-q-regexp "\\`\\([^=?]\\|=[0-9A-Fa-f][0-9A-Fa-f]\\)*\\'") - -(defconst ew-byte-decoder-alist - '(("B" . ew-b-decode) - ("Q" . ew-q-decode))) - -(defconst ew-byte-checker-alist - '(("B" . ew-b-check) - ("Q" . ew-q-check))) - (defun ew-b-check (encoding encoded-text) (string-match ew-b-regexp encoded-text)) (defun ew-q-check (encoding encoded-text) (string-match ew-q-regexp encoded-text)) -(defun ew-eword-p (str) +(defsubst ew-eword-p (str) (let ((len (length str))) (and (<= 3 len) - (string= (substring str 0 2) "=?") - (string= (substring str (- len 2) len) "?=")))) + (eq (aref str 0) ?=) + (eq (aref str 1) ??) + (eq (aref str (- len 2)) ??) + (eq (aref str (1- len)) ?=)))) -(defun ew-decode-eword (str &optional eword-filter1 eword-filter2) +(defun ew-decode-eword (str) (if (string-match ew-anchored-encoded-word-regexp str) (let ((charset (match-string 1 str)) (encoding (match-string 2 str)) @@ -50,18 +25,16 @@ bdec cdec bcheck tmp) - (if (and (setq bdec (ew-byte-decoder encoding)) - (setq cdec (ew-char-decoder charset))) - (if (or (null (setq bcheck (ew-byte-checker encoding))) - (funcall bcheck encoding encoded-text)) - (progn - (setq tmp (closure-call cdec (funcall bdec encoded-text))) - (when eword-filter1 (setq tmp (closure-call eword-filter1 tmp))) - (setq tmp (ew-quote tmp)) - (when eword-filter2 (setq tmp (closure-call eword-filter2 tmp))) - tmp) - (ew-quote str)) - (ew-quote-eword charset encoding encoded-text))) + (if (or ew-permit-null-encoded-text + (< 0 (length encoded-text))) + (if (and (setq bdec (ew-byte-decoder encoding)) + (setq cdec (ew-char-decoder charset))) + (if (or (null (setq bcheck (ew-byte-checker encoding))) + (funcall bcheck encoding encoded-text)) + (ew-quote (closure-call cdec (funcall bdec encoded-text))) + (ew-quote str)) + (ew-quote-eword charset encoding encoded-text)) + (ew-quote str))) (ew-quote str))) (defun ew-byte-decoder (encoding) @@ -70,24 +43,9 @@ (defun ew-byte-checker (encoding) (cdr (assoc (upcase encoding) ew-byte-checker-alist))) -(defalias 'ew-b-decode 'base64-decode-string) -(defalias 'ew-q-decode 'q-encoding-decode-string) - -(defconst ew-charset-aliases - '((us-ascii . iso-8859-1) - (iso-2022-jp-2 . iso-2022-7bit-ss2) - (x-ctext . ctext) - )) - (defun ew-char-decoder (charset) - (catch 'return - (setq charset (downcase charset)) - (let ((sym (intern charset)) - tmp cs) - (when (setq tmp (assq sym ew-charset-aliases)) - (setq sym (cdr tmp))) - (setq cs (intern (concat (symbol-name sym) "-unix"))) - (when (coding-system-p cs) - (throw 'return - (closure-make (lambda (str) (decode-coding-string str cs)) cs))) - nil))) + (let ((sym (intern (downcase charset)))) + (when (mime-charset-to-coding-system sym 'LF) + (closure-make + (lambda (str) (decode-mime-charset-string str sym 'LF)) + sym))))