1;;; lao.el --- Quail package for inputting Lao characters  -*-coding: iso-2022-7bit;-*-
2
3;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4;;   2006, 2007
5;;   National Institute of Advanced Industrial Science and Technology (AIST)
6;;   Registration Number H14PRO021
7
8;; Keywords: multilingual, input method, Lao
9
10;; This file is part of GNU Emacs.
11
12;; GNU Emacs is free software; you can redistribute it and/or modify
13;; it under the terms of the GNU General Public License as published by
14;; the Free Software Foundation; either version 2, or (at your option)
15;; any later version.
16
17;; GNU Emacs is distributed in the hope that it will be useful,
18;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20;; GNU General Public License for more details.
21
22;; You should have received a copy of the GNU General Public License
23;; along with GNU Emacs; see the file COPYING.  If not, write to the
24;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
25;; Boston, MA 02110-1301, USA.
26
27;;; Commentary:
28
29;;; Code:
30
31(require 'quail)
32(require 'lao-util)
33
34(defun quail-lao-update-translation (control-flag)
35  (if (integerp control-flag)
36      ;; Non-composable character typed.
37      (setq quail-current-str
38	    (buffer-substring (overlay-start quail-overlay)
39			      (overlay-end quail-overlay))
40	    unread-command-events
41	    (string-to-list
42	     (substring quail-current-key control-flag)))
43    (setq quail-current-str
44	  (compose-string (quail-lookup-map-and-concat quail-current-key))))
45  control-flag)
46
47(defvar lao-key-alist
48  '(("!" . "1")
49    ("\"" . "=")
50    ("#" . "3")
51    ("$" . "4")
52    ("&" . "5")
53    ("%" . "(1l(B")
54    ("'" . "(1'(B")
55    ("(" . "7")
56    (")" . "8")
57    ("*" . "6")
58    ("+" . ["(1mh(B"])
59    ("," . "(1A(B")
60    ("-" . "(1*(B")
61    ("." . "(1c(B")
62    ("/" . "(1=(B")
63    ("0" . "(1"(B")
64    ("1" . "(1B(B")
65    ("2" . "(1?(B")
66    ("3" . "(1b(B")
67    ("4" . "(16(B")
68    ("5" . "(1X(B")
69    ("6" . "(1Y(B")
70    ("7" . "(1$(B")
71    ("8" . "(15(B")
72    ("9" . "(1((B")
73    (":" . "%")
74    (";" . "(1G(B")
75    ("<" . "(1}(B")
76    ("=" . "(1m(B")
77    (">" . "$")
78    ("?" . ")")
79    ("@" . "2")
80    ("A" . ["(1Qi(B"])
81    ("B" . ["(1Vi(B"])
82    ("C" . "(1O(B")
83    ("D" . ".")
84    ("E" . ["(1Si(B"])
85    ("F" . ",")
86    ("G" . ":")
87    ("H" . "(1j(B")
88    ("I" . "(1N(B")
89    ("J" . "(1k(B")
90    ("K" . "!")
91    ("L" . "?")
92    ("M" . "(1f(B")
93    ("N" . ["(1Wi(B"])
94    ("O" . "(1|(B")
95    ("P" . "(1](B")
96    ("Q" . ["(1[i(B"])
97    ("R" . "_")
98    ("S" . ";")
99    ("T" . "+")
100    ("U" . ["(1Ui(B"])
101    ("V" . "x")
102    ("W" . "0")
103    ("X" . "(")
104    ("Y" . ["(1Ti(B"])
105    ("Z" . "\"")
106    ("[" . "(1:(B")
107    ("]" . "(1E(B")
108    ("^" . "(1\(B")
109    ("_" . "9")
110    ("`" . "(1'(B")
111    ("a" . "(1Q(B")
112    ("b" . "(1V(B")
113    ("c" . "(1a(B")
114    ("d" . "(1!(B")
115    ("e" . "(1S(B")
116    ("f" . "(14(B")
117    ("g" . "(1`(B")
118    ("h" . "(1i(B")
119    ("i" . "(1C(B")
120    ("j" . "(1h(B")
121    ("k" . "(1R(B")
122    ("l" . "(1J(B")
123    ("m" . "(17(B")
124    ("n" . "(1W(B")
125    ("o" . "(19(B")
126    ("p" . "(1-(B")
127    ("q" . "(1[(B")
128    ("r" . "(1>(B")
129    ("s" . "(1K(B")
130    ("t" . "(1P(B")
131    ("u" . "(1U(B")
132    ("v" . "(1M(B")
133    ("w" . "(1d(B")
134    ("x" . "(1;(B")
135    ("y" . "(1T(B")
136    ("z" . "(1<(B")
137    ("{" . "-")
138    ("|" . ["(1K\(B"])
139    ("}" . "/")
140    ("~" . "(1l(B")
141    ("\\0" . "(1p(B")
142    ("\\1" . "(1q(B")
143    ("\\2" . "(1r(B")
144    ("\\3" . "(1s(B")
145    ("\\4" . "(1t(B")
146    ("\\5" . "(1u(B")
147    ("\\6" . "(1v(B")
148    ("\\7" . "(1w(B")
149    ("\\8" . "(1x(B")
150    ("\\9" . "(1y(B")
151    )
152  "Alist of key sequences vs the corresponding Lao string to input.
153This variable is for the input method \"lao\".
154If you change the value of this variable while quail/lao is already loaded,
155you need to re-load it to properly re-initialize related alists.")
156
157;; Temporary variable to initialize lao-consonant-key-alist, etc.
158(defconst lao-key-alist-vector
159  (let ((tail lao-key-alist)
160	consonant-key-alist semivowel-key-alist vowel-key-alist
161	voweltone-key-alist tone-key-alist other-key-alist
162	elt phonetic-type)
163    (while tail
164      (setq elt (car tail) tail (cdr tail))
165      (if (stringp (cdr elt))
166	  (setq phonetic-type (get-char-code-property (aref (cdr elt) 0)
167						      'phonetic-type))
168	(setq phonetic-type (get-char-code-property (aref (aref (cdr elt) 0) 0)
169						    'phonetic-type))
170	(aset (cdr elt) 0 (compose-string (aref (cdr elt) 0))))
171      (cond ((eq phonetic-type 'consonant)
172	     (setq consonant-key-alist (cons elt consonant-key-alist)))
173	    ((memq phonetic-type '(vowel-upper vowel-lower))
174	     (if (stringp (cdr elt))
175		 (setq vowel-key-alist (cons elt vowel-key-alist))
176	       (setq voweltone-key-alist (cons elt voweltone-key-alist))))
177	    ((eq  phonetic-type 'tone)
178	     (setq tone-key-alist (cons elt tone-key-alist)))
179	    ((eq phonetic-type 'semivowel-lower)
180	     (setq semivowel-key-alist (cons elt semivowel-key-alist)))
181	    (t
182	     (setq other-key-alist (cons elt other-key-alist)))))
183    (vector consonant-key-alist semivowel-key-alist vowel-key-alist
184	    voweltone-key-alist tone-key-alist other-key-alist)))
185
186(defconst lao-consonant-key-alist (aref lao-key-alist-vector 0))
187(defconst lao-semivowel-key-alist (aref lao-key-alist-vector 1))
188(defconst lao-vowel-key-alist (aref lao-key-alist-vector 2))
189(defconst lao-voweltone-key-alist (aref lao-key-alist-vector 3))
190(defconst lao-tone-key-alist (aref lao-key-alist-vector 4))
191(defconst lao-other-key-alist (aref lao-key-alist-vector 5))
192
193;; Done with it.
194(makunbound 'lao-key-alist-vector)
195
196(quail-define-package
197 "lao" "Lao" "(1E(B" t
198 "Lao input method simulating Lao keyboard layout based on Thai TIS620"
199 nil t t t t nil nil nil 'quail-lao-update-translation nil t)
200
201(quail-install-map
202 (quail-map-from-table
203  '((base-state (lao-consonant-key-alist . svt-state)
204		lao-vowel-key-alist
205		lao-voweltone-key-alist
206		lao-tone-key-alist
207		lao-other-key-alist)
208    (svt-state (lao-semivowel-key-alist . v-state)
209	      (lao-vowel-key-alist . t-state)
210	      lao-voweltone-key-alist)
211    (v-state (lao-vowel-key-alist . t-state))
212    (t-state lao-tone-key-alist))))
213
214;;; arch-tag: 23863a30-a8bf-402c-b7ce-c517a7aa8570
215;;; lao.el ends here
216