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))
(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)")
(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
(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
- (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)))))
i (egg-next-single-property-change i 'egg-lang str len))
(set-text-properties j i (list 'egg-lang lang) str))))
+;;; Should think again the interface to language-info-alist
(defun egg-charset-to-language (charset)
(let ((list language-info-alist))
(while (and list
(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.")
bunsetsu (cons (egg-make-bunsetsu bunsetsu-info
(and (null l) last))
bunsetsu)))
- (apply 'insert (nreverse bunsetsu))))
+ (apply 'insert (nreverse bunsetsu)))) ; XXX: Should avoid apply and reverse
(defun egg-beginning-of-conversion-buffer (n)
(interactive "p")
(insert (egg-make-bunsetsu new last))
(goto-char p)))))
+(defun egg-conversion-mode ()
+ "\\{egg-conversion-map}"
+ ;; dummy function to get docstring
+ )
+
+(defun egg-help-command ()
+ "Display documentation for EGG Conversion mode."
+ (interactive)
+ (with-output-to-temp-buffer "*Help*"
+ (princ "EGG Conversion mode:\n")
+ (princ (documentation 'egg-conversion-mode))
+ (help-setup-xref (cons #'help-xref-mode (current-buffer)) (interactive-p))))
+
(provide 'egg-cnv)
;;; egg-cnv.el ends here.