Move runtime leim lisp files to lisp/leim directory
[bpt/emacs.git] / lisp / leim / quail / tibetan.el
CommitLineData
4b725a70 1;;; tibetan.el --- Quail package for inputting Tibetan characters -*-coding: utf-8-emacs;-*-
2cd1b939 2
ab422c4d 3;; Copyright (C) 1997, 2001-2013 Free Software Foundation, Inc.
03ba6797 4;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
5df4f04c 5;; 2006, 2007, 2008, 2009, 2010, 2011
698218a2
KH
6;; National Institute of Advanced Industrial Science and Technology (AIST)
7;; Registration Number H14PRO021
2cd1b939
KH
8
9;; Keywords: multilingual, input method, Tibetan
10
11;; This file is part of GNU Emacs.
12
3d544458 13;; GNU Emacs is free software: you can redistribute it and/or modify
2cd1b939 14;; it under the terms of the GNU General Public License as published by
3d544458
GM
15;; the Free Software Foundation, either version 3 of the License, or
16;; (at your option) any later version.
2cd1b939
KH
17
18;; GNU Emacs is distributed in the hope that it will be useful,
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
22
23;; You should have received a copy of the GNU General Public License
3d544458 24;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
2cd1b939
KH
25
26;; Author: Toru TOMABECHI, <Toru.Tomabechi@orient.unil.ch>
27
28;; Created: Feb. 17. 1997
29
30;; History:
e4920bc9 31;; 1997.03.13 Support for inputting special signs and punctuation added.
2cd1b939
KH
32;; (Only Ext. Wylie input)
33
be567141
PJ
34;;; Commentary:
35
2cd1b939
KH
36;;; Code:
37
38(require 'quail)
653b6bad
KH
39(require 'tibet-util)
40
41;; Now quail-current-key is set to Tibetan-Roman transcription. We
42;; set quail-current-str to the corresponding Tibetan string (composed
43;; if necessary). Both Wylie and TibKey input methods use this
44;; function.
45
46(defun quail-tibetan-update-translation (control-flag)
47 (if (numberp control-flag)
48 ;; Non-composable-character typed.
49 (setq quail-current-str
50 (buffer-substring (overlay-start quail-overlay)
51 (overlay-end quail-overlay))
52 unread-command-events
53 (string-to-list
54 (substring quail-current-key control-flag)))
55 ;; Special treatment of "-d..." and "-y...".
56 (if (string-match "^-[dy]" quail-current-key)
57 (setq quail-current-key (substring quail-current-key 1)))
58 (let ((str (tibetan-transcription-to-tibetan quail-current-key)))
e4920bc9 59 ;; If quail-current-key is for punctuation, it can't be
653b6bad
KH
60 ;; transcribed by tibetan-transcription-to-tibetan, thus STR
61 ;; contains ASCII string now. In that case, use the current
62 ;; characters set in quail-current-str.
63 (if (> (aref str 0) 255)
64 (setq quail-current-str (tibetan-compose-string str))
65 (or quail-current-str
66 (setq quail-current-str quail-current-key)))))
67 control-flag)
68
69;;; Wylie transcription based input methods.
70
4b725a70 71;; Special alist for `འ'. It must be treated as a subjoined
653b6bad 72;; consonant if it follows a consonant.
cc7d79ad
KH
73;; * Removed by Tomabechi 2000/06/10 *
74;; 'a chung must be explicitly typed as a vowel ("fa")
4b725a70
PE
75;; འ is now treated as normal base consonants
76;; (defconst tibetan-wylie-quote-alist '(("'" . ?འ)))
653b6bad
KH
77
78;; Special alist to avoid default stacking.
79(defconst tibetan-wylie-non-stacking-alist
4b725a70
PE
80 '(("-d" . "ད")
81 ("-y" . "ཡ")))
653b6bad 82
e4920bc9 83;; Punctuation characters are not transcribed.
653b6bad
KH
84
85(defconst tibetan-wylie-punctuation-alist
86 '(("." . " ")
4b725a70
PE
87 (":" . "ཿ")
88 (" " . "་")
89 ("/" . "།")
90 ("//" . "༎")
91 ("////" . ["༎ ༎"])
92 ("$" . "༏")
93 ("/\"" . "༐") ; Not defined in Ext. Wylie.
94 ("&" . "༐")
95 (";" . "༑")
96 ("%" . "༔")
97 ("!" . "༈")
98 ("<" . "༼")
99 (">" . "༽")
100 ("@" . "྅")
101 ("*" . ["༄༅"])
102 ("#" . ["༄༅༅"])
103 ("^" . "༆")
104 ("0" . "༠")
105 ("1" . "༡")
106 ("2" . "༢")
107 ("3" . "༣")
108 ("4" . "༤")
109 ("5" . "༥")
110 ("6" . "༦")
111 ("7" . "༧")
112 ("8" . "༨")
113 ("9" . "༩")
114 ("-0" . "༳")
115 ("-1" . "༪")
116 ("-2" . "༫")
117 ("-3" . "༬")
118 ("-4" . "༭")
119 ("-5" . "༮")
120 ("-6" . "༯")
121 ("-7" . "༰")
122 ("-8" . "༱")
123 ("-9" . "༲")
124 ("|" . "ༀ༁༂༃༇༉༊༒༓༕༖༗༘༙༚༛༜༝༞༟༴༶༸༺༻༾༿྾྿࿀࿁࿂࿃࿄࿅࿆࿇࿈࿉࿊࿋࿌࿏")))
2cd1b939
KH
125
126(quail-define-package "tibetan-wylie" "Tibetan" "TIBw" t
127"Tibetan character input by Extended Wylie key assignment.
128
129 +-------------------------------------+
4b725a70
PE
130 |ཀ་ k |ཁ་ kh |ག་ g |གྷ་ gh |ང་ ng| ི i ། /
131 |ཅ་ c |ཆ་ ch |ཇ་ j | |ཉ་ ny| ུ u ༎ //
132 |ཊ་ T |ཋ་ TH |ཌ་ D |ཌྷ་ DH |ཎ་ N | ེ e ༎ ༎ ////
133 |ཏ་ t |ཐ་ th |ད་ d |དྷ་ dh |ན་ n | ོ o ༑ ;
134 |པ་ p |ཕ་ ph |བ་ b |བྷ་ bh |མ་ m | ཻ ai (ee, E) ༏ $
135 |ཙ་ ts|ཚ་ tsh|ཛ་ dz |ཛྷ་ dzh|ཝ་ w | ཽ au (oo, O) ༐ &
136 |ཞ་ zh|ཟ་ z |འ་ ' | |ཡ་ y | ྀ I ༄༅ *
137 |ར་ r |ལ་ l |ཤ་ sh |ཥ་ SH |ས་ s | ཿ : ༄༅༅ #
138 |ཧ་ h |ཨ་ A |ཀྵ་ kSH| | | ཾ M ༼ ༽ < >
139 +-------------------------------------+ ༔ %
140 (The consonant ཨ་ must be typed explicitly.)
2cd1b939
KH
141
142 NOT SPECIFIED IN EXT. WYLIE:
143 +--------------------------------------------------------+
4b725a70 144 |ྂ = ~ |ྃ = ` |྄ = , |྅ = @ |༷ = _o|༵ = _O|༆ = ^|
2cd1b939 145 +--------------------------------------------------------+
4b725a70 146 |ྈ = x |ྉ = X |྆ = v |྇ = V |ྊ = q |ྋ = Q |
2cd1b939
KH
147 +-----------------------------------------------+
148
149 SPECIAL KEYS
150 + : Consonant Stacking
e67e483f 151 (Consonant stacking for ordinary Tibetan is done automatically)
2cd1b939 152 - : No Consonant Stacking
e67e483f 153 (To suppress automatic stacking for \"g-y\",
2cd1b939
KH
154 and to get da-drag in -r-d, -l-d .)
155 | : Special signs.
156
e67e483f 157 Tsheg is assigned to SPC. Space is assigned to period '.'.
2cd1b939 158"
653b6bad
KH
159 nil nil nil nil nil nil nil nil
160 'quail-tibetan-update-translation)
161
22bcf204 162;; Here we build up a Quail map for a Tibetan sequence the whole of
653b6bad
KH
163;; which can be one composition.
164;;
165;; A Tibetan syllable is typically structured as follows:
166;; [P] C [c+] V [M] [S [s]]
167;; ^^^^^^^^^^^^
168;; where P:prefix, C:base consonant, c:subjoined consonant,
169;; V:vowel, M:vowel modifier, S:suffix, s:post suffix.
170;; In this pattern, the part indicated by "^^^" can be one composition.
171
cc7d79ad
KH
172;;; modified by Tomabechi 1999/12/10
173;;; modified by Tomabechi 2000/06/08
174;;; Allows infinite addition of vowels/modifiers
175;;; as specified in Unicode v.3
653b6bad
KH
176(quail-install-map
177 (quail-map-from-table
cc7d79ad
KH
178 '((base-state (tibetan-consonant-transcription-alist . svm-state)
179 (tibetan-precomposed-transcription-alist . svm-state)
180 (tibetan-wylie-non-stacking-alist . svm-state)
653b6bad
KH
181 tibetan-subjoined-transcription-alist
182 tibetan-vowel-transcription-alist
183 tibetan-modifier-transcription-alist
184 tibetan-wylie-punctuation-alist)
cc7d79ad
KH
185 (svm-state ;;(tibetan-wylie-quote-alist . vm-state)
186 (tibetan-vowel-transcription-alist . vm-state)
187 (tibetan-subjoined-transcription-alist . svm-state)
188 (tibetan-modifier-transcription-alist . m-state))
189 (vm-state (tibetan-vowel-transcription-alist . vm-state)
190 (tibetan-modifier-transcription-alist . m-state))
191 (m-state (tibetan-modifier-transcription-alist . m-state)))))
2cd1b939
KH
192
193;;;
653b6bad 194;;; TibKey key alignment based input method
2cd1b939
KH
195;;;
196
197(defconst tibetan-tibkey-to-transcription-alist
653b6bad 198 '(;; consonant
2cd1b939
KH
199 ("`" . "`") ; sna ldan
200 ("~" . "~") ; sna ldan + nada
201 ("q" . "k") ; ka
202 ("Q" ."kSH") ; kSHa
203 ("w" . "kh") ; kha
204 ("e" . "g") ; ga
205 ("r" . "ng") ; nga
206 ("t" . "c") ; ca
207 ("T" . "I") ; gi gu log
208 ("y" . "ch") ; cha
209 ("u" . "j") ; ja
210 ("i" . "ny") ; nya
211 ("o" . "t") ; ta
212 ("O" . "T") ; Ta
213 ("p" . "th") ; tha
214 ("P" . "TH") ; THa
177c0ea7 215 ("[" . "d") ; da
2cd1b939
KH
216 ("{" . "D") ; Da
217 ("]" . "n") ; na
218 ("}" . "N") ; Na
219 ("a" . "p") ; pa
220 ("A" . "a") ; Vowel a (not used in original TibKey)
221 ("s" . "ph") ; pha
222 ("d" . "b") ; ba
223 ("f" . "m") ; ma
224 ("F" . "M") ; anusvara
225 ("g" . "u") ; zhabs kyu
226 ("G" . "i") ; gi gu
22bcf204 227 ("H" . ",") ; virama
2cd1b939
KH
228 ("j" . "o") ; naro
229 ("J" . "e") ; 'greng bu
230 ("k" . "ts") ; tsa
231 ("l" . "tsh") ; tsha
232 (";" . "dz") ; dza
233 ("'" . "w") ; wa
234 ("\"" . "+w") ; wa zur
235 ("z" . "zh") ; zha
236 ("x" . "z") ; za
237 ("c" . "'") ; 'a
238 ("C" . "+'") ; 'a chung
239 ("v" . "y") ; ya
240 ("V" . "+y") ; ya btags
241 ("b" . "r") ; ra
242 ("B" . "+r") ; ra btags
243 ("n" . "l") ; la
244 ("N" . "+l") ; la btags
245 ("m" . "sh") ; sha
246 ("M" . "SH") ; SHa
247 ("," . "s") ; sa
248 ("." . "h") ; ha
249 ("/" . "A") ; Aa
653b6bad 250 ;; subjoined
2cd1b939
KH
251 ("hq" . "+k") ; ka
252 ("hQ" ."+kSH") ; kSHa
253 ("hw" . "+kh") ; kha
254 ("he" . "+g") ; ga
255 ("hr" . "+ng") ; nga
256 ("ht" . "+c") ; ca
257 ("hy" . "+ch") ; cha
258 ("hu" . "+j") ; ja
259 ("hi" . "+ny") ; nya
260 ("ho" . "+t") ; ta
261 ("hO" . "+T") ; Ta
262 ("hp" . "+th") ; tha
263 ("hP" . "+TH") ; THa
177c0ea7 264 ("h[" . "+d") ; da
2cd1b939
KH
265 ("h{" . "+D") ; Da
266 ("h]" . "+n") ; na
267 ("h}" . "+N") ; Na
177c0ea7 268 ("ha" . "+p") ; pa
2cd1b939
KH
269 ("hs" . "+ph") ; pha
270 ("hd" . "+b") ; ba
271 ("hf" . "+m") ; ma
272 ("hk" . "+ts") ; tsa
273 ("hl" . "+tsh") ; tsha
274 ("h;" . "+dz") ; dza
275 ("h'" . "+w") ; wa
276 ("hz" . "+zh") ; zha
277 ("hx" . "+z") ; za
278 ("hc" . "+'") ; 'a
279 ("hv" . "+y") ; ya
280 ("hb" . "+r") ; ra
281 ("hn" . "+l") ; la
282 ("hm" . "+sh") ; sha
283 ("hM" . "+SH") ; SHa
284 ("h," . "+s") ; sa
285 ("h." . "+h") ; ha
286 ("h/" . "+A") ; Aa
4b725a70 287 ;; Special rule for `ཡ' to avoid stacking.
653b6bad 288 ("E" . "-y")
2cd1b939
KH
289 ))
290
653b6bad
KH
291(defconst tibetan-consonant-tibkey-alist nil)
292(defconst tibetan-subjoined-tibkey-alist nil)
293(defconst tibetan-vowel-tibkey-alist nil)
294(defconst tibetan-modifier-tibkey-alist nil)
295(defconst tibetan-non-stacking-tibkey-alist nil)
296
297(let ((type-list '("consonant" "subjoined" "vowel" "modifier" "non-stacking"))
298 (tail tibetan-tibkey-to-transcription-alist)
299 elt)
300 (while tail
301 (setq elt (car tail) tail (cdr tail))
302 (let ((types type-list)
303 type transcription trans-alist tibkey-alist)
304 (while types
305 (setq type (car types) types (cdr types))
306 (setq trans-alist
307 (if (string= type "non-stacking")
308 'tibetan-wylie-non-stacking-alist
309 (intern (format "tibetan-%s-transcription-alist" type)))
310 transcription
311 (cdr (assoc (cdr elt) (symbol-value trans-alist))))
312 (when transcription
313 (setq tibkey-alist (intern (format "tibetan-%s-tibkey-alist" type)))
314 (set tibkey-alist
315 (cons (cons (car elt) transcription)
316 (symbol-value tibkey-alist)))))
317 (or tibkey-alist
318 (error "No Tibetan transcription for %s" (cdr elt))))))
319
320(defconst tibetan-punctuation-tibkey-alist
4b725a70
PE
321 '(("1" . "༡")
322 ("!" . "༄") ; nyi zla long
323 ("2" . "༢")
324 ("@" . "༅") ; nyi zla simple
325 ("3" . "༣")
653b6bad 326;;; ("#" )
4b725a70 327 ("4" . "༤")
653b6bad 328;;; ("$" )
4b725a70
PE
329 ("5" . "༥")
330 ("%" . "༔")
331 ("6" . "༦")
332 ("^" . "༁")
333 ("7" . "༧")
334 ("8" . "༨")
653b6bad 335;;; ("*" ) ; avagraha, not supported yet
4b725a70
PE
336 ("9" . "༩")
337 ("(" . "༼")
338 ("0" . "༠")
339 (")" . "༽")
4c36be58 340;;; ("-" ) ; emphatic, not yet supported
653b6bad
KH
341;;; ("_" ) ; id.
342;;; ("=" ) ; special sign, not yet supported
4b725a70
PE
343 ("+" . "༑")
344 ("\\" . "༏")
345 ("|" . "༈")
346 ("I" . "྅") ; avagraha
347 (":" . "ཿ")
348;;; (">" ?་) ; to be assigned to SPC
653b6bad 349 (">" . " ")
4b725a70
PE
350 ("?" . "།")
351 ("??" . "༎")
352 ("????" . ["༎ ༎"])
353 (" " . "་")
653b6bad 354 ))
2cd1b939 355
653b6bad
KH
356;; Convert TibKey string to Tibetan-Roman transcription string.
357;; If there's no proper conversion, return nil.
358(defun quail-tibkey-to-transcription (tibkey)
359 (let ((len (length tibkey))
360 (i 0)
361 (trans-list nil))
362 (while (< i len)
363 (let ((last len)
364 trans)
365 (while (and (not trans) (> last i))
366 (or (setq trans (cdr (assoc (substring tibkey i last)
367 tibetan-tibkey-to-transcription-alist)))
368 (setq last (1- last))))
369 (if trans
370 (setq trans-list (cons trans trans-list)
371 i last)
372 (setq trans-list nil i len))))
373 (apply 'concat (nreverse trans-list))))
374
375(defvar quail-tibkey-characters nil)
376
377(defun quail-tibkey-update-translation (control-flag)
378 (if (integerp control-flag)
379 ;; Non-composable-character typed.
380 (setq quail-current-str
381 (buffer-substring (overlay-start quail-overlay)
382 (overlay-end quail-overlay))
383 unread-command-events
384 (string-to-list
385 (substring quail-current-key control-flag)))
386 (let ((transcription (quail-tibkey-to-transcription quail-current-key)))
387 (if (> (length transcription) 0)
388 (let ((quail-current-key transcription))
389 (setq control-flag
390 (quail-tibetan-update-translation control-flag)))
391 (or quail-current-str
392 (setq quail-current-str quail-current-key)))))
393 control-flag)
2cd1b939
KH
394
395(quail-define-package "tibetan-tibkey" "Tibetan" "TIBt" t
396"Tibetan character input by TibKey key assignment.
397
653b6bad 398\(This implementation is still incomplete.
2cd1b939
KH
399 Therefore, the following key assignment is a provisional one.)
400
401 [NOT SHIFTED]
402
403 +-------------------------------------------------------+
4b725a70 404 |`ྃ|1༡|2༢|3༣|4༤|5༥|6༦|7༧|8༨|9༩|0༠|- |= |\\༈|
2cd1b939 405 +-------------------------------------------------------+
4b725a70 406 |qཀ|wཁ|eག|rང|tཅ|yཆ|uཇ|iཉ|oཏ|pཐ|[ད|]ན|
2cd1b939 407 +-----------------------------------------------+
4b725a70 408 |aཔ| sཕ| dབ|fམ|gུ|h |jོ|kཙ|lཚ|;ཛ|'ཝ|
2cd1b939 409 +---------------------------------------------+
4b725a70 410 |zཞ|xཟ|cའ|vཡ|bར|nལ|mཤ|,ས|.ཧ|/ཨ|
2cd1b939
KH
411 +---------------------------------------+
412 The key 'h' is used for consonant stacking.
413
414 [SHIFTED]
415
416 +----------------------------------------------------------+
4b725a70 417 |~ྂ|!༄|@༅|# |$ |%༔ |^༁|& |* |(༼|)༽|_ |+༑| |༈|
2cd1b939 418 +----------------------------------------------------------+
4b725a70 419 |Qཀྵ|W |E |R |Tྀ|Y |U |I྅|Oཊ|Pཋ|{ཌ|}ཎ|
2cd1b939 420 +-----------------------------------------------+
4b725a70 421 |A |S |D |Fཾ|Gི|H྄|Jེ|K |L |:ཿ|\"ྭ|
2cd1b939 422 +-------------------------------------------+
4b725a70 423 |Z |X |Cཱ|Vྱ|Bྲ|Nླ|Mཥ|< |> |?། |
177c0ea7 424 +---------------------------------------+
2cd1b939
KH
425
426 DIFFERENCE FROM THE ORIGINAL TIBKEY:
427
428 1. Vowel 'a' should be typed explicitly by the key 'A'.
e67e483f 429 This is really inconvenient. But to make the coding
c7015153 430 scheme clear, it is desirable to have an explicit
2cd1b939 431 vowel sign for 'a'.
e67e483f 432 2. Tsheg is assigned to SPC key. You can input a space
2cd1b939 433 by typing '>'.
4b725a70
PE
434 4. To avoid the default stacking and to obtain གཡ,
435 type 'E' instead of 'v' (=ཡ).
2cd1b939 436 3. There are many characters that are not supported in the
e67e483f
JB
437 current implementation (especially special signs).
438 I hope I'll complete in a future revision.
2cd1b939 439"
653b6bad
KH
440 nil nil nil nil nil nil nil nil
441 'quail-tibkey-update-translation)
442
443(quail-install-map
444 (quail-map-from-table
445 '((base-state (tibetan-consonant-tibkey-alist . s-state)
446 (tibetan-non-stacking-tibkey-alist . s-state)
447 tibetan-subjoined-tibkey-alist
448 tibetan-vowel-tibkey-alist
449 tibetan-modifier-tibkey-alist
450 tibetan-punctuation-tibkey-alist)
451 (s-state (tibetan-subjoined-tibkey-alist . s-state)
452 (tibetan-vowel-tibkey-alist . m-state))
453 (m-state tibetan-modifier-tibkey-alist))))
be567141
PJ
454
455;;; tibetan.el ends here