egg-980220.
[elisp/egg.git] / egg-cnv.el
index 76a748b..8c499b3 100644 (file)
       (narrow-to-region start end)
       (goto-char start)
       (insert egg-conversion-open)
-      (put-text-property start (point) 'egg-start t)
+      (add-text-properties start (point)
+                          (list
+                           'egg-start t
+                           'egg-source (buffer-substring (point)
+                                                         (point-max))))
       (if egg-conversion-face
           (put-text-property start (point) 'invisible t))
       (setq start (point))
     (define-key map [?\C-\ ] 'egg-decide-first-char)
     (define-key map "\C-a"   'egg-beginning-of-conversion-buffer)
     (define-key map "\C-b"   'egg-backward-bunsetsu)
+    (define-key map "\C-c"   'egg-abort-conversion)
     (define-key map "\C-e"   'egg-end-of-conversion-buffer)
     (define-key map "\C-f"   'egg-forward-bunsetsu)
     (define-key map "\C-h"   'egg-help-command)
        (signal 'end-of-buffer nil))))
 
 (defun egg-get-previous-bunsetsu (p)
-  (if (get-text-property (1- p) 'egg-start)
-      nil
-    (egg-get-bunsetsu-info (- p 2))))
+  (and (null (get-text-property (1- p) 'egg-start))
+       (null (get-text-property (1- p) 'egg-bunsetsu-last))
+       (egg-get-bunsetsu-info (- p 2))))
 
 (defun egg-separate-characters (str)
   (let* ((v (string-to-vector str))
   (interactive "p")
   (egg-next-candidate (- n)))
 
+;; Bogus function 980220
 (defun egg-decide-bunsetsu (&optional end-marker)
   (let ((in-loop t)
        p bunsetsu-info-list bl)
 
 (defun egg-decide-before-point ()
   (interactive)
-  (let ((m (make-marker))
-       all start bunsetsu-list)
-    (if (get-text-property (1- (point)) 'egg-start)
-       (signal 'beginning-of-buffer nil)
-      (setq start (1- (previous-single-property-change (point) 'egg-start))))
-    (set-marker m (point))
-    (goto-char start)
-    ;; Delete open marker
-    (delete-region start (1+ start))
-    (setq bunsetsu-list (egg-decide-bunsetsu m))
-    ;; delete separator
-    (delete-region (1- (point)) (point))
-    ;; insert open marker
-    (insert egg-conversion-open)
-    (put-text-property m (point) 'egg-start t)
-    (if egg-conversion-face
-       (put-text-property p (point) 'invisible t))
-    (egg-end-conversion bunsetsu-list)
-    (set-marker m nil)))
+  (let (bunsetsu-list bl (p (point)) source (dlen 0) l s)
+    (save-restriction
+      (if (null (get-text-property (1- (point)) 'egg-start))
+         (goto-char (previous-single-property-change (point) 'egg-start)))
+      (narrow-to-region (1- (point)) p)
+      (setq source (get-text-property (1- (point)) 'egg-source))
+      (setq bunsetsu-list (setq bl (list nil)))
+      (while (< (point) (point-max))
+       ;; delete sparator/open marker
+       (delete-region (1- (point)) (point))
+       (setq bl (setcdr bl (list (egg-get-bunsetsu-info (point)))))
+       (setq dlen (+ dlen (length (egg-get-bunsetsu-source (car bl)))))
+       (if (get-text-property (point) 'egg-bunsetsu-last)
+           (progn
+             (egg-end-conversion (cdr bunsetsu-list))
+             (setq bunsetsu-list (setq bl (list nil)))))
+       (setq p (point))
+       (forward-char)
+       (remove-text-properties p (point) '(face nil
+                                                intangible nil
+                                                local-map nil
+                                                egg-bunsetsu-last nil))))
+    (if (get-text-property (point) 'egg-end)
+       (progn
+         ;; delete close marker
+         (delete-region (point) (1+ (point)))
+         (egg-do-auto-fill)
+         (run-hooks 'input-method-after-insert-chunk-hook))
+      ;; delete last from speparater to close marker
+      (delete-region (1- (point))
+                    (1+ (next-single-property-change (point) 'egg-end)))
+      ;; rebuild fence mode string
+      (setq p 0)
+      (while (< p dlen)
+       (setq s (car (get-text-property p 'its-syl source))
+             l (length s)
+             p (+ p l))
+       (if (> p dlen)
+           (put-text-property dlen p
+                              'its-syl (list (substring s (- dlen p)))
+                              source)))
+      (its-restart (substring source dlen)))))
 
 (defun egg-exit-conversion ()
   (interactive)
-  (let (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 (1+ start))
-    (setq bunsetsu-list (egg-decide-bunsetsu))
-    ;; Delete close marker
-    (delete-region (point) (1+ (point)))
-    (egg-do-auto-fill)
-    (egg-end-conversion bunsetsu-list)
-    (run-hooks 'input-method-after-insert-chunk-hook)))
+  (goto-char (next-single-property-change (point) 'egg-end))
+  (egg-decide-before-point))
+
+(defun egg-abort-conversion ()
+  (interactive)
+  (if (null (get-text-property (1- (point)) 'egg-start))
+      (goto-char (previous-single-property-change (point) 'egg-start)))
+  (egg-decide-before-point))
 
 (defun egg-select-candidate ()
   (interactive)