| 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, 2008, 2009, 2010, 2011 |
| 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 3 of the License, or |
| 15 | ;; (at your option) 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. If not, see <http://www.gnu.org/licenses/>. |
| 24 | |
| 25 | ;;; Commentary: |
| 26 | |
| 27 | ;;; Code: |
| 28 | |
| 29 | (require 'quail) |
| 30 | (require 'lao-util) |
| 31 | |
| 32 | (defun quail-lao-update-translation (control-flag) |
| 33 | (if (integerp control-flag) |
| 34 | ;; Non-composable character typed. |
| 35 | (setq quail-current-str |
| 36 | (buffer-substring (overlay-start quail-overlay) |
| 37 | (overlay-end quail-overlay)) |
| 38 | unread-command-events |
| 39 | (string-to-list |
| 40 | (substring quail-current-key control-flag))) |
| 41 | (setq quail-current-str |
| 42 | (compose-string (quail-lookup-map-and-concat quail-current-key)))) |
| 43 | control-flag) |
| 44 | |
| 45 | (defvar lao-key-alist |
| 46 | '(("!" . "1") |
| 47 | ("\"" . "=") |
| 48 | ("#" . "3") |
| 49 | ("$" . "4") |
| 50 | ("&" . "5") |
| 51 | ("%" . "\e(1l\e(B") |
| 52 | ("'" . "\e(1'\e(B") |
| 53 | ("(" . "7") |
| 54 | (")" . "8") |
| 55 | ("*" . "6") |
| 56 | ("+" . ["\e(1mh\e(B"]) |
| 57 | ("," . "\e(1A\e(B") |
| 58 | ("-" . "\e(1*\e(B") |
| 59 | ("." . "\e(1c\e(B") |
| 60 | ("/" . "\e(1=\e(B") |
| 61 | ("0" . "\e(1"\e(B") |
| 62 | ("1" . "\e(1B\e(B") |
| 63 | ("2" . "\e(1?\e(B") |
| 64 | ("3" . "\e(1b\e(B") |
| 65 | ("4" . "\e(16\e(B") |
| 66 | ("5" . "\e(1X\e(B") |
| 67 | ("6" . "\e(1Y\e(B") |
| 68 | ("7" . "\e(1$\e(B") |
| 69 | ("8" . "\e(15\e(B") |
| 70 | ("9" . "\e(1(\e(B") |
| 71 | (":" . "%") |
| 72 | (";" . "\e(1G\e(B") |
| 73 | ("<" . "\e(1}\e(B") |
| 74 | ("=" . "\e(1m\e(B") |
| 75 | (">" . "$") |
| 76 | ("?" . ")") |
| 77 | ("@" . "2") |
| 78 | ("A" . ["\e(1Qi\e(B"]) |
| 79 | ("B" . ["\e(1Vi\e(B"]) |
| 80 | ("C" . "\e(1O\e(B") |
| 81 | ("D" . ".") |
| 82 | ("E" . ["\e(1Si\e(B"]) |
| 83 | ("F" . ",") |
| 84 | ("G" . ":") |
| 85 | ("H" . "\e(1j\e(B") |
| 86 | ("I" . "\e(1N\e(B") |
| 87 | ("J" . "\e(1k\e(B") |
| 88 | ("K" . "!") |
| 89 | ("L" . "?") |
| 90 | ("M" . "\e(1f\e(B") |
| 91 | ("N" . ["\e(1Wi\e(B"]) |
| 92 | ("O" . "\e(1|\e(B") |
| 93 | ("P" . "\e(1]\e(B") |
| 94 | ("Q" . ["\e(1[i\e(B"]) |
| 95 | ("R" . "_") |
| 96 | ("S" . ";") |
| 97 | ("T" . "+") |
| 98 | ("U" . ["\e(1Ui\e(B"]) |
| 99 | ("V" . "x") |
| 100 | ("W" . "0") |
| 101 | ("X" . "(") |
| 102 | ("Y" . ["\e(1Ti\e(B"]) |
| 103 | ("Z" . "\"") |
| 104 | ("[" . "\e(1:\e(B") |
| 105 | ("]" . "\e(1E\e(B") |
| 106 | ("^" . "\e(1\\e(B") |
| 107 | ("_" . "9") |
| 108 | ("`" . "\e(1'\e(B") |
| 109 | ("a" . "\e(1Q\e(B") |
| 110 | ("b" . "\e(1V\e(B") |
| 111 | ("c" . "\e(1a\e(B") |
| 112 | ("d" . "\e(1!\e(B") |
| 113 | ("e" . "\e(1S\e(B") |
| 114 | ("f" . "\e(14\e(B") |
| 115 | ("g" . "\e(1`\e(B") |
| 116 | ("h" . "\e(1i\e(B") |
| 117 | ("i" . "\e(1C\e(B") |
| 118 | ("j" . "\e(1h\e(B") |
| 119 | ("k" . "\e(1R\e(B") |
| 120 | ("l" . "\e(1J\e(B") |
| 121 | ("m" . "\e(17\e(B") |
| 122 | ("n" . "\e(1W\e(B") |
| 123 | ("o" . "\e(19\e(B") |
| 124 | ("p" . "\e(1-\e(B") |
| 125 | ("q" . "\e(1[\e(B") |
| 126 | ("r" . "\e(1>\e(B") |
| 127 | ("s" . "\e(1K\e(B") |
| 128 | ("t" . "\e(1P\e(B") |
| 129 | ("u" . "\e(1U\e(B") |
| 130 | ("v" . "\e(1M\e(B") |
| 131 | ("w" . "\e(1d\e(B") |
| 132 | ("x" . "\e(1;\e(B") |
| 133 | ("y" . "\e(1T\e(B") |
| 134 | ("z" . "\e(1<\e(B") |
| 135 | ("{" . "-") |
| 136 | ("|" . ["\e(1K\\e(B"]) |
| 137 | ("}" . "/") |
| 138 | ("~" . "\e(1l\e(B") |
| 139 | ("\\0" . "\e(1p\e(B") |
| 140 | ("\\1" . "\e(1q\e(B") |
| 141 | ("\\2" . "\e(1r\e(B") |
| 142 | ("\\3" . "\e(1s\e(B") |
| 143 | ("\\4" . "\e(1t\e(B") |
| 144 | ("\\5" . "\e(1u\e(B") |
| 145 | ("\\6" . "\e(1v\e(B") |
| 146 | ("\\7" . "\e(1w\e(B") |
| 147 | ("\\8" . "\e(1x\e(B") |
| 148 | ("\\9" . "\e(1y\e(B") |
| 149 | ) |
| 150 | "Alist of key sequences vs the corresponding Lao string to input. |
| 151 | This variable is for the input method \"lao\". |
| 152 | If you change the value of this variable while quail/lao is already loaded, |
| 153 | you need to re-load it to properly re-initialize related alists.") |
| 154 | |
| 155 | ;; Temporary variable to initialize lao-consonant-key-alist, etc. |
| 156 | (defconst lao-key-alist-vector |
| 157 | (let ((tail lao-key-alist) |
| 158 | consonant-key-alist semivowel-key-alist vowel-key-alist |
| 159 | voweltone-key-alist tone-key-alist other-key-alist |
| 160 | elt phonetic-type) |
| 161 | (while tail |
| 162 | (setq elt (car tail) tail (cdr tail)) |
| 163 | (if (stringp (cdr elt)) |
| 164 | (setq phonetic-type (get-char-code-property (aref (cdr elt) 0) |
| 165 | 'phonetic-type)) |
| 166 | (setq phonetic-type (get-char-code-property (aref (aref (cdr elt) 0) 0) |
| 167 | 'phonetic-type)) |
| 168 | (aset (cdr elt) 0 (compose-string (aref (cdr elt) 0)))) |
| 169 | (cond ((eq phonetic-type 'consonant) |
| 170 | (setq consonant-key-alist (cons elt consonant-key-alist))) |
| 171 | ((memq phonetic-type '(vowel-upper vowel-lower)) |
| 172 | (if (stringp (cdr elt)) |
| 173 | (setq vowel-key-alist (cons elt vowel-key-alist)) |
| 174 | (setq voweltone-key-alist (cons elt voweltone-key-alist)))) |
| 175 | ((eq phonetic-type 'tone) |
| 176 | (setq tone-key-alist (cons elt tone-key-alist))) |
| 177 | ((eq phonetic-type 'semivowel-lower) |
| 178 | (setq semivowel-key-alist (cons elt semivowel-key-alist))) |
| 179 | (t |
| 180 | (setq other-key-alist (cons elt other-key-alist))))) |
| 181 | (vector consonant-key-alist semivowel-key-alist vowel-key-alist |
| 182 | voweltone-key-alist tone-key-alist other-key-alist))) |
| 183 | |
| 184 | (defconst lao-consonant-key-alist (aref lao-key-alist-vector 0)) |
| 185 | (defconst lao-semivowel-key-alist (aref lao-key-alist-vector 1)) |
| 186 | (defconst lao-vowel-key-alist (aref lao-key-alist-vector 2)) |
| 187 | (defconst lao-voweltone-key-alist (aref lao-key-alist-vector 3)) |
| 188 | (defconst lao-tone-key-alist (aref lao-key-alist-vector 4)) |
| 189 | (defconst lao-other-key-alist (aref lao-key-alist-vector 5)) |
| 190 | |
| 191 | ;; Done with it. |
| 192 | (makunbound 'lao-key-alist-vector) |
| 193 | |
| 194 | (quail-define-package |
| 195 | "lao" "Lao" "\e(1E\e(B" t |
| 196 | "Lao input method simulating Lao keyboard layout based on Thai TIS620" |
| 197 | nil t t t t nil nil nil 'quail-lao-update-translation nil t) |
| 198 | |
| 199 | (quail-install-map |
| 200 | (quail-map-from-table |
| 201 | '((base-state (lao-consonant-key-alist . svt-state) |
| 202 | lao-vowel-key-alist |
| 203 | lao-voweltone-key-alist |
| 204 | lao-tone-key-alist |
| 205 | lao-other-key-alist) |
| 206 | (svt-state (lao-semivowel-key-alist . v-state) |
| 207 | (lao-vowel-key-alist . t-state) |
| 208 | lao-voweltone-key-alist |
| 209 | lao-tone-key-alist) |
| 210 | (v-state (lao-vowel-key-alist . t-state)) |
| 211 | (t-state lao-tone-key-alist)))) |
| 212 | |
| 213 | ;;; lao.el ends here |