;; th-pattachote.mim -- Thai input method with Pattachote keyboard layout ;; Copyright (C) 2006 ;; 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 St, Fifth Floor, Boston, MA ;; 02110-1301, USA. (input-method th pattachote) (description "Thai input method simulating the Pattachote keyboard with WTT 2.0 level 1 input sequence correction. The correction algorithm follows the one shown in the following ") (title "ท") (map (map ("!" "+") ("\"" "ฑ") ("#" "/") ("$" ",") ("%" "?") ("&" "_") ("'" "ข") ("(" "(") (")" ")") ("*" ".") ("+" "%") ("," "ะ") ("-" "๑") ("." "จ") ("/" "พ") ("0" "๐") ("1" "=") ("2" "๒") ("3" "๓") ("4" "๔") ("5" "๕") ("6" "ู") ("7" "๗") ("8" "๘") ("9" "๙") (":" "ฆ") (";" "ไ") ("<" "ฟ") ("=" "๖") (">" "ฉ") ("?" "ฬ") ("@" "\"") ("A" "๋") ("B" "ฺ") ("C" "ฐ") ("D" "ำ") ("E" "ๆ") ("F" "ณ") ("G" "์") ("H" "ื") ("I" "ซ") ("J" "ผ") ("K" "ช") ("L" "โ") ("M" "ฮ") ("N" "ศ") ("O" "ถ") ("P" "ฒ") ("Q" "๊") ("R" "ญ") ("S" "ธ") ("T" "ษ") ("U" "ฝ") ("V" "ภ") ("W" "ฤ") ("X" "ฏ") ("Y" "ึ") ("Z" "ฎ") ("[" "ใ") ("\\" "ๅ") ("]" "ฌ") ("^" "ุ") ("_" "-") ("`" "_") ("a" "้") ("b" "ิ") ("c" "ล") ("d" "ง") ("e" "ย") ("f" "ก") ("g" "ั") ("h" "ี") ("i" "ม") ("j" "า") ("k" "น") ("l" "เ") ("m" "ส") ("n" "ค") ("o" "ว") ("p" "แ") ("q" "็") ("r" "อ") ("s" "ท") ("t" "ร") ("u" "ด") ("v" "ห") ("w" "ต") ("x" "ป") ("y" "่") ("z" "บ") ("{" "ฯ") ("|" "ํ") ("}" "ฦ") ("~" "฿"))) (include (th kesmanee) macro) (state (init (map (delete @<) (pushback 1) (cond ((= @-1 -2) (shift nst)) (1 (shift st))))) ;; no surrounding text (nst (t (set x -1) (set y -1)) (map (set z @-) (set arg1 y) (set arg2 z) (cp) (cond ((= ret 1) ;; CP(y,z) succeeded. (set x y) (set y z)) (1 (ac) (cond ((= ret 1) ;; AC(y,z) succeeded. (set x y) (set y z)) (1 ;; WTT-based input sequence correction starts here. ;; begin ;; if CP(x,z) then (set arg1 x) (set arg2 z) (cp) (cond ((= ret 1) ;; if CP(z,y) then (set arg1 z) (set arg2 y) (cp) (cond ((= ret 1) ;; reorder(y -> zy) (delete @-) (delete @-) (insert z) (insert y) (set x z)) ;; elif CP(x,y) then (1 (set arg1 x) (set arg2 y) (cp) (cond ((= ret 1) ;; replace(y -> z) (delete @-) (delete @-) (insert z) (set y z)) ;; elif y is FV1 and z is TONE then ((& (| (= y 0x0E30) (= y 0x0E32) (= y 0x0E33)) (>= z 0x0E48) (<= z 0x0E4B)) ;; reorder(y -> zy) (delete @-) (delete @-) (insert z) (insert y) (set x z)) ;; else ;; reject(z) (1 (delete @-)) ;;endif )))) ;; elif AC(x,z) then (1 (set arg1 x) (set arg2 z) (ac) (cond ((& (= ret 1) ;; CTRL, NON and CONS should not be replaced. (| (= y 0x0E24) (= y 0x0E26) (& (>= y 0x0E30) (<= y 0x0E3A)) (& (>= y 0x0E40) (<= y 0x0E45)) (& (>= y 0x0E47) (<= y 0x0E4E))) (| (= z 0x0E24) (= z 0x0E26) (& (>= z 0x0E30) (<= z 0x0E3A)) (& (>= z 0x0E40) (<= z 0x0E45)) (& (>= z 0x0E47) (<= z 0x0E4E)))) ;; replace(y -> z) (delete @-) (delete @-) (insert z) (set y z)) ;; else ;; reject(z) (1 (delete @-)) ;; endif ))) ;; end )))) ;; Commit the preedit chars as soon as fixed. (set w @-) (cond ;; If the last char is CTRL or NON, we can commit everything. ((| (& (>= w 0x0000) (<= w 0x0E00)) (= w 0x0E2F) (= w 0x0E3F) (= w 0x0E46) (>= w 0x0E4F)) (commit)) ;; If the last char is CONS, LV, FV2 or FV3, we can commit ;; everything but the last. ((| (& (>= w 0x0E01) (<= w 0x0E2E)) (& (>= w 0x0E40) (<= w 0x0E45))) (delete @-) (commit) (insert w)) ;; If the last char is FV1 (excluding AM) and ... ((| (= w 0x0E30) (= w 0x0E32)) (delete @-) (set v @-) (cond ;; ... the before last is CONS, we can commit other than the ;; last two. ((| (& (>= v 0x0E01) (<= v 0x0E23)) (= v 0x0E25) (& (>= v 0x0E27) (<= v 0x0E2E))) (delete @-) (commit) (insert v) (insert w)) ;; ... else if the before last is not CONS, we can commit ;; everything but the last. (1 (commit) (insert w)))) ))) ;; with surrounding text (st (map ;; z = next character (set z @-) ;; y = previous character (set y @-1) ;; x = character previous to y (set x @-2) (set arg1 y) (set arg2 z) (cp) (cond ((= ret 1)) ;; CP(y,z) succeeded. (1 (ac) (cond ((= ret 1)) ;; AC(y,z) succeeded. (1 ;; WTT-based input sequence correction starts here. ;; begin ;; if CP(x,z) then (set arg1 x) (set arg2 z) (cp) (cond ((= ret 1) ;; if CP(z,y) then (set arg1 z) (set arg2 y) (cp) (cond ((= ret 1) ;; reorder(y -> zy) (delete @-) (delete @-1) (insert z) (insert y)) ;; elif CP(x,y) then (1 (set arg1 x) (set arg2 y) (cp) (cond ((= ret 1) ;; replace(y -> z) (delete @-) (delete @-1) (insert z)) ;; elif y is FV1 and z is TONE then ((& (| (= y 0x0E30) (= y 0x0E32) (= y 0x0E33)) (>= z 0x0E48) (<= z 0x0E4B)) ;; reorder(y -> zy) (delete @-) (delete @-1) (insert z) (insert y)) ;; else ;; reject(z) (1 (delete @-)) ;;endif )))) ;; elif AC(x,z) then (1 (set arg1 x) (set arg2 z) (ac) (cond ((& (= ret 1) ;; CTRL, NON and CONS should not be replaced. (| (= y 0x0E24) (= y 0x0E26) (& (>= y 0x0E30) (<= y 0x0E3A)) (& (>= y 0x0E40) (<= y 0x0E45)) (& (>= y 0x0E47) (<= y 0x0E4E))) (| (= z 0x0E24) (= z 0x0E26) (& (>= z 0x0E30) (<= z 0x0E3A)) (& (>= z 0x0E40) (<= z 0x0E45)) (& (>= z 0x0E47) (<= z 0x0E4E)))) ;; replace(y -> z) (delete @-) (delete @-1) (insert z)) ;; else ;; reject(z) (1 (delete @-)) ;; endif ))) ;; end )))) (commit) ))) ;; Local Variables: ;; coding: utf-8 ;; mode: emacs-lisp ;; End: