33 |
;;; Code: |
;;; Code: |
34 |
|
|
35 |
(require 'quail) |
(require 'quail) |
|
(require 'devan-util) |
|
36 |
(require 'ind-util) |
(require 'ind-util) |
37 |
|
(require 'devan-util) |
|
(defun quail-indian-preceding-char-position (position) |
|
|
"Return the position of preceding composite character." |
|
|
(let (prec-composed) |
|
|
(if (char-valid-p (char-before position)) ;; range o.k. |
|
|
(if (setq prec-composed (find-composition (1- position))) |
|
|
(car prec-composed) |
|
|
(1- position)) |
|
|
nil))) |
|
|
|
|
|
(defvar quail-indian-update-preceding-char nil) |
|
|
(make-variable-frame-local 'quail-indian-update-preceding-char) |
|
|
|
|
|
;; Input value :: |
|
|
;; CONTROL-FLAG is integer `n' |
|
|
;; quail-current-key :: keyboard input. |
|
|
;; Only first `n' can be translated. |
|
|
;; quail-current-str :: corresonding string. |
|
|
;; jobs :: (1) put last (len-n) char to unrread-command-event. |
|
|
;; (2) put translated string to quail-current-str. |
|
|
;; |
|
|
;; CONTROL-FLAG is t (terminate) or nil (proceed the translation) |
|
|
;; quail-current-key :: keyboard input. |
|
|
;; quail-current-str :: corresponding string. |
|
|
;; jobs :: (1) put modified translated string to quail-current-str. |
|
|
;; |
|
|
;; When non-nil value is returned from quail-translation-update-function, |
|
|
;; the quail-current-str is split to characters and put into event queue, |
|
|
;; with `compose-last-char' event with composition info at the end. |
|
|
|
|
|
(defun quail-indian-update-translation (control-flag) |
|
|
;; make quail-current-str string when possible. |
|
|
(if (char-valid-p quail-current-str) |
|
|
(setq quail-current-str (char-to-string quail-current-str))) |
|
|
;(message "\n input control-flag=%s, str=%s, key=%s q-ind-upd-prec-char=%s" |
|
|
; control-flag quail-current-str quail-current-key |
|
|
; quail-indian-update-preceding-char) |
|
|
;; reset quail-indian-update-preceding-char if it's initial. |
|
|
(if (= (overlay-start quail-overlay) (overlay-end quail-overlay)) |
|
|
(setq quail-indian-update-preceding-char nil)) |
|
|
;; Check the preceding character of the quail region. If the |
|
|
;; preceding character can be composed with quail-current-str, then |
|
|
;; grab that preceding character into the quail-current-str and |
|
|
;; remove that char from the region. |
|
|
(let* (prec-char-position composition-regexp |
|
|
prec-char-str candidate-str match-pos match-end) |
|
|
(when (and quail-current-str |
|
|
(null quail-indian-update-preceding-char) |
|
|
(null input-method-use-echo-area) |
|
|
(null input-method-exit-on-first-char) |
|
|
(setq prec-char-position |
|
|
(quail-indian-preceding-char-position |
|
|
(overlay-start quail-overlay))) |
|
|
(setq composition-regexp |
|
|
(if prec-char-position |
|
|
(caar (elt composition-function-table |
|
|
(char-after prec-char-position))))) |
|
|
(setq prec-char-str |
|
|
(buffer-substring prec-char-position |
|
|
(overlay-start quail-overlay)) |
|
|
candidate-str (concat prec-char-str quail-current-str) |
|
|
match-pos (string-match composition-regexp candidate-str) |
|
|
match-end (match-end 0)) |
|
|
(> match-end (length prec-char-str))) |
|
|
(setq quail-indian-update-preceding-char prec-char-str) |
|
|
(delete-region prec-char-position |
|
|
(overlay-start quail-overlay)))) |
|
|
(setq quail-current-str |
|
|
(indian-compose-string |
|
|
(concat quail-indian-update-preceding-char |
|
|
quail-current-str))) |
|
|
(if (numberp control-flag) |
|
|
(setq unread-command-events |
|
|
(string-to-list |
|
|
(substring quail-current-key control-flag)))) |
|
|
(when control-flag |
|
|
(setq quail-indian-update-preceding-char nil)) |
|
|
;(message "output control-flag=%s, str=%s, key=%s q-ind-upd-prec-char=%s" |
|
|
; control-flag quail-current-str quail-current-key |
|
|
; quail-indian-update-preceding-char) |
|
|
control-flag) |
|
38 |
|
|
39 |
;;; |
;;; |
40 |
;;; Input by transliteration |
;;; Input by transliteration |
43 |
(defun quail-define-indian-trans-package (hashtbls pkgname |
(defun quail-define-indian-trans-package (hashtbls pkgname |
44 |
lang title doc) |
lang title doc) |
45 |
(funcall 'quail-define-package pkgname lang title t doc |
(funcall 'quail-define-package pkgname lang title t doc |
46 |
nil nil nil nil nil nil t nil |
nil nil nil nil nil nil t nil) |
|
'quail-indian-update-translation) |
|
47 |
(maphash |
(maphash |
48 |
(lambda (key val) |
(lambda (key val) |
49 |
(quail-defrule key (if (= (length val) 1) |
(quail-defrule key (if (= (length val) 1) |
143 |
(setq char-table (quail-indian-flatten-list char-table)) |
(setq char-table (quail-indian-flatten-list char-table)) |
144 |
(setq key-table (quail-indian-flatten-list key-table)) |
(setq key-table (quail-indian-flatten-list key-table)) |
145 |
(funcall 'quail-define-package pkgname lang title nil docstring |
(funcall 'quail-define-package pkgname lang title nil docstring |
146 |
nil nil nil nil nil nil nil nil |
nil nil nil nil nil nil nil nil) |
|
'quail-indian-update-translation) |
|
147 |
(dolist (key key-table) |
(dolist (key key-table) |
148 |
(let ((val (pop char-table))) |
(let ((val (pop char-table))) |
149 |
(if (and key val) |
(if (and key val) |
150 |
(quail-defrule |
(quail-defrule |
151 |
(if (char-valid-p key) (char-to-string key) key) |
(if (characterp key) (char-to-string key) key) |
152 |
(if (stringp val) (vector val) val)))))) |
(if (stringp val) (vector val) val)))))) |
153 |
|
|
154 |
;; |
;; |