egg-980316.
[elisp/egg.git] / egg-cnv.el
index b85cd04..f9df95d 100644 (file)
@@ -88,7 +88,7 @@
     (if (= len (length s))
        (list s)
       (list (substring s 0 len) (substring s len)))))
-(defun egg-end-conversion-other-languages (bunsetsu-info-list)
+(defun egg-end-conversion-other-languages (bunsetsu-info-list abort)
   nil)
 (defun egg-fini-other-languages (language)
   nil)
   (funcall (aref egg-conversion-backend 8) bunsetsu-info candidate-pos))
 (defun egg-change-bunsetsu-length (b0 b1 b2 len)
   (funcall (aref egg-conversion-backend 9) b0 b1 b2 len))
-(defun egg-end-conversion (bunsetsu-info-list)
-  (funcall (aref egg-conversion-backend 10) bunsetsu-info-list))
+(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)
                  (egg-start-conversion
                   (buffer-substring-no-properties s e)
                   egg-current-language))
-         (error
+         (error                        ; XXX: catching all error is BADBADBAD
           (setq egg-conversion-backend egg-conversion-backend-other-languages
                 bunsetsu-info-list (egg-start-conversion-other-languages
                                     (buffer-substring-no-properties s e)
   (interactive "p")
   (egg-reconvert-bunsetsu-internal n 'egg-start-conversion))
 
+;; XXX: not working.  Should change protocol to backend?
 (defun egg-decide-before-point ()
   (interactive)
   (let ((inhibit-read-only t)
       (delete-region (point) (+ (point) (length egg-conversion-close)))
       (its-restart source t))))
 
+(defun egg-decide-bunsetsu (&optional end-marker)
+  (let ((in-loop t)
+       p bunsetsu-info-list bl)
+    (setq p (point))
+    (while in-loop
+      (let ((bl1 (cons (egg-get-bunsetsu-info p) nil)))
+       (if bl
+           (setq bl (setcdr bl bl1))
+         (setq bunsetsu-info-list (setq bl bl1))))
+      (forward-char)
+      (remove-text-properties p (point) '(face nil
+                                         intangible nil
+                                         local-map nil
+                                         read-only nil
+                                         egg-bunsetsu-last nil))
+      (setq p (point))
+      (if (or (and end-marker (= p end-marker))
+             (get-text-property p 'egg-end))
+         (setq in-loop nil)
+       (setq p (1- p))
+       (delete-region p (1+ p))))      ; Delete bunsetsu separator
+    bunsetsu-info-list))
+
 (defun egg-exit-conversion ()
   (interactive)
-  (goto-char (next-single-property-change (point) 'egg-end))
-  (egg-decide-before-point))
+  (let ((inhibit-read-only t)
+       start bunsetsu-list)
+    (if (get-text-property (1- (point)) 'egg-start)
+       (setq start (1- (point)))
+      (setq start (1- (previous-single-property-change (point) 'egg-start))))
+    (goto-char start)
+    ;; Delete open marker
+    (delete-region start (+ start (length egg-conversion-open)))
+    (setq bunsetsu-list (egg-decide-bunsetsu))
+    ;; Delete close marker
+    (delete-region (point) (+ (point) (length egg-conversion-close)))
+    (egg-end-conversion bunsetsu-list nil)
+    (egg-do-auto-fill)
+    (run-hooks 'input-method-after-insert-chunk-hook)))
 
 (defun egg-abort-conversion ()
   (interactive)
-  (let ((inhibit-read-only t) source)
-    (goto-char (- (if (get-text-property (1- (point)) 'egg-start)
-                     (point)
-                   (previous-single-property-change (point) 'egg-start))
-                 (length egg-conversion-open)))
+  (let ((inhibit-read-only t)
+       start bunsetsu-list source)
+    (if (get-text-property (1- (point)) 'egg-start)
+       (setq start (1- (point)))
+      (setq start (1- (previous-single-property-change (point) 'egg-start))))
+    (goto-char start)
     (setq source (get-text-property (point) 'egg-source))
-    (delete-region (point) (+ (next-single-property-change (point) 'egg-end)
-                             (length egg-conversion-close)))
+    ;; Delete open marker
+    (delete-region start (+ start (length egg-conversion-open)))
+    (setq bunsetsu-list (egg-decide-bunsetsu))
+    ;; Delete close marker
+    (delete-region (point) (+ (point) (length egg-conversion-close)))
+    (egg-end-conversion bunsetsu-list t)
+    (delete-region start (point))
     (its-restart source)))
 
 (defun egg-select-candidate ()