- (let (bunsetsu-info-list lang contin p s e)
- (save-restriction
- (narrow-to-region start end)
- (goto-char start)
- (insert egg-conversion-open)
- (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))
- (egg-separate-languages start (point-max))
- (goto-char start)
- (while (< (point) (point-max))
- (setq lang (get-text-property (point) 'egg-lang))
- (setq s (point)
- e (next-single-property-change s 'egg-lang nil (point-max)))
- (setq bunsetsu-info-list
- (egg-start-conversion (buffer-substring s e) lang))
- (setq contin (< e (point-max)))
- (delete-region s e)
- (egg-insert-bunsetsu-list bunsetsu-info-list
- (if (< (point) (point-max)) 'contine t))))
- (setq p (point))
- (insert egg-conversion-close)
- (put-text-property p (point) 'egg-end t)
- (if egg-conversion-face
- (put-text-property p (point) 'invisible t))
- (goto-char start)))
-
-(defun egg-separate-languages (start end)
- (let (lang last-lang last-chinese p l c cset)
- (goto-char start)
- (while (< (point) end)
- (setq p (next-single-property-change (point) 'its-lang nil end))
- (cond
- ((get-text-property (point) 'its-lang)
- (goto-char p))
- ((setq l (egg-chinese-syllable (buffer-substring (point) p)))
- (setq p (point))
- (goto-char (+ (point) l))
- (put-text-property p (point) 'its-lang "Chinese"))
- ((progn
- (setq c (following-char)
- cset (char-charset c))
- (eq cset 'chinese-sisheng))
- (setq p (point))
- (forward-char)
- (put-text-property p (point) 'its-lang "Chinese"))
- ((eq cset 'ascii)
- (forward-char))
- (t
- (setq p (point))
- (forward-char)
- (put-text-property p (point) 'its-lang (egg-char-to-language c)))))
- (goto-char start)
- (while (< (point) end)
- (setq lang (get-text-property (point) 'its-lang))
+ (let ((source (buffer-substring start end))
+ (no-prop-source (buffer-substring-no-properties start end))
+ bunsetsu-info-list len result i j s)
+ (if (>= start end)
+ ;; nothing to do
+ nil
+ (delete-region start end)
+ (let ((inhibit-read-only t))
+ (its-define-select-keys egg-conversion-map)
+ (goto-char start)
+ (setq s (copy-sequence egg-conversion-open)
+ len (length s))
+ (set-text-properties 0 len
+ (list
+ 'read-only t
+ 'egg-start t
+ 'egg-source source)
+ s)
+ (if egg-conversion-invisible
+ (put-text-property 0 len 'invisible t s))
+ (insert s)
+ (setq start (point)
+ s (copy-sequence egg-conversion-close)
+ len (length s))
+ (set-text-properties 0 len
+ '(read-only t rear-nonsticky t egg-end t)
+ s)
+ (if egg-conversion-invisible
+ (put-text-property 0 len 'invisible t s))
+ (insert s)
+ (goto-char start)
+ (egg-separate-languages (copy-sequence source))
+ (setq i 0
+ len (length source))
+ (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))
+ (setq i j))
+ (goto-char start)))))
+
+(defconst egg-chinese-sisheng-regexp
+ (concat "[" (list (make-char 'chinese-sisheng 32))
+ "-" (list (make-char 'chinese-sisheng 127))
+ "]+"))
+
+(defun egg-separate-languages (str &optional last-lang)
+ (let (lang last-chinese
+ (len (length str)) i j l)
+ ;; 1st pass -- mark undefined Chinese part
+ (if (or (eq last-lang 'Chinese-GB) (eq last-lang 'Chinese-CNS))
+ (setq last-chinese last-lang))
+ (setq i 0)
+ (while (< i len)
+ (setq j (egg-next-single-property-change i 'egg-lang str len))
+ (if (get-text-property i 'egg-lang str)
+ nil
+ (setq c (egg-string-to-char-at str i)
+ cset (char-charset c))
+ (cond
+ ((eq cset 'chinese-sisheng)
+ (string-match egg-chinese-sisheng-regexp str i)
+ (setq l (match-end 0)
+ j (min j l)
+ lang 'Chinese))
+ ((setq l (egg-chinese-syllable str i))
+ (setq j (+ i l)
+ lang 'Chinese))
+ ((eq cset 'ascii)
+ (if (eq (string-match "[\0-\177\240-\377]+" str (1+ i)) (1+ i))
+ (setq j (match-end 0))
+ (setq j (1+ i)))
+ (if (and (< j len)
+ (eq (char-charset (egg-string-to-char-at str j))
+ 'chinese-sisheng))
+ (setq j (max (1+ i) (- j 6))))
+ (setq lang nil))
+ ((eq cset 'composition)
+ (setq j (+ i (egg-char-bytes c))
+ lang (egg-charset-to-language
+ (char-charset
+ (car (decompose-composite-char c 'list))))))
+ (t
+ (string-match (concat "[" (list (make-char cset 32 32))
+ "-" (list (make-char cset 127 127))
+ "]+")
+ str i)
+ (setq j (match-end 0)
+ lang (egg-charset-to-language cset))))
+ (if lang
+ (put-text-property i j 'egg-lang lang str)))
+ (setq i j))
+ ;; 2nd pass -- set language property
+ (setq i 0)
+ (while (< i len)
+ (setq lang (get-text-property i 'egg-lang str))