Sync up with egg-980712.
[elisp/egg.git] / egg-cnv.el
index a996838..515fb91 100644 (file)
@@ -1,4 +1,4 @@
-pn;;; egg-cnv.el --- Conversion Backend in Egg Input Method Architecture
+;;; egg-cnv.el --- Conversion Backend in Egg Input Method Architecture
 
 ;; Copyright (C) 1997, 1998 Mule Project,
 ;; Powered by Electrotechnical Laboratory, JAPAN.
@@ -47,74 +47,60 @@ pn;;; egg-cnv.el --- Conversion Backend in Egg Input Method Architecture
     bunsetsu-info))
 ;;
 
-(defconst egg-conversion-backend-other-languages
-  [ egg-init-other-languages
-
-       egg-start-conversion-other-languages
-      egg-get-bunsetsu-converted-other-languages
-      egg-get-bunsetsu-source-other-languages
-      egg-list-candidates-other-languages
-         egg-get-number-of-candidates-other-languages
-         egg-get-current-candidate-number-other-languages
-         egg-get-all-candidates-other-languages
-         egg-decide-candidate-other-languages
-      egg-change-bunsetsu-length-other-languages
-    egg-end-conversion-other-languages
+(defconst egg-conversion-backend-null
+  [ egg-init-null
+
+      egg-start-conversion-null
+      egg-get-bunsetsu-converted-null
+      egg-get-bunsetsu-source-null
+      egg-list-candidates-null
+         egg-get-number-of-candidates-null
+         egg-get-current-candidate-number-null
+         egg-get-all-candidates-null
+         egg-decide-candidate-null
+      egg-change-bunsetsu-length-null
+    egg-end-conversion-null
     nil
 
-    egg-fini-other-languages
+    egg-fini-null
  ])
 
-(defun egg-init-other-languages ()
-  )
+(defun egg-init-null ()
+ )
 
-(defun egg-start-conversion-other-languages (yomi-string language)
-  (setq egg-conversion-backend egg-conversion-backend-other-languages)
+(defun egg-start-conversion-null (yomi-string language)
   (list yomi-string))
-(defun egg-get-bunsetsu-converted-other-languages (bunsetsu-info)
+(defun egg-get-bunsetsu-converted-null (bunsetsu-info)
   bunsetsu-info)
-(defun egg-get-bunsetsu-source-other-languages (bunsetsu-info)
+(defun egg-get-bunsetsu-source-null (bunsetsu-info)
   bunsetsu-info)
-(defun egg-list-candidates-other-languages (bunsetsu-info prev-bunsetsu-info)
+(defun egg-list-candidates-null (bunsetsu-info prev-bunsetsu-info)
   1)
-(defun egg-get-number-of-candidates-other-languages (bunsetsu-info)
+(defun egg-get-number-of-candidates-null (bunsetsu-info)
   1)
-(defun egg-get-current-candidate-number-other-languages (bunsetsu-info)
+(defun egg-get-current-candidate-number-null (bunsetsu-info)
   0)
-(defun egg-get-all-candidates-other-languages (bunsetsu-info)
+(defun egg-get-all-candidates-null (bunsetsu-info)
   (list bunsetsu-info))
-(defun egg-decide-candidate-other-languages (bunsetsu-info candidate-pos)
+(defun egg-decide-candidate-null (bunsetsu-info candidate-pos)
   bunsetsu-info)
-(defun egg-change-bunsetsu-length-other-languages (b0 b1 b2 len)
+(defun egg-change-bunsetsu-length-null (b0 b1 b2 len)
   (let ((s (concat b1 b2)))
     (set-text-properties 0 (length s) nil s)
     (if (= len (length s))
        (list s)
       (list (substring s 0 len) (substring s len)))))
-(defun egg-end-conversion-other-languages (bunsetsu-info-list abort)
+(defun egg-end-conversion-null (bunsetsu-info-list abort)
   nil)
-(defun egg-fini-other-languages (language)
+(defun egg-fini-null (language)
   nil)
 
-(defvar egg-conversion-backend-alist nil)
-(make-variable-buffer-local 'egg-conversion-backend-alist)
 (defvar egg-conversion-backend nil)
-(make-variable-buffer-local 'egg-conversion-backend)
-
-(defvar egg-finalize-backend-alist nil)
-
-(defun egg-set-current-backend (language)
-  (setq egg-conversion-backend
-       (cdr (assq language egg-conversion-backend-alist)))
-  (if (null egg-conversion-backend)
-      (setq egg-conversion-backend egg-conversion-backend-other-languages)))
 
 (defun egg-initialize-backend (language)
-  (egg-set-current-backend language)
   (funcall (aref egg-conversion-backend 0)))
 
 (defun egg-start-conversion (yomi-string language)
-  (egg-set-current-backend language)
   (funcall (aref egg-conversion-backend 1) yomi-string language))
 (defun egg-get-bunsetsu-converted (bunsetsu-info)
   (funcall (aref egg-conversion-backend 2) bunsetsu-info))
@@ -135,35 +121,12 @@ pn;;; egg-cnv.el --- Conversion Backend in Egg Input Method Architecture
 (defun egg-end-conversion (bunsetsu-info-list abort)
   (funcall (aref egg-conversion-backend 10) bunsetsu-info-list abort))
 (defun egg-start-reverse-conversion (yomi-string language)
-  (egg-set-current-backend language)
   (if (aref egg-conversion-backend 11)
       (funcall (aref egg-conversion-backend 11) yomi-string language)
     (beep)))
 
 (defun egg-finalize-backend ()
-  (let ((alist egg-finalize-backend-alist))
-    (while alist
-      (funcall (car (car (car alist))) (cdr (car (car alist))))
-      (setq alist (cdr alist)))))
-
-(defun egg-set-conversion-backend (backend langs &optional force)
-  (let (pair)
-    (if backend
-       (setq egg-conversion-backend backend)
-      (setq backend egg-conversion-backend))
-    (while langs
-      (setq pair (assoc (car langs) egg-conversion-backend-alist))
-      (cond
-       ((null pair)
-       (setq egg-conversion-backend-alist
-             (cons (cons (car langs) backend) egg-conversion-backend-alist)))
-       (force
-       (setcdr pair backend)))
-      (setq pair (cons (aref backend (1- (length backend))) (car langs)))
-      (if (null (assoc pair egg-finalize-backend-alist))
-         (setq egg-finalize-backend-alist
-               (cons (list pair) egg-finalize-backend-alist)))
-      (setq langs (cdr langs)))))
+  (aref egg-conversion-backend 12))
 \f
 (defvar egg-conversion-open  "|"  "*\e$B%U%'%s%9$N;OE@$r<($9J8;zNs\e(B (1 \e$BJ8;z0J>e\e(B)")
 (defvar egg-conversion-close "|"  "*\e$B%U%'%s%9$N=*E@$r<($9J8;zNs\e(B (1 \e$BJ8;z0J>e\e(B)")
@@ -177,12 +140,20 @@ pn;;; egg-cnv.el --- Conversion Backend in Egg Input Method Architecture
                       (assq t egg-conversion-face)))))
     (if face (cdr face) egg-conversion-face)))
 
+(defvar egg-start-conversion-failure-hook
+  '(egg-start-conversion-failure-fallback)
+  "Hook which runs on failure of conversion.")
+
+;; SAIGO no shudan
+(defun egg-start-conversion-failure-fallback (language)
+  (setq egg-conversion-backend egg-conversion-backend-null))
+
 ;;
 (defun egg-convert-region (start end)
   (interactive "r")
   (let ((source (buffer-substring start end))
        (no-prop-source (buffer-substring-no-properties start end))
-       bunsetsu-info-list len result i j s)
+       len result i j s)
     (if (>= start end)
        ;; nothing to do
        nil
@@ -190,11 +161,6 @@ pn;;; egg-cnv.el --- Conversion Backend in Egg Input Method Architecture
       (let ((inhibit-read-only t))
        (its-define-select-keys egg-conversion-map)
        (goto-char start)
-       ;; XXX: Why make OPEN&CLOSE string every time when 
-       ;; this function is invoked?  Any Reason?
-       ;; For me it's matter of user costomization
-       ;; of setting egg-conversion-open/egg-conversion-close
-       ;; it can be string of properties at the beginning, isn't it?
        (setq s (copy-sequence egg-conversion-open)
              len (length s))
        (set-text-properties 0 len
@@ -222,18 +188,29 @@ pn;;; egg-cnv.el --- Conversion Backend in Egg Input Method Architecture
        (while (< i len)
          (setq egg-current-language (get-text-property i 'egg-lang source)
                j (egg-next-single-property-change i 'egg-lang source len))
-         (condition-case result
-             (setq bunsetsu-info-list (egg-start-conversion
-                                       (substring no-prop-source i j)
-                                       egg-current-language))
-           (error                      ; XXX: catching all error is BADBADBAD
-            (setq bunsetsu-info-list (egg-start-conversion-other-languages
-                                      (substring no-prop-source i j)
-                                      egg-current-language))
-            (message "egg %s backend: %s"
-                     egg-current-language (nth 1 result))))
-         (egg-insert-bunsetsu-list bunsetsu-info-list
-                                   (if (< j len) 'contine t))
+         (let (bunsetsu-info-list)
+           (while (null bunsetsu-info-list)
+             (condition-case err
+                 (setq bunsetsu-info-list (egg-start-conversion
+                                           (substring no-prop-source i j)
+                                           egg-current-language))
+               ;; Don't catch programming error
+               (lang-not-supported
+                (message "Language not supported: %s" egg-current-language)
+                (ding)
+                (setq bunsetsu-info-list
+                      (egg-start-conversion-null
+                       (substring no-prop-source i j)
+                       egg-current-language)))
+               (file-error             
+                (message "Error on %s backend: %s"
+                         egg-current-language (nth 1 err))
+                (ding)
+                (sit-for 1)
+                (run-hook-with-args-until-success
+                 'egg-start-conversion-failure-hook egg-current-language))))
+           (egg-insert-bunsetsu-list bunsetsu-info-list
+                                     (if (< j len) 'contine t)))
          (setq i j))
        (goto-char start)))))
 
@@ -369,6 +346,7 @@ pn;;; egg-cnv.el --- Conversion Backend in Egg Input Method Architecture
     (define-key map [right]  'egg-forward-bunsetsu)
     (define-key map [left]   'egg-backward-bunsetsu)
     (define-key map " "      'egg-next-candidate)
+    (define-key map "/"      'egg-exit-conversion)
     map)
   "Keymap for EGG Conversion mode.")