update.
[elisp/semi.git] / mime-play.el
index e60f76e..95d93e1 100644 (file)
 
 (eval-when-compile (require 'mime-text))
 
+
+(defvar mime-acting-situation-examples nil)
+
+(defun mime-save-acting-situation-examples ()
+  (let* ((file mime-acting-situation-examples-file)
+        (buffer (get-buffer-create " *mime-example*")))
+    (unwind-protect
+        (save-excursion
+          (set-buffer buffer)
+          (setq buffer-file-name file)
+          (erase-buffer)
+          (insert ";;; " (file-name-nondirectory file) "\n")
+          (insert "\n;; This file is generated automatically by "
+                  mime-view-version-string "\n\n")
+         (insert ";;; Code:\n\n")
+         (pp `(setq mime-acting-situation-examples
+                    ',mime-acting-situation-examples)
+             (current-buffer))
+         (insert "\n;;; "
+                  (file-name-nondirectory file)
+                  " ends here.\n")
+          (save-buffer))
+      (kill-buffer buffer))))
+
+(add-hook 'kill-emacs-hook 'mime-save-acting-situation-examples)
+
   
 ;;; @ content decoder
 ;;;
@@ -58,7 +84,37 @@ If MODE is specified, play as it.  Default MODE is \"play\"."
            (goto-char mime-preview-after-decoded-position)
            )))))
 
-(defvar mime-user-acting-condition nil)
+(defun mime-sort-situation (situation)
+  (sort situation
+       #'(lambda (a b)
+           (let ((a-t (car a))
+                 (b-t (car b))
+                 (order '((type . 1)
+                          (subtype . 2)
+                          (mode . 3)
+                          (major-mode . 4)))
+                 a-order b-order)
+             (if (symbolp a-t)
+                 (let ((ret (assq a-t order)))
+                   (if ret
+                       (setq a-order (cdr ret))
+                     (setq a-order 5)
+                     ))
+               (setq a-order 6)
+               )
+             (if (symbolp b-t)
+                 (let ((ret (assq b-t order)))
+                   (if ret
+                       (setq b-order (cdr ret))
+                     (setq b-order 5)
+                     ))
+               (setq b-order 6)
+               )
+             (if (= a-order b-order)
+                 (string< (format "%s" a-t)(format "%s" b-t))
+               (< a-order b-order))
+             )))
+  )
 
 (defun mime-raw-play-entity (entity-info &optional mode)
   "Play entity specified by ENTITY-INFO.
@@ -92,9 +148,9 @@ specified, play as it.  Default MODE is \"play\"."
          (setq cal (cons (cons 'mode mode) cal))
        )
       (setq ret
-           (or (ctree-match-calist mime-user-acting-condition cal)
-               (ctree-match-calist-partially
-                mime-user-acting-condition cal)
+           (or (ctree-match-calist mime-acting-situation-examples cal)
+               (ctree-match-calist-partially mime-acting-situation-examples
+                                             cal)
                cal))
       (setq ret
            (or (ctree-find-calist mime-acting-condition ret
@@ -112,7 +168,8 @@ specified, play as it.  Default MODE is \"play\"."
                                            (cdr (assq 'method situation)))
                                    situation)))
                                ret)))
-            (ctree-set-calist-strictly 'mime-user-acting-condition ret)
+            (setq ret (mime-sort-situation ret))
+            (ctree-set-calist-strictly 'mime-acting-situation-examples ret)
             )
            (t
             (setq ret (car ret))
@@ -122,6 +179,9 @@ specified, play as it.  Default MODE is \"play\"."
                  (fboundp method))
             (funcall method beg end ret)
             )
+           ((stringp method)
+            (mime-activate-mailcap-method beg end ret)
+            )
            ((and (listp method)(stringp (car method)))
             (mime-activate-external-method beg end ret)
             )
@@ -137,6 +197,29 @@ specified, play as it.  Default MODE is \"play\"."
 ;;; @ external decoder
 ;;;
 
+(defun mime-activate-mailcap-method (start end situation)
+  (save-excursion
+    (save-restriction
+      (narrow-to-region start end)
+      (goto-char start)
+      (let ((method (cdr (assoc 'method situation)))
+           (name (mime-raw-get-filename situation)))
+       (mime-write-decoded-region (if (re-search-forward "^$" end t)
+                                      (1+ (match-end 0))
+                                    (point-min))
+                                  end name
+                                  (cdr (assq 'encoding situation)))
+       (message "External method is starting...")
+       (let ((command
+              (mailcap-format-command
+               method
+               (cons (cons 'filename name) situation))))
+         (start-process command mime-echo-buffer-name
+                        shell-file-name shell-command-switch command)
+         )
+       (mime-show-echo-buffer)
+       ))))
+
 (defun mime-activate-external-method (beg end cal)
   (save-excursion
     (save-restriction
@@ -555,4 +638,19 @@ to write."
 
 (provide 'mime-play)
 
+(let* ((file mime-acting-situation-examples-file)
+       (buffer (get-buffer-create " *mime-example*")))
+  (if (file-readable-p file)
+      (unwind-protect
+         (save-excursion
+           (set-buffer buffer)
+           (erase-buffer)
+           (insert-file-contents file)
+           (eval-current-buffer)
+           ;; format check
+           (or (eq (car mime-acting-situation-examples) 'type)
+               (setq mime-acting-situation-examples nil))
+           )
+       (kill-buffer buffer))))
+
 ;;; mime-play.el ends here