;; tai-sonla.mim -- Tai Viet input method with Phonetic sequence
;; Copyright (C) 2007
;;   Thua Thien Hue Center of Information Technology (HueCIT, Vietnam)
;; Copyright (C) 2007
;;   National Institute of Advanced Industrial Science and Technology (AIST)
;;   Registration Number H15PRO112

;; This file is part of the m17n contrib; a sub-part of the m17n
;; library.

;; The m17n library is free software; you can redistribute it and/or
;; modify it under the terms of the GNU Lesser General Public License
;; as published by the Free Software Foundation; either version 2.1 of
;; the License, or (at your option) any later version.

;; The m17n library is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;; Lesser General Public License for more details.

;; You should have received a copy of the GNU Lesser General Public
;; License along with the m17n library; if not, write to the Free
;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.

(input-method tai sonla-kbd)

(title "꫞")

(description (_"Tai Viet input method using the phonetic key sequence with the Tai Son La keyboard layout.
The phonetic key sequence means that you type a syllable in this order:
  C W? V v? F? T?
where
  C is an initial consonant,
  W is a label for labializing C ('ꪫ'),
  V is a vowel (V1:prefix, V2:combining, or V3:postfix),
  v is the second vowel of a digraph vowel
        (in the case that V is 'ꪹ' and v is 'ꪸ', 'ꪷ', or 'ꪱ'),
  F is a final consonant,
  T is a tonemark (spacing or combining).

You can type special symbols by these keys:
  '$' -> 'ꫛ'
  '#' -> 'ꫜ'
  '%' -> 'ꫝ'
  '!' -> '꫞'
  '@' -> '꫟'
"))

(macro
 (adjust-tone
  (set TT @-1)
  (delete @-)
  (cond ((| (= T ?ꫀ) (= T ?ꫂ)) (delete @-) (move @>))
	((> T 0) (move M) (delete @+) (move @>)))
  (set T TT)
  (cond ((| (= T ?ꫀ) (= T ?ꫂ)) (insert T))
	((> T 0) (move M) (insert T) (move @>)))))

(map
 (consonant
  ("k" "ꪀ")
  ("K" "ꪁ")
  ("x" "ꪂ")
  ("X" "ꪃ")
  ("q" "ꪄ")
  ("Q" "ꪅ")
  ("|" "ꪆ")
  ("\"" "ꪇ")
  ("g" "ꪈ")
  ("G" "ꪉ")
  ("c" "ꪊ")
  ("C" "ꪋ")
  ("." "ꪌ")
  (">" "ꪍ")
  ("s" "ꪎ")
  ("S" "ꪏ")
  ("z" "ꪐ")
  ("Z" "ꪑ")
  ("d" "ꪒ")
  ("D" "ꪓ")
  ("t" "ꪔ")
  ("T" "ꪕ")
  ("w" "ꪖ")
  ("W" "ꪗ")
  ("n" "ꪘ")
  ("N" "ꪙ")
  ("b" "ꪚ")
  ("B" "ꪛ")
  ("p" "ꪜ")
  ("P" "ꪝ")
  ("/" "ꪞ")
  ("?" "ꪟ")
  ("f" "ꪠ")
  ("F" "ꪡ")
  ("m" "ꪢ")
  ("M" "ꪣ")
  ("j" "ꪤ")
  ("J" "ꪥ")
  ("r" "ꪦ")
  ("R" "ꪧ")
  ("l" "ꪨ")
  ("L" "ꪩ")
  ("v" "ꪪ")
  ("V" "ꪫ")
  ("h" "ꪬ")
  ("H" "ꪭ")
  ("o" "ꪮ")
  ("O" "ꪯ"))

 (final-c
  ("b" "ꪚ")
  ("d" "ꪒ")
  ("k" "ꪀ")
  ("J" "ꪥ")
  ("M" "ꪣ")
  ("N" "ꪙ")
  ("G" "ꪉ")
  ("V" "ꪫ"))  

 (high-v
  ("V" "ꪫ"))  

 (special
  ("$" "ꫛ")
  ("#" "ꫜ")
  ("%" "ꫝ")
  ("!" "꫞")
  ("@" "꫟"))

 (vowel-pre
  ("e" "ꪵ")
  ("," "ꪶ")
  ("E" "ꪹ")
  ("Y" "ꪻ")
  ("y" "ꪼ")
  ("o^" "ꪶ"))

 (vowel-combining
  ("}" "ꪰ")
  ("i" "ꪲ")
  ("U" "ꪳ")
  ("u" "ꪴ")
  ("[" "ꪷ")
  ("I" "ꪸ")
  ("{" "ꪾ")
  ("awm" "ꪾ"))

 (vowel-post
  ("a" "ꪱ")
  ;; ("A" "ꪱꪲ")
  ("<" "ꪺ")
  ("]" "ꪽ")
  ;; Note: "ꪮ" and "ꪯ" can be consonant and vowel. 
  ("o" "ꪮ")
  ("O" "ꪯ"))

 (vowel-digraph
  ("r" "ꪸ")
  ("R" "ꪷ")
  ("A" "ꪱ"))

 (tone
  (":" "ꫀ")
  (";" "ꫂ")
  ("\"" "꪿")
  ("'" "꫁"))

 (punctuation
  ("!!" "!")
  ("@@" "@")
  ("##" "#")
  ("$$" "$")
  ("%%" "%")
  (",," ",")
  (".." ".")
  (";;" ";")
  ("::" ":")
  (";;" ";")
  ("\"\"" "\"")
  ("//" "/")
  ("||" "|")
  ("''" "'")
  ("!!" "?")
  ("??" "?")
  ("[[" "[")
  ("]]" "]")
  ("{{" "{")
  ("}}" "}")
  ("<<" "<")
  (">>" ">"))

 (backspace
  ((BackSpace) (sub K 1) (undo K))))

(state
 (init
  (t (set K 0))
  (consonant (mark M) (shift after-c))
  (special)
  (punctuation)
  (vowel-pre)
  (vowel-post)
  (vowel-combining)
  (tone))

 (after-c
  (t (mark M) (set V2 0) (set K @@))
  (high-v (mark M))
  (vowel-pre (set V1 @-1)
	     (delete @-)
	     (move @<) (insert V1) (move @>) (shift after-c-vpre))
  (vowel-combining (cond ((> V2 0) (move @-) (delete @-) (move @>))
			 (1 (set K @@)))
		   (set V2 @-1) (mark M))
  (vowel-post (shift after-c-v))
  (vowel-digraph (mark M) (move @<) (insert "ꪹ") (move @>)
		 (shift after-c-v))
  (final-c (delete @-) (pushback 1) (shift init))
  (backspace)
  (nil (shift after-c-v)))
  
 (after-c-vpre
  (t (set K @@))
  (vowel-combining (set V2 @-1) (mark M) (shift after-c-v))
  (vowel-post (shift after-c-v))
  (backspace)
  (nil (shift after-c-v)))

 (after-c-v
  (t (set T 0) (set K @@))
  (tone (cond ((= T 0) (set K @@))) (adjust-tone))
  (final-c (shift after-c-v-f))
  (backspace))

 (after-c-v-f
  (t (set K @@))
  (tone (adjust-tone))
  (backspace)))
