]> code.delx.au - gnu-emacs/blobdiff - leim/quail/lao.el
(archive-l-e): New optional argument `float' means generate a float value.
[gnu-emacs] / leim / quail / lao.el
index b270b278bd78a970cb628bf40119790e2a42fb89..09151735de0fd44c00f3696e1fdabbb02bfa4b1d 100644 (file)
@@ -1,7 +1,8 @@
-;;; 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