;; si-wijesekera-preedit.mim -- Sinhala input method with wijesekera method
;; Copyright (C) 2006, 2007
;;   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 si wijesekera-preedit)

(description "Sinhala input method based on SLS 1134 Rev. 2:2004.
  <http://www.fonts.lk/doc/sin-kbd-layout4.pdf>
This input method uses preedit rather than surrounding text.
")

(title "සි")

(map
 (independent
  ("w" "අ")				; 0D85
  ("b" "ඉ")				; 0D89
  ("B" "ඊ")				; 0D8A
  ("W" "උ")				; 0D8B
  ("R" "ඍ")				; 0D8D
  ((A-,) "ඏ")				; 0D8F
  ("t" "එ")				; 0D91
  ("T" "ඔ")				; 0D94
  ("l" "ක")				; 0D9A
  ("L" "ඛ")				; 0D9B
  ("." "ග")				; 0D9C
  (">" "ඝ")				; 0D9D
  ("X" "ඞ")				; 0D9E
  ((A-.) "ඟ") ((0x2E A-z) "ඟ")		; 0D9F
  ("p" "ච")				; 0DA0
  ("P" "ඡ")				; 0DA1
  ("c" "ජ")				; 0DA2
  ("C" "ඣ")				; 0DA3
  ("\[" "ඤ")				; 0DA4
  ("{" "ඥ")				; 0DA5
  ((A-c) "ඦ") ((0x63 A-z) "ඦ")		; 0DA6
  ("g" "ට")				; 0DA7
  ("G" "ඨ")				; 0DA8
  ("v" "ඩ")				; 0DA9
  ("V" "ඪ")				; 0DAA
  ("K" "ණ")				; 0DAB
  ((A-v) "ඬ") ((0x76 A-z) "ඬ")		; 0DAC
  (";" "ත")				; 0DAD
  (":" "ථ")				; 0DAE
  ("o" "ද")				; 0DAF
  ("O" "ධ")				; 0DB0
  ("k" "න")				; 0DB1
  ((A-o) "ඳ") ((0x6F A-z) "ඳ")		; 0DB3
  ("m" "ප")				; 0DB4
  ("M" "ඵ")				; 0DB5
  ("n" "බ")				; 0DB6
  ("N" "භ")				; 0DB7
  ("u" "ම")				; 0DB8
  ("U" "ඹ")				; 0DB9
  ("h" "ය")				; 0DBA
  ("r" "ර")				; 0DBB
  ("," "ල")				; 0DBD
  ("j" "ව")				; 0DC0
  ("Y" "ශ")				; 0DC1
  ("I" "ෂ")				; 0DC2
  ("i" "ස")				; 0DC3
  ("y" "හ")				; 0DC4
  ("<" "ළ")				; 0DC5
  ("F" "ෆ")				; 0DC6
  ((A-') "෴")				; 0DF4

  ("J" "ළු")				; muurdhaja lu (0DC5 0DD4)

  ((S-\ ) " ")				; NBSP (00A0)
  ((A-\ ) "‌")				; ZWNJ (200C)

  ("\]" ";")
  ("}" ":")
  ("'" ".")
  ("\"" ",")
  ("z" "'")
  ("Z" "\"")
  )

 (dependent
  ("x" "ං")				; 0D82
  ((A-x) "ඃ")				; 0D83
  ("a"
   (cond
    ((= @- 0x0D91) (delete @-) "ඒ")	; 0D92
    ((= @- 0x0D94) (delete @-) "ඕ")	; 0D95
    ((= @- 0x0DD9) (delete @-) "ේ")	; 0DDA
    ((= @- 0x0DDC) (delete @-) "ෝ")	; 0DDD
    (1 "්")))				; 0DCA
  ("d"
   (cond
    ((= @- 0x0D85) (delete @-) "ආ")	; 0D86
    ((= @- 0x0DD9) (delete @-) "ො")	; 0DDC
    (1 "ා")))				; 0DCF
  ("e"
   (cond
    ((= @- 0x0D85) (delete @-) "ඇ")	; 0D87
    (1 "ැ")))				; 0DD0
  ("E"
   (cond
    ((= @- 0x0D85) (delete @-) "ඈ")	; 0D88
    ((& (= @-2 0x0DC5) (= @- 0x0DD4))
     (delete @-) "ූ")			; 0DD6
    (1 "ෑ")))				; 0DD1
  ("s" "ි")				; 0DD2
  ("S" "ී")				; 0DD3
  ("q" "ු")				; 0DD4
  ("Q" "ූ")				; 0DD6

  ("D"
   (cond
    ((= @- 0x0D8D) (delete @-) "ඎ")	; 0D8E
;; The following line does not work when no consonant proceeds.
;;    ((= @- 0x0DD8) (delete @-) "ෲ")	; 0DF2
    (1 "ෘ")))				; 0DD8
;; This one works with or without a preceeding consonant.
  ("DD" "ෲ") 				; 0DF2

  ("A"
   (cond
    ((= @- 0x0D8B) (delete @-) "ඌ")	; 0D8C
    ((= @- 0x0D8F) (delete @-) "ඐ")	; 0D90
    ((= @- 0x0D94) (delete @-) "ඖ")	; 0D96
    ((= @- 0x0DD9) (delete @-) "ෞ")	; 0DDE
    (1 "ෟ")))				; 0DDF
  ((A-a) "ෳ")				; 0DF3

  ("H"					; yansaya (0DCA 200D 0DBA)
   (cond
    ((| (= @- 0x0DD9) (= @- 0x0DDB))
     (move @-) "්‍ය" (move @>))
    (1
     "්‍ය")))

  ("`"					; rakaransaya (0DCA 200D 0DBB)
   (cond
    ((| (= @- 0x0DD2) (= @- 0x0DD3) (= @- 0x0DD9) (= @- 0x0DDB))
     (move @-) "්‍ර" (move @>))
    (1 "්‍ර")))

  ("~"					; repaya (0DBB 0DCA 200D)
   (move @<)
   "ර්‍"
   (move @>))
  )

 (kombuva
  ("f" "ෙ"))				; 0DD9

 (join
  ("\\"))

 (backspace
  ((BackSpace)))
 )

(state
 (init-state
  (independent
   (shift independent-state))
  (kombuva
   (shift kombuva-state))
  (dependent))

 (independent-state
  (dependent)
  (join
   (cond
    ((| (= @- 0x0DD9) (= @- 0x0DDB))
     (shift join-state))
    ((| (< @- 0x0D9A) (> @- 0x0DC6))
     (undo -1))
    (1
     (shift join-state))))
  (backspace
   (undo)))

 (join-state
  (t
   (mark p))
  (independent
   (move p)
   (set c @-)
   (cond
    ((| (= c 0x0DD9) (= c 0x0DDB))
     (delete @-)
     "්‍"				; 0DCA 200D
     (move @>)
     (insert c))
    (1
     "්‍"				; 0DCA 200D
     (move @>)))
   (shift independent-state))
  (backspace
   (undo)))

 (kombuva-state
  (t
   (mark p))
  (independent
   (cond
    ((& (= @0 0x0DD9) (= @1 0x0D91))
     (delete @<)
     "ඓ"				; 0D93
     (shift independent-state))
    ((& (= @0 0x0DD9) (< @2 0))
     (move @0)
     (delete @+)
     (move @>)
     "ෙ"				; 0DD9
     (shift independent-state))
    ((& (= @0 0x0DDB) (< @2 0))
     (move @0)
     (delete @+)
     (move @>)
     "ෛ"				; 0DDB
     (shift independent-state))
    (1
     (delete p)
     (pushback 1)
     (shift init-state))))
  (kombuva
   (mark p)
   (cond
    ((& (= @0 0x0DD9) (< @2 0))
     (delete @<)
     "ෛ")				; 0DDB
    (1
     (delete @-)
     (pushback 1)
     (shift init-state))))
  (dependent
   (mark p))
  (backspace
   (undo))))

;; Local Variables:
;; coding: utf-8
;; mode: emacs-lisp
;; End:
