-;;; quail/lao.el --- Quail package for inputting Lao characters
+;;; lao.el --- Quail package for inputting Lao characters -*-coding: iso-2022-7bit;-*-
-;; Copyright (C) 1997 Electrotechnical Laboratory, JAPAN.
-;; Licensed to the Free Software Foundation.
+;; Copyright (C) 1997, 1999, 2004
+;; National Institute of Advanced Industrial Science and Technology (AIST)
+;; Registration Number H14PRO021
;; Keywords: multilingual, input method, Lao
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
;;; Code:
(require 'quail)
(require 'lao-util)
-(eval-and-compile
-
-(defconst lao-keyboard-mapping
- [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; control codes
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; control codes
- 0 "1" "=" "3" "4" "\e(1l\e(B" "5" "\e(1'\e(B" ; SPC .. '
- "7" "8" "6" "\e(1mh\e(B" "\e(1A\e(B" "9" "\e(1c\e(B" "\e(1=\e(B" ; ( .. /
- "\e(1"\e(B" "\e(1B\e(B" "\e(1?\e(B" "\e(1b\e(B" "\e(16\e(B" "\e(1X\e(B" "\e(1Y\e(B" "\e(1$\e(B" ; 0 .. 7
- "\e(15\e(B" "\e(1(\e(B" "%" "\e(1G\e(B" "\e(1}\e(B" "\e(1m\e(B" ">" "\)" ; 8 .. ?
- "2" "\e(1Qi\e(B" "\e(1Vi\e(B" "\e(1O\e(B" "." "\e(1Si\e(B" "," ":" ; @ .. G
- "\e(1j\e(B" "\e(1N\e(B" "\e(1k\e(B" "!" "?" "\e(1f\e(B" "\e(1Wi\e(B" "\e(1|\e(B" ; H .. O
- "\e(1]\e(B" "\e(1[i\e(B" "_" ";" "+" "\e(1Ui\e(B" "x" "0" ; P .. W
- "\(" "\e(1Ti\e(B" "\"" "\e(1:\e(B" 0 "\e(1E\e(B" "\e(1\\e(B" "\e(1*\e(B" ; X .. _
- "\e(1'\e(B" "\e(1Q\e(B" "\e(1V\e(B" "\e(1a\e(B" "\e(1!\e(B" "\e(1S\e(B" "\e(14\e(B" "\e(1`\e(B" ; ` .. g
- "\e(1i\e(B" "\e(1C\e(B" "\e(1h\e(B" "\e(1R\e(B" "\e(1J\e(B" "\e(17\e(B" "\e(1W\e(B" "\e(19\e(B" ; h .. o
- "\e(1-\e(B" "\e(1[\e(B" "\e(1>\e(B" "\e(1K\e(B" "\e(1P\e(B" "\e(1U\e(B" "\e(1M\e(B" "\e(1d\e(B" ; p .. w
- "\e(1;\e(B" "\e(1T\e(B" "\e(1<\e(B" "-" "\e(1K\\e(B" "/" "~" 0] ; x .. DEL
- "A table which maps ASCII key codes to corresponding Lao characters."
- )
-
-)
-
-;; Template of a cdr part of a Quail map when a consonant is entered.
-(defvar lao-consonant-alist nil)
-;; Template of a cdr part of a Quail map when a vowel upper is entered.
-(defvar lao-vowel-upper-alist nil)
-;; Template of a cdr part of a Quail map when a vowel lower is entered.
-(defvar lao-vowel-lower-alist nil)
-;; Template of a cdr part of a Quail map when a semivowel lower is entered.
-(defvar lao-semivowel-lower-alist nil)
-
-;; Return a Quail map corresponding to KEY of length LEN.
-;; The car part of the map is a translation generated automatically.
-;; The cdr part of the map is a copy of ALIST.
-(defun lao-generate-quail-map (key len alist)
- (let ((str "")
- (idx 0))
- (while (< idx len)
- (setq str (concat str (aref lao-keyboard-mapping (aref key idx)))
- idx (1+ idx)))
- (cons (string-to-char (compose-string str)) (copy-alist alist))))
-
-;; Return a Quail map corresponding to KEY of length LEN when Lao
-;; tone mark is entered.
-(defun lao-tone-input (key len)
- (lao-generate-quail-map key len nil))
-
-;; Return a Quail map corresponding to KEY of length LEN when Lao
-;; vowel upper is entered.
-(defun lao-vowel-upper-input (key len)
- (lao-generate-quail-map key len lao-vowel-upper-alist))
-
-;; Return a Quail map corresponding to KEY of length LEN when Lao
-;; vowel lower is entered.
-(defun lao-vowel-lower-input (key len)
- (lao-generate-quail-map key len lao-vowel-lower-alist))
-
-;; Return a Quail map corresponding to KEY of length LEN when Lao
-;; semivowel lower is entered.
-(defun lao-semivowel-lower-input (key len)
- (lao-generate-quail-map key len lao-semivowel-lower-alist))
-
-;; Return an alist which can be a cdr part of a Quail map
-;; corresponding to the current key when Lao consonant is entered.
-(defun lao-consonant-input (key len)
- (copy-alist lao-consonant-alist))
+(defun quail-lao-update-translation (control-flag)
+ (if (integerp control-flag)
+ ;; Non-composable character typed.
+ (setq quail-current-str
+ (buffer-substring (overlay-start quail-overlay)
+ (overlay-end quail-overlay))
+ unread-command-events
+ (string-to-list
+ (substring quail-current-key control-flag)))
+ (setq quail-current-str
+ (compose-string (quail-lookup-map-and-concat quail-current-key))))
+ control-flag)
+
+(defvar lao-key-alist
+ '(("!" . "1")
+ ("\"" . "=")
+ ("#" . "3")
+ ("$" . "4")
+ ("&" . "5")
+ ("%" . "\e(1l\e(B")
+ ("'" . "\e(1'\e(B")
+ ("(" . "7")
+ (")" . "8")
+ ("*" . "6")
+ ("+" . ["\e(1mh\e(B"])
+ ("," . "\e(1A\e(B")
+ ("-" . "\e(1*\e(B")
+ ("." . "\e(1c\e(B")
+ ("/" . "\e(1=\e(B")
+ ("0" . "\e(1"\e(B")
+ ("1" . "\e(1B\e(B")
+ ("2" . "\e(1?\e(B")
+ ("3" . "\e(1b\e(B")
+ ("4" . "\e(16\e(B")
+ ("5" . "\e(1X\e(B")
+ ("6" . "\e(1Y\e(B")
+ ("7" . "\e(1$\e(B")
+ ("8" . "\e(15\e(B")
+ ("9" . "\e(1(\e(B")
+ (":" . "%")
+ (";" . "\e(1G\e(B")
+ ("<" . "\e(1}\e(B")
+ ("=" . "\e(1m\e(B")
+ (">" . "$")
+ ("?" . ")")
+ ("@" . "2")
+ ("A" . ["\e(1Qi\e(B"])
+ ("B" . ["\e(1Vi\e(B"])
+ ("C" . "\e(1O\e(B")
+ ("D" . ".")
+ ("E" . ["\e(1Si\e(B"])
+ ("F" . ",")
+ ("G" . ":")
+ ("H" . "\e(1j\e(B")
+ ("I" . "\e(1N\e(B")
+ ("J" . "\e(1k\e(B")
+ ("K" . "!")
+ ("L" . "?")
+ ("M" . "\e(1f\e(B")
+ ("N" . ["\e(1Wi\e(B"])
+ ("O" . "\e(1|\e(B")
+ ("P" . "\e(1]\e(B")
+ ("Q" . ["\e(1[i\e(B"])
+ ("R" . "_")
+ ("S" . ";")
+ ("T" . "+")
+ ("U" . ["\e(1Ui\e(B"])
+ ("V" . "x")
+ ("W" . "0")
+ ("X" . "(")
+ ("Y" . ["\e(1Ti\e(B"])
+ ("Z" . "\"")
+ ("[" . "\e(1:\e(B")
+ ("]" . "\e(1E\e(B")
+ ("^" . "\e(1\\e(B")
+ ("_" . "9")
+ ("`" . "\e(1'\e(B")
+ ("a" . "\e(1Q\e(B")
+ ("b" . "\e(1V\e(B")
+ ("c" . "\e(1a\e(B")
+ ("d" . "\e(1!\e(B")
+ ("e" . "\e(1S\e(B")
+ ("f" . "\e(14\e(B")
+ ("g" . "\e(1`\e(B")
+ ("h" . "\e(1i\e(B")
+ ("i" . "\e(1C\e(B")
+ ("j" . "\e(1h\e(B")
+ ("k" . "\e(1R\e(B")
+ ("l" . "\e(1J\e(B")
+ ("m" . "\e(17\e(B")
+ ("n" . "\e(1W\e(B")
+ ("o" . "\e(19\e(B")
+ ("p" . "\e(1-\e(B")
+ ("q" . "\e(1[\e(B")
+ ("r" . "\e(1>\e(B")
+ ("s" . "\e(1K\e(B")
+ ("t" . "\e(1P\e(B")
+ ("u" . "\e(1U\e(B")
+ ("v" . "\e(1M\e(B")
+ ("w" . "\e(1d\e(B")
+ ("x" . "\e(1;\e(B")
+ ("y" . "\e(1T\e(B")
+ ("z" . "\e(1<\e(B")
+ ("{" . "-")
+ ("|" . ["\e(1K\\e(B"])
+ ("}" . "/")
+ ("~" . "\e(1l\e(B")
+ ("\\0" . "\e(1p\e(B")
+ ("\\1" . "\e(1q\e(B")
+ ("\\2" . "\e(1r\e(B")
+ ("\\3" . "\e(1s\e(B")
+ ("\\4" . "\e(1t\e(B")
+ ("\\5" . "\e(1u\e(B")
+ ("\\6" . "\e(1v\e(B")
+ ("\\7" . "\e(1w\e(B")
+ ("\\8" . "\e(1x\e(B")
+ ("\\9" . "\e(1y\e(B")
+ )
+ "Alist of key sequences vs the corresponding Lao string to input.
+This variable is for the input method \"lao\".
+If you change the value of this variable while quail/lao is already loaded,
+you need to re-load it to properly re-initialize related alists.")
+
+;; Temporary variable to initialize lao-consonant-key-alist, etc.
+(defconst lao-key-alist-vector
+ (let ((tail lao-key-alist)
+ consonant-key-alist semivowel-key-alist vowel-key-alist
+ voweltone-key-alist tone-key-alist other-key-alist
+ elt phonetic-type)
+ (while tail
+ (setq elt (car tail) tail (cdr tail))
+ (if (stringp (cdr elt))
+ (setq phonetic-type (get-char-code-property (aref (cdr elt) 0)
+ 'phonetic-type))
+ (setq phonetic-type (get-char-code-property (aref (aref (cdr elt) 0) 0)
+ 'phonetic-type))
+ (aset (cdr elt) 0 (compose-string (aref (cdr elt) 0))))
+ (cond ((eq phonetic-type 'consonant)
+ (setq consonant-key-alist (cons elt consonant-key-alist)))
+ ((memq phonetic-type '(vowel-upper vowel-lower))
+ (if (stringp (cdr elt))
+ (setq vowel-key-alist (cons elt vowel-key-alist))
+ (setq voweltone-key-alist (cons elt voweltone-key-alist))))
+ ((eq phonetic-type 'tone)
+ (setq tone-key-alist (cons elt tone-key-alist)))
+ ((eq phonetic-type 'semivowel-lower)
+ (setq semivowel-key-alist (cons elt semivowel-key-alist)))
+ (t
+ (setq other-key-alist (cons elt other-key-alist)))))
+ (vector consonant-key-alist semivowel-key-alist vowel-key-alist
+ voweltone-key-alist tone-key-alist other-key-alist)))
+
+(defconst lao-consonant-key-alist (aref lao-key-alist-vector 0))
+(defconst lao-semivowel-key-alist (aref lao-key-alist-vector 1))
+(defconst lao-vowel-key-alist (aref lao-key-alist-vector 2))
+(defconst lao-voweltone-key-alist (aref lao-key-alist-vector 3))
+(defconst lao-tone-key-alist (aref lao-key-alist-vector 4))
+(defconst lao-other-key-alist (aref lao-key-alist-vector 5))
+
+;; Done with it.
+(makunbound 'lao-key-alist-vector)
(quail-define-package
"lao" "Lao" "\e(1E\e(B" t
"Lao input method simulating Lao keyboard layout based on Thai TIS620"
- nil t t t t)
-
-(defmacro lao-quail-define-rules (&rest rules)
- (let ((l rules)
- consonant-alist
- vowel-upper-alist
- vowel-lower-alist
- semivowel-lower-alist
- rule trans ch c-set)
- (while l
- (setq rule (car l))
- (setq trans (nth 1 rule))
- (if (consp trans)
- (setq trans (car trans)))
- (setq c-set (char-category-set (string-to-char trans)))
- (cond ((aref c-set ?2) ; vowel upper
- (setq consonant-alist
- (cons (cons (string-to-char (car rule))
- 'lao-vowel-upper-input)
- consonant-alist)))
- ((aref c-set ?3) ; vowel lower
- (setq consonant-alist
- (cons (cons (string-to-char (car rule))
- 'lao-vowel-lower-input)
- consonant-alist)
- semivowel-lower-alist
- (cons (cons (string-to-char (car rule))
- 'lao-vowel-lower-input)
- semivowel-lower-alist)))
- ((aref c-set ?4) ; tone
- (setq consonant-alist
- (cons (cons (string-to-char (car rule))
- 'lao-tone-input)
- consonant-alist)
- vowel-upper-alist
- (cons (cons (string-to-char (car rule))
- 'lao-tone-input)
- vowel-upper-alist)
- vowel-lower-alist
- (cons (cons (string-to-char (car rule))
- 'lao-tone-input)
- vowel-lower-alist)))
- ((aref c-set ?9) ; semivowel lower
- (setq consonant-alist
- (cons (cons (string-to-char (car rule))
- 'lao-semivowel-lower-input)
- consonant-alist)
- vowel-upper-alist
- (cons (cons (string-to-char (car rule))
- 'lao-semivowel-lower-input)
- vowel-upper-alist))))
- (setq l (cdr l)))
- (list 'progn
- (cons 'quail-define-rules rules)
- `(setq lao-consonant-alist ',consonant-alist
- lao-vowel-upper-alist ',vowel-upper-alist
- lao-vowel-lower-alist ',vowel-lower-alist
- lao-semivowel-lower-alist ',semivowel-lower-alist))))
-
-(lao-quail-define-rules
- ("!" "1")
- ("\"" "=")
- ("#" "3")
- ("$" "4")
- ("&" "5")
- ("%" "\e(1l\e(B")
- ("'" ("\e(1'\e(B" . lao-consonant-input))
- ("(" "7")
- (")" "8")
- ("*" "6")
- ("+" "\e0\e(1mh\e1\e(B")
- ("," ("\e(1A\e(B" . lao-consonant-input))
- ("-" "9")
- ("." "\e(1c\e(B")
- ("/" ("\e(1=\e(B" . lao-consonant-input))
- ("0" ("\e(1"\e(B" . lao-consonant-input))
- ("1" ("\e(1B\e(B" . lao-consonant-input))
- ("2" ("\e(1?\e(B" . lao-consonant-input))
- ("3" "\e(1b\e(B")
- ("4" ("\e(16\e(B" . lao-consonant-input))
- ("5" "\e(1X\e(B")
- ("6" "\e(1Y\e(B")
- ("7" ("\e(1$\e(B" . lao-consonant-input))
- ("8" ("\e(15\e(B" . lao-consonant-input))
- ("9" ("\e(1(\e(B" . lao-consonant-input))
- (":" "%")
- (";" ("\e(1G\e(B" . lao-consonant-input))
- ("<" ("\e(1}\e(B" . lao-consonant-input))
- ("=" "\e(1m\e(B")
- (">" ">")
- ("?" ")")
- ("@" "2")
- ("A" "\e0\e(1Qi\e1\e(B")
- ("B" "\e0\e(1Vi\e1\e(B")
- ("C" "\e(1O\e(B")
- ("D" ".")
- ("E" "\e0\e(1Si\e1\e(B")
- ("F" ",")
- ("G" ":")
- ("H" "\e(1j\e(B")
- ("I" ("\e(1N\e(B" . lao-consonant-input))
- ("J" "\e(1k\e(B")
- ("K" "!")
- ("L" "?")
- ("M" "\e(1f\e(B")
- ("N" "\e0\e(1Wi\e1\e(B")
- ("O" ("\e(1|\e(B" . lao-consonant-input))
- ("P" "\e(1]\e(B")
- ("Q" "\e0\e(1[i\e1\e(B")
- ("R" "_")
- ("S" ";")
- ("T" "+")
- ("U" "\e0\e(1Ui\e1\e(B")
- ("V" "x")
- ("W" "0")
- ("X" "(")
- ("Y" "\e0\e(1Ti\e1\e(B")
- ("Z" "\"")
- ("[" ("\e(1:\e(B" . lao-consonant-input))
- ("]" ("\e(1E\e(B" . lao-consonant-input))
- ("^" "\e(1\\e(B")
- ("_" ("\e(1*\e(B" . lao-consonant-input))
- ("`" ("\e(1'\e(B" . lao-consonant-input))
- ("a" "\e(1Q\e(B")
- ("b" "\e(1V\e(B")
- ("c" "\e(1a\e(B")
- ("d" ("\e(1!\e(B" . lao-consonant-input))
- ("e" "\e(1S\e(B")
- ("f" ("\e(14\e(B" . lao-consonant-input))
- ("g" "\e(1`\e(B")
- ("h" "\e(1i\e(B")
- ("i" ("\e(1C\e(B" . lao-consonant-input))
- ("j" "\e(1h\e(B")
- ("k" "\e(1R\e(B")
- ("l" ("\e(1J\e(B" . lao-consonant-input))
- ("m" ("\e(17\e(B" . lao-consonant-input))
- ("n" "\e(1W\e(B")
- ("o" ("\e(19\e(B" . lao-consonant-input))
- ("p" ("\e(1-\e(B" . lao-consonant-input))
- ("q" "\e(1[\e(B")
- ("r" ("\e(1>\e(B" . lao-consonant-input))
- ("s" ("\e(1K\e(B" . lao-consonant-input))
- ("t" "\e(1P\e(B")
- ("u" "\e(1U\e(B")
- ("v" ("\e(1M\e(B" . lao-consonant-input))
- ("w" "\e(1d\e(B")
- ("x" ("\e(1;\e(B" . lao-consonant-input))
- ("y" "\e(1T\e(B")
- ("z" ("\e(1<\e(B" . lao-consonant-input))
- ("{" "-")
- ("|" ("\e0\e(1K\\e1\e(B" . lao-consonant-input))
- ("}" "/")
- ("~" "\e(1l\e(B")
- ("\\0" "\e(1p\e(B")
- ("\\1" "\e(1q\e(B")
- ("\\2" "\e(1r\e(B")
- ("\\3" "\e(1s\e(B")
- ("\\4" "\e(1t\e(B")
- ("\\5" "\e(1u\e(B")
- ("\\6" "\e(1v\e(B")
- ("\\7" "\e(1w\e(B")
- ("\\8" "\e(1x\e(B")
- ("\\9" "\e(1y\e(B")
- )
-
-
-;;; quail/lao.el ends here
+ nil t t t t nil nil nil 'quail-lao-update-translation nil t)
+
+(quail-install-map
+ (quail-map-from-table
+ '((base-state (lao-consonant-key-alist . svt-state)
+ lao-vowel-key-alist
+ lao-voweltone-key-alist
+ lao-tone-key-alist
+ lao-other-key-alist)
+ (svt-state (lao-semivowel-key-alist . v-state)
+ (lao-vowel-key-alist . t-state)
+ lao-voweltone-key-alist)
+ (v-state (lao-vowel-key-alist . t-state))
+ (t-state lao-tone-key-alist))))
+
+;;; arch-tag: 23863a30-a8bf-402c-b7ce-c517a7aa8570
+;;; lao.el ends here