X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mime-def.el;h=b7b778d255fcdb467de2ea4e5715962694a6898a;hb=ad0cf5ef95a402267991f20b0190d590a07f14e0;hp=8ad307bde9cdc64a4a97ac76b9e660a965dd0e44;hpb=12528a3fd120e7928fe05acde2df875b1fd93d0e;p=elisp%2Fsemi.git diff --git a/mime-def.el b/mime-def.el index 8ad307b..b7b778d 100644 --- a/mime-def.el +++ b/mime-def.el @@ -1,12 +1,11 @@ ;;; mime-def.el --- definition module for SEMI -;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc. +;; Copyright (C) 1995,1996,1997,1998 Free Software Foundation, Inc. ;; Author: MORIOKA Tomohiko -;; Version: $Id: mime-def.el,v 0.38 1997-03-03 16:57:09 morioka Exp $ ;; Keywords: definition, MIME, multimedia, mail, news -;; This file is part of SEMI (SEMI is Emacs MIME Interfaces). +;; This file is part of SEMI (Spadework for Emacs MIME Interfaces). ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as @@ -25,15 +24,43 @@ ;;; Code: -(require 'cl) (require 'emu) +(require 'custom) + +(defgroup mime nil + "Emacs MIME Interfaces" + :group 'news + :group 'mail) + +(custom-handle-keyword 'default-mime-charset :group 'mime + 'custom-variable) + +(unless (fboundp 'butlast) + (defun butlast (x &optional n) + "Returns a copy of LIST with the last N elements removed." + (if (and n (<= n 0)) x + (nbutlast (copy-sequence x) n))) + + (defun nbutlast (x &optional n) + "Modifies LIST to remove the last N elements." + (let ((m (length x))) + (or n (setq n 1)) + (and (< n m) + (progn + (if (> n 0) (setcdr (nthcdr (- (1- m) n) x) nil)) + x)))) + ) + +(defconst semi-version '("Nishiizumi" 1 1 3) + "Version name and numbers of SEMI-kernel package.") + +(autoload 'mule-caesar-region "mule-caesar" + "Caesar rotation of current region." t) ;;; @ variables ;;; -(defvar mime/tmp-dir (or (getenv "TM_TMP_DIR") "/tmp/")) - (defvar mime/use-multi-frame (and (>= emacs-major-version 19) window-system)) @@ -43,55 +70,67 @@ (function find-file) )) -(defvar mime/output-buffer-window-is-shared-with-bbdb t - "*If t, mime/output-buffer window is shared with BBDB window.") - ;;; @ constants ;;; -(defconst mime/output-buffer-name "*MIME-out*") -(defconst mime/temp-buffer-name " *MIME-temp*") +(defconst mime-echo-buffer-name "*MIME-echo*" + "Name of buffer to display MIME-playing information.") + +(defconst mime-temp-buffer-name " *MIME-temp*") ;;; @ definitions about MIME ;;; -(defconst mime/tspecials "][\000-\040()<>@,\;:\\\"/?.=") -(defconst mime/token-regexp (concat "[^" mime/tspecials "]+")) -(defconst mime-charset-regexp mime/token-regexp) - -(defconst mime/content-type-subtype-regexp - (concat mime/token-regexp "/" mime/token-regexp)) +(defconst mime-tspecials "][()<>@,\;:\\\"/?=") +(defconst mime-token-regexp (concat "[^" mime-tspecials "\000-\040]+")) +(defconst mime-charset-regexp mime-token-regexp) -(defconst mime/disposition-type-regexp mime/token-regexp) +(defconst mime-media-type/subtype-regexp + (concat mime-token-regexp "/" mime-token-regexp)) ;;; @ button ;;; -(if running-xemacs - (require 'overlay) - ) +(defcustom mime-button-face 'bold + "Face used for content-button or URL-button of MIME-Preview buffer." + :group 'mime + :type 'face) + +(defcustom mime-button-mouse-face 'highlight + "Face used for MIME-preview buffer mouse highlighting." + :group 'mime + :type 'face) + +(defsubst mime-add-button (from to function &optional data) + "Create a button between FROM and TO with callback FUNCTION and DATA." + (let ((overlay (make-overlay from to))) + (and mime-button-face + (overlay-put overlay 'face mime-button-face)) + (and mime-button-mouse-face + (overlay-put overlay 'mouse-face mime-button-mouse-face)) + (add-text-properties from to (list 'mime-button-callback function)) + (and data + (add-text-properties from to (list 'mime-button-data data))) + ;;(add-text-properties from to (list 'keymap widget-keymap)) + )) -(defvar mime-button-face 'bold - "Face used for content-button or URL-button of MIME-Preview buffer.") - -(defvar mime-button-mouse-face 'highlight - "Face used for MIME-preview buffer mouse highlighting.") - -(defun mime-add-button (from to func &optional data) - "Create a button between FROM and TO with callback FUNC and data DATA." - (and mime-button-face - (overlay-put (make-overlay from to) 'face mime-button-face)) - (add-text-properties from to - (nconc - (and mime-button-mouse-face - (list 'mouse-face mime-button-mouse-face)) - (list 'mime-button-callback func) - (and data (list 'mime-button-data data)) - )) - ) +(defsubst mime-insert-button (string function &optional data) + "Insert STRING as button with callback FUNCTION and DATA." + (save-restriction + (narrow-to-region (point)(point)) + (insert (concat "[" string "]")) + ;; (widget-push-button-value-create + ;; (widget-convert 'push-button + ;; :notify (lambda (&rest ignore) + ;; (mime-preview-play-current-entity) + ;; ) + ;; string)) + (insert "\n") + (mime-add-button (point-min)(point-max) function data) + )) (defvar mime-button-mother-dispatcher nil) @@ -129,9 +168,9 @@ (fetch-key mc-pgp-fetch-key "mc-pgp") (snarf-keys mc-snarf-keys "mc-toplev") ;; for mime-edit - (mime-sign tm:mc-pgp-sign-region "mime-mc") + (mime-sign mime-mc-pgp-sign-region "mime-mc") (traditional-sign mc-pgp-sign-region "mc-pgp") - (encrypt tm:mc-pgp-encrypt-region "mime-mc") + (encrypt mime-mc-pgp-encrypt-region "mime-mc") (insert-key mc-insert-public-key "mc-toplev") ) "Alist of service names vs. corresponding functions and its filenames. @@ -148,12 +187,12 @@ FUNCTION.") (defmacro pgp-function (method) "Return function to do service METHOD." - (` (car (cdr (assq (, method) (symbol-value 'pgp-function-alist))))) + `(cadr (assq ,method (symbol-value 'pgp-function-alist))) ) (mapcar (function (lambda (method) - (autoload (second method)(third method)) + (autoload (cadr method)(nth 2 method)) )) pgp-function-alist) @@ -161,19 +200,11 @@ FUNCTION.") ;;; @ method selector kernel ;;; +(require 'atype) + ;;; @@ field unifier ;;; -(defun field-unifier-for-default (a b) - (let ((ret - (cond ((equal a b) a) - ((null (cdr b)) a) - ((null (cdr a)) b) - ))) - (if ret - (list nil ret nil) - ))) - (defun field-unifier-for-mode (a b) (let ((va (cdr a))) (if (if (consp va) @@ -183,191 +214,6 @@ FUNCTION.") (list nil b nil) ))) -(defun field-unify (a b) - (let ((sym (intern (concat "field-unifier-for-" (symbol-name (car a)))))) - (or (fboundp sym) - (setq sym (function field-unifier-for-default)) - ) - (funcall sym a b) - )) - - -;;; @@ type unifier -;;; - -(defun assoc-unify (class instance) - (catch 'tag - (let ((cla (copy-alist class)) - (ins (copy-alist instance)) - (r class) - cell aret ret prev rest) - (while r - (setq cell (car r)) - (setq aret (assoc (car cell) ins)) - (if aret - (if (setq ret (field-unify cell aret)) - (progn - (if (car ret) - (setq prev (put-alist (car (car ret)) - (cdr (car ret)) - prev)) - ) - (if (nth 2 ret) - (setq rest (put-alist (car (nth 2 ret)) - (cdr (nth 2 ret)) - rest)) - ) - (setq cla (put-alist (car cell)(cdr (nth 1 ret)) cla)) - (setq ins (del-alist (car cell) ins)) - ) - (throw 'tag nil) - )) - (setq r (cdr r)) - ) - (setq r (copy-alist ins)) - (while r - (setq cell (car r)) - (setq aret (assoc (car cell) cla)) - (if aret - (if (setq ret (field-unify cell aret)) - (progn - (if (car ret) - (setq prev (put-alist (car (car ret)) - (cdr (car ret)) - prev)) - ) - (if (nth 2 ret) - (setq rest (put-alist (car (nth 2 ret)) - (cdr (nth 2 ret)) - rest)) - ) - (setq cla (del-alist (car cell) cla)) - (setq ins (put-alist (car cell)(cdr (nth 1 ret)) ins)) - ) - (throw 'tag nil) - )) - (setq r (cdr r)) - ) - (list prev (append cla ins) rest) - ))) - -(defun get-unified-alist (db al) - (let ((r db) ret) - (catch 'tag - (while r - (if (setq ret (nth 1 (assoc-unify (car r) al))) - (throw 'tag ret) - ) - (setq r (cdr r)) - )))) - -(defun delete-atype (atl al) - (let* ((r atl) ret oal) - (setq oal - (catch 'tag - (while r - (if (setq ret (nth 1 (assoc-unify (car r) al))) - (throw 'tag (car r)) - ) - (setq r (cdr r)) - ))) - (delete oal atl) - )) - -(defun remove-atype (sym al) - (and (boundp sym) - (set sym (delete-atype (eval sym) al)) - )) - -(defun replace-atype (atl old-al new-al) - (let* ((r atl) ret oal) - (if (catch 'tag - (while r - (if (setq ret (nth 1 (assoc-unify (car r) old-al))) - (throw 'tag (rplaca r new-al)) - ) - (setq r (cdr r)) - )) - atl))) - -(defun set-atype (sym al &rest options) - (if (null (boundp sym)) - (set sym al) - (let* ((replacement (memq 'replacement options)) - (ignore-fields (car (cdr (memq 'ignore options)))) - (remove (or (car (cdr (memq 'remove options))) - (let ((ral (copy-alist al))) - (mapcar (function - (lambda (type) - (setq ral (del-alist type ral)) - )) - ignore-fields) - ral))) - ) - (set sym - (or (if replacement - (replace-atype (eval sym) remove al) - ) - (cons al - (delete-atype (eval sym) remove) - ) - ))))) - - -;;; @ rot13-47 -;;; -;; caesar-region written by phr@prep.ai.mit.edu Nov 86 -;; modified by tower@prep Nov 86 -;; gnus-caesar-region -;; Modified by umerin@flab.flab.Fujitsu.JUNET for ROT47. -(defun tm:caesar-region (&optional n) - "Caesar rotation of region by N, default 13, for decrypting netnews. -ROT47 will be performed for Japanese text in any case." - (interactive (if current-prefix-arg ; Was there a prefix arg? - (list (prefix-numeric-value current-prefix-arg)) - (list nil))) - (cond ((not (numberp n)) (setq n 13)) - (t (setq n (mod n 26)))) ;canonicalize N - (if (not (zerop n)) ; no action needed for a rot of 0 - (progn - (if (or (not (boundp 'caesar-translate-table)) - (/= (aref caesar-translate-table ?a) (+ ?a n))) - (let ((i 0) (lower "abcdefghijklmnopqrstuvwxyz") upper) - (message "Building caesar-translate-table...") - (setq caesar-translate-table (make-vector 256 0)) - (while (< i 256) - (aset caesar-translate-table i i) - (setq i (1+ i))) - (setq lower (concat lower lower) upper (upcase lower) i 0) - (while (< i 26) - (aset caesar-translate-table (+ ?a i) (aref lower (+ i n))) - (aset caesar-translate-table (+ ?A i) (aref upper (+ i n))) - (setq i (1+ i))) - ;; ROT47 for Japanese text. - ;; Thanks to ichikawa@flab.fujitsu.junet. - (setq i 161) - (let ((t1 (logior ?O 128)) - (t2 (logior ?! 128)) - (t3 (logior ?~ 128))) - (while (< i 256) - (aset caesar-translate-table i - (let ((v (aref caesar-translate-table i))) - (if (<= v t1) (if (< v t2) v (+ v 47)) - (if (<= v t3) (- v 47) v)))) - (setq i (1+ i)))) - (message "Building caesar-translate-table...done"))) - (let ((from (region-beginning)) - (to (region-end)) - (i 0) str len) - (setq str (buffer-substring from to)) - (setq len (length str)) - (while (< i len) - (aset str i (aref caesar-translate-table (aref str i))) - (setq i (1+ i))) - (goto-char from) - (delete-region from to) - (insert str))))) - ;;; @ field ;;;