--- /dev/null
+;; ta-lk-renganathan.mim -- Tamil input method with Renganathan layout
+;; Copyright (C) 2008
+;; National Institute of Advanced Industrial Science and Technology (AIST)
+;; Registration Number H15PRO112
+
+;; This file is part of the m17n database; 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 ta lk-renganathan)
+
+(description "Tamil input method with Renganathan layout.
+For the detail, see the page: <http://www.locallanguages.lk/>
+")
+
+(title "க")
+
+(variable
+ (use-surrounding-text (_"Surrounding text vs. preedit
+If 1, try to use surrounding text. Otherwise, use preedit.")
+ 0 1 0))
+
+(macro
+ (pre-proc
+ (cond
+ ((= @-1 0x200C)
+ (delete @-1)))
+ (cond
+ ((= @+1 0x200C)
+ (delete @+1))))
+
+ (post-proc
+ (cond
+ ((& (>= @-1 0x0B95) (<= @-1 0x0BB9) ; a consonant
+ (>= @+1 0x0BC6) (<= @+1 0x0BCC)) ; a left/two-part vowel sign
+ ;; prevent syllable formation
+ 0x200C)
+
+ ((& (| (< @-2 0x0B95) (> @-2 0x0BB9)) ; not a consonant
+ (>= @-1 0x0BC6) (<= @-1 0x0BCC) ; a left/two-part vowel sign
+ (>= @+1 0x0B95) (<= @+1 0x0BB9) ; a consonant
+ (| (< @+2 0x0BBE) (> @+2 0x0BD7))) ; not a vowel sign
+ ;; exchange @-1 and @+1
+ (set vs @-1)
+ (set c @+1)
+ (delete @-1)
+ (delete @+1)
+ (insert c)
+ (insert vs))
+
+ ((& (= @-1 0x200C)
+ (| (< @-2 0x0B95) (> @-2 0x0BB9) ; not a constant
+ (< @+1 0x0BC6) (> @+1 0x0BCC))) ; not a left/two-part vowel sign
+ ;; delete unnecessary ZWNJ
+ (delete @-1))
+
+ ((& (= @+1 0x200C)
+ (| (< @-1 0x0B95) (> @-1 0x0BB9) ; not a constant
+ (< @+2 0x0BC6) (> @+2 0x0BCC))) ; not a left/two-part vowel sign
+ ;; delete unnecessary ZWNJ
+ (delete @+1))))
+
+ (consonant-proc
+ (move @<)
+ (cond
+ ((= @-1 0x200C)
+ (delete @-1)))
+ (set vs 0)
+ (cond
+ ((& (>= @-1 0x0BC6) (<= @-1 0x0BC8)) ; a left vowel sign
+ (cond
+ ((= @-2 0x200C)
+ (set vs @-1)
+ (delete @-2))
+ ((| (< @-2 0x0B95) (> @-2 0x0BB9)) ; not a consonant
+ (set vs @-1)
+ (delete @-1)))))
+
+ (move @>)
+ (cond
+ ((& (= @+1 0x200C)
+ (| (< @+2 0x0BC6) (> @+2 0x0BCC))) ; not a left vowel sign
+ (delete @+1)))
+
+ (cond
+ ((= vs 0x0BC6)
+ (cond
+ ((= @+1 0x0BBE)
+ (delete @+1)
+ 0x0BCA)
+ ((| (= @+1 0x0BB3) (= @+1 0x0BD7))
+ (delete @+1)
+ 0x0BCC)
+ (1
+ 0x0BC6)))
+ ((= vs 0x0BC7)
+ (cond
+ ((= @+1 0x0BBE)
+ (delete @+1)
+ 0x0BCB)
+ (1
+ 0x0BC7)))
+ ((= vs 0x0BC8)
+ 0x0BC8))
+
+ (cond
+ ((& (>= @-1 0x0B95) (<= @-1 0x0BB9) ; a consonant
+ (>= @+1 0x0BC6) (<= @+1 0x0BCC)) ; a left vowel sign
+ 0x200C)))
+
+ (check-surrounding-text
+ (cond
+ ((& (= @+1 0x0B95) (= @+2 0x0BCD) (= @+3 0x0BB7)) ; k.ssa follows
+ 0x0B95 0x0BCD 0x0BB7
+ (delete @+3))
+ ((& (>= @+1 0x0B95) (<= @+1 0x0BB9)) ; a consonant follows
+ (set c @+1)
+ (insert c)
+ (delete @+1))
+ ((& (>= @-1 0x0B95) (<= @-1 0x0BB9)) ; a consonant precedes
+ 0x200C)))
+ )
+
+(map
+ (starter
+ ("q") ("w") ("e") ("r") ("t") ("y") ("u") ("i") ("o") ("p") ("[") ("]")
+ ("a") ("s") ("d") ("f") ("g") ("h") ("j") ("k") ("l") (";")
+ ("z") ("x") ("c") ("v") ("b") ("n") ("m") ("`")
+ ("Q") ("W") ("E") ("R") ("T") ("Y") ("U") ("I") ("O") ("P") ("{") ("}")
+ ("A") ("S") ("D") ("F") ("G") ("H") ("J") ("K") ("L")
+ ("Z") ("X") ("C") ("V") ("B") ("N") ("M")
+ ((A-q)) ((A-w)) ((A-e)) ((A-r)) ((A-t)) ((A-y)) ((A-u)) ((A-i))
+ ((A-1)) ((A-2)) ((A-3)) ((A-4)) ((A-5)) ((A-6)) ((A-7)) ((A-8)) ((A-9))
+ ((A-0)) ((A-`)) ((A-=)) ((A--))
+ ((BackSpace)) ((Delete)))
+
+ (composite
+ ("f;" "க்") ; 0B95 0BCD
+ ("f;W" "க்ஷ") ; 0B95 0BCD 200C 0BB7
+ ("Zh" "ஒளா") ; 0B92 0BB3 0BBE
+ ("Zp" "ஒளி") ; 0B92 0BB3 0BBF
+ ("ZP" "ஒளீ") ; 0B92 0BB3 0BC0
+ ("Z[" "ஒளு") ; 0B92 0BB3 0BC1
+ ("Z{" "ஒளூ") ; 0B92 0BB3 0BC2
+ ("Z;" "ஒள்") ; 0B92 0BB3 0BCD
+ ("xs" "ஔ") ; 0B94
+ ("xsh" "ஒளா") ; 0B92 0BB3 0BBE
+ ("xsp" "ஒளி") ; 0B92 0BB3 0BBF
+ ("xsP" "ஒளீ") ; 0B92 0BB3 0BC0
+ ("xs[" "ஒளு") ; 0B92 0BB3 0BC1
+ ("xs{" "ஒளூ") ; 0B92 0BB3 0BC2
+ ("xs;" "ஒள்") ; 0B92 0BB3 0BCD
+ )
+
+ (consonant
+ ("f" "க") ; 0B95
+ ("q" "ங") ; 0B99
+ ("r" "ச") ; 0B9A
+ ("E" "ஜ") ; 0B9C
+ ("]" "ஞ") ; 0B9E
+ ("l" "ட") ; 0B9F
+ ("z" "ண") ; 0BA3
+ ("j" "த") ; 0BA4
+ ("e" "ந") ; 0BA8
+ ("d" "ன") ; 0BA9
+ ("g" "ப") ; 0BAA
+ ("k" "ம") ; 0BAE
+ ("a" "ய") ; 0BAF
+ ("u" "ர") ; 0BB0
+ ("w" "ற") ; 0BB1
+ ("y" "ல") ; 0BB2
+ ("o" "ழ") ; 0BB4
+ ("t" "வ") ; 0BB5
+ ("U" "ஶ") ; 0BB6
+ ("Q" "ஸ") ; 0BB8
+ ("R" "ஹ") ; 0BB9
+
+ ("T" "க்ஷ") ; 0B95 0BCD 0BB7
+ )
+
+ (sign
+ ("p" "ி") ; 0BBF
+ ("P" "ீ") ; 0BC0
+ ("[" "ு") ; 0BC1
+ ("{" "ூ") ; 0BC2
+ (";" "்") ; 0BCD
+ )
+
+ (lla
+ ("s"))
+
+ (ssa
+ ("W"))
+
+ (aa
+ ("h"))
+
+ (e
+ ("n"))
+
+ (ee
+ ("N"))
+
+ (ai
+ ("i"))
+
+ (backspace
+ ((BackSpace)))
+
+ (delete
+ ((Delete)))
+
+ (misc
+ ("`" "ஃ") ; 0B83
+ ("m" "அ") ; 0B85
+ ("M" "ஆ") ; 0B86
+ ("b" "இ") ; 0B87
+ ("B" "ஈ") ; 0B88
+ ("c" "உ") ; 0B89
+ ("C" "ஊ") ; 0B8A
+ ("v" "எ") ; 0B8E
+ ("V" "ஏ") ; 0B8F
+ ("I" "ஐ") ; 0B90
+ ("x" "ஒ") ; 0B92
+ ("X" "ஓ") ; 0B93
+ ("Z" "ஔ") ; 0B94
+
+ ("O" "ௐ") ; 0BD0
+
+ ((A-0) "௦") ; 0BE6
+ ((A-1) "௧") ; 0BE7
+ ((A-2) "௨") ; 0BE8
+ ((A-3) "௩") ; 0BE9
+ ((A-4) "௪") ; 0BEA
+ ((A-5) "௫") ; 0BEB
+ ((A-6) "௬") ; 0BEC
+ ((A-7) "௭") ; 0BED
+ ((A-8) "௮") ; 0BEE
+ ((A-9) "௯") ; 0BEF
+ ((A-q) "௰") ; 0BF0
+ ((A-w) "௱") ; 0BF1
+ ((A-e) "௲") ; 0BF2
+ ((A-y) "௳") ; 0BF3
+ ((A-u) "௴") ; 0BF4
+ ((A-i) "௵") ; 0BF5
+ ((A-r) "௶") ; 0BF6
+ ((A-t) "௷") ; 0BF7
+ ((A-`) "௸") ; 0BF8
+ ((A-=) "௹") ; 0BF9
+ ((A--) "௺") ; 0BFA
+
+ ("Y" "ஶ்ரீ") ; 0BB6 0BCD 0BB0 0BC0
+
+ ("}" ";") ; 003B
+
+ ("A" "")
+ ("S" "")
+ ("D" "")
+ ("F" "")
+ ("G" "")
+ ("H" "")
+ ("J" "")
+ ("K" "")
+ ("L" "")
+ ))
+
+(state
+ (init
+ (starter
+ (pushback 1)
+ (cond
+ ((& (= use-surrounding-text 1) (= @-0 -1))
+ (shift surrounding-text))
+ (1
+ (shift preedit)))))
+
+ (surrounding-text
+ (consonant
+ (consonant-proc)
+ (commit))
+
+ (lla
+ (cond
+ ((= @-1 0x200C)
+ (delete @-1)))
+
+ (cond
+ ((& (>= @-2 0x0B95) (<= @-2 0x0BB9) ; a consonant
+ (= @-1 0x0BC6))
+ (delete @-1)
+ 0x0BCC
+ (cond
+ ((= @+1 0x200C)
+ (delete @+1))))
+ ((= @-1 0x0B92)
+ (delete @-1)
+ 0x0B94
+ (cond
+ ((= @+1 0x200C)
+ (delete @+1))))
+ (1
+ 0x0BB3
+ (consonant-proc)))
+
+ (commit))
+
+ (ssa
+ (cond
+ ((= @-1 0x200C)
+ (delete @-1)))
+
+ (cond
+ ((& (= @-2 0x0B95) (= @-1 0x0BCD))
+ 0x200C))
+ 0x0BB7
+ (consonant-proc)
+
+ (commit))
+
+ (sign
+ (cond
+ ((= @+1 0x200C)
+ (delete @+1)))
+ (move @<)
+ (cond
+ ((= @-1 0x200C)
+ (delete @-1)))
+
+ (cond
+ ((= @-1 0x0B94)
+ (delete @-1)
+ 0x0B92 0x0BB3)
+ ((= @-1 0x0BCC)
+ (delete @-1)
+ 0x0BC6 0x0BB3))
+
+ (commit))
+
+ (aa
+ (pre-proc)
+
+ (cond
+ ((= @-1 0x0BC6)
+ (cond
+ ((& (| (< @-3 0x0B95) (> @-3 0x0BB9)) ; not a consonant
+ (= @-2 0x200C))
+ (delete @-2))
+ (1
+ (delete @-1)))
+ 0x0BCA)
+
+ ((= @-1 0x0BC7)
+ (cond
+ ((& (| (< @-3 0x0B95) (> @-3 0x0BB9)) ; not a consonant
+ (= @-2 0x200C))
+ (delete @-2))
+ (1
+ (delete @-1)))
+ 0x0BCB)
+
+ ((= @-1 0x0B94)
+ (delete @-1)
+ 0x0B92 0x0BB3 0x0BBE)
+
+ ((= @-1 0x0BCC)
+ (delete @-1)
+ 0x0BC6 0x0BB3 0x0BBE)
+
+ (1
+ 0x0BBE))
+
+ (commit))
+
+ (e
+ (pre-proc)
+
+ (cond
+ ;; additional check-surrounding-text for this vowel sign
+ ((& (>= @+1 0x0B95) (<= @+1 0x0BB9) ; a consonant
+ (= @+2 0x0BB3))
+ (set c @+1)
+ (delete @+2)
+ (insert c)
+ 0x0BCC)
+
+ ;; ordinary check-surrounding-text
+ (1
+ (check-surrounding-text)
+ (cond
+ ((= @+1 0x0BBE)
+ (delete @+1)
+ 0x0BCA)
+ ((= @+1 0x0BD7)
+ (delete @+1)
+ 0x0BCC)
+ (1
+ 0x0BC6))))
+
+ (commit))
+
+ (ee
+ (pre-proc)
+
+ (check-surrounding-text)
+ (cond
+ ((= @+1 0x0BBE)
+ (delete @+1)
+ 0x0BCB)
+ (1
+ 0x0BC7))
+
+ (commit))
+
+ (ai
+ (pre-proc)
+
+ (check-surrounding-text)
+ 0x0BC8
+
+ (commit))
+
+ (backspace
+ (pre-proc)
+
+ (cond
+ ((& (>= @-4 0x0B95) (<= @-4 0x0BB9) ; a consonant
+ (= @-3 0x0BC6)
+ (= @-2 0x0BB3)
+ (| (& (>= @-1 0x0BBE) (<= @-1 0x0BC2)) ; a right/above/below vowel sign
+ (= @-1 0x0BCD)))
+ (delete @-3)
+ 0x0BCC)
+
+ ((& (= @-4 0x0BB6) (= @-3 0x0BCD) (= @-2 0x0BB0) (= @-1 0x0BC0)) ; shrii
+ (delete @-4))
+
+ ((& (= @-3 0x0B92)
+ (= @-2 0x0BB3)
+ (| (& (>= @-1 0x0BBE) (<= @-1 0x0BC2)) ; a right/above/below vowel sign
+ (= @-1 0x0BCD)))
+ (delete @-3)
+ 0x0B94)
+
+ ((& (= @-3 0x0B95) (= @-2 0x0BCD) (= @-1 0x0BB7)) ; k.ssa
+ (delete @-3))
+
+ ((| (= @-1 0x0BCA) (= @-1 0x0BCC)) ; vowel sign e/ai
+ (delete @-1)
+ 0x0BC6)
+
+ ((= @-1 0x0BCB) ; vowel sign ee
+ (delete @-1)
+ 0x0BC7)
+
+ ((& (>= @-1 0x0BC6) (<= @-1 0x0BC8)) ; a left vowel sign
+ (set vs @-1)
+ (delete @-1)
+ (cond
+ ((& (>= @-1 0x0B95) (<= @-1 0x0BB9)) ; a consonant
+ (cond
+ ((& (= @-3 0x0B95) (= @-2 0x0BCD) (= @-1 0x0BB7)) ; k.ssa
+ (delete @-3))
+ (1
+ (delete @-1)))
+
+ (cond
+ ((& (>= @+1 0x0B95) (<= @+1 0x0BB9) ; a consonant follows
+ (| (< @+2 0x0BBE) (> @+2 0x0BD7))) ; not a vowel sign
+ ;; visual : E C1 | C2 -> E C2 |
+ ;; logical : C1 E | C2 -> C2 E |
+ (cond
+ ((& (= @+1 0x0B95) (= @+2 0x0BCD) (= @+3 0x0BB7)) ; k.ssa
+ (delete @+3)
+ 0x0B95 0x0BCD 0x0BB7)
+ (1
+ (set c @+1)
+ (delete @+1)
+ (insert c)))
+ (insert vs))
+
+ ((& (>= @-1 0x0B95) (<= @-1 0x0BB9)) ; a consonant precedes
+ ;; visual : C1 E C2 | X -> C1 E | X
+ ;; logical : C1 C2 E | X -> C1 N E | X
+ 0x200C
+ (insert vs))
+
+ (1
+ ;; visual : X1 E C | X2 -> X1 E | X2
+ ;; logical : X1 C E | X2 -> X1 E | X2
+ (insert vs))))
+
+ ((= @-1 0x200C)
+ (delete @-1))))
+
+ (1
+ (delete @-1)))
+
+ (post-proc)
+ (commit))
+
+ (delete
+ (pre-proc)
+
+ (cond
+ ((& (= @+1 0x0BB6) (= @+2 0x0BCD) (= @+3 0x0BB0) (= @+4 0x0C0)) ; shrii
+ (delete @+4))
+
+ ((& (= @+1 0x0B95) (= @+2 0x0BCD) (= @+3 0x0BB7)) ; k.ssa
+ (cond
+ ((& (>= @+4 0x0BC6) (<= @+4 0x0BC8)) ; a left vowel sign
+ (delete @+4)
+ 0x0B95 0x0BCD 0x0BB7)
+ ((| (= @+4 0x0BCA) (= @+4 0x0BCB)) ; vowel sign e/ee
+ (delete @+4)
+ 0x0B95 0x0BCD 0x0BB7 0x0BBE)
+ ((| (& (>= @+4 0x0BBE) (<= @+4 0x0BC2)) ; vowel sign aa .. uu
+ (= @+4 0x0BCC) ; vowel sign ai
+ (= @+4 0x0BCD)) ; virama
+ (delete @+4))
+ (1
+ (delete @+3))))
+
+ ((& (>= @+1 0x0B95) (<= @+1 0x0BB9)) ; a consonant
+ (set c @+1)
+ (cond
+ ((& (>= @+2 0x0BC6) (<= @+2 0x0BC8)) ; a left vowel sign
+ (delete @+2)
+ (insert c))
+ ((| (= @+2 0x0BCA) (= @+2 0x0BCB)) ; vowel sign e/ee
+ (delete @+2)
+ (insert c)
+ 0x0BBE)
+ ((| (& (>= @+2 0x0BBE) (<= @+2 0x0BC2)) ; vowel sign aa .. uu
+ (= @+2 0x0BCC) ; vowel sign ai
+ (= @+2 0x0BCD)) ; virama
+ (delete @+2))
+ (1
+ (delete @+1))))
+
+ ((| (= @+1 0x0BCA) (= @+1 0x0BCB)) ; vowel sign e/ee
+ (delete @+1)
+ 0x0BBE)
+
+ ((= @+1 0x0BCC) ; vowel sign ai
+ (delete @+1)
+ 0x0BB3)
+
+ (1
+ (delete @+1)))
+
+ (post-proc)
+ (commit))
+
+ (misc
+ (move @<)
+ (cond
+ ((= @-1 0x200C)
+ (delete @-1)))
+ (move @>)
+ (cond
+ ((= @+1 0x200C)
+ (delete @+1)))
+ (commit)))
+
+ (preedit
+ (consonant (shift c-state))
+ (composite (commit))
+ (sign (commit))
+ (misc (commit))
+ (lla "ள" (shift c-state)) ; 0BB3
+ (ssa "ஷ" (shift c-state)) ; 0BB7
+ (aa "ா" (commit)) ; 0BBE
+ (e "ெ" (shift e-state)) ; 0BC6
+ (ee "ே" (shift ee-state)) ; 0BC7
+ (ai "ை" (shift ai-state))) ; 0BC8
+
+ (c-state
+ (sign (shift c-s-state))
+ (aa "ா" (shift c-s-state)) ; 0BBE
+ (backspace (undo)))
+
+ (c-s-state
+ (sign
+ (cond
+ ((= @-2 0x0BCC)
+ (move @-)
+ (delete @-)
+ 0x0BC6 0x0BB3
+ (move @+))
+ (1
+ (commit)
+ (shift preedit))))
+ (aa
+ "ா"
+ (cond
+ ((= @-2 0x0BCC)
+ (move @-)
+ (delete @-)
+ 0x0BC6 0x0BB3
+ (move @+))
+ (1
+ (commit)
+ (shift preedit))))
+ (backspace (undo)))
+
+ (e-state
+ (consonant (move @<) (delete @+) (move @>) "ெ" (shift e-c-state))
+ (lla (delete @-) "ளெ" (shift e-c-state))
+ (ssa (delete @-) "ஷெ" (shift e-c-state))
+ (backspace (delete @-) (shift preedit))
+ (nil (undo -1)))
+
+ (ee-state
+ (consonant (move @<) (delete @+) (move @>) "ே" (shift ee-c-state))
+ (lla (delete @-) "ளே" (shift ee-c-state))
+ (ssa (delete @-) "ஷே" (shift ee-c-state))
+ (backspace (delete @-) (shift preedit))
+ (nil (undo -1)))
+
+ (ai-state
+ (consonant (move @<) (delete @+) (move @>) "ை" (shift c-s-state))
+ (lla (delete @-) "ளை" (shift c-s-state))
+ (ssa (delete @-) "ஷை" (shift c-s-state))
+ (backspace (delete @-) (shift preedit))
+ (nil (undo -1)))
+
+ (e-c-state
+ (aa (delete @-) "ொ" (shift c-s-state))
+ (lla (delete @-) "ௌ" (shift c-s-state))
+ (backspace (delete @<) "ெ" (shift e-state)))
+
+ (ee-c-state
+ (aa (delete @-) "ோ" (shift c-s-state))
+ (backspace (delete @<) "ே" (shift ee-state)))
+ )
+
+;; Local Variables:
+;; coding: utf-8
+;; mode: emacs-lisp
+;; End: