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