Update copyright year.
[m17n/m17n-db.git] / MIM / vi-telex.mim
index edbe435..98307f3 100644 (file)
@@ -1,5 +1,5 @@
 ;; vi-telex.mim -- Input method for Vietnames with TELEX key sequence
-;; Copyright (C) 2003, 2004, 2005, 2006, 2007
+;; Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
 ;;   National Institute of Advanced Industrial Science and Technology (AIST)
 ;;   Registration Number H15PRO112
 
@@ -29,7 +29,7 @@ The following variables are customizable:
   tone-mark-on-last: control tone mark position in equivocal cases
   backspace-is-undo: control the action of Backspace key (delete or undo)"))
 
-(title "Ắ")
+(title "Ắ(TLX)")
 
 (variable
  (tone-mark-on-last
@@ -47,59 +47,29 @@ If the value is 1, Backspace key undoes the previous key
 \(e.g. \"q u a i s BS\" => \"quai\").")
   0 0 1))
 
-(macro
- (handle-mark
-  (delete @-)
-  ;; At first, cancel the tone mark if already put.
-  (move T) (select 0)
-  (move M)
-  (cond (V-3
-        ;; Tripple-vowel
-        ;; Put a tone mark on the last vowel if it is ê, or ơ.
-        ;; Otherwise put a tone mark on the second vowel.
-        (cond ((| (= V-1 ?ê) (= V-1 ?ơ) (= V-1 ?Ê) (= V-1 ?Ơ)))
-              (1 (move @-))))
-       (V-2
-        ;; Double-vowel
-        ;; Put a tone mark on the last vowel in the following cases:
-        ;;  * The last vowel is  â, ă, ê, ô, ơ, ư, or ư (i.e. non-ASCII).
-        ;;  * The initial consonant and the first vowel is "gi" or "qu".
-        ;;  * tone-mark-on-last is customized to 1 in such equivocal
-        ;;    cases as "oa", "oe", "oo", and "uy".
-        ;; Otherwise put a tone mark on the first vowel.
-        (cond ((| (> V-1 127)
-                  (& (| (= C ?g) (= C ?G)) (| (= V-2 ?i) (= V-2 ?I)))
-                  (& (| (= C ?q) (= C ?Q)) (| (= V-2 ?u) (= V-2 ?U)))
-                  (& (| tone-mark-on-last (> C-AFTER-V))
-                     (| (& (| (= V-2 ?o) (= V-2 ?O))
-                           (| (= V-1 ?a) (= V-1 ?A) (= V-1 ?e) (= V-1 ?E)
-                              (= V-1 ?o) (= V-1 ?O)))
-                        (& (| (= V-2 ?u) (= V-2 ?U))
-                           (| (= V-1 ?y) (= V-1 ?Y)))))))
-              (1 (move @-)))))
-  (select SELECT)
-  (mark T)
-  (move @>)))
+(include (t nil vi-base) macro)
+(include (t nil vi-base) map)
 
 (map
- (vowel  ; sfrxj
-  ("a"  ("aáàảãạ")) ("A"  ("AÁÀẢÃẠ"))
-  ("e"  ("eéèẻẽẹ")) ("E"  ("EÉÈẺẼẸ"))
-  ("i"  ("iíìỉĩị")) ("I"  ("IÍÌỈĨỊ"))
-  ("o"  ("oóòỏõọ")) ("O"  ("OÓÒỎÕỌ"))
-  ("u"  ("uúùủũụ")) ("U"  ("UÚÙỦŨỤ"))
-  ("y"  ("yýỳỷỹỵ")) ("Y"  ("YÝỲỶỸỴ"))
+ (vowel-ext
   ("aa" ("âấầẩẫậ")) ("AA" ("ÂẤẦẨẪẬ")) ("Aa" ("ÂẤẦẨẪẬ"))
   ("aw" ("ăắằẳẵặ")) ("AW" ("ĂẮẰẲẴẶ")) ("Aw" ("ĂẮẰẲẴẶ"))
   ("ee" ("êếềểễệ")) ("EE" ("ÊẾỀỂỄỆ")) ("Ee" ("ÊẾỀỂỄỆ"))
   ("oo" ("ôốồổỗộ")) ("OO" ("ÔỐỒỔỖỘ")) ("Oo" ("ÔỐỒỔỖỘ"))
   ("ow" ("ơớờởỡợ")) ("OW" ("ƠỚỜỞỠỢ")) ("Ow" ("ƠỚỜỞỠỢ"))
   ("uw" ("ưứừửữự")) ("UW" ("ƯỨỪỬỮỰ")) ("Uw" ("ƯỨỪỬỮỰ"))
-  ("w"  ("ưứừửữự")) ("W"  ("ƯỨỪỬỮỰ"))
+  ("w"  (cond ((= V-1 0) ("ưứừửữự")) (1 "w"))) ; Works when it's the
+  ("W"  (cond ((= V-1 0) ("ƯỨỪỬỮỰ")) (1 "W"))) ; first vowel (not seư)
   ("ooo" ("oóòỏõọ") ("oóòỏõọ") (set V-2 V-1) (set V-1 ?o))
   ("OOO" ("OÓÒỎÕỌ") ("OÓÒỎÕỌ") (set V-2 V-1) (set V-1 ?O))
   ("Ooo" ("OÓÒỎÕỌ") ("oóòỏõọ") (set V-2 V-1) (set V-1 ?O)))
 
+ (consonant-ext
+  ("dd" ?đ) ("DD" ?Đ) ("Dd" ?Đ))
+  ;("dd" (cond ((= C-AFTER-V 0) "dd") (1 ?đ))) ; Works when
+  ;("DD" (cond ((= C-AFTER-V 0) "DD") (1 ?Đ))) ; it is the first
+  ;("Dd" (cond ((= C-AFTER-V 0) "Dd") (1 ?Đ)))) ; letter (not ađ)
+
  (tone-mark
   ("z" (set SELECT 0) ?z) ("Z" (set SELECT 0) ?Z)
   ("s" (set SELECT 1) ?s) ("S" (set SELECT 1) ?S)
@@ -112,74 +82,81 @@ If the value is 1, Backspace key undoes the previous key
   ("z" ?z) ("s" ?s) ("f" ?f) ("r" ?r) ("x" ?x) ("j" ?j)
   ("Z" ?Z) ("S" ?S) ("F" ?F) ("R" ?R) ("X" ?X) ("J" ?J))
 
- (consonant
-  ("b" ?b) ("c" ?c) ("d" ?d) ("g" ?g) ("h" ?h) ("k" ?k) ("l" ?l) ("m" ?m)
-  ("n" ?n) ("p" ?p) ("q" ?q) ("t" ?t) ("v" ?v)
-  ("dd" ?đ)
-  ("B" ?B) ("C" ?C) ("D" ?D) ("G" ?G) ("H" ?H) ("K" ?K) ("L" ?L) ("M" ?M)
-  ("N" ?N) ("P" ?P) ("Q" ?Q) ("T" ?T) ("V" ?V)
-  ("DD" ?Đ) ("Dd" ?Đ))
-
  (temporary-escape
   ("aaa" "aa") ("AAA" "AA") ("Aaa" "Aa")
   ("eee" "ee") ("EEE" "EE") ("Eee" "Ee")
   ("ddd" "dd") ("DDD" "DD") ("Ddd" "Dd")
+  ("aww" "aw") ("AWW" "AW") ("Aww" "Aw")
+  ("uww" "uw") ("UWW" "UW") ("Uww" "Uw")
+  ("oww" "ow") ("OWW" "OW") ("Oww" "Ow")
   ("ww" ?w) ("WW" ?W) ("Ww" ?W)
   ("zz" ?z) ("ZZ" ?Z) ("Zz" ?Z)
   ("ss" ?s) ("SS" ?S) ("Ss" ?S)
   ("ff" ?f) ("FF" ?F) ("Ff" ?F)
   ("rr" ?r) ("RR" ?R) ("Rr" ?R)
   ("xx" ?x) ("XX" ?X) ("Xx" ?X)
-  ("jj" ?j) ("JJ" ?J) ("Jj" ?J))
-
- (alphabet
-  ("a" ?a) ("b" ?b) ("c" ?c) ("d" ?d) ("e" ?e) ("f" ?f) ("g" ?g) 
-  ("h" ?h) ("i" ?i) ("j" ?j) ("k" ?k) ("l" ?l) ("m" ?m) ("n" ?n)
-  ("o" ?o) ("p" ?p) ("q" ?q) ("r" ?r) ("s" ?s) ("t" ?t) ("u" ?u)
-  ("v" ?v) ("w" ?w) ("x" ?x) ("y" ?y) ("z" ?z)
-  ("A" ?A) ("B" ?B) ("C" ?C) ("D" ?D) ("E" ?E) ("F" ?F) ("G" ?G) 
-  ("H" ?H) ("I" ?I) ("J" ?J) ("K" ?K) ("L" ?L) ("M" ?M) ("N" ?N)
-  ("O" ?O) ("P" ?P) ("Q" ?Q) ("R" ?R) ("S" ?S) ("T" ?T) ("U" ?U)
-  ("V" ?V) ("W" ?W) ("X" ?X) ("Y" ?Y) ("Z" ?Z))
-
- (permanent-escape
-  ("\\"))
-
- (backspace
-  ((BackSpace) (cond (backspace-is-undo (undo))))))
+  ("jj" ?j) ("JJ" ?J) ("Jj" ?J)))
 
 (state
  (init
   ;; Initialize variables.  C is the initial consonant.  V-N is the
   ;; (N-1)th vowel from the last.  C-AFTER-V is a number of consonants
-  ;; typed after vowel.
-  (t (set C @-1) (set V-1 0) (set V-2 0) (set V-3 0) (set C-AFTER-V 0))
+  ;; typed after vowel.  NST is 1 iff surrounding text is not supported.
+  (t (set C @-1) (set V-1 0) (set V-2 0) (set V-3 0) (set C-AFTER-V 0)
+     (set SELECT 0) (set NST (= @-0 -2)))
 
-  (consonant (set C @-1))
-  (consonant-or-tone-mark (set C @-1))
+  (consonant (set C @-1) (cond (NST (shift after-c))))
+  (consonant-ext (set C @-1) (cond (NST (shift after-c))))
+  (consonant-or-tone-mark
+   (cond ((| (= @-1 ?f) (= @-1 ?j) (= @-1 ?z) ; Invalid beginning consonants
+             (= @-1 ?F) (= @-1 ?J) (= @-1 ?Z)) (shift temporary-escape))
+         (1 (set C @-1) (cond (NST (shift after-c))))))
 
   ;; Mark M remembers the preedit position after the last vowel.
   (vowel (mark M) (set V-2 V-1) (set V-1 @-1) (shift after-v))
+  (vowel-ext (mark M) (set V-2 V-1) (set V-1 @-1) (shift after-v))
   (temporary-escape (shift temporary-escape))
-  (permanent-escape (shift escape-in-normal-mode)))
+  (permanent-escape (shift escape-in-normal-mode))
+  (smart-quotes))
+
+ ;; The state shifted to when an initial consonants is typed and
+ ;; surrounding text is not supported.
+ (after-c
+  (vowel (mark M) (set V-2 V-1) (set V-1 @-1) (shift after-v))
+  (vowel-ext (mark M) (set V-2 V-1) (set V-1 @-1) (shift after-v)))
 
  ;; The state shifted to when a vowel is typed.
  (after-v
-  (consonant (shift after-vc))
-  (vowel (mark M) (set V-3 V-2) (set V-2 V-1) (set V-1 @-1))
+  (ending-1st-consonant (handle-mark) (shift after-vc)) ; toans/toasn->toán
+  (vowel (mark M) (set V-3 V-2) (set V-2 V-1) (set V-1 @-1)
+        (move T) (select 0) (handle-mark) (move M))
+  (vowel-ext (mark M) (set V-3 V-2) (set V-2 V-1) (set V-1 @-1)
+            (move T) (select 0) (handle-mark) (move M))
+  (ending-1st-notviet-consonant (shift temporary-escape)) ;; See ending-1st-notviet-consonant section in the vi-base.mim 
   (consonant-or-tone-mark (delete @-) (pushback 1) (shift after-t))
   (backspace (delete @-)
-            (cond (V-3 (set V-1 V-2) (set V-2 V-3) (set V-3 0))
-                  (V-2 (set V-1 V-2) (set V-2 0))
+            (cond (V-3 (set V-1 V-2) (set V-2 V-3) (set V-3 0)
+                       (cond ((> TPLACE 2) (set SELECT 0)))
+                       (handle-mark))
+                  (V-2 (set V-1 V-2) (set V-2 0)
+                       (cond ((> TPLACE 1) (set SELECT 0)))
+                       (handle-mark))
                   (1 (shift init)))))
 
  ;; The state shifted to when a consonant is typed after a vowel.
  (after-vc
   (t (set C-AFTER-V 1))
-  (consonant (add C-AFTER-V 1))
+  (ending-2nd-consonant
+   (cond ((| (= @-2 ?n) (= @-2 ?c) ; 1st ending consonant must be n/c
+             (= @-2 ?N) (= @-2 ?C)) (add C-AFTER-V 1))
+         (1 (shift temporary-escape))))
+  (ending-1st-notviet-consonant (shift temporary-escape)) ;; Expand notviet-consonant section in the vi-base.mim 
   (consonant-or-tone-mark (delete @-) (pushback 1) (shift after-t))
+  (vowel (shift temporary-escape))      ; There can only be one
+  (vowel-ext (shift temporary-escape))  ; main vowel in a word
   (backspace (delete @-)
             (sub C-AFTER-V 1)
+            (handle-mark)
             (cond ((= C-AFTER-V 0) (shift after-v)))))
 
  ;; The state shifted to when a tone-mark is typed.
@@ -187,14 +164,14 @@ If the value is 1, Backspace key undoes the previous key
   (t (set CURRENT-SELECT -1))
   (tone-mark (cond ((= CURRENT-SELECT SELECT) (move T) (select 0) (move @>)
                    (shift temporary-escape))
-                  (1 (handle-mark) (set CURRENT-SELECT SELECT))))
+                  (1 (delete @-) (handle-mark) (set CURRENT-SELECT SELECT))))
   (nil (cond (C-AFTER-V (shift after-vc))
             (1 (shift after-v)))))
 
  (temporary-escape
   "en"
   (t (commit))
-  (alphabet (commit)))
+  (alnum (commit)))
 
  (escape-in-normal-mode
   "EN"