From 43b75075bbdf179f99ce18d1f802ed2326912417 Mon Sep 17 00:00:00 2001 From: handa Date: Fri, 19 Mar 2010 01:03:22 +0000 Subject: [PATCH] *** empty log message *** --- ar-kbd.mimx | 743 ------------- el-kbd.mimx | 650 ------------ global.mimx | 456 -------- latn-post.js | 363 ------- latn-post.mimx | 3157 -------------------------------------------------------- mim.js | 2740 +++++++++++++++++++++++++++++++++++++++--------- th-kesmanee.js | 97 -- vi-base.mimx | 1345 ------------------------ vi-tcvn.mimx | 1095 -------------------- vi-telex.mimx | 1415 ------------------------- vi-viqr.mimx | 778 -------------- vi-vni.mimx | 771 -------------- xex.html | 27 - xex.js | 2478 +------------------------------------------- 14 files changed, 2277 insertions(+), 13838 deletions(-) delete mode 100644 ar-kbd.mimx delete mode 100644 el-kbd.mimx delete mode 100644 global.mimx delete mode 100644 latn-post.js delete mode 100644 latn-post.mimx delete mode 100644 th-kesmanee.js delete mode 100644 vi-base.mimx delete mode 100644 vi-tcvn.mimx delete mode 100644 vi-telex.mimx delete mode 100644 vi-viqr.mimx delete mode 100644 vi-vni.mimx delete mode 100644 xex.html diff --git a/ar-kbd.mimx b/ar-kbd.mimx deleted file mode 100644 index 8aa2106..0000000 --- a/ar-kbd.mimx +++ /dev/null @@ -1,743 +0,0 @@ - - - - ar - kbd - - Input Method for Arabic simulating Arabic keyboard (MS Windows). - - ض - - - - - 1 - - - ١ - - - - - 2 - - - ٢ - - - - - 3 - - - ٣ - - - - - 4 - - - ٤ - - - - - 5 - - - ٥ - - - - - 6 - - - ٦ - - - - - 7 - - - ٧ - - - - - 8 - - - ٨ - - - - - 9 - - - ٩ - - - - - 0 - - - ٠ - - - - - ` - - - ذ - - - - - 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 - - - ' - - - - - < - - - , - - - - - > - - - . - - - - - ? - - - ؟ - - - - - - C-, - - - - > - - - - - - C-. - - - - < - - - - - - C-[ - - - - ] - - - - - - C-] - - - - [ - - - - - - C-J - - - - ‍ - - - - - - C-L - - - - ‎ - - - - - - C-N - - - - ‌ - - - - - - C-R - - - - ‏ - - - - - - C-{ - - - - } - - - - - - C-} - - - - { - - - - - - - - - - diff --git a/el-kbd.mimx b/el-kbd.mimx deleted file mode 100644 index 4420827..0000000 --- a/el-kbd.mimx +++ /dev/null @@ -1,650 +0,0 @@ - - - - - el - kbd - - Greek input method simulating the Greek keyboard. - 1! 2@ 3# 4$ 5% 6^ 7& 8* 9( 0) -_ =+ `~ - ;: ςΣ εΕ ρΡ τΤ υΥ θΘ ιΙ οΟ πΠ [{ ]} - αΑ σΣ δΔ φΦ γΓ ηΗ ξΞ κΚ λΛ ΄¨ '" \| - ζΖ χΧ ψΨ ωΩ βΒ νΝ μΜ ,< .> /? - - Ψ - - - - - q - - - 59 - - - - - w - - - 962 - - - - - e - - - 949 - - - - - r - - - 961 - - - - - t - - - 964 - - - - - y - - - 965 - - - - - u - - - 952 - - - - - i - - - 953 - - - - - o - - - 959 - - - - - p - - - 960 - - - - - [ - - - 91 - - - - - ] - - - 93 - - - - - a - - - 945 - - - - - s - - - 963 - - - - - d - - - 948 - - - - - f - - - 966 - - - - - g - - - 947 - - - - - h - - - 951 - - - - - j - - - 958 - - - - - k - - - 954 - - - - - l - - - 955 - - - - - ; - - - 900 - - - - - z - - - 950 - - - - - x - - - 967 - - - - - c - - - 968 - - - - - v - - - 969 - - - - - b - - - 946 - - - - - n - - - 957 - - - - - m - - - 956 - - - - - Q - - - 58 - - - - - W - - - 931 - - - - - E - - - 917 - - - - - R - - - 929 - - - - - T - - - 932 - - - - - Y - - - 933 - - - - - U - - - 920 - - - - - I - - - 921 - - - - - O - - - 927 - - - - - P - - - 928 - - - - - A - - - 913 - - - - - S - - - 931 - - - - - D - - - 916 - - - - - F - - - 934 - - - - - G - - - 915 - - - - - H - - - 919 - - - - - J - - - 926 - - - - - K - - - 922 - - - - - L - - - 923 - - - - - : - - - 168 - - - - - Z - - - 918 - - - - - X - - - 935 - - - - - C - - - 936 - - - - - V - - - 937 - - - - - B - - - 914 - - - - - N - - - 925 - - - - - M - - - 924 - - - - - ;a - - - 940 - - - - - ;e - - - 941 - - - - - ;h - - - 942 - - - - - ;i - - - 943 - - - - - ;o - - - 972 - - - - - ;y - - - 973 - - - - - ;v - - - 974 - - - - - ;A - - - 902 - - - - - ;E - - - 904 - - - - - ;H - - - 905 - - - - - ;I - - - 906 - - - - - ;O - - - 908 - - - - - ;Y - - - 910 - - - - - ;V - - - 911 - - - - - :i - - - 970 - - - - - :y - - - 971 - - - - - :I - - - 938 - - - - - :Y - - - 939 - - - - - ;:i - - - 912 - - - - - :;i - - - 912 - - - - - ;:y - - - 944 - - - - - :;y - - - 944 - - - - - - - - - - \ No newline at end of file diff --git a/global.mimx b/global.mimx deleted file mode 100644 index 25c6023..0000000 --- a/global.mimx +++ /dev/null @@ -1,456 +0,0 @@ - - - - t - nil - global - - - Global variable and command definitions. -This is actually not an input method, but provides documents, -default values of global variables, and default key-bindings of -global commands. - - - - - Maxmum number of candidates in a candidate group. -Value must be an integer. -If the value is not positive, number of candidates in a group is decided -by how candiates are grouped in an input method source file. - - 10 - - - - Character set to limit candidates. -Value must be a symbol representing a charater set, or nil. -If the value is not nil, a candidate containing a character not belonging -to the specified character set is ignored. - - nil - - - - - - Commit -Commit the preedit text - - - - Return - - - - - Linefeed - - - - - - Convert -Convert the preedit text - - - - ? - - - - - Henkan - - - - - - Revert -Revert the conversion - - - - Escape - - - - - - Previous candidate -Spot the previous candidate - - - - Left - - - - - C-B - - - - - - Next candidate -Spot the next candidate - - - - Right - - - - - C-F - - - - - ? - - - - - - First candidate -Spot the first candidate in the current group - - - - C-A - - - - - - Last candidate -Spot the last candidate in the current group - - - - C-E - - - - - - Previous candidate group -Move to the previous candidate group - - - - Up - - - - - C-P - - - - - - Next candidate group -Move to the next candidate group - - - - Down - - - - - C-N - - - - - - Select the 1st candidate -Select the first candidate in the current group - - - - ?1 - - - - - - Select the 2nd candidate -Select the second candidate in the current group - - - - ?2 - - - - - - Select the 3rd candidate -Select the third candidate in the current group - - - - ?3 - - - - - - Select the 4th candidate -Select the fourth candidate in the current group - - - - ?4 - - - - - - Select the 5th candidate -Select the fifth candidate in the current group - - - - ?5 - - - - - - Select the 6th candidate -Select the sixth candidate in the current group - - - - ?6 - - - - - - Select the 7th candidate -Select the seventh candidate in the current group - - - - ?7 - - - - - - select the 8th candidate -Select the eighth candidate in the current group - - - - ?8 - - - - - - Select the 9th candidate -Select the ninth candidate in the current group - - - - ?9 - - - - - - Select the 10th candidate -Select the tenth candidate in the current group - - - - ?0 - - - - - - Previous character -Move to the previous character in the preedit text - - - - Left - - - - - C-B - - - - - - Next character -Move to the next character in the preedit text - - - - Right - - - - - C-F - - - - - - Fist character -Move to the first character in the preedit text - - - - C-A - - - - - - Last character -Move to the last character in the preedit text - - - - C-E - - - - - - Delete char backward -Delete the previous character in the preedit text - - - - Backspace - - - - - - Delete char -Delete the following character in the preedit text - - - - Delete - - - - - - Previous segment -Move to the previous segment in the preedit text - - - - Left - - - - - C-B - - - - - - Next segment -Move to the next segment in the preedit text - - - - Right - - - - - C-F - - - - - - First segment -Move to the first segment in the preedit text - - - - C-A - - - - - - Last segment -Move to the last segment in the preedit text - - - - C-E - - - - - - Extend segment -Extend the current segment length to the tail - - - - S-Right - - - - - C-O - - - - - - Shrink segment -Shrink the current segment length from the tail - - - - S-Left - - - - - C-I - - - - - - Reload input method -Reload the input method (and configulation if any) and freshly start it. -Note that the length of key-sequence bound for this command must be 1. -This is one of special commands reserved by the m17n library, and -should not be used in a map of an input method. - - - - M-Return - - - - - \ No newline at end of file diff --git a/latn-post.js b/latn-post.js deleted file mode 100644 index 50e1524..0000000 --- a/latn-post.js +++ /dev/null @@ -1,363 +0,0 @@ -im = MIM.find ('latin', 'post'); -im.load_map ({ -" _":" ", -"!/":"¡", -"//":"°", -"<<":"«", -">>":"»", -"/":"¿", -"$/":"£", -"$/":"¤", -"A'":"Á", -"A,":"Ą", -"A-":"Ā", -"A/":"Å", -"A\\":"Ä", -"A^":"Â", -"A`":"À", -"A~":"Ã", -"A~":"Ă", -"C'":"Ć", -"C,":"Ç", -"C.":"Ċ", -"C^":"Ĉ", -"C~":"Č", -"D/":"Ð", -"D/":"Đ", -"D~":"Ď", -"E'":"É", -"E,":"Ę", -"E-":"Ē", -"E.":"Ė", -"E/":"Æ", -"E\\":"Ë", -"E^":"Ê", -"E`":"È", -"E~":"Ě", -"G,":"Ģ", -"G.":"Ġ", -"G^":"Ĝ", -"G~":"Ğ", -"H/":"Ħ", -"H^":"Ĥ", -"I'":"Í", -"I,":"Į", -"I-":"Ī", -"I.":"İ", -"I\\":"Ï", -"I^":"Î", -"I`":"Ì", -"I~":"Ĩ", -"J^":"Ĵ", -"K,":"Ķ", -"L'":"Ĺ", -"L,":"Ļ", -"L/":"Ł", -"L~":"Ľ", -"N'":"Ń", -"N,":"Ņ", -"N/":"Ŋ", -"N~":"Ñ", -"N~":"Ň", -"O'":"Ó", -"O-":"Ō", -"O/":"Ø", -"O/":"Œ", -"O:":"Ő", -"O\\":"Ö", -"O^":"Ô", -"O`":"Ò", -"O~":"Õ", -"R'":"Ŕ", -"R,":"Ŗ", -"R~":"Ř", -"S'":"Ś", -"S,":"Ş", -"S^":"Ŝ", -"S~":"Š", -"T,":"Ţ", -"T/":"Þ", -"T/":"Ŧ", -"T~":"Ť", -"U'":"Ú", -"U,":"Ų", -"U-":"Ū", -"U.":"Ů", -"U:":"Ű", -"U\\":"Ü", -"U^":"Û", -"U`":"Ù", -"U~":"Ũ", -"U~":"Ŭ", -"Y'":"Ý", -"Y\\":"Ÿ", -"Y=":"¥", -"Z'":"Ź", -"Z.":"Ż", -"Z~":"Ž", -"a'":"á", -"a,":"ą", -"a-":"ā", -"a/":"å", -"a\\":"ä", -"a^":"â", -"a_":"ª", -"a`":"à", -"a~":"ã", -"a~":"ă", -"c'":"ć", -"c,":"ç", -"c.":"ċ", -"c^":"ĉ", -"c~":"č", -"c/":"¢", -"d/":"ð", -"d/":"đ", -"d~":"ď", -"e'":"é", -"e,":"ę", -"e-":"ē", -"e.":"ė", -"e/":"æ", -"e\\":"ë", -"e^":"ê", -"e`":"è", -"e~":"ě", -"e=":"€", -"g,":"ģ", -"g.":"ġ", -"g^":"ĝ", -"g~":"ğ", -"h/":"ħ", -"h^":"ĥ", -"i'":"í", -"i,":"į", -"i-":"ī", -"i.":"ı", -"i\\":"ï", -"i^":"î", -"i`":"ì", -"i~":"ĩ", -"j^":"ĵ", -"k,":"ķ", -"k/":"ĸ", -"l'":"ĺ", -"l,":"ļ", -"l/":"ł", -"l~":"ľ", -"n'":"ń", -"n,":"ņ", -"n/":"ŋ", -"n~":"ñ", -"n~":"ň", -"o'":"ó", -"o-":"ō", -"o/":"ø", -"o/":"œ", -"o:":"ő", -"o\\":"ö", -"o^":"ô", -"o_":"º", -"o`":"ò", -"o~":"õ", -"r'":"ŕ", -"r,":"ŗ", -"r~":"ř", -"s'":"ś", -"s,":"ş", -"s/":"ß", -"s^":"ŝ", -"s~":"š", -"t,":"ţ", -"t/":"þ", -"t/":"ŧ", -"t~":"ť", -"u'":"ú", -"u,":"ų", -"u-":"ū", -"u.":"ů", -"u:":"ű", -"u\\":"ü", -"u^":"û", -"u`":"ù", -"u~":"ũ", -"u~":"ŭ", -"y'":"ý", -"y\\":"ÿ", -"z'":"ź", -"z.":"ż", -"z~":"ž", -"!//":"!/", -"///":"//", -"<<<":"<<", -">>>":">>", -"?//":"?/", -"$//":"$/", -"A''":"A'", -"A,,":"A,", -"A--":"A-", -"A//":"A/", -"A\\\\":"A\\", -"A^^":"A^", -"A``":"A`", -"A~~":"A~", -"C''":"C'", -"C,,":"C,", -"C..":"C.", -"C^^":"C^", -"C~~":"C~", -"D//":"D/", -"D~~":"D~", -"E''":"E'", -"E,,":"E,", -"E--":"E-", -"E..":"E.", -"E//":"E/", -"E\\\\":"E\\", -"E^^":"E^", -"E``":"E`", -"E~~":"E~", -"G,,":"G,", -"G..":"G.", -"G^^":"G^", -"G~~":"G~", -"H//":"H/", -"H^^":"H^", -"I''":"I'", -"I,,":"I,", -"I--":"I-", -"I..":"I.", -"I\\\\":"I\\", -"I^^":"I^", -"I``":"I`", -"I~~":"I~", -"J^^":"J^", -"K,,":"K,", -"L''":"L'", -"L,,":"L,", -"L//":"L/", -"L~~":"L~", -"N''":"N'", -"N,,":"N,", -"N//":"N/", -"N~~":"N~", -"O''":"O'", -"O--":"O-", -"O//":"O/", -"O::":"O:", -"O\\\\":"O\\", -"O^^":"O^", -"O``":"O`", -"O~~":"O~", -"R''":"R'", -"R,,":"R,", -"R~~":"R~", -"S''":"S'", -"S,,":"S,", -"S^^":"S^", -"S~~":"S~", -"T,,":"T,", -"T//":"T/", -"T~~":"T~", -"U''":"U'", -"U,,":"U,", -"U--":"U-", -"U..":"U.", -"U::":"U:", -"U\\\\":"U\\", -"U^^":"U^", -"U``":"U`", -"U~~":"U~", -"Y''":"Y'", -"Y\\\\":"Y\\", -"Y==":"Y=", -"Z''":"Z'", -"Z..":"Z.", -"Z~~":"Z~", -"a''":"a'", -"a,,":"a,", -"a--":"a-", -"a//":"a/", -"a\\\\":"a\\", -"a^^":"a^", -"a__":"a_", -"a``":"a`", -"a~~":"a~", -"c''":"c'", -"c,,":"c,", -"c..":"c.", -"c^^":"c^", -"c~~":"c~", -"c//":"c/", -"d//":"d/", -"d~~":"d~", -"e''":"e'", -"e,,":"e,", -"e--":"e-", -"e..":"e.", -"e//":"e/", -"e\\\\":"e\\", -"e^^":"e^", -"e``":"e`", -"e==":"e=", -"e~~":"e~", -"g,,":"g,", -"g..":"g.", -"g^^":"g^", -"g~~":"g~", -"h//":"h/", -"h^^":"h^", -"i''":"i'", -"i,,":"i,", -"i--":"i-", -"i..":"i.", -"i\\\\":"i\\", -"i^^":"i^", -"i``":"i`", -"i~~":"i~", -"j^^":"j^", -"k,,":"k,", -"k//":"k/", -"l''":"l'", -"l,,":"l,", -"l//":"l/", -"l~~":"l~", -"n''":"n'", -"n,,":"n,", -"n//":"n/", -"n~~":"n~", -"o''":"o'", -"o--":"o-", -"o//":"o/", -"o::":"o:", -"o\\\\":"o\\", -"o^^":"o^", -"o__":"o_", -"o``":"o`", -"o~~":"o~", -"r''":"r'", -"r,,":"r,", -"r~~":"r~", -"s''":"s'", -"s,,":"s,", -"s//":"s/", -"s^^":"s^", -"s~~":"s~", -"t,,":"t,", -"t//":"t/", -"t~~":"t~", -"u''":"u'", -"u,,":"u,", -"u--":"u-", -"u..":"u.", -"u::":"u:", -"u\\\\":"u\\", -"u^^":"u^", -"u``":"u`", -"u~~":"u~", -"y''":"y'", -"y\\\\":"y\\", -"z''":"z'", -"z..":"z.", -"z~~":"z~", -}); diff --git a/latn-post.mimx b/latn-post.mimx deleted file mode 100644 index 468cc65..0000000 --- a/latn-post.mimx +++ /dev/null @@ -1,3157 +0,0 @@ - - - - t - latn-post - - - Latin script input method using postfix modifiers. - | mark | postfix | examples - |------------+---------+---------- - | acute | ' | a' -> á - | grave | ` | a` -> à - | circumflex | ^ | a^ -> â - | diaeresis | " | a" -> ä - | tilde | ~ | a~ -> ã - | cedilla | , | c, -> ç - | ogonek | , | a, -> ą - | breve | ~ | g~ -> ğ - | caron | ~ | c~ -> č - | dbl. acute | : | o: -> ő - | ring | . | u. -> ů - | dot | . | z. -> ż - | stroke | / | l/ -> ł - | others | /, etc. | d/ -> ð t/ -> þ a/ -> å o/ -> ø - | | | ae/ -> æ ij -> ij oe/ -> œ s/ -> ß - | | | ?/ -> ¿ !/ -> ¡ // -> ° - | | | << -> « >> -> » o_ -> º a_ -> ª - -Repeating the postfix changes ambiguous combining marks: - Ex: A~ -> Ã, A~~ -> Ă, A~~~ -> A~ - - Latin-post - - - - - !/ - - - ¡ - - - - - !// - - - !/ - - - - - // - - - ° - - - - - /// - - - // - - - - - << - - - « - - - - - <<< - - - << - - - - - >> - - - » - - - - - >>> - - - >> - - - - - ?/ - - - ¿ - - - - - ?// - - - ?/ - - - - - $/ - - - £ - - - - - $// - - - ¤ - - - - - $/// - - - $/ - - - - - A' - - - Á - - - - - a' - - - á - - - - - A'' - - - A' - - - - - a'' - - - a' - - - - - A, - - - Ą - - - - - a, - - - ą - - - - - A,, - - - A, - - - - - a,, - - - a, - - - - - A- - - - Ā - - - - - a- - - - ā - - - - - A-- - - - A- - - - - - a-- - - - a- - - - - - A/ - - - Å - - - - - a/ - - - å - - - - - A// - - - A/ - - - - - a// - - - a/ - - - - - A" - - - Ä - - - - - a" - - - ä - - - - - A"" - - - A" - - - - - a"" - - - a" - - - - - A^ - - -  - - - - - a^ - - - â - - - - - A^^ - - - A^ - - - - - a^^ - - - a^ - - - - - A` - - - À - - - - - a` - - - à - - - - - A`` - - - A` - - - - - a`` - - - a` - - - - - A~ - - - à - - - - - a~ - - - ã - - - - - A~~ - - - Ă - - - - - a~~ - - - ă - - - - - A~~~ - - - A~ - - - - - a~~~ - - - a~ - - - - - AE/ - - - Æ - - - - - ae/ - - - æ - - - - - AE// - - - Æ/ - - - - - ae// - - - æ/ - - - - - AE/// - - - AE/ - - - - - ae/// - - - ae/ - - - - - a_ - - - ª - - - - - a__ - - - a_ - - - - - C' - - - Ć - - - - - c' - - - ć - - - - - C'' - - - C' - - - - - c'' - - - c' - - - - - C, - - - Ç - - - - - c, - - - ç - - - - - C,, - - - C, - - - - - c,, - - - c, - - - - - C. - - - Ċ - - - - - c. - - - ċ - - - - - C.. - - - C. - - - - - c.. - - - c. - - - - - C^ - - - Ĉ - - - - - c^ - - - ĉ - - - - - C^^ - - - C^ - - - - - c^^ - - - c^ - - - - - C~ - - - Č - - - - - c~ - - - č - - - - - C~~ - - - C~ - - - - - c~~ - - - c~ - - - - - c/ - - - ¢ - - - - - c// - - - c/ - - - - - D/ - - - Ð - - - - - d/ - - - ð - - - - - D// - - - Đ - - - - - d// - - - đ - - - - - D/// - - - D/ - - - - - d/// - - - d/ - - - - - D~ - - - Ď - - - - - d~ - - - ď - - - - - D~~ - - - D~ - - - - - d~~ - - - d~ - - - - - E' - - - É - - - - - e' - - - é - - - - - E'' - - - E' - - - - - e'' - - - e' - - - - - E, - - - Ę - - - - - e, - - - ę - - - - - E,, - - - E, - - - - - e,, - - - e, - - - - - E- - - - Ē - - - - - e- - - - ē - - - - - E-- - - - E- - - - - - e-- - - - e- - - - - - E. - - - Ė - - - - - e. - - - ė - - - - - E.. - - - E. - - - - - e.. - - - e. - - - - - E" - - - Ë - - - - - e" - - - ë - - - - - E"" - - - E" - - - - - e"" - - - e" - - - - - E^ - - - Ê - - - - - e^ - - - ê - - - - - E^^ - - - E^ - - - - - e^^ - - - e^ - - - - - E` - - - È - - - - - e` - - - è - - - - - E`` - - - E` - - - - - e`` - - - e` - - - - - E~ - - - Ě - - - - - e~ - - - ě - - - - - E~~ - - - Ĕ - - - - - e~~ - - - ĕ - - - - - E~~~ - - - E~ - - - - - e~~~ - - - e~ - - - - - e= - - - € - - - - - e== - - - e= - - - - - G, - - - Ģ - - - - - g, - - - ģ - - - - - G,, - - - G, - - - - - g,, - - - g, - - - - - G. - - - Ġ - - - - - g. - - - ġ - - - - - G.. - - - G. - - - - - g.. - - - g. - - - - - G^ - - - Ĝ - - - - - g^ - - - ĝ - - - - - G^^ - - - G^ - - - - - g^^ - - - g^ - - - - - G~ - - - Ğ - - - - - g~ - - - ğ - - - - - G~~ - - - G~ - - - - - g~~ - - - g~ - - - - - H/ - - - Ħ - - - - - h/ - - - ħ - - - - - H// - - - H/ - - - - - h// - - - h/ - - - - - H^ - - - Ĥ - - - - - h^ - - - ĥ - - - - - H^^ - - - H^ - - - - - h^^ - - - h^ - - - - - I' - - - Í - - - - - i' - - - í - - - - - I'' - - - I' - - - - - i'' - - - i' - - - - - I, - - - Į - - - - - i, - - - į - - - - - I,, - - - I, - - - - - i,, - - - i, - - - - - I- - - - Ī - - - - - i- - - - ī - - - - - I-- - - - I- - - - - - i-- - - - i- - - - - - I. - - - İ - - - - - i. - - - ı - - - - - I.. - - - I. - - - - - i.. - - - i. - - - - - I" - - - Ï - - - - - i" - - - ï - - - - - I"" - - - I" - - - - - i"" - - - i" - - - - - I^ - - - Î - - - - - i^ - - - î - - - - - I^^ - - - I^ - - - - - i^^ - - - i^ - - - - - I` - - - Ì - - - - - i` - - - ì - - - - - I`` - - - I` - - - - - i`` - - - i` - - - - - I~ - - - Ĩ - - - - - i~ - - - ĩ - - - - - I~~ - - - Ĭ - - - - - i~~ - - - ĭ - - - - - I~~~ - - - I~ - - - - - i~~~ - - - i~ - - - - - IJ/ - - - IJ - - - - - ij/ - - - ij - - - - - IJ// - - - IJ/ - - - - - ij// - - - ij/ - - - - - IJ/// - - - IJ/ - - - - - ij/// - - - ij/ - - - - - J^ - - - Ĵ - - - - - j^ - - - ĵ - - - - - J^^ - - - J^ - - - - - j^^ - - - j^ - - - - - K, - - - Ķ - - - - - k, - - - ķ - - - - - K,, - - - K, - - - - - k,, - - - k, - - - - - k/ - - - ĸ - - - - - k// - - - k/ - - - - - L' - - - Ĺ - - - - - l' - - - ĺ - - - - - L'' - - - L' - - - - - l'' - - - l' - - - - - L, - - - Ļ - - - - - l, - - - ļ - - - - - L,, - - - L, - - - - - l,, - - - l, - - - - - L. - - - Ŀ - - - - - l. - - - ŀ - - - - - L.. - - - L. - - - - - l.. - - - l. - - - - - L/ - - - Ł - - - - - l/ - - - ł - - - - - L// - - - L/ - - - - - l// - - - l/ - - - - - L~ - - - Ľ - - - - - l~ - - - ľ - - - - - L~~ - - - L~ - - - - - l~~ - - - l~ - - - - - N' - - - Ń - - - - - n' - - - ń - - - - - N'' - - - N' - - - - - n'' - - - n' - - - - - N, - - - Ņ - - - - - n, - - - ņ - - - - - N,, - - - N, - - - - - n,, - - - n, - - - - - N/ - - - Ŋ - - - - - n/ - - - ŋ - - - - - N// - - - N/ - - - - - n// - - - n/ - - - - - N~ - - - Ñ - - - - - n~ - - - ñ - - - - - N~~ - - - Ň - - - - - n~~ - - - ň - - - - - N~~~ - - - N~ - - - - - n~~~ - - - n~ - - - - - O' - - - Ó - - - - - o' - - - ó - - - - - O'' - - - O' - - - - - o'' - - - o' - - - - - O- - - - Ō - - - - - o- - - - ō - - - - - O-- - - - O- - - - - - o-- - - - o- - - - - - O/ - - - Ø - - - - - o/ - - - ø - - - - - O// - - - O/ - - - - - o// - - - o/ - - - - - O: - - - Ő - - - - - o: - - - ő - - - - - O:: - - - O: - - - - - o:: - - - o: - - - - - O" - - - Ö - - - - - o" - - - ö - - - - - O"" - - - O" - - - - - o"" - - - o" - - - - - O^ - - - Ô - - - - - o^ - - - ô - - - - - O^^ - - - O^ - - - - - o^^ - - - o^ - - - - - O` - - - Ò - - - - - o` - - - ò - - - - - O`` - - - O` - - - - - o`` - - - o` - - - - - O~ - - - Õ - - - - - o~ - - - õ - - - - - O~~ - - - Ŏ - - - - - o~~ - - - ŏ - - - - - O~~~ - - - O~ - - - - - o~~~ - - - o~ - - - - - OE/ - - - Œ - - - - - oe/ - - - œ - - - - - OE// - - - Œ/ - - - - - oe// - - - œ/ - - - - - OE/// - - - OE/ - - - - - oe/// - - - oe/ - - - - - o_ - - - º - - - - - o__ - - - o_ - - - - - R' - - - Ŕ - - - - - r' - - - ŕ - - - - - R'' - - - R' - - - - - r'' - - - r' - - - - - R, - - - Ŗ - - - - - r, - - - ŗ - - - - - R,, - - - R, - - - - - r,, - - - r, - - - - - R~ - - - Ř - - - - - r~ - - - ř - - - - - R~~ - - - R~ - - - - - r~~ - - - r~ - - - - - S' - - - Ś - - - - - s' - - - ś - - - - - S'' - - - S' - - - - - s'' - - - s' - - - - - S, - - - Ş - - - - - s, - - - ş - - - - - S,, - - - S, - - - - - s,, - - - s, - - - - - S^ - - - Ŝ - - - - - s^ - - - ŝ - - - - - S^^ - - - S^ - - - - - s^^ - - - s^ - - - - - S~ - - - Š - - - - - s~ - - - š - - - - - S~~ - - - S~ - - - - - s~~ - - - s~ - - - - - s/ - - - ß - - - - - s// - - - s/ - - - - - T, - - - Ţ - - - - - t, - - - ţ - - - - - T,, - - - T, - - - - - t,, - - - t, - - - - - T/ - - - Þ - - - - - t/ - - - þ - - - - - T// - - - Ŧ - - - - - t// - - - ŧ - - - - - T/// - - - T/ - - - - - t/// - - - t/ - - - - - T~ - - - Ť - - - - - t~ - - - ť - - - - - T~~ - - - T~ - - - - - t~~ - - - t~ - - - - - U' - - - Ú - - - - - u' - - - ú - - - - - U'' - - - U' - - - - - u'' - - - u' - - - - - U, - - - Ų - - - - - u, - - - ų - - - - - U,, - - - U, - - - - - u,, - - - u, - - - - - U- - - - Ū - - - - - u- - - - ū - - - - - U-- - - - U- - - - - - u-- - - - u- - - - - - U/ - - - Ů - - - - - u/ - - - ů - - - - - U// - - - U/ - - - - - u// - - - u/ - - - - - U: - - - Ű - - - - - u: - - - ű - - - - - U:: - - - U: - - - - - u:: - - - u: - - - - - U" - - - Ü - - - - - u" - - - ü - - - - - U"" - - - U" - - - - - u"" - - - u" - - - - - U^ - - - Û - - - - - u^ - - - û - - - - - U^^ - - - U^ - - - - - u^^ - - - u^ - - - - - U` - - - Ù - - - - - u` - - - ù - - - - - U`` - - - U` - - - - - u`` - - - u` - - - - - U~ - - - Ũ - - - - - u~ - - - ũ - - - - - U~~ - - - Ŭ - - - - - u~~ - - - ŭ - - - - - U~~~ - - - U~ - - - - - u~~~ - - - u~ - - - - - W^ - - - Ŵ - - - - - w^ - - - ŵ - - - - - W^^ - - - W^ - - - - - w^^ - - - w^ - - - - - Y' - - - Ý - - - - - y' - - - ý - - - - - Y'' - - - Y' - - - - - y'' - - - y' - - - - - Y^ - - - Ŷ - - - - - y^ - - - ŷ - - - - - Y^^ - - - Y^ - - - - - y^^ - - - y^ - - - - - Y" - - - Ÿ - - - - - y" - - - ÿ - - - - - Y"" - - - Y" - - - - - y"" - - - y" - - - - - Y= - - - ¥ - - - - - Y== - - - Y= - - - - - Z' - - - Ź - - - - - z' - - - ź - - - - - Z'' - - - Z' - - - - - z'' - - - z' - - - - - Z. - - - Ż - - - - - z. - - - ż - - - - - Z.. - - - Z. - - - - - z.. - - - z. - - - - - Z~ - - - Ž - - - - - z~ - - - ž - - - - - Z~~ - - - Z~ - - - - - z~~ - - - z~ - - - - - - - - - - \ No newline at end of file diff --git a/mim.js b/mim.js index be5bf7b..5dac255 100644 --- a/mim.js +++ b/mim.js @@ -1,280 +1,1705 @@ -// -* coding: utf-8; -* - -var MIM = {}; - -// URL of the input method server. -MIM.server = "http://www.m17n.org/common/mim-js", -// Boolean flag to tell if MIM is active or not. -MIM.enabled = true; -// Boolean flag to tell if MIM is running in debug mode or not. -MIM.debug = false; -// List of registered input methods. -MIM.list = new Array (); -// Currently selected input method. -MIM.current_im = false; - -MIM.im = function (lang, name, filename) -{ - this.status = 0; /* 0: not-yet-loaded, 1:loading, 2:loaded, -1:error */ - this.url = MIM.server + "/" + filename; - this.lang = lang; - this.name = name; - this.keymap = false; - this.body = null; +var MIM = { + // URL of the input method server. + server: "http://www.m17n.org/common/mim-js", + // Boolean flag to tell if MIM is active or not. + enabled: true, + // Boolean flag to tell if MIM is running in debug mode or not. + debug: false, + // List of main input methods. + imlist: {}, + // List of extra input methods; + imextra: {}, + // Global input method data + im_global: null, + // Currently selected input method. + current: false, + + // enum + LoadStatus: { NotLoaded:0, Loading:1, Loaded:2, Error:-1 }, + ChangedStatus: { + None: 0x00, + StateTitle: 0x01, + PreeditText:0x02, + CursorPos: 0x04, + CandidateList:0x08, + CandidateIndex:0x10, + CandidateShow:0x20, + Preedit: 0x06, // PreeditText | CursorPos + Candidate: 0x38 // CandidateList | CandidateIndex | CandidateShow + }, + KeyModifier: { + SL: 0x00400000, + SR: 0x00800000, + S: 0x00C00000, + CL: 0x01000000, + CR: 0x02000000, + C: 0x03000000, + AL: 0x04000000, + AR: 0x08000000, + A: 0x0C000000, + ML: 0x04000000, + MR: 0x08000000, + M: 0x0C000000, + G: 0x10000000, + s: 0x20000000, + H: 0x40000000, + High: 0x70000000, + All: 0x7FC00000 + }, + Error: { + ParseError: "parse-error" + } +}; + +(function () { + var keysyms = new Array (); + keysyms["bs"] = "backspace"; + keysyms["lf"] = "linefeed"; + keysyms["cr"] = keysyms["enter"] = "return"; + keysyms["esc"] = "escape"; + keysyms["spc"] = "space"; + keysyms["del"] = "delete"; - function add_keystring (map, keystring, str) + function decode_keysym (str) { + if (str.length == 1) + return str; + var parts = str.split ("-"); + var len = parts.length, i; + var has_modifier = len > 1; + + for (i = 0; i < len - 1; i++) + if (! MIM.KeyModifier.hasOwnProperty (parts[i])) + return false; + var key = parts[len - 1]; + if (key.length > 1) + { + key = keysyms[key.toLowerCase ()]; + if (key) + { + if (len > 1) + { + str = parts[0]; + for (i = 1; i < len - 1; i++) + str += '-' + parts[i]; + str += '-' + key; + } + else + str = key; + } + } + if (has_modifier) + { + parts = new Array (); + parts.push (str); + return parts; + } + return str; + } + + MIM.Key = function (val) { - var i, c; - var newmap; - var intermediate_string = ""; + this.key; + if (val instanceof Xex.Term) + this.key = val.val; + else if (typeof val == 'string' || val instanceof String) + { + this.key = decode_keysym (val); + if (! this.key) + throw new Xex.ErrTerm (MIM.Error.ParseError, "Invalid key: " + val); + if (this.key instanceof Array) + { + this.key = this.key[0]; + this.has_modifier = true; + } + } + else if (typeof val == 'number' || val instanceof Number) + this.key = String.fromCharCode (val); + else + throw new Xex.ErrTerm (MIM.Error.ParseError, "Invalid key: " + val); + } - for (i = 0; i < keystring.length; i++) - { - c = keystring.charAt (i); - if (c in map) - { - map = map[c]; - if ('_target_text' in map) - intermediate_string = map['_target_text']; - else - intermediate_string += c; - } - else - { - newmap = new Array (); - map[c] = newmap; - map['_has_child'] = true; - map = newmap; - intermediate_string += c; - map['_target_text'] = intermediate_string; + MIM.Key.prototype.toString = function () { return this.key; }; + + MIM.Key.FocusIn = new MIM.Key (new Xex.StrTerm ('input-focus-in')); + MIM.Key.FocusOut = new MIM.Key (new Xex.StrTerm ('input-focus-out')); + MIM.Key.FocusMove = new MIM.Key (new Xex.StrTerm ('input-focus-move')); +}) (); + +(function () { + MIM.KeySeq = function (seq) + { + this.val = new Array (); + + if (seq) + { + if (seq.IsList) + { + var len = seq.val.length; + for (var i = 0; i < len; i++) + { + var v = seq.val[i], key; + if (v.type == 'symbol' || v.type == 'string') + key = new MIM.Key (v); + else if (v.type == 'integer') + key = new MIM.Key (v.val); + else + throw new Xex.ErrTerm (MIM.Error.ParseError, + "Invalid key: " + v); + this.val.push (key); + if (key.has_modifier) + this.has_modifier = true; + } + } + else if (seq.IsStr) + { + var len = seq.val.length; + for (var i = 0; i < len; i++) + this.val.push (new MIM.Key (seq.val.charCodeAt (i))); + } + else + throw new Xex.ErrTerm (MIM.Error.ParseError, "Invalid key: " + seq); + } + } + + var proto = new Xex.Term ('keyseq'); + proto.Clone = function () { return this; } + proto.Parser = function (domain, node) + { + var seq = new Array (); + for (node = node.firstChild; node; node = node.nextSibling) + if (node.nodeType == 1) + { + var term = Xex.Term.Parse (domain, node); + return new MIM.KeySeq (term); } - } - map['_target_text'] = str; + throw new Xex.ErrTerm (MIM.Error.ParseError, "Invalid keyseq"); + } + proto.toString = function () + { + var len = this.val.length; + if (len == 0) + return ''; + var first = true; + var str = ''; + for (var i = 0; i < len; i++) + { + if (first) + first = false; + else if (this.has_modifier) + str += ' '; + str += this.val[i].toString (); + } + return str + ''; } - this.lookup = function (keyseq, limit) + MIM.KeySeq.prototype = proto; +}) (); + +(function () { + MIM.Marker = function () { } + MIM.Marker.prototype = new Xex.Term ('marker'); + MIM.Marker.prototype.CharAt = function (ic) { - var map = this.keymap; + var p = this.Position (ic); + if (p < 0 || p >= ic.preedit.length) + return 0; + return ic.preedit.charCodeAt (p); + } - if (limit > keyseq.length) - limit = keyseq.length; - for (var i = 0; i < limit; i++) + MIM.FloatingMarker = function (name) { this.val = name; }; + var proto = new MIM.Marker (); + MIM.FloatingMarker.prototype = proto; + proto.Position = function (ic) { return ic.marker_positions[this.val]; }; + proto.Mark = function (ic) { ic.marker_positions[this.val] = ic.cursor_pos; }; + + MIM.PredefinedMarker = function (name) { this.val = name; } + MIM.PredefinedMarker.prototype = new MIM.Marker (); + MIM.PredefinedMarker.prototype.Position = function (ic) + { + if (typeof this.pos == 'number') + return this.pos; + return this.pos (ic); + } + + var predefined = { } + + function def_predefined (name, position) + { + predefined[name] = new MIM.PredefinedMarker (name); + predefined[name].pos = position; + } + + def_predefined ('@<', 0); + def_predefined ('@>', function (ic) { return ic.preedit.length; }); + def_predefined ('@-', function (ic) { return ic.cursor_pos - 1; }); + def_predefined ('@+', function (ic) { return ic.cursor_pos + 1; }); + def_predefined ('@[', function (ic) { + if (ic.cursor_pos > 0) { - var c = keyseq[i]; - if (! (c in map)) - return i; - map = map[c]; + var pos = ic.cursor_pos; + return ic.preedit.FindProp ('candidates', pos - 1).from; } - return map; - } + return 0; + }); + def_predefined ('@]', function (ic) { + if (ic.cursor_pos < ic.preedit.length - 1) + { + var pos = ic.cursor_pos; + return ic.preedit.FindProp ('candidates', pos).to; + } + return ic.preedit.length; + }); + for (var i = 0; i < 10; i++) + def_predefined ("@" + i, i); + predefined['@first'] = predefined['@<']; + predefined['@last'] = predefined['@>']; + predefined['@previous'] = predefined['@-']; + predefined['@next'] = predefined['@+']; + predefined['@previous-candidate-change'] = predefined['@[']; + predefined['@next-candidate-change'] = predefined['@]']; - this.load_map = function (mapdef) + MIM.SurroundMarker = function (name) + { + this.val = name; + this.distance = parseInt (name.slice (1)); + if (isNaN (this.distance)) + throw new Xex.ErrTerm (MIM.Error.ParseError, "Invalid marker: " + name); + } + MIM.SurroundMarker.prototype = new MIM.Marker (); + MIM.SurroundMarker.prototype.Position = function (ic) + { + return ic.cursor_pos + this.distance; + } + MIM.SurroundMarker.prototype.CharAt = function (ic) { - this.keymap = new Array (); - for (var keystring in mapdef) - add_keystring (this.keymap, keystring, mapdef[keystring]); + if (this.val == '@-0') + return -1; + var p = this.Position (ic); + if (p < 0) + return ic.GetSurroundingChar (p); + else if (p >= ic.preedit.length) + return ic.GetSurroundingChar (p - ic.preedit.length); + return ic.preedit.charCodeAt (p); } - this.load_map_node = function () + MIM.Marker.prototype.Parser = function (domain, node) { - this.keymap = new Array (); - var maps = this.body.getElementsByTagName ('map'); - var map = maps[0]; - var rules = map.getElementsByTagName ('rule'); - for (var i = 0; i < rules.length; i++) + var name = node.firstChild.nodeValue; + if (name.charAt (0) == '@') { - var rule = rules[i]; - var keyseq_elm = MIM.first_element (rule); - var keystring = keyseq_elm.attributes[0].nodeValue; - var insert_elm = MIM.next_element (rule); - var str = insert_elm.attributes[0].nodeValue; - add_keystring (this.keymap, keystring, str); + var n = predefined[name]; + if (n) + return n; + if (name.charAt (1) == '-' || name.charAt (1) == '+') + return new MIM.SurroundMarker (name); + throw new Xex.ErrTerm (MIM.Error.ParseError, + "Invalid marker: " + name); } + return new MIM.FloatingMarker (name);; } -}; +}) (); -MIM.error_return = function (msg, ret) +MIM.Selector = function (name) { - alert (msg); - return ret; + this.val = name; } +MIM.Selector.prototype = new Xex.Term ('selector'); + +(function () { + var selectors = {}; + selectors["@<"] = selectors["@first"] = new MIM.Selector ('@<'); + selectors["@="] = selectors["@current"] = new MIM.Selector ('@='); + selectors["@>"] = selectors["@last"] = new MIM.Selector ('@>'); + selectors["@-"] = selectors["@previous"] = new MIM.Selector ('@-'); + selectors["@+"] = selectors["@next"] = new MIM.Selector ('@+'); + selectors["@["] = selectors["@previous-group"] = new MIM.Selector ('@['); + selectors["@]"] = selectors["@next-group"] = new MIM.Selector ('@]'); -MIM.first_element = function (node) + MIM.Selector.prototype.Parser = function (domain, node) + { + var name = node.firstChild.nodeValue; + var s = selectors[name]; + if (! s) + throw new Xex.ErrTerm (MIM.Error.ParseError, + "Invalid selector: " + name); + return s; + } +}) (); + +MIM.Rule = function (keyseq, actions) +{ + this.keyseq = keyseq; + if (actions) + this.actions = actions; +} +MIM.Rule.prototype = new Xex.Term ('rule'); +MIM.Rule.prototype.Parser = function (domain, node) { - node.mim_index = 0; - return MIM.next_element (node); + var n; + for (n = node.firstChild; n && n.nodeType != 1; n = n.nextSibling); + if (! n) + throw new Xex.ErrTerm (MIM.Error.ParseError, "invalid rule:" + node); + var keyseq = Xex.Term.Parse (domain, n); + if (keyseq.type != 'keyseq') + throw new Xex.ErrTerm (MIM.Error.ParseError, "invalid rule:" + node); + var actions = null; + n = n.nextElement (); + if (n) + actions = Xex.Term.Parse (domain, n, null); + return new MIM.Rule (keyseq, actions); } +MIM.Rule.prototype.toString = function () +{ + return ''; +} + +MIM.Map = function (name) +{ + this.name = name; + this.rules = new Array (); +}; + +(function () { + var proto = new Xex.Term ('map'); + + proto.Parser = function (domain, node) + { + var name = node.attributes['mname'].nodeValue; + if (! name) + throw new Xex.ErrTerm (MIM.Error.ParseError, "invalid map"); + var map = new MIM.Map (name); + for (var n = node.firstChild; n; n = n.nextSibling) + if (n.nodeType == 1) + map.rules.push (Xex.Term.Parse (domain, n)); + return map; + } + + proto.toString = function () + { + var str = ''; + var len = this.rules.length; + for (i = 0; i < len; i++) + str += this.rules[i]; + return str + ''; + } + + MIM.Map.prototype = proto; +}) (); -MIM.next_element = function (node) +Xex.CatchTag._mimtag = new Xex.SymTerm ('@mimtag'); + +MIM.Action = function (domain, terms) { - var element = node.childNodes[node.mim_index++]; - while (element && element.nodeType != 1) - element = node.childNodes[node.mim_index++]; - return element; + var args = new Array (); + args.push (Xex.CatchTag_.mimtag); + for (var i = 0; i < terms.length; i++) + args.push (terms[i]); + this.action = Xex.Funcall.prototype.New (domain, 'catch', null, args); } -MIM.check_map = function (im, map) +MIM.Action.prototype.Run = function (domain) { - var rules = map.getElementsByTagName ('rule'); - var len = rules.length; - - for (var i = 0; i < len; i++) + var result = this.action.Eval (domain); + if (result.type == 'error') { - var rule = rules[i]; - var elm = MIM.first_element (rule); - - if (!elm || elm.nodeName != 'keyseq') - return false; - while ((elm = MIM.next_element (rule))) - if (elm.nodeName != 'insert') - return false; + domain.context.Error = result.toString (); + return false; } - return true; + return (result != Xex.CatchTag._mimtag); } -MIM.check_state = function (im, state) +MIM.Keymap = function () +{ + this.name = 'TOP'; + this.submaps = null; +}; + +(function () { + var proto = {}; + + function add_rule (keymap, rule, branch_actions) + { + var keyseq = rule.keyseq; + var len = keyseq.val.length; + var name = ''; + + for (var i = 0; i < len; i++) + { + var key = keyseq.val[i]; + var sub = false; + + name += key.key; + if (! keymap.submaps) + keymap.submaps = {}; + else + sub = keymap.submaps[key.key]; + if (! sub) + keymap.submaps[key.key] = sub = new MIM.Keymap (); + keymap = sub; + keymap.name = name; + } + keymap.map_actions = rule.actions; + if (branch_actions) + keymap.branch_actions = branch_actions; + } + + proto.Add = function (map, branch_actions) + { + var rules = map.rules; + var len = rules.length; + + for (var i = 0; i < len; i++) + add_rule (this, rules[i], branch_actions); + } + proto.Lookup = function (keys, index) + { + var sub; + + if (index < keys.val.length && this.submaps + && ! keys.val[index]) + { + Xex.Log ('invalid key at ' + index); + throw 'invalid key'; + } + + if (index < keys.val.length && this.submaps + && (sub = this.submaps[keys.val[index].key])) + { + index++; + return sub.Lookup (keys, index); + } + return { map: this, index: index }; + } + + MIM.Keymap.prototype = proto; +}) (); + +MIM.State = function (name) { - var branches = state.getElementsByTagName ('branch'); - var len = branches.length; + this.name = name; + this.keymap = new MIM.Keymap (); +}; + +(function () { + var proto = new Xex.Term ('state'); + + proto.Parser = function (domain, node) + { + var map_list = domain.map_list; + var name = node.attributes['sname'].nodeValue; + if (! name) + throw new Xex.ErrTerm (MIM.Error.ParseError, "invalid map"); + var state = new MIM.State (name); + for (node = node.firstElement (); node; node = node.nextElement ()) + { + if (node.nodeName == 'title') + state.title = node.firstChild.nodeValue; + else + { + var n = node.firstElement (); + var branch_actions = n ? Xex.Term.Parse (domain, n, null) : null; + if (node.nodeName == 'branch') + state.keymap.Add (map_list[node.attributes['mname'].nodeValue], + branch_actions); + else if (node.nodeName == 'state-hook') + state.enter_actions = branch_actions; + else if (node.nodeName == 'catch-all-branch') + state.fallback_actions = branch_actions; + } + } + return state; + } + + proto.toString = function () + { + return '' + this.keymap + ''; + } + + MIM.State.prototype = proto; +}) (); + +(function () { + function Block (index, term) + { + this.Index = index; + if (term.IsStr) + this.Data = term.val; + else if (term.IsList) + { + this.Data = new Array (); + for (var i = 0; i < term.val.length; i++) + this.Data.push (term.val[i].val); + } + } + + Block.prototype.Count = function () { return this.Data.length; } + Block.prototype.get = function (i) + { + return (this.Data instanceof Array ? this.Data[i] : this.Data.charAt (i)); + } + + MIM.Candidates = function (ic, candidates, column) + { + this.ic = ic; + this.column = column; + this.row = 0; + this.index = 0; + this.total = 0; + this.blocks = new Array (); + + for (var i = 0; i < candidates.length; i++) + { + var block = new Block (this.total, candidates[i]); + this.blocks.push (block); + this.total += block.Count (); + } + } + + function get_col () + { + return (this.column > 0 ? this.index % this.column + : this.index - this.blocks[this.row].Index); + } + + function prev_group () + { + var col = get_col.call (this); + var nitems; + if (this.column > 0) + { + this.index -= this.column; + if (this.index >= 0) + nitems = this.column; + else + { + var lastcol = (this.total - 1) % this.column; + this.index = (col < lastcol ? this.total - lastcol + col + : this.total - 1); + this.row = this.blocks.length - 1; + nitems = lastcol + 1; + } + while (this.blocks[this.row].Index > this.index) + this.row--; + } + else + { + this.row = this.row > 0 ? this.row - 1 : this.blocks.length - 1; + nitems = this.blocks[this.row].Count (); + this.index = (this.blocks[this.row].Index + + (col < nitems ? col : nitems - 1)); + } + return nitems; + } + + function next_group () + { + var col = get_col.call (this); + var nitems; + if (this.column > 0) + { + this.index += this.column - col; + if (this.index < this.total) + { + if (this.index + col >= this.total) + { + nitems = this.total - this.index; + this.index = this.total - 1; + } + else + { + nitems = this.column; + this.index += col; + } + } + else + { + this.index = col; + this.row = 0; + } + while (this.blocks[this.row].Index + this.blocks[this.row].Count () + <= this.index) + this.row++; + } + else + { + this.row = this.row < this.blocks.length - 1 ? this.row + 1 : 0; + nitems = this.blocks[this.row].Count (); + this.index = (this.blocks[this.row].Index + + (col < nitems ? col : nitems - 1)); + } + return nitems; + } + + function prev () + { + if (this.index == 0) + { + this.index = this.total - 1; + this.row = this.blocks.length - 1; + } + else + { + this.index--; + if (this.blocks[this.row].Index > this.index) + this.row--; + } + } + + function next () + { + this.index++; + if (this.index == this.total) + { + this.index = 0; + this.row = 0; + } + else + { + var b = this.blocks[this.row]; + if (this.index == b.Index + b.Count ()) + this.row++; + } + } + + function first () + { + this.index -= get_col.call (this); + while (this.blocks[this.row].Index > this.index) + this.row--; + } + + function last () + { + var b = this.blocks[this.row]; + if (this.column > 0) + { + if (this.index + 1 < this.total) + { + this.index += this.column - get_col.call (this) + 1; + while (b.Index + b.Count () <= this.index) + b = this.blocks[++this.row]; + } + } + else + this.index = b.Index + b.Count () - 1; + } + + MIM.Candidates.prototype.Current = function () + { + var b = this.blocks[this.row]; + return b.get (this.index - b.Index); + } + + MIM.Candidates.prototype.Select = function (selector) + { + var idx = this.index; + var gidx = this.column > 0 ? idx / this.column : this.row; + if (selector.type == 'selector') + { + switch (selector.val) + { + case '@<': first.call (this); break; + case '@>': last.call (this); break; + case '@-': prev.call (this); break; + case '@+': next.call (this); break; + case '@[': prev_group.call (this); break; + case '@]': next_group.call (this); break; + default: break; + } + } + else + { + var col, start, end + if (this.column > 0) + { + col = this.index % this.column; + start = this.index - col; + end = start + this.column; + } + else + { + start = this.blocks[this.row].Index; + col = this.index - start; + end = start + this.blocks[this.row].Count; + } + if (end > this.total) + end = this.total; + this.index += selector.val - col; + if (this.index >= end) + this.index = end - 1; + if (this.column > 0) + { + if (selector.val > col) + while (this.blocks[this.row].Index + this.blocks[this.row].Count + < this.index) + this.row++; + else + while (this.blocks[this.row].Index > this.index) + this.row--; + } + } + var newgidx = this.column > 0 ? this.index / this.column : this.row; + if (this.index != idx) + this.ic.changed |= (gidx == newgidx + ? MIM.ChangedStatus.CandidateIndex + : MIM.ChangedStatus.CandidateList); + return this.Current (); + } + + MIM.Candidates.prototype.CurrentCol = function () + { + return get_col.call (this); + } + + MIM.Candidates.prototype.CurrentGroup = function () + { + var col, start, end, gnum, gidx; + if (this.column > 0) + { + gnum = Math.floor ((this.total - 1) / this.column) + 1; + col = this.index % this.column; + start = this.index - col; + gidx = start / this.column + 1; + end = start + this.column; + if (end > this.total) + end = this.total; + } + else + { + gnum = this.blocks.length; + gidx = this.row + 1; + start = this.blocks[this.row].Index; + col = this.index - start; + end = start + this.blocks[this.row].Count (); + } + var group = new Array (); + var indices = new Array (gnum, gidx, col); + group.push (indices); + var row = this.row; + var block = this.blocks[row++]; + while (start < end) + { + var c = block.get (start - block.Index); + group.push (c); + start++; + if (start == block.Index + block.Count ()) + block = this.blocks[row++]; + } + return group; + } +}) (); + +MIM.im_domain = new Xex.Domain ('input-method', null, null); +MIM.im_domain.DefType (MIM.KeySeq.prototype); +MIM.im_domain.DefType (MIM.Marker.prototype); +MIM.im_domain.DefType (MIM.Selector.prototype); +MIM.im_domain.DefType (MIM.Rule.prototype); +MIM.im_domain.DefType (MIM.Map.prototype); +MIM.im_domain.DefType (MIM.State.prototype); + +(function () { + var im_domain = MIM.im_domain; + + function Finsert (domain, vari, args) + { + var text; + if (args[0].type == 'integer') + text = String.fromCharCode (args[0].val); + else + text = args[0].val; + domain.context.ins (text, null); + return args[0]; + } + + function Finsert_candidates (domain, vari, args) + { + var ic = domain.context; + var gsize = domain.variables['candidates-group-size']; + var candidates = new MIM.Candidates (ic, args, + gsize ? gsize.val.Intval () : 0); + ic.ins (candidates.Current (), candidates); + return args[0]; + } + + function Fdelete (domain, vari, args) + { + var ic = domain.context; + var pos = args[0].IsInt ? args[0].Intval () : args[0].Position (ic); + return new Xex.IntTerm (ic.del (pos)); + } + + function Fselect (domain, vari, args) + { + var ic = domain.context; + var can = ic.candidates; + + if (can) + { + var old_text = can.Current (); + var new_text = can.Select (args[0]); + ic.rep (old_text, new_text, can); + } + else + Xex.Log ('no candidates at ' + ic.cursor_pos + ' of ' + ic.candidate_table.table.length); + return args[0]; + } + + function Fshow (domain, vari, args) + { + domain.context.candidate_show = true; + domain.context.changed |= MIM.ChangedStatus.CandidateShow; + return Xex.nil; + } + + function Fhide (domain, vari, args) + { + domain.context.candidate_show = false; + domain.context.changed |= MIM.ChangedStatus.CandidateShow; + return Xex.nil; + } + + function Fchar_at (domain, vari, args) + { + return new Xex.IntTerm (args[0].CharAt (domain.context)); + } + + function Fmove (domain, vari, args) + { + var ic = domain.context; + var pos = args[0].IsInt ? args[0].val : args[0].Position (ic); + ic.move (pos); + return new Xex.IntTerm (pos); + } + + function Fmark (domain, vari, args) + { + args[0].Mark (domain.context); + return args[0]; + } + + function Fpushback (domain, vari, args) + { + var a = (args[0].IsInt ? args[0].Intval () + : args[0].IsStr ? new KeySeq (args[0]) + : args[0]); + domain.context.pushback (a); + return args[0]; + } + + function Fpop (domain, vari, args) + { + var ic = domain.context; + if (ic.key_head < ic.keys.val.length) + ic.keys.val.splice (ic.keys_head, 1); + return Xex.nil; + } + + function Fundo (domain, vari, args) + { + var ic = domain.context; + var n = args.length == 0 ? -2 : args[0].val; + Xex.Log ('undo with arg ' + args[0]); + if (n < 0) + ic.keys.val.splice (ic.keys.val.length + n, -n); + else + ic.keys.val.splice (n, ic.keys.val.length); + ic.reset (false); + return Xex.nil; + } + + function Fcommit (domain, vari, args) + { + domain.context.commit (); + return Xex.nil; + } + + function Funhandle (domain, vari, args) + { + domain.context.commit (); + return Xex.Fthrow (domain, vari, Xex.CatchTag._mimtag); + } + + function Fshift (domain, vari, args) + { + var ic = domain.context; + var state_name = args[0].val; + var state = ic.im.state_list[state_name]; + if (! state) + throw ("Unknown state: " + state_name); + ic.shift (state); + return args[0]; + } + + function Fshiftback (domain, vari, args) + { + domain.context.shift (null); + return Xex.nil; + } + + function Fkey_count (domain, vari, args) + { + return new Xex.IntTerm (domain.context.key_head); + } + + function Fsurrounding_flag (domain, vari, args) + { + return new Xex.IntTerm (-1); + } + + im_domain.DefSubr (Finsert, "insert", false, 1, 1); + im_domain.DefSubr (Finsert_candidates, "insert-candidates", false, 1, 1); + im_domain.DefSubr (Fdelete, "delete", false, 1, 1); + im_domain.DefSubr (Fselect, "select", false, 1, 1); + im_domain.DefSubr (Fshow, "show-candidates", false, 0, 0); + im_domain.DefSubr (Fhide, "hide-candidates", false, 0, 0); + im_domain.DefSubr (Fmove, "move", false, 1, 1); + im_domain.DefSubr (Fmark, "mark", false, 1, 1); + im_domain.DefSubr (Fpushback, "pushback", false, 1, 1); + im_domain.DefSubr (Fpop, "pop", false, 0, 0); + im_domain.DefSubr (Fundo, "undo", false, 0, 1); + im_domain.DefSubr (Fcommit, "commit", false, 0, 0); + im_domain.DefSubr (Funhandle, "unhandle", false, 0, 0); + im_domain.DefSubr (Fshift, "shift", false, 1, 1); + im_domain.DefSubr (Fshiftback, "shiftback", false, 0, 0); + im_domain.DefSubr (Fchar_at, "char-at", false, 1, 1); + im_domain.DefSubr (Fkey_count, "key-count", false, 0, 0); + im_domain.DefSubr (Fsurrounding_flag, "surrounding-text-flag", false, 0, 0); +}) (); + + +(function () { + function get_global_var (vname) + { + if (MIM.im_global.load_status == MIM.LoadStatus.NotLoaded) + MIM.im_global.Load () + return MIM.im_global.domain.variables[vname]; + } + + function include (node) + { + node = node.firstElement (); + if (node.nodeName != 'tags') + return null; + + var lang = null, name = null, extra = null; + for (node = node.firstElement (); node; node = node.nextElement ()) + { + if (node.nodeName == 'language') + lang = node.firstChild.nodeValue; + else if (node.nodeName == 'name') + name = node.firstChild.nodeValue; + else if (node.nodeName == 'extra-id') + extra = node.firstChild.nodeValue; + } + if (! lang || ! MIM.imlist[lang]) + return null; + if (! extra) + { + if (! name || ! (im = MIM.imlist[lang][name])) + return null; + } + else + { + if (! (im = MIM.imextra[lang][extra])) + return null; + } + if (im.load_status != MIM.LoadStatus.Loaded + && (im.load_status != MIM.LoadStatus.NotLoaded || ! im.Load ())) + return null; + return im; + } + + var parsers = { }; + + parsers['description'] = function (node) + { + this.description = node.firstChild.nodeValue; + } + parsers['variable-list'] = function (node) + { + for (node = node.firstElement (); node; node = node.nextElement ()) + { + var vname = node.attributes['vname'].nodeValue; + if (this != MIM.im_global) + { + var vari = get_global_var (vname); + if (vari != null) + this.domain.Defvar (vname, vari.desc, vari.val, vari.range); + } + vname = Xex.Term.Parse (this.domain, node) + } + } + parsers['command-list'] = function (node) + { + } + parsers['macro-list'] = function (node) + { + for (var n = node.firstElement (); n; n = n.nextElement ()) + if (n.nodeName == 'xi:include') + { + var im = include (n); + if (! im) + alert ('inclusion fail'); + else + for (var macro in im.domain.functions) + { + var func = im.domain.functions[macro]; + if (func instanceof Xex.Macro) + im.domain.CopyFunc (this.domain, macro); + } + n = n.previousSibling; + node.removeChild (n.nextSibling); + } + Xex.Term.Parse (this.domain, node.firstElement (), null); + } + parsers['title'] = function (node) + { + this.title = node.firstChild.nodeValue; + } + parsers['map-list'] = function (node) + { + for (node = node.firstElement (); node; node = node.nextElement ()) + { + if (node.nodeName == 'xi:include') + { + var im = include (node); + if (! im) + { + alert ('inclusion fail'); + continue; + } + for (var mname in im.map_list) + this.map_list[mname] = im.map_list[mname]; + } + else + { + var map = Xex.Term.Parse (this.domain, node); + this.map_list[map.name] = map; + } + } + } + parsers['state-list'] = function (node) + { + this.domain.map_list = this.map_list; + for (node = node.firstElement (); node; node = node.nextElement ()) + { + if (node.nodeName == 'xi:include') + { + var im = include (node); + if (! im) + alert ('inclusion fail'); + for (var sname in im.state_list) + { + state = im.state_list[sname]; + if (! this.initial_state) + this.initial_state = state; + this.state_list[sname] = state; + } + } + else if (node.nodeName == 'state') + { + var state = Xex.Term.Parse (this.domain, node); + if (! state.title) + state.title = this.title; + if (! this.initial_state) + this.initial_state = state; + this.state_list[state.name] = state; + } + } + delete this.domain.map_list; + } + + MIM.IM = function (lang, name, extra_id, file) + { + this.lang = lang; + this.name = name; + this.extra_id = extra_id; + this.file = file; + this.load_status = MIM.LoadStatus.NotLoaded; + this.domain = new Xex.Domain (this.lang + '-' + + (this.name != 'nil' + ? this.name : this.extra_id), + MIM.im_domain, null); + } + + var proto = { + Load: function () + { + var node = Xex.Load (null, this.file); + if (! node) + { + this.load_status = MIM.LoadStatus.Error; + return false; + } + this.map_list = {}; + this.initial_state = null; + this.state_list = {}; + for (node = node.firstElement (); node; node = node.nextElement ()) + { + var name = node.nodeName; + var parser = parsers[name]; + if (parser) + parser.call (this, node); + } + this.load_status = MIM.LoadStatus.Loaded; + return true; + } + } + + MIM.IM.prototype = proto; + + MIM.IC = function (im, target) + { + if (im.load_status == MIM.LoadStatus.NotLoaded) + im.Load (); + if (im.load_status != MIM.LoadStatus.Loaded) + alert ('im:' + im.name + ' error:' + im.load_status); + this.im = im; + this.target = target; + this.domain = new Xex.Domain ('context', im.domain, this); + this.active = true; + this.range = new Array (); + this.range[0] = this.range[1] = 0; + this.state = null; + this.initial_state = this.im.initial_state; + this.keys = new MIM.KeySeq (); + this.marker_positions = new Array (); + this.candidate_table = new MIM.CandidateTable (); + this.reset (false); + } + + MIM.CandidateTable = function () + { + this.table = new Array (); + } + + MIM.CandidateTable.prototype.get = function (pos) + { + for (var i = 0; i < this.table.length; i++) + { + var elt = this.table[i]; + if (elt.from < pos && pos <= elt.to) + return elt.val; + } + } + + MIM.CandidateTable.prototype.put = function (from, to, candidates) + { + for (var i = 0; i < this.table.length; i++) + { + var elt = this.table[i]; + if (elt.from < to && elt.to > from) + { + elt.from = from; + elt.to = to; + elt.val = candidates; + return; + } + } + this.table.push ({ from: from, to: to, val: candidates }); + } + + MIM.CandidateTable.prototype.adjust = function (from, to, inserted) + { + var diff = inserted - (to - from); + if (diff == 0) + return; + for (var i = 0; i < this.table.length; i++) + { + var elt = this.table[i]; + if (elt.from >= to) + { + elt.from += diff; + elt.to += diff; + } + } + } + + MIM.CandidateTable.prototype.clear = function () + { + this.table.length = 0; + } + + function set_cursor (prefix, pos) + { + this.cursor_pos = pos; + var candidates = this.candidate_table.get (pos); + if (this.candidates != candidates) + { + this.candidates = candidates; + this.changed |= MIM.ChangedStatus.CandidateList; + } + } + + function save_state () + { + this.state_var_values = this.domain.SaveValues (); + this.state_preedit = this.preedit; + this.state_key_head = this.key_head; + this.state_pos = this.cursor_pos; + } + + function restore_state () + { + this.domain.RestoreValues (this.state_var_values); + this.preedit = this.state_preedit; + set_cursor.call (this, "restore", this.state_pos); + } + + function handle_key () + { + Xex.Log ('Key(' + this.key_head + ') "' + this.keys.val[this.key_head] + + '" in ' + this.state.name + ':' + this.keymap.name + + " key/state/commit-head/len:" + + this.key_head + '/' + this.state_key_head + '/' + this.commit_key_head + '/' + this.keys.val.length); + var out = this.state.keymap.Lookup (this.keys, this.state_key_head); + var sub = out.map; + + if (out.index > this.key_head) + { + this.key_head = out.index; + Xex.Log (' with submap', false, true); + restore_state.call (this); + this.keymap = sub; + if (sub.map_actions) + { + Xex.Log ('taking map actions:'); + if (! this.take_actions (sub.map_actions)) + return false; + } + else if (sub.submaps) + { + Xex.Log ('no map actions'); + for (var i = this.state_key_head; i < this.key_head; i++) + { + Xex.Log ('inserting key:' + this.keys.val[i].key); + this.ins (this.keys.val[i].key, null); + } + } + if (! sub.submaps) + { + Xex.Log ('terminal:'); + if (this.keymap.branch_actions) + { + Xex.Log ('branch actions:'); + if (! this.take_actions (this.keymap.branch_actions)) + return false; + } + if (sub != this.state.keymap) + this.shift (this.state); + } + } + else + { + Xex.Log (' without submap', false, true); + this.keymap = sub; + var current_state = this.state; + var map = this.keymap; + + if (map.branch_actions) + { + Xex.Log ('branch actions:'); + if (! this.take_actions (map.branch_actions)) + return false; + } + + if (map == this.keymap) + { + Xex.Log ('no state change'); + if (map == this.initial_state.keymap + && this.key_head < this.keys.val.length) + { + Xex.Log ('unhandled'); + return false; + } + if (this.keymap != current_state.keymap) + this.shift (current_state); + else if (this.keymap.actions == null) + this.shift (this.initial_state); + } + } + return true; + } + + proto = { + reset: function (clear_keys) + { + this.cursor_pos = 0; + this.prev_state = null; + this.title = this.initial_state.title; + this.state_preedit = ''; + this.state_key_head = 0; + this.state_var_values = {}; + this.state_pos = 0; + this.key_head = 0; + if (clear_keys) + this.keys.val.length = 0; + this.commit_key_head = 0; + this.key_unhandled = false; + this.unhandled_key = null; + this.changed = MIM.ChangedStatus.None; + this.error_message = ''; + this.title = this.initial_state.title; + this.produced = ''; + this.preedit = ''; + this.preedit_saved = ''; + if (this.candidate_show) + MIM.hide (this); + this.candidate_table.clear (); + this.candidates = null; + this.candidate_show = false; + for (var elt in this.marker_positions) + this.marker_positions[elt] = 0; + this.shift (this.initial_state); + }, + + catch_args: new Array (Xex.CatchTag._mimtag, null), + + take_actions: function (actions) + { + if (actions.length == 0) + return true;; + var func_progn = this.domain.GetFunc ('progn'); + var func_catch = this.domain.GetFunc ('catch'); + this.catch_args[1] = new Xex.Funcall (func_progn, null, actions); + var term = new Xex.Funcall (func_catch, null, this.catch_args); + term = term.Eval (this.domain); + return (! term.IsSymbol || term.val != '@mimtag'); + }, + + GetSurroundingChar: function (pos) + { + if (pos < 0) + { + pos += this.range[0]; + if (pos < 0) + return -1; + } + else + { + pos += this.range[1]; + if (pos >= this.target.value.length) + return -1; + } + return this.target.value.charCodeAt (pos); + }, + + DelSurroundText: function (pos) + { + var text; + if (pos < 0) + { + pos += this.range[0]; + if (pos <= 0) + { + pos = 0; text = ''; + } + else + text = this.target.value.substring (0, pos); + if (this.range[0] < this.target.value.length) + text += this.target.value.substring (this.range[0]); + this.target.value = text; + this.range[1] -= this.range[0] - pos; + this.range[0] = pos; + } + else + { + pos += this.range[1]; + text = this.target.value.substring (0, this.range[1]); + if (pos >= this.target.value.length) + pos = this.target.value.length; + else + text += this.target.value.substring (pos); + this.target.value = text; + } + }, + + adjust_markers: function (from, to, inserted) + { + var diff = inserted - (to - from); + + for (var name in this.marker_positions) + { + var pos = this.marker_positions[name]; + if (pos > from) + { + if (pos >= to) + this.marker_positions[name] += diff; + else if (pos > from) + this.marker_positions[name] = from; + } + } + }, + + preedit_replace: function (from, to, text, candidates) + { + var newlen = text.length; + this.preedit = (this.preedit.substring (0, from) + + text + this.preedit.substring (to)); + this.changed |= MIM.ChangedStatus.Preedit | MIM.ChangedStatus.CursorPos; + this.adjust_markers (from, to, newlen); + this.candidate_table.adjust (from, to, newlen); + if (candidates) + this.candidate_table.put (from, from + newlen, candidates) + if (this.cursor_pos >= to) + set_cursor.call (this, 'adjust', this.cursor_pos + text.length - (to - from)); + else if (this.cursor_pos > from) + set_cursor.call (this, 'adjust', from) + }, + + ins: function (text, candidates) + { + this.preedit_replace (this.cursor_pos, this.cursor_pos, text, candidates); + }, + + rep: function (old_text, new_text, candidates) + { + this.preedit_replace (this.cursor_pos - old_text.length, + this.cursor_pos, new_text, candidates); + }, + + del: function (pos) + { + var deleted = pos - this.cursor_pos; + if (pos < this.cursor_pos) + { + if (pos < 0) + { + this.DelSurroundText (pos); + deleted = - this.cursor_pos; + pos = 0; + } + if (pos < this.cursor_pos) + this.preedit_replace (pos, this.cursor_pos, '', null); + } + else + { + if (pos > this.preedit.length) + { + this.DelSurroundText (pos - this.preedit.length); + deleted = this.preedit.length - this.cursor_pos; + pos = this.preedit.length; + } + if (pos > this.cursor_pos) + this.preedit_replace (this.cursor_pos, pos, '', null); + } + return deleted; + }, + + show: function () + { + this.candidate_show = true; + this.changed |= MIM.ChangedStatus.CandidateShow; + }, + + hide: function () + { + this.candidate_show = false; + this.changed |= MIM.ChangedStatus.CandidateShow; + }, + + move: function (pos) + { + if (pos < 0) + pos = 0; + else if (pos > this.preedit.length) + pos = this.preedit.length; + if (pos != this.cursor_pos) + { + set_cursor.call (this, 'move', pos); + this.changed |= MIM.ChangedStatus.Preedit; + } + }, + + pushback: function (n) + { + if (n instanceof MIM.KeySeq) + { + if (this.key_head > 0) + this.key_head--; + if (this.key_head < this.keys.val.length) + this.keys.val.splice (this.key_head, + this.keys.val.length - this.key_head); + for (var i = 0; i < n.val.length; i++) + this.keys.val.push (n.val[i]); + return; + } + if (n > 0) + { + this.key_head -= n; + if (this.key_head < 0) + this.key_head = 0; + } + else if (n == 0) + this.key_head = 0; + else + { + this.key_head = - n; + if (this.key_head > this.keys.val.length) + this.key_head = this.keys.val.length; + } + }, + + pop: function () + { + if (this.key_head < this.keys.val.length) + this.keys.val.splice (this.key_head, 1); + }, + + commit: function () + { + if (this.preedit.length > 0) + { + this.candidate_table.clear (); + this.produced += this.preedit; + this.preedit_replace.call (this, 0, this.preedit.length, '', null); + this.preedit_saved = ''; + this.state_pos = 0; + this.commit_key_head = this.key_head; + } + }, - for (var i = 0; i < len; i++) + shift: function (state) { - var branch = branches[i]; - var elm = MIM.first_element (branch); + if (state == null) + { + if (this.prev_state == null) + return; + state = this.prev_state; + } - if (elm) - return false; - } - return true; -} + if (state == this.initial_state) + { + if (this.state) + { + this.commit (); + this.keys.val.splice (0, this.key_head); + this.key_head = this.state_key_head = this.commit_key_head = 0; + this.prev_state = null; + } + } + else + { + if (state != this.state) + this.prev_state = this.state; + } + if (state != this.state && state.enter_actions) + this.take_actions (state.enter_actions); + if (! this.state || this.state.title != state.title) + this.changed |= MIM.ChangedStatus.StateTitle; + this.state = state; + this.keymap = state.keymap; + save_state.call (this); + }, -MIM.parse = function (im) -{ - var maps = im.body.getElementsByTagName ('map'); - var states = im.body.getElementsByTagName ('state'); - var str = ""; - var i; + Filter: function (key) + { + if (! this.active) + { + Xex.Log ("active = false"); + this.key_unhandled = true; + this.unhandled_key = key; + return false; + } + if (key.key == '_reload') + return true; + this.changed = MIM.ChangedStatus.None; + this.produced = ''; + this.key_unhandled = false; + this.keys.val.push (key); + var count = 0; + while (this.key_head < this.keys.val.length) + { + if (! handle_key.call (this)) + { + if (this.key_head < this.keys.val.length) + { + this.unhandled_key = this.keys.val[this.key_head]; + this.keys.val.splice (this.key_head, this.key_head + 1); + } + if (this.state_key_head > 0) + this.state_key_head--; + if (this.commit_key_head > 0) + this.commit_key_head--; + this.key_unhandled = true; + break; + } + if (++count == 10) + { + this.reset (true); + this.key_unhandled = true; + break; + } + } + if (this.keymap == this.initial_state.keymap) + this.commit (); - if (! maps || maps.length == 0) - MIM.error_return ('No map', false); - if (! states) - MIM.error_return ('No state', false); - for (i = 0; i < maps.length; i++) - if (! MIM.check_map (im, maps[i])) - MIM.error_return ('Unsupported directive in map', false); - for (var i = 0; i < states.length; i++) - if (! MIM.check_state (im, states[i])) - MIM.error_return ('Unsupported directive in state', false); - im.load_map_node (); - return true; -} + if (this.commit_key_head > 0) + { + this.keys.val.splice (0, this.commit_key_head); + this.key_head -= this.commit_key_head; + this.state_key_head -= this.commit_key_head; + this.commit_key_head = 0; + } + if (this.key_unhandled) + { + this.keys.val.length = 0; + //this.keys.val.splice (0, this.keys.val.length); + this.key_head = this.state_key_head = this.commit_key_head = 0; + } + if (this.changed & MIM.ChangedStatus.Candidate) + { + if (this.candidate_show && this.candidates) + MIM.show (this); + else + MIM.hide (this); + } + return (! this.key_unhandled + && this.produced.length == 0); + } + } -MIM.register = function (lang, name, url) -{ - var im = new MIM.im (lang, name, url); - if (! (lang in MIM.list)) - MIM.list[lang] = new Array (); - MIM.list[lang][name] = im; - return im; -}; + MIM.IC.prototype = proto; -MIM.find = function (lang, name) -{ - if (! (lang in MIM.list)) - return false; - if (! (name in MIM.list[lang])) - return false; - return MIM.list[lang][name]; -}; + var node = Xex.Load (null, "imlist.xml"); + for (node = node.firstChild; node; node = node.nextSibling) + if (node.nodeName == 'input-method') + { + var lang = null, name = null, extra_id = null, file = null; -MIM.load_async = function (im) -{ - var obj = (window.XMLHttpRequest ? new XMLHttpRequest () - : window.ActiveXObject ? new ActiveXObject ("Msxml2.XMLHTTP") - : null); - - if (! obj) - alert ("XMLHttpRequest not supported"); - obj.open ('GET', im.url, true); - im.status = 1; /* loading */ - obj.onreadystatechange = function () { - if (obj.readyState == 4) - { - try { - eval (obj.responseText); - im.status = 2; /* loaded */ - } catch (e) { - alert ("load error:" + e.message + " at " + e.lineNumber - + " " + obj.responseText); - im.status = -1; /* load fail */ - } + for (var n = node.firstChild; n; n = n.nextSibling) + { + if (n.nodeName == 'language') + lang = n.firstChild.nodeValue; + else if (n.nodeName == 'name') + name = n.firstChild.nodeValue; + else if (n.nodeName == 'extra-id') + extra_id = n.firstChild.nodeValue; + else if (n.nodeName == 'filename') + file = n.firstChild.nodeValue; + } + if (name && name != 'nil') + { + if (! MIM.imlist[lang]) + MIM.imlist[lang] = {}; + MIM.imlist[lang][name] = new MIM.IM (lang, name, extra_id, file); + } + else if (extra_id && extra_id != 'nil') + { + if (! MIM.imextra[lang]) + MIM.imextra[lang] = {}; + MIM.imextra[lang][extra_id] = new MIM.IM (lang, name, extra_id, file); + } } - }; - obj.send (null); - return im; -}; - -MIM.load_sync = function (im) -{ - var obj = (window.XMLHttpRequest ? new XMLHttpRequest () - : window.ActiveXObject ? new ActiveXObject ("Msxml2.XMLHTTP") - : null); - - if (! obj) - alert ("XMLHttpRequest not supported"); - if (true) - { - obj.open ('GET', im.url, false); - obj.send (""); - eval (obj.responseText); - if (! im.keymap) - alert ("obj.responseText"); - return im; - } + if (MIM.imextra.t && MIM.imextra.t.global) + MIM.im_global = MIM.imextra.t.global; else { - obj.open ('GET', 'latn-post.mimx', false); - obj.overrideMimeType ('text/xml'); - obj.send (""); - im.body = obj.responseXML; - document.AnXml = im.body; - if (MIM.parse (im)) - return im; - alert (im.parse_error); + MIM.im_global = new MIM.IM ('t', 'nil', 'global', null); + MIM.im_global.load_status = MIM.LoadStatus.Error; } - return false; -}; - -MIM.load = function (im) -{ - var s = document.createElement ('script'); - - s.charset = 'UTF-8'; - s.src = im.url; - document.body.appendChild (s); - document.body.removeChild (s); - if (! im.keymap) - alert ("load fail"); - im.status = 2; - return im; -}; - -MIM.add_event_listener - = (window.addEventListener - ? function (target, type, listener) { - target.addEventListener (type, listener, false); - } - : window.attachEvent - ? function (target, type, listener) { - target.attachEvent ('on' + type, - function() { - listener.call (target, window.event); - }); - } - : function (target, type, listener) { - target['on' + type] - = function (e) { listener.call (target, e || window.event); }; - }); + node = undefined; +}) (); (function () { var keys = new Array (); @@ -297,70 +1722,97 @@ MIM.add_event_listener keys[111 + i] = "f" + i; keys[0x90] = "numlock"; keys[0xF0] = "capslock"; - MIM.special_key = keys; -}) (); -MIM.decode_key = function (event) -{ - var key = ((event.type == 'keydown' || event.keyCode) ? event.keyCode - : event.charCode ? event.charCode - : false); - if (! key) - return false; - if (event.type == 'keydown') - { - key = MIM.special_key[key]; - if (! key) - return false; - if (event.shiftKey) key = "S-" + key ; + var keyids = {}; + keyids['U+0008'] = 'Backspace'; + keyids['U+0009'] = 'Tab'; + keyids['U+0018'] = 'Cancel'; + keyids['U+001B'] = 'Escape'; + keyids['U+0020'] = 'Space'; + keyids['U+007F'] = 'Delete'; + + var modifiers = {} + modifiers.Shift = 1; + modifiers.Control = 1; + modifiers.Alt = 1; + modifiers.AltGraph = 1; + modifiers.Meta = 1 + + MIM.decode_key_event = function (event) + { + var key = event.keyIdentifier; + + if (key) // keydown event of Chrome + { + if (modifiers[key]) + return false; + var mod = ''; + if (event.ctrlKey) mod += 'C-'; + if (event.metaKey) mod += 'M-'; + if (event.altKey) mod += 'A-'; + var keysym = keyids[key]; + if (keysym) + key = keysym; + else if (key.match(/^U\+([0-9A-Z]+)$/)) + { + if (mod.length == 0) + return false; + key = String.fromCharCode (parseInt (RegExp.$1, 16)); + } + //else + //key = key.toLowerCase (); + if (event.shiftKey) mod += 'S-'; + return new MIM.Key (mod + key); } - else - key = String.fromCharCode (key); - if (event.altKey) key = "A-" + key ; - if (event.ctrlKey) key = "C-" + key ; - return key; -}; + else + { + key = ((event.type == 'keydown' || event.keyCode) ? event.keyCode + : event.charCode ? event.charCode + : false); + if (! key) + return false; + if (event.type == 'keydown') + { + key = keys[key]; + if (! key) + return false; + if (event.shiftKey) key = "S-" + key ; + } + else + key = String.fromCharCode (key); + } + if (event.altKey) key = "A-" + key ; + if (event.ctrlKey) key = "C-" + key ; + return new MIM.Key (key); + } +}) (); -MIM.debug_print = function (event, ic) -{ - if (! MIM.debug) - return; - if (! MIM.debug_nodes) - { - MIM.debug_nodes = new Array (); - MIM.debug_nodes['keydown'] = document.getElementById ('keydown'); - MIM.debug_nodes['keypress'] = document.getElementById ('keypress'); - MIM.debug_nodes['status0'] = document.getElementById ('status0'); - MIM.debug_nodes['status1'] = document.getElementById ('status1'); - MIM.debug_nodes['keyseq0'] = document.getElementById ('keyseq0'); - MIM.debug_nodes['keyseq1'] = document.getElementById ('keyseq1'); - MIM.debug_nodes['range0'] = document.getElementById ('range0'); - MIM.debug_nodes['range1'] = document.getElementById ('range1'); - } - var target = event.target; - var code = event.keyCode; - var ch = event.type == 'keydown' ? 0 : event.charCode; - var key = MIM.decode_key (event); - var keyseq = ""; - var index; - - MIM.debug_nodes[event.type].innerHTML = "" + code + "/" + ch + " : " + key; - index = (event.type == 'keydown' ? '0' : '1'); - MIM.debug_nodes['status' + index].innerHTML = ic.im.status; - for (var i = 0; i < ic.keyseq.length; i++) - keyseq += ic.keyseq[i]; - MIM.debug_nodes['keyseq' + index].innerHTML - = keyseq + ":" + ic.keyseq.length; - MIM.debug_nodes['range' + index].innerHTML - = "" + ic.range[0] + ":" + ic.range[1]; -}; +MIM.add_event_listener + = (window.addEventListener + ? function (target, type, listener) { + target.addEventListener (type, listener, false); + } + : window.attachEvent + ? function (target, type, listener) { + target.attachEvent ('on' + type, + function() { + listener.call (target, window.event); + }); + } + : function (target, type, listener) { + target['on' + type] + = function (e) { listener.call (target, e || window.event); }; + }); + +MIM.debug_print = function () { }; -MIM.get_range = function (target, range) +MIM.get_range = function (target, ic) { + var from, to; if (target.selectionStart != null) // for Mozilla { - range[0] = target.selectionStart; - range[1] = target.selectionEnd; + from = target.selectionStart; + to = target.selectionEnd; } else // for IE { @@ -369,112 +1821,239 @@ MIM.get_range = function (target, range) rr.moveToElementText (target); rr.setEndPoint ('EndToEnd', range); - range[0] = rr.text.length - r.text.length; - range[1] = rr.text.length; - } -} - -MIM.set_caret = function (target, pos) -{ - if (target.selectionStart != null) // Mozilla - { - target.focus (); - target.setSelectionRange (pos, pos); - } - else // IE - { - var range = target.createTextRange (); - range.move ('character', pos); - range.select (); + from = rr.text.length - r.text.length; + to = rr.text.length; } + if (from == to + && from == ic.range[0] + ic.cursor_pos + && (ic.preedit.length == 0 + || ic.preedit == target.value.substring (ic.range[0], ic.range[1]))) + return true; + ic.reset (true); + ic.range[0] = from; + ic.range[1] = to; + return false; }; -MIM.ic = function (im, target) -{ - this.im = im; - this.target = target; - this.key = false; - this.keyseq = new Array (); - this.range = new Array (0, 0); - return this; -}; +(function () { + var temp; -MIM.ic.prototype.reset = function () -{ - this.key = false; - while (this.keyseq.length > 0) - this.keyseq.pop (); -}; + var style_props = { + width: 'width', + height: 'height', + padingLeft: 'padding-left', + paddingRight: 'padding-right', + paddingTop: 'padding-top', + paddintBottom: 'padding-bottom', + borderLeftStyle: 'border-left-style', + borderRightStyle: 'border-right-style', + borderTopStyle: 'border-top-style', + borderBottomStyle: 'border-bottom-style', + borderLeftWidth: 'border-left-width', + borderRightWidth: 'border-right-width', + borderTopWidth: 'border-top-width', + borderBottomWidth: 'border-bottom-width', + fontFamily: 'font-family', + fontSize: 'font-size', + lineHeight: 'line-height', + letterSpacing: 'letter-spacing', + wordSpacing: 'word-spacing' }; -MIM.ic.prototype.check_range = function () -{ - var from = this.range[0], to = this.range[1]; + function copy_style (from, to) + { + var from_style = getComputedStyle(from,''); + for(var name in style_props) + to.style[name] = from_style.getPropertyValue (style_props[name]); + to.style.left = from.offsetLeft + 'px'; + to.style.top = from.offsetTop + 'px'; + to.style.width = from.offsetWidth; + to.style.height = from.offsetHeight; + } - MIM.get_range (this.target, this.range); - if (this.range[0] != this.range[1] || to != this.range[1]) - this.reset (); - else - this.range[0] = from; -}; + MIM.get_preedit_pos = function (target, ic) + { + if (! temp) + { + temp = document.createElement ('div'); + temp.style.visibility = 'hidden'; + temp.style.position = 'absolute'; + temp.appendChild (document.createElement ('span')); + temp.appendChild (document.createElement ('span')); + document.getElementsByTagName ('body')[0].appendChild (temp); + } + if (temp.ic != ic) + { + temp.ic = ic; + copy_style (target, temp); + ic.abs_top = 0; + ic.abs_left = 0; + for (var elm = target.offsetParent; elm; elm = elm.offsetParent) + { + ic.abs_top += elm.offsetTop; + ic.abs_left += elm.offsetLeft; + } + } + temp.firstChild.innerText = target.value.substring (0, ic.range[0]); + temp.lastChild.innerText + = (ic.range[0] == ic.range[1] ? "|" + : target.value.substring (ic.range[0], ic.range[1])); + ic.abs_y = (ic.abs_top + temp.lastChild.offsetTop + + temp.lastChild.offsetHeight - target.scrollTop); + ic.abs_x0 = ic.abs_left + temp.lastChild.offsetLeft; + ic.abs_x1 = ic.abs_x0 + temp.lastChild.offsetWidth; + } +}) (); -MIM.insert = function (ic, insert) +MIM.update_bar = function (target, ic) { - var text = ic.target.value; - ic.target.value = (text.substring (0, ic.range[0]) - + insert - + text.substring (ic.range[1])); - ic.range[1] = ic.range[0] + insert.length; - MIM.set_caret (ic.target, ic.range[1]); + if (ic.preedit.length > 0) + { + MIM.get_preedit_pos (target, ic); + if (! ic.bar) + { + ic.bar = document.createElement ('div'); + ic.bar.style.position = 'absolute'; + ic.bar.style.backgroundColor = "black"; + ic.bar.style.minHeight = '1px'; + document.getElementsByTagName ('body')[0].appendChild (ic.bar); + } + ic.bar.style.display = 'block' + ic.bar.style.top = (ic.abs_y + 1) + 'px'; + ic.bar.style.left = ic.abs_x0 + 'px'; + ic.bar.style.minWidth = ic.bar.style.maxWidth = (ic.abs_x1 - ic.abs_x0) + 'px'; + } + else if (ic.bar) + ic.bar.style.display = 'none' }; -function keyseq_string (keyseq) -{ - var str = ""; - for (var i = 0; i < keyseq.length; i++) - str += keyseq[i]; - return str; -} - -MIM.handle_keyseq = function (event, ic) +MIM.update = function (target, ic, for_focus_out) { - var map = ic.im.lookup (ic.keyseq, 1000); - if (map instanceof Array) + var text = target.value; + target.value = (text.substring (0, ic.range[0]) + + ic.produced + + ic.preedit + + text.substring (ic.range[1])); + ic.range[0] += ic.produced.length; + ic.range[1] = ic.range[0] + ic.preedit.length; + MIM.update_bar (target, ic); + if (! for_focus_out) { - MIM.insert (ic, map['_target_text']); - if (! ('_has_child' in map)) + var pos = ic.range[0] + ic.cursor_pos; + if (target.setSelectionRange) // Mozilla { - ic.reset (); - ic.range[0] = ic.range[1]; + var scrollTop = target.scrollTop; + target.setSelectionRange (pos, pos); + target.scrollTop = scrollTop; } - event.preventDefault (); - //document.getElementById ('text').value - //= keyseq_string (ic.keyseq) + " handled"; - } - else if (map > 0) - { - MIM.insert (ic, ic.im.lookup (ic.keyseq, map)['_target_text']); - while (map > 0) + else // IE { - ic.keyseq.shift (); - map--; + var range = target.createTextRange (); + range.moveStart ('character', pos); + range.moveEnd ('character', pos); + range.select (); } - ic.range[0] = ic.range[1]; - if (ic.keyseq.length > 0) - MIM.handle_keyseq (event, ic); - } - else - { - ic.reset (); - //document.getElementById ('text').value - //= keyseq_string (ic.keyseq) + " unhandled"; } }; -MIM.reset_ic = function (event) +(function () { + MIM.show = function (ic) + { + if (! ic.candidates) + return; + var target = ic.target; + MIM.get_preedit_pos (target, ic); + if (! ic.can_node) + { + ic.can_node = document.createElement ('table'); + ic.can_node.style.position = 'absolute'; + ic.can_node.style.display = 'none'; + ic.can_node.style.backgroundColor = "white"; + ic.can_node.style.border = "1px solid black"; + document.getElementsByTagName ('body')[0].appendChild (ic.can_node); + } + + if (ic.changed & MIM.ChangedStatus.CandidateList) + { + while (ic.can_node.childNodes.length > 0) + ic.can_node.removeChild (ic.can_node.firstChild); + var tr = document.createElement ('tr'); + var group = ic.candidates.CurrentGroup (); + var td = document.createElement ('td'); + td.innerHTML = group[0][1] + '/' + group[0][0]; + td.style.color = 'white'; + td.style.backgroundColor = 'black'; + tr.appendChild (td); + for (var i = 1; i < group.length; i++) + { + var td = document.createElement ('td'); + td.noWrap = true; + td.innerHTML = (i < 10 ? i : i == 10 ? '0' : String.fromCharCode (0x60 + (i - 10))) + '.' + group[i]; + if (i == group[0][2] + 1) + td.style.backgroundColor = 'lightblue'; + tr.appendChild (td); + } + ic.can_node.appendChild (tr); + ic.can_node.style.top = (ic.abs_y + 10) + 'px'; + ic.can_node.style.left = ic.abs_x0 + 'px'; + } + else + { + var td = ic.can_node.firstElement ().firstElement ().nextElement (); + var col = ic.candidates.CurrentCol (); + for (var i = 0; td; td = td.nextElement ()) + td.style.backgroundColor = (i++ == col ? 'lightblue' : 'white'); + } + ic.can_node.style.display = 'block'; + } + + MIM.hide = function (ic) + { + if (ic.can_node) + ic.can_node.style.display = 'none'; + } + + function real_focus_in (target, ic) + { + if (MIM.get_range (target, ic)) + ic.Filter (MIM.Key.FocusIn); + MIM.update (target, ic, false); + } + + var focus_in_timer; + + MIM.focus_in = function (event) + { + var target = event.target; + Xex.Log ("Focus in " + target.tagName); + focus_in_timer + = setTimeout (function () {real_focus_in (target, target.mim_ic)} , 10); + return true; + } + + MIM.click = function (event) + { + var target = event.target; + Xex.Log ("Click in " + target.tagName); + if (focus_in_timer) + { + clearTimeout (focus_in_timer); + focus_in_timer = null; + } + real_focus_in (target, target.mim_ic); + } + +}) (); + +MIM.focus_out = function (event) { - var ic = event.target.mim_ic; - if (ic) - ic.reset (); + var target = event.target; + var ic = target.mim_ic; + Xex.Log ("Focus out " + target.tagName); + MIM.get_range (target, ic); + MIM.debug_print (event, ic); + ic.Filter (MIM.Key.FocusOut); + MIM.update (target, ic, true); + return true; }; MIM.keydown = function (event) @@ -484,144 +2063,339 @@ MIM.keydown = function (event) return; var ic = target.mim_ic; - if (! ic || ic.im != MIM.current_im) + if (! ic || ic.im != MIM.current) { - ic = new MIM.ic (MIM.current_im, target); + target.mim_ic = null; + Xex.Log ('creating IC'); + ic = new MIM.IC (MIM.current, target); + if (ic.im.load_status != MIM.LoadStatus.Loaded) + return true; target.mim_ic = ic; - MIM.add_event_listener (target, 'blur', MIM.reset_ic); + MIM.add_event_listener (target, 'focus', MIM.focus_in); + MIM.add_event_listener (target, 'blur', MIM.focus_out); + MIM.add_event_listener (target, 'click', MIM.click); } - if (ic.im.status < 0) - return; - ic.check_range (); + MIM.get_range (target, ic) MIM.debug_print (event, ic); - ic.key = MIM.decode_key (event); + ic.key = MIM.decode_key_event (event); + if (ic.key) + { + try { + var result = ic.Filter (ic.key); + } catch (e) { + Xex.Log ('Error' + e); + throw (e); + } + MIM.update (target, ic, false); + if (! ic.key_unhandled) + event.preventDefault (); + } }; MIM.keypress = function (event) { - if (! (event.target.type == "text" || event.target.type == "textarea")) + var target = event.target; + if (! (target.type == "text" || target.type == "textarea")) return; - var ic = event.target.mim_ic; + var ic = target.mim_ic; var i; try { - if (ic.im.status < 0) + if (ic.im.load_status != MIM.LoadStatus.Loaded) return; if (! ic.key) - ic.key = MIM.decode_key (event); + ic.key = MIM.decode_key_event (event); if (! ic.key) { - ic.reset (); + ic.reset (true); return; } - ic.keyseq.push (ic.key); - if (ic.im.status == 1) // Still loading. - return; - MIM.handle_keyseq (event, ic); + + try { + var result = ic.Filter (ic.key); + } catch (e) { + Xex.Log ('Error:' + e); + throw (e); + } + MIM.update (target, ic, false); + if (! ic.key_unhandled) + event.preventDefault (); + } catch (e) { + Xex.Log ("error:" + e); + event.preventDefault (); } finally { MIM.debug_print (event, ic); } + return; }; -MIM.select_im = function (event) -{ - var target = event.target.parentNode; - while (target.tagName != "SELECT") - target = target.parentNode; - var idx = 0; - var im = false; - for (var lang in MIM.list) - for (var name in MIM.list[lang]) - if (idx++ == target.selectedIndex) - { - im = MIM.list[lang][name]; - break; - } - document.getElementsByTagName ('body')[0].removeChild (target); - target.target.focus (); - if (im && im != MIM.current_im) - MIM.current_im = MIM.load_sync (im); -}; +(function () { + var lang_category = { + European: { + cs: { name: 'Czech' }, + da: { name: 'Danish' }, + el: { name: 'Greek' }, + en: { name: 'English' }, + eo: { name: 'Esperanto' }, + fr: { name: 'French' }, + grc: { name: 'ClassicGreek' }, + hr: { name: 'Croatian' }, + hy: { name: 'Armenian' }, + ka: { name: 'Georgian' }, + kk: { name: 'Kazakh' }, + ru: { name: 'Russian' }, + sk: { name: 'Slovak' }, + sr: { name: 'Serbian' }, + sv: { name: 'Swedish' }, + yi: { name: 'Yiddish' } }, + MiddleEast: { + ar: { name: 'Arabic' }, + dv: { name: 'Divehi' }, + fa: { name: 'Persian' }, + he: { name: 'Hebrew' }, + kk: { name: 'Kazakh' }, + ps: { name: 'Pushto' }, + ug: { name: 'Uighur' }, + yi: { name: 'Yiddish' } }, + SouthAsia: { + as: { name: 'Assamese' }, + bn: { name: 'Bengali' }, + bo: { name: 'Tibetan' }, + gu: { name: 'Gujarati' }, + hi: { name: 'Hindi' }, + kn: { name: 'Kannada' }, + ks: { name: 'Kashmiri' }, + ml: { name: 'Malayalam' }, + mr: { name: 'Marathi' }, + ne: { name: 'Nepali' }, + or: { name: 'Oriya' }, + pa: { name: 'Panjabi' }, + sa: { name: 'Sanskirit' }, + sd: { name: 'Sindhi' }, + si: { name: 'Sinhalese' }, + ta: { name: 'Tamil' }, + te: { name: 'Telugu' }, + ur: { name: 'Urdu' } }, + SouthEastAsia: { + cmc: { name: 'Cham' }, + km: { name: 'Khmer'}, + lo: { name: 'Lao' }, + my: { name: 'Burmese' }, + tai: { name: 'Tai Viet' }, + th: { name: 'Thai' }, + vi: { name: 'Vietanamese' } }, + EastAsia: { + ii: { name: 'Yii' }, + ja: { name: 'Japanese' }, + ko: { name: 'Korean' }, + zh: { name: 'Chinese' } }, + Other: { + am: { name: 'Amharic' }, + ath: { name: 'Carrier' }, + bla: { name: 'Blackfoot' }, + cr: { name: 'Cree' }, + eo: { name: 'Esperanto' }, + iu: { name: 'Inuktitut' }, + nsk: { name: 'Naskapi' }, + oj: { name: 'Ojibwe' }, + t: { name: 'Generic' } } + }; -MIM.destroy_menu = function (event) -{ - if (event.target.tagName == "SELECT") - document.getElementsByTagName ('body')[0].removeChild (event.target); -}; + function categorize_im () + { + var cat, lang, list, name; + for (lang in MIM.imlist) + { + list = null; + for (cat in lang_category) + if (lang_category[cat][lang]) + { + list = lang_category[cat][lang].list; + if (! list) + list = lang_category[cat][lang].list = {}; + for (name in MIM.imlist[lang]) + list[name] = MIM.imlist[lang][name]; + } + if (! list) + for (name in MIM.imlist[lang]) + Xex.Log ('no category ' + lang + '-' + name); + } + } -MIM.select_menu = function (event) -{ - var target = event.target; + var destroy_timer; + var last_target; - if (! ((target.type == "text" || target.type == "textarea") - && event.which == 1 && event.ctrlKey)) - return; + function destroy () + { + clearTimeout (destroy_timer); + destroy_timer = null; + var target = document.getElementById ('mim-menu'); + if (target) + { + for (; last_target && last_target.menu_level; + last_target = last_target.parentLi) + last_target.style.backgroundColor = 'white'; + var nodes = target.getElementsByTagName ('ul'); + for (var i = 0; i < nodes.length; i++) + nodes[i].style.visibility = 'hidden'; + document.getElementsByTagName ('body')[0].removeChild (target); + } + } - var sel = document.createElement ('select'); - sel.onclick = MIM.select_im; - sel.onmouseout = MIM.destroy_menu; - sel.style.position='absolute'; - sel.style.left = (event.clientX - 10) + "px"; - sel.style.top = (event.clientY - 10) + "px"; - sel.target = target; - var idx = 0; - for (var lang in MIM.list) - for (var name in MIM.list[lang]) - { - var option = document.createElement ('option'); - var imname = lang + "-" + name; - option.appendChild (document.createTextNode (imname)); - option.value = imname; - sel.appendChild (option); - if (MIM.list[lang][name] == MIM.current_im) - sel.selectedIndex = idx; - idx++; - } - sel.size = idx; - document.getElementsByTagName ('body')[0].appendChild (sel); -}; + function destroy_menu () { + if (! destroy_timer) + destroy_timer = setTimeout (destroy, 1000); + return true; + } -MIM.textinput = function (event) -{ - var str = '' - var changed = false; - for (var i = 0; i < event.data.length; i++) - { - if (event.data.charAt (i) == 'あ') - { - str += 'ア'; changed = true; - } - else - str += event.data.charAt (i); - } - alert (str); - if (changed) - { - var e = document.createEvent ('TextEvent'); - e.initTextEvent ('textInput', event.canBuggle, event.cancelable, event.view, - str, event.inputMode); - document.getElementById ('text').value = str; - event.target.dispatchEvent (e); - } -} + function show_submenu (event) + { + var target = event.target; + if (! target.menu_level) + { + if (! target.parentNode || ! target.parentNode.menu_level) + return true; + target = target.parentNode; + } + if (destroy_timer) + { + clearTimeout (destroy_timer); + destroy_timer = null; + } + if (last_target && target.parentLi != last_target) + { + last_target.style.backgroundColor = 'white'; + if (target.menu_level < last_target.menu_level) + { + last_target = last_target.parentLi; + last_target.style.backgroundColor = 'white'; + } + var uls = last_target.getElementsByTagName ('ul'); + for (var i = 0; i < uls.length; i++) + uls[i].style.visibility = 'hidden'; + } + last_target = target; + target.style.backgroundColor = 'yellow'; + if (target.menu_level < 3) + { + target.lastChild.style.visibility = 'visible'; + target.lastChild.style.left = target.clientWidth + 'px'; + } + event.preventDefault (); + } -MIM.init = function () -{ - MIM.add_event_listener (window, 'keydown', MIM.keydown); - MIM.add_event_listener (window, 'keypress', MIM.keypress); - MIM.add_event_listener (window, 'mousedown', MIM.select_menu); - MIM.add_event_listener (window, 'textInput', MIM.textinput); - if (window.location == 'http://localhost/mim/index.html') - MIM.server = 'http://localhost/mim'; - MIM.current_im = MIM.register ('latin', 'post', 'latn-post.js'); - MIM.register ('th', 'kesmanee', 'th-kesmanee.js'); - MIM.load_sync (MIM.current_im); -}; + function select_im (event) + { + var target = event.target; + if (! target.im) + { + if (! target.parentNode || ! target.parentNode.menu_level) + { + event.preventDefault (); + return false; + } + target = target.parentNode; + } + if (target.im) + { + MIM.current = target.im; + destroy (); + } + event.preventDefault (); + } -MIM.init_debug = function () -{ - MIM.debug = true; - MIM.init (); -}; + function create_ul (visibility) + { + var ul = document.createElement ('ul'); + ul.style.position = 'absolute'; + ul.style.margin = '0px'; + ul.style.padding = '0px'; + ul.style.border = '1px solid gray'; + ul.style.borderBottom = 'none'; + ul.style.top = '-1px'; + ul.style.backgroundColor = 'white'; + ul.style.visibility = visibility; + return ul; + } + + function create_li (level, text) + { + var li = document.createElement ('li'); + li.style.position = 'relative'; + li.style.margin = '0px'; + li.style.padding = '1px'; + li.style.borderBottom = '1px solid gray'; + li.style.top = '0px'; + li.style.listStyle = 'none'; + li.menu_level = level; + var nobr = document.createElement ('nobr'); + nobr.innerHTML = text; + li.appendChild (nobr); + return li; + } + + var menu; + + function create_menu (event) + { + var target = event.target; + + if (! ((target.type == "text" || target.type == "textarea") + && event.which == 1 && event.ctrlKey)) + return; + if (! menu) + { + categorize_im (); + menu = create_ul ('visible'); + menu.style.fontFamily = 'sans-serif'; + menu.style.fontWeight = 'bold'; + menu.id = 'mim-menu'; + menu.onmousedown = select_im; + menu.onmouseover = show_submenu; + menu.onmouseout = destroy_menu; + for (var catname in lang_category) + { + var cat = lang_category[catname]; + var li = create_li (1, catname); + var sub = create_ul ('hidden'); + for (var langname in cat) + { + var lang = cat[langname]; + if (! lang.list) + continue; + var sub_li = create_li (2, lang.name); + sub_li.parentLi = li; + var subsub = create_ul ('hidden'); + for (var name in lang.list) + { + var im = lang.list[name]; + var subsub_li = create_li (3, im.name); + subsub_li.parentLi = sub_li; + subsub_li.im = im; + subsub.appendChild (subsub_li); + } + sub_li.appendChild (subsub); + sub.appendChild (sub_li); + } + li.appendChild (sub); + menu.appendChild (li); + } + lang_category = null; + } + menu.style.left = (event.clientX - 10) + "px"; + menu.style.top = (event.clientY - 10) + "px"; + document.getElementsByTagName ('body')[0].appendChild (menu); + }; + + MIM.init = function () + { + MIM.add_event_listener (window, 'keydown', MIM.keydown); + MIM.add_event_listener (window, 'keypress', MIM.keypress); + MIM.add_event_listener (window, 'mousedown', create_menu); + if (window.location == 'http://localhost/mim/index.html') + MIM.server = 'http://localhost/mim'; + MIM.current = MIM.imlist['zh']['py-gb']; + }; +}) (); diff --git a/th-kesmanee.js b/th-kesmanee.js deleted file mode 100644 index a57f7f2..0000000 --- a/th-kesmanee.js +++ /dev/null @@ -1,97 +0,0 @@ -im = MIM.find ('th', 'kesmanee'); -im.load_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":"ผ", -"{":"ฐ", -"|":"ฅ", -"}":",", -"~":"%" -}); diff --git a/vi-base.mimx b/vi-base.mimx deleted file mode 100644 index 0ba8ec2..0000000 --- a/vi-base.mimx +++ /dev/null @@ -1,1345 +0,0 @@ - - - - t - nil - vi-base - - Provide bases for Vietnamese input methods. -This is acutually not a standalone input method, but is expected -to be included in the other Vietnamese input method (e.g. vi-telex, vi-vni). - - - - - T - - - - M - - - - - - - - - - 234 - - - - 417 - - - - 202 - - - - 416 - - - - 3 - - - - 1 - - @- - - - 2 - - - - - - - - - - - - 127 - - - - - - 103 - - - - 71 - - - - - - 105 - - - - 73 - - - - - - - - 113 - - - - 81 - - - - - - 117 - - - - 85 - - - - - - - - - 0 - - - - - - - - 111 - - - - 79 - - - - - - 97 - - - - 65 - - - - 101 - - - - 69 - - - - 111 - - - - 79 - - - - - - - - 117 - - - - 85 - - - - - - 121 - - - - 89 - - - - - - - - 2 - - - - 1 - - @- - - - 1 - - - - - - 1 - - 1 - - - - - - T - - - @> - - - - - - - - a - - - aáàảãạ - - - - - A - - - AÁÀẢÃẠ - - - - - e - - - eéèẻẽẹ - - - - - E - - - EÉÈẺẼẸ - - - - - i - - - iíìỉĩị - - - - - I - - - IÍÌỈĨỊ - - - - - o - - - oóòỏõọ - - - - - O - - - OÓÒỎÕỌ - - - - - u - - - uúùủũụ - - - - - U - - - UÚÙỦŨỤ - - - - - y - - - yýỳỷỹỵ - - - - - Y - - - YÝỲỶỸỴ - - - - - - - b - - - 98 - - - - - c - - - 99 - - - - - d - - - 100 - - - - - g - - - 103 - - - - - h - - - 104 - - - - - k - - - 107 - - - - - l - - - 108 - - - - - m - - - 109 - - - - - n - - - 110 - - - - - p - - - 112 - - - - - q - - - 113 - - - - - t - - - 116 - - - - - v - - - 118 - - - - - B - - - 66 - - - - - C - - - 67 - - - - - D - - - 68 - - - - - G - - - 71 - - - - - H - - - 72 - - - - - K - - - 75 - - - - - L - - - 76 - - - - - M - - - 77 - - - - - N - - - 78 - - - - - P - - - 80 - - - - - Q - - - 81 - - - - - T - - - 84 - - - - - V - - - 86 - - - - - - - q - - - 113 - - - - - Q - - - 81 - - - - - d - - - 100 - - - - - D - - - 68 - - - - - g - - - 103 - - - - - G - - - 71 - - - - - h - - - 104 - - - - - H - - - 72 - - - - - k - - - 107 - - - - - K - - - 75 - - - - - l - - - 108 - - - - - L - - - 76 - - - - - v - - - 118 - - - - - V - - - 86 - - - - - b - - - 98 - - - - - B - - - 66 - - - - - z - - - 122 - - - - - Z - - - 90 - - - - - - - c - - - 99 - - - - - m - - - 109 - - - - - n - - - 110 - - - - - p - - - 112 - - - - - t - - - 116 - - - - - C - - - 67 - - - - - M - - - 77 - - - - - N - - - 78 - - - - - P - - - 80 - - - - - T - - - 84 - - - - - - - g - - - 103 - - - - - h - - - 104 - - - - - G - - - 71 - - - - - H - - - 72 - - - - - - - a - - - 97 - - - - - b - - - 98 - - - - - c - - - 99 - - - - - d - - - 100 - - - - - e - - - 101 - - - - - f - - - 102 - - - - - g - - - 103 - - - - - h - - - 104 - - - - - i - - - 105 - - - - - j - - - 106 - - - - - k - - - 107 - - - - - l - - - 108 - - - - - m - - - 109 - - - - - n - - - 110 - - - - - o - - - 111 - - - - - p - - - 112 - - - - - q - - - 113 - - - - - r - - - 114 - - - - - s - - - 115 - - - - - t - - - 116 - - - - - u - - - 117 - - - - - v - - - 118 - - - - - w - - - 119 - - - - - x - - - 120 - - - - - y - - - 121 - - - - - z - - - 122 - - - - - A - - - 65 - - - - - B - - - 66 - - - - - C - - - 67 - - - - - D - - - 68 - - - - - E - - - 69 - - - - - F - - - 70 - - - - - G - - - 71 - - - - - H - - - 72 - - - - - I - - - 73 - - - - - J - - - 74 - - - - - K - - - 75 - - - - - L - - - 76 - - - - - M - - - 77 - - - - - N - - - 78 - - - - - O - - - 79 - - - - - P - - - 80 - - - - - Q - - - 81 - - - - - R - - - 82 - - - - - S - - - 83 - - - - - T - - - 84 - - - - - U - - - 85 - - - - - V - - - 86 - - - - - W - - - 87 - - - - - X - - - 88 - - - - - Y - - - 89 - - - - - Z - - - 90 - - - - - 0 - - - 48 - - - - - 1 - - - 49 - - - - - 2 - - - 50 - - - - - 3 - - - 51 - - - - - 4 - - - 52 - - - - - 5 - - - 53 - - - - - 6 - - - 54 - - - - - 7 - - - 55 - - - - - 8 - - - 56 - - - - - 9 - - - 57 - - - - - - - ' - - - 39 - - - - - '' - - - ‘’ - - - - - " - - - 34 - - - - - "" - - - “” - - - - - - - \ - - - - - - - - BackSpace - - - - - - - - - - - - \ No newline at end of file diff --git a/vi-tcvn.mimx b/vi-tcvn.mimx deleted file mode 100644 index f3f54c9..0000000 --- a/vi-tcvn.mimx +++ /dev/null @@ -1,1095 +0,0 @@ - - - - vi - tcvn - - - Vietnames input method using the TCVN6064 sequence. -Typing Backslash ('\') toggles the normal mode and English mode. -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) - - Ắ(TCVN) - - - - Flag to control tone mark position in equivocal cases. -If this variable is 0 (the default), put tone mark on the first vowel -in such equivocal cases as "oa", "oe", "uy". -Otherwise, put tone mark on the last vowel. - - 0 - - 0 - 1 - - - - - Flag to control the action of Backspace key (delete or undo). -If this variable is 0 (the default), Backspace key deletes the previous -character (e.g. "q u a i s BS" => "quá"). -If the value is 1, Backspace key undoes the previous key -(e.g. "q u a i s BS" => "quai"). - - 0 - - 0 - 1 - - - - - - - t - nil - vi-base - -
macro
-
-
- - - - t - nil - vi-base - -
map
-
- - - - 2 - - - âấầẩẫậ - - - - - @ - - - ÂẤẦẨẪẬ - - - - - 1 - - - ăắằẳẵặ - - - - - ! - - - ĂẮẰẲẴẶ - - - - - 3 - - - êếềểễệ - - - - - # - - - ÊẾỀỂỄỆ - - - - - 4 - - - ôốồổỗộ - - - - - $ - - - ÔỐỒỔỖỘ - - - - - ] - - - ơớờởỡợ - - - - - } - - - ƠỚỜỞỠỢ - - - - - [ - - - ưứừửữự - - - - - { - - - ƯỨỪỬỮỰ - - - - - - - 0 - - - 273 - - - - - ) - - - 272 - - - - - - - 8 - - - 1 - - - 49 - - - - - 5 - - - 2 - - - 50 - - - - - 6 - - - 3 - - - 51 - - - - - 7 - - - 4 - - - 52 - - - - - 9 - - - 5 - - - 53 - - - - - - - = - - - 8363 - - - - - == - - - 61 - - - - - - A-1 - - - - 49 - - - - - - A-2 - - - - 50 - - - - - - A-3 - - - - 51 - - - - - - A-4 - - - - 52 - - - - - - A-5 - - - - 53 - - - - - - A-6 - - - - 54 - - - - - - A-7 - - - - 55 - - - - - - A-8 - - - - 56 - - - - - - A-9 - - - - 57 - - - - - - A-0 - - - - 48 - - - - - - A-- - - - - 45 - - - - - - A-= - - - - 61 - - - - - - A-\ - - - - 92 - - - - - - A-[ - - - - 91 - - - - - - A-] - - - - 93 - - - - - - A-! - - - - 33 - - - - - - A-@ - - - - 64 - - - - - - A-# - - - - 35 - - - - - - A-$ - - - - 36 - - - - - - A-% - - - - 37 - - - - - - A-^ - - - - 94 - - - - - - A-& - - - - 38 - - - - - - A-* - - - - 42 - - - - - - A-( - - - - 40 - - - - - - A-) - - - - 41 - - - - - - A-_ - - - - 95 - - - - - - A-+ - - - - 43 - - - - - - A-| - - - - 124 - - - - - - A-{ - - - - 123 - - - - - - A-} - - - - 125 - - - - - - - 22 - - - 2 - - - - - @@ - - - @ - - - - - 11 - - - 1 - - - - - !! - - - ! - - - - - 33 - - - 3 - - - - - ## - - - ## - - - - - 44 - - - 4 - - - - - $$ - - - $ - - - - - ]] - - - ] - - - - - }} - - - } - - - - - [[ - - - [ - - - - - {{ - - - { - - - - - 00 - - - 0 - - - - - )) - - - ) - - - -
- - - - - - @-1 - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - -2 - - - - - - - @-1 - - - - - - - state-after-c - - - - - - - - @-1 - - - - - - - state-after-c - - - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - state-temporary-escape - - - - - state-escape-in-normal-mode - - - - - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - - - state-after-vc - - - - - state-after-vc - - - - - M - - - - - - - - - - @-1 - - - - T - - - - - M - - - - - M - - - - - - - - - - @-1 - - - - T - - - - - M - - - - - @- - - - 1 - - - state-after-t - - - - - @- - - - - - - - - - - - - 0 - - - - - - 2 - - - 0 - - - - - - - - - - - 0 - - - - - - 1 - - - 0 - - - - - - 1 - - state-init - - - - - - - - - 1 - - - - - 1 - - - - - 1 - - - - - @- - - - 1 - - - state-after-t - - - - - @- - - - 1 - - - - - - 0 - - - state-after-v - - - - - - - - - -1 - - - - - - - - - - - T - - - - @> - - - state-temporary-escape - - - - 1 - - @- - - - - - - - - - - - - - - state-after-vc - - - - 1 - - state-after-v - - - - - - - en - - - - - - - - - EN - - - \ - - - state-init - - - - - state-permanent-escape - - - - - EN - - - 1 - - - - - state-escape-in-permanent-escape - - - - - - - - Ắ - - - \ - - - - state-permanent-escape - - - - -
\ No newline at end of file diff --git a/vi-telex.mimx b/vi-telex.mimx deleted file mode 100644 index 2074b24..0000000 --- a/vi-telex.mimx +++ /dev/null @@ -1,1415 +0,0 @@ - - - - vi - telex - - - Vietnames input method using the TELEX key sequence. -Typing Backslash ('\') toggles the normal mode and English mode. -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) - - Ắ(TLX) - - - - Flag to control tone mark position in equivocal cases. -If this variable is 0 (the default), put tone mark on the first vowel -in such equivocal cases as "oa", "oe", "uy". -Otherwise, put tone mark on the last vowel. - - 0 - - 0 - 1 - - - - - Flag to control the action of Backspace key (delete or undo). -If this variable is 0 (the default), Backspace key deletes the previous -character (e.g. "q u a i s BS" => "quá"). -If the value is 1, Backspace key undoes the previous key -(e.g. "q u a i s BS" => "quai"). - - 0 - - 0 - 1 - - - - - - - t - nil - vi-base - -
macro
-
-
- - - - t - nil - vi-base - -
map
-
- - - - aa - - - âấầẩẫậ - - - - - AA - - - ÂẤẦẨẪẬ - - - - - Aa - - - ÂẤẦẨẪẬ - - - - - aw - - - ăắằẳẵặ - - - - - AW - - - ĂẮẰẲẴẶ - - - - - Aw - - - ĂẮẰẲẴẶ - - - - - ee - - - êếềểễệ - - - - - EE - - - ÊẾỀỂỄỆ - - - - - Ee - - - ÊẾỀỂỄỆ - - - - - oo - - - ôốồổỗộ - - - - - OO - - - ÔỐỒỔỖỘ - - - - - Oo - - - ÔỐỒỔỖỘ - - - - - ow - - - ơớờởỡợ - - - - - OW - - - ƠỚỜỞỠỢ - - - - - Ow - - - ƠỚỜỞỠỢ - - - - - uw - - - ưứừửữự - - - - - UW - - - ƯỨỪỬỮỰ - - - - - Uw - - - ƯỨỪỬỮỰ - - - - - w - - - - - - 0 - - - ưứừửữự - - - - 1 - - w - - - - - - - W - - - - - - 0 - - - ƯỨỪỬỮỰ - - - - 1 - - W - - - - - - - ooo - - - oóòỏõọ - - - oóòỏõọ - - - - - - 111 - - - - - OOO - - - OÓÒỎÕỌ - - - OÓÒỎÕỌ - - - - - - 79 - - - - - Ooo - - - OÓÒỎÕỌ - - - oóòỏõọ - - - - - - 79 - - - - - - - dd - - - 273 - - - - - DD - - - 272 - - - - - Dd - - - 272 - - - - - - - z - - - 0 - - - 122 - - - - - Z - - - 0 - - - 90 - - - - - s - - - 1 - - - 115 - - - - - S - - - 1 - - - 83 - - - - - f - - - 2 - - - 102 - - - - - F - - - 2 - - - 70 - - - - - r - - - 3 - - - 114 - - - - - R - - - 3 - - - 82 - - - - - x - - - 4 - - - 120 - - - - - X - - - 4 - - - 88 - - - - - j - - - 5 - - - 106 - - - - - J - - - 5 - - - 74 - - - - - - - z - - - 122 - - - - - s - - - 115 - - - - - f - - - 102 - - - - - r - - - 114 - - - - - x - - - 120 - - - - - j - - - 106 - - - - - Z - - - 90 - - - - - S - - - 83 - - - - - F - - - 70 - - - - - R - - - 82 - - - - - X - - - 88 - - - - - J - - - 74 - - - - - - - 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 - - - 119 - - - - - WW - - - 87 - - - - - Ww - - - 87 - - - - - zz - - - 122 - - - - - ZZ - - - 90 - - - - - Zz - - - 90 - - - - - ss - - - 115 - - - - - SS - - - 83 - - - - - Ss - - - 83 - - - - - ff - - - 102 - - - - - FF - - - 70 - - - - - Ff - - - 70 - - - - - rr - - - 114 - - - - - RR - - - 82 - - - - - Rr - - - 82 - - - - - xx - - - 120 - - - - - XX - - - 88 - - - - - Xx - - - 88 - - - - - jj - - - 106 - - - - - JJ - - - 74 - - - - - Jj - - - 74 - - - -
- - - - - - @-1 - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - -2 - - - - - - - @-1 - - - - - - - state-after-c - - - - - - - - @-1 - - - - - - - state-after-c - - - - - - - - - - - @-1 - - 102 - - - - @-1 - - 106 - - - - @-1 - - 122 - - - - @-1 - - 70 - - - - @-1 - - 74 - - - - @-1 - - 90 - - - - state-temporary-escape - - - - 1 - - - @-1 - - - - - - - state-after-c - - - - - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - state-temporary-escape - - - - - state-escape-in-normal-mode - - - - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - - - - state-after-vc - - - - - M - - - - - - - - - - @-1 - - - - T - - - - - M - - - - - M - - - - - - - - - - @-1 - - - - T - - - - - M - - - - - state-temporary-escape - - - - - @- - - - 1 - - - state-after-t - - - - - @- - - - - - - - - - - - - 0 - - - - - - 2 - - - 0 - - - - - - - - - - - - 0 - - - - - - 1 - - - 0 - - - - - - - 1 - - state-init - - - - - - - - - 1 - - - - - - - - - @-2 - - 110 - - - - @-2 - - 99 - - - - @-2 - - 78 - - - - @-2 - - 67 - - - - 1 - - - - 1 - - state-temporary-escape - - - - - - - state-temporary-escape - - - - - @- - - - 1 - - - state-after-t - - - - - state-temporary-escape - - - - - state-temporary-escape - - - - - @- - - - 1 - - - - - - - 0 - - - state-after-v - - - - - - - - - -1 - - - - - - - - - - - T - - - - @> - - - state-temporary-escape - - - - 1 - - @- - - - - - - - - - - - - - - state-after-vc - - - - 1 - - state-after-v - - - - - - - en - - - - - - - - - EN - - - \ - - - state-init - - - - - state-permanent-escape - - - - - EN - - - 1 - - - - - state-escape-in-permanent-escape - - - - - - - - Ắ - - - \ - - - - state-permanent-escape - - - - -
\ No newline at end of file diff --git a/vi-viqr.mimx b/vi-viqr.mimx deleted file mode 100644 index d7d3e83..0000000 --- a/vi-viqr.mimx +++ /dev/null @@ -1,778 +0,0 @@ - - - - vi - viqr - - - Vietnames input method using the VIQR key sequence. -Typing Backslash ('\') toggles the normal mode and English mode. -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) - - Ắ(VIQR) - - - - Flag to control tone mark position in equivocal cases. -If this variable is 0 (the default), put tone mark on the first vowel -in such equivocal cases as "oa", "oe", "uy". -Otherwise, put tone mark on the last vowel. - - 0 - - 0 - 1 - - - - - Flag to control the action of Backspace key (delete or undo). -If this variable is 0 (the default), Backspace key deletes the previous -character (e.g. "q u a i s BS" => "quá"). -If the value is 1, Backspace key undoes the previous key -(e.g. "q u a i s BS" => "quai"). - - 0 - - 0 - 1 - - - - - - - t - nil - vi-base - -
macro
-
-
- - - - t - nil - vi-base - -
map
-
- - - - a^ - - - âấầẩẫậ - - - - - A^ - - - ÂẤẦẨẪẬ - - - - - a( - - - ăắằẳẵặ - - - - - A( - - - ĂẮẰẲẴẶ - - - - - e^ - - - êếềểễệ - - - - - E^ - - - ÊẾỀỂỄỆ - - - - - o^ - - - ôốồổỗộ - - - - - O^ - - - ÔỐỒỔỖỘ - - - - - o+ - - - ơớờởỡợ - - - - - O+ - - - ƠỚỜỞỠỢ - - - - - u+ - - - ưứừửữự - - - - - U+ - - - ƯỨỪỬỮỰ - - - - - - - dd - - - 273 - - - - - DD - - - 272 - - - - - Dd - - - 272 - - - - - - - 0 - - - 0 - - - 48 - - - - - ' - - - 1 - - - 39 - - - - - ` - - - 2 - - - 96 - - - - - ? - - - 3 - - - 63 - - - - - ~ - - - 4 - - - 126 - - - - - . - - - 5 - - - 46 - - - - - - - a^^ - - - a^ - - - - - A^^ - - - A^ - - - - - a(( - - - a( - - - - - A(( - - - A( - - - - - e^^ - - - e^ - - - - - E^^ - - - E^ - - - - - o^^ - - - o^ - - - - - O^^ - - - O^ - - - - - o++ - - - o+ - - - - - O++ - - - O+ - - - - - u++ - - - u+ - - - - - U++ - - - U+ - - - -
- - - - - - @-1 - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - -2 - - - - - - - @-1 - - - - - - - state-after-c - - - - - - - - @-1 - - - - - - - state-after-c - - - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - state-temporary-escape - - - - - state-escape-in-normal-mode - - - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - - - state-after-vc - - - - - state-after-vc - - - - - M - - - - - - - - - - @-1 - - - - T - - - - - M - - - - - M - - - - - - - - - - @-1 - - - - T - - - - - M - - - - - @- - - - 1 - - - state-after-t - - - - - @- - - - - - - - - - - - - 0 - - - - - - 2 - - - 0 - - - - - - - - - - - 0 - - - - - - 1 - - - 0 - - - - - - 1 - - state-init - - - - - - - - - 1 - - - - - 1 - - - - - 1 - - - - - @- - - - 1 - - - state-after-t - - - - - @- - - - 1 - - - - - - 0 - - - state-after-v - - - - - - - - - -1 - - - - - - - - - - - T - - - - @> - - - state-temporary-escape - - - - 1 - - @- - - - - - - - - - - - - - - state-after-vc - - - - 1 - - state-after-v - - - - - - - en - - - - - - - - - EN - - - \ - - - state-init - - - - - state-permanent-escape - - - - - EN - - - 1 - - - - - state-escape-in-permanent-escape - - - - - - - - Ắ - - - \ - - - - state-permanent-escape - - - - -
\ No newline at end of file diff --git a/vi-vni.mimx b/vi-vni.mimx deleted file mode 100644 index fe0d857..0000000 --- a/vi-vni.mimx +++ /dev/null @@ -1,771 +0,0 @@ - - - - vi - vni - - - Vietnames input method using the VNI key sequence. -Typing Backslash ('\') toggles the normal mode and English mode. -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) - - Ắ(VNI) - - - - Flag to control tone mark position in equivocal cases. -If this variable is 0 (the default), put tone mark on the first vowel -in such equivocal cases as "oa", "oe", "uy". -Otherwise, put tone mark on the last vowel. - - 0 - - 0 - 1 - - - - - Flag to control the action of Backspace key (delete or undo). -If this variable is 0 (the default), Backspace key deletes the previous -character (e.g. "q u a i s BS" => "quá"). -If the value is 1, Backspace key undoes the previous key -(e.g. "q u a i s BS" => "quai"). - - 0 - - 0 - 1 - - - - - - - t - nil - vi-base - -
macro
-
-
- - - - t - nil - vi-base - -
map
-
- - - - a6 - - - âấầẩẫậ - - - - - A6 - - - ÂẤẦẨẪẬ - - - - - a8 - - - ăắằẳẵặ - - - - - A8 - - - ĂẮẰẲẴẶ - - - - - e6 - - - êếềểễệ - - - - - E6 - - - ÊẾỀỂỄỆ - - - - - o6 - - - ôốồổỗộ - - - - - O6 - - - ÔỐỒỔỖỘ - - - - - o7 - - - ơớờởỡợ - - - - - O7 - - - ƠỚỜỞỠỢ - - - - - u7 - - - ưứừửữự - - - - - U7 - - - ƯỨỪỬỮỰ - - - - - - - d9 - - - 273 - - - - - D9 - - - 272 - - - - - - - 0 - - - 0 - - - 48 - - - - - 1 - - - 1 - - - 49 - - - - - 2 - - - 2 - - - 50 - - - - - 3 - - - 3 - - - 51 - - - - - 4 - - - 4 - - - 52 - - - - - 5 - - - 5 - - - 53 - - - - - - - a66 - - - a6 - - - - - A66 - - - A6 - - - - - a88 - - - a8 - - - - - A88 - - - A8 - - - - - e66 - - - e6 - - - - - E66 - - - E6 - - - - - o66 - - - o6 - - - - - O66 - - - O6 - - - - - o77 - - - o7 - - - - - O77 - - - O7 - - - - - u77 - - - u7 - - - - - U77 - - - U7 - - - -
- - - - - - @-1 - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - -2 - - - - - - - @-1 - - - - - - - state-after-c - - - - - - - - @-1 - - - - - - - state-after-c - - - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - state-temporary-escape - - - - - state-escape-in-normal-mode - - - - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - M - - - - - - - @-1 - - - - state-after-v - - - - - - - state-after-vc - - - - - state-after-vc - - - - - M - - - - - - - - - - @-1 - - - - T - - - - - M - - - - - M - - - - - - - - - - @-1 - - - - T - - - - - M - - - - - @- - - - 1 - - - state-after-t - - - - - @- - - - - - - - - - - - - 0 - - - - - - 2 - - - 0 - - - - - - - - - - - 0 - - - - - - 1 - - - 0 - - - - - - 1 - - state-init - - - - - - - - - 1 - - - - - 1 - - - - - 1 - - - - - @- - - - 1 - - - state-after-t - - - - - @- - - - 1 - - - - - - 0 - - - state-after-v - - - - - - - - - -1 - - - - - - - - - - - T - - - - @> - - - state-temporary-escape - - - - 1 - - @- - - - - - - - - - - - - - - state-after-vc - - - - 1 - - state-after-v - - - - - - - en - - - - - - - - - EN - - - \ - - - state-init - - - - - state-permanent-escape - - - - - EN - - - 1 - - - - - state-escape-in-permanent-escape - - - - - - - - Ắ - - - \ - - - - state-permanent-escape - - - - -
\ No newline at end of file diff --git a/xex.html b/xex.html deleted file mode 100644 index f60ee20..0000000 --- a/xex.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - M17N Input Method by JavaScript - - - - -

m17n-lib input method in Javascript

- - -
textarea
text
-
debug Info
- - - - -
keystatuskeycodekeymappreedit
down0
press0
- - diff --git a/xex.js b/xex.js index 46d510f..932d240 100644 --- a/xex.js +++ b/xex.js @@ -16,18 +16,23 @@ var Xex = { else { var node; - LogNodeLen++; - if (LogNodeLen >= 200) - node = Xex.LogNode.firstElement (); + if (cont) + Xex.LogNode.lastChild.innerText += arg; else - node = document.createElement ('div'); - if (indent != undefined) - node.style.textIndent = (indent + 1) + 'em'; - else - node.style.textIndent = '0px'; - node.innerText = LogNodeLen + ': ' + arg; - Xex.LogNode.appendChild (node); - Xex.LogNode.scrollTop = Xex.LogNode.scrollHeight; + { + LogNodeLen++; + if (LogNodeLen >= 1000) + node = Xex.LogNode.firstElement (); + else + node = document.createElement ('div'); + if (indent != undefined) + node.style.textIndent = (indent + 1) + 'em'; + else + node.style.textIndent = '0px'; + node.innerText = LogNodeLen + ': ' + arg; + Xex.LogNode.appendChild (node); + Xex.LogNode.scrollTop = Xex.LogNode.scrollHeight; + } } } }; @@ -444,7 +449,7 @@ Xex.Term.prototype = { Equals: function (obj) { return (this.type == obj.type - && this.val + && this.val != undefined && obj.val == this.val); }, Matches: function (obj) { return this.Equals (obj); }, @@ -916,7 +921,7 @@ Xex.LstTerm = function (list) { this.val = list; }; { var n = vari ? vari.val.Intval () : 1; for (var i = 0; i < args.length; i++) - n *= arg.Intval (); + n *= args[i].Intval (); return maybe_set_intvar (vari, n); } @@ -1088,7 +1093,7 @@ Xex.LstTerm = function (list) { this.val = list; }; function Fge (domain, vari, args) { var n = args[0].Intval (); - for (var i = 1; i < args.Length; i++) + for (var i = 1; i < args.length; i++) { var n1 = args[i].Intval (); if (n < n1) @@ -1121,7 +1126,7 @@ Xex.LstTerm = function (list) { this.val = list; }; if (result.IsTrue ()) return args[1].Eval (domain); if (args.length == 2) - return Zero; + return Xex.Zero; return args[2].Eval (domain); } @@ -1302,2446 +1307,3 @@ Xex.Load = function (server, file) obj.send (''); return obj.responseXML.firstChild; } - -var MIM = { - // URL of the input method server. - server: "http://www.m17n.org/common/mim-js", - // Boolean flag to tell if MIM is active or not. - enabled: true, - // Boolean flag to tell if MIM is running in debug mode or not. - debug: false, - // List of main input methods. - imlist: {}, - // List of extra input methods; - imextra: {}, - // Global input method data - im_global: null, - // Currently selected input method. - current: false, - - // enum - LoadStatus: { NotLoaded:0, Loading:1, Loaded:2, Error:-1 }, - ChangedStatus: { - None: 0x00, - StateTitle: 0x01, - PreeditText:0x02, - CursorPos: 0x04, - CandidateList:0x08, - CandidateIndex:0x10, - CandidateShow:0x20, - Preedit: 0x06, // PreeditText | CursorPos - Candidate: 0x38 // CandidateList | CandidateIndex | CandidateShow - }, - KeyModifier: { - SL: 0x00400000, - SR: 0x00800000, - S: 0x00C00000, - CL: 0x01000000, - CR: 0x02000000, - C: 0x03000000, - AL: 0x04000000, - AR: 0x08000000, - A: 0x0C000000, - ML: 0x04000000, - MR: 0x08000000, - M: 0x0C000000, - G: 0x10000000, - s: 0x20000000, - H: 0x40000000, - High: 0x70000000, - All: 0x7FC00000 - }, - Error: { - ParseError: "parse-error" - } -}; - -(function () { - var keysyms = new Array (); - keysyms["bs"] = "backspace"; - keysyms["lf"] = "linefeed"; - keysyms["cr"] = keysyms["enter"] = "return"; - keysyms["esc"] = "escape"; - keysyms["spc"] = "space"; - keysyms["del"] = "delete"; - - function decode_keysym (str) { - if (str.length == 1) - return str; - var parts = str.split ("-"); - var len = parts.length, i; - var has_modifier = len > 1; - - for (i = 0; i < len - 1; i++) - if (! MIM.KeyModifier.hasOwnProperty (parts[i])) - return false; - var key = parts[len - 1]; - if (key.length > 1) - { - key = keysyms[key.toLowerCase ()]; - if (key) - { - if (len > 1) - { - str = parts[0]; - for (i = 1; i < len - 1; i++) - str += '-' + parts[i]; - str += '-' + key; - } - else - str = key; - } - } - if (has_modifier) - { - parts = new Array (); - parts.push (str); - return parts; - } - return str; - } - - MIM.Key = function (val) - { - this.key; - if (val instanceof Xex.Term) - this.key = val.val; - else if (typeof val == 'string' || val instanceof String) - { - this.key = decode_keysym (val); - if (! this.key) - throw new Xex.ErrTerm (MIM.Error.ParseError, "Invalid key: " + val); - if (this.key instanceof Array) - { - this.key = this.key[0]; - this.has_modifier = true; - } - } - else if (typeof val == 'number' || val instanceof Number) - this.key = String.fromCharCode (val); - else - throw new Xex.ErrTerm (MIM.Error.ParseError, "Invalid key: " + val); - } - - MIM.Key.prototype.toString = function () { return this.key; }; - - MIM.Key.FocusIn = new MIM.Key (new Xex.StrTerm ('input-focus-in')); - MIM.Key.FocusOut = new MIM.Key (new Xex.StrTerm ('input-focus-out')); - MIM.Key.FocusMove = new MIM.Key (new Xex.StrTerm ('input-focus-move')); -}) (); - -(function () { - MIM.KeySeq = function (seq) - { - this.val = new Array (); - - if (seq) - { - if (seq.IsList) - { - var len = seq.val.length; - for (var i = 0; i < len; i++) - { - var v = seq.val[i], key; - if (v.type == 'symbol' || v.type == 'string') - key = new MIM.Key (v); - else if (v.type == 'integer') - key = new MIM.Key (v.val); - else - throw new Xex.ErrTerm (MIM.Error.ParseError, - "Invalid key: " + v); - this.val.push (key); - if (key.has_modifier) - this.has_modifier = true; - } - } - else if (seq.IsStr) - { - var len = seq.val.length; - for (var i = 0; i < len; i++) - this.val.push (new MIM.Key (seq.val.charCodeAt (i))); - } - else - throw new Xex.ErrTerm (MIM.Error.ParseError, "Invalid key: " + seq); - } - } - - var proto = new Xex.Term ('keyseq'); - proto.Clone = function () { return this; } - proto.Parser = function (domain, node) - { - var seq = new Array (); - for (node = node.firstChild; node; node = node.nextSibling) - if (node.nodeType == 1) - { - var term = Xex.Term.Parse (domain, node); - return new MIM.KeySeq (term); - } - throw new Xex.ErrTerm (MIM.Error.ParseError, "Invalid keyseq"); - } - proto.toString = function () - { - var len = this.val.length; - if (len == 0) - return ''; - var first = true; - var str = ''; - for (var i = 0; i < len; i++) - { - if (first) - first = false; - else if (this.has_modifier) - str += ' '; - str += this.val[i].toString (); - } - return str + ''; - } - - MIM.KeySeq.prototype = proto; -}) (); - -(function () { - MIM.Marker = function () { } - MIM.Marker.prototype = new Xex.Term ('marker'); - MIM.Marker.prototype.CharAt = function (ic) - { - var p = this.Position (ic); - if (p < 0 || p >= ic.preedit.length) - return 0; - return ic.preedit.charCodeAt (p); - } - - MIM.FloatingMarker = function (name) { this.val = name; }; - var proto = new MIM.Marker (); - MIM.FloatingMarker.prototype = proto; - proto.Position = function (ic) { return ic.marker_positions[this.val]; }; - proto.Mark = function (ic) { ic.marker_positions[this.val] = ic.cursor_pos; }; - - MIM.PredefinedMarker = function (name) { this.val = name; } - MIM.PredefinedMarker.prototype = new MIM.Marker (); - MIM.PredefinedMarker.prototype.Position = function (ic) - { - if (typeof this.pos == 'number') - return this.pos; - return this.pos (ic); - } - - var predefined = { } - - function def_predefined (name, position) - { - predefined[name] = new MIM.PredefinedMarker (name); - predefined[name].pos = position; - } - - def_predefined ('@<', 0); - def_predefined ('@>', function (ic) { return ic.preedit.length; }); - def_predefined ('@-', function (ic) { return ic.cursor_pos - 1; }); - def_predefined ('@+', function (ic) { return ic.cursor_pos + 1; }); - def_predefined ('@[', function (ic) { - if (ic.cursor_pos > 0) - { - var pos = ic.cursor_pos; - return ic.preedit.FindProp ('candidates', pos - 1).from; - } - return 0; - }); - def_predefined ('@]', function (ic) { - if (ic.cursor_pos < ic.preedit.length - 1) - { - var pos = ic.cursor_pos; - return ic.preedit.FindProp ('candidates', pos).to; - } - return ic.preedit.length; - }); - for (var i = 0; i < 10; i++) - def_predefined ("@" + i, i); - predefined['@first'] = predefined['@<']; - predefined['@last'] = predefined['@>']; - predefined['@previous'] = predefined['@-']; - predefined['@next'] = predefined['@+']; - predefined['@previous-candidate-change'] = predefined['@[']; - predefined['@next-candidate-change'] = predefined['@]']; - - MIM.SurroundMarker = function (name) - { - this.val = name; - this.distance = parseInt (name.slice (1)); - if (isNaN (this.distance)) - throw new Xex.ErrTerm (MIM.Error.ParseError, "Invalid marker: " + name); - } - MIM.SurroundMarker.prototype = new MIM.Marker (); - MIM.SurroundMarker.prototype.Position = function (ic) - { - return ic.cursor_pos + this.distance; - } - MIM.SurroundMarker.prototype.CharAt = function (ic) - { - if (this.val == '@-0') - return -1; - var p = this.Position (ic); - if (p < 0) - return ic.GetSurroundingChar (p); - else if (p >= ic.preedit.length) - return ic.GetSurroundingChar (p - ic.preedit.length); - return ic.preedit.charCodeAt (p); - } - - MIM.Marker.prototype.Parser = function (domain, node) - { - var name = node.firstChild.nodeValue; - if (name.charAt (0) == '@') - { - var n = predefined[name]; - if (n) - return n; - if (name.charAt (1) == '-' || name.charAt (1) == '+') - return new MIM.SurroundMarker (name); - throw new Xex.ErrTerm (MIM.Error.ParseError, - "Invalid marker: " + name); - } - return new MIM.FloatingMarker (name);; - } -}) (); - -MIM.Selector = function (name) -{ - this.val = name; -} -MIM.Selector.prototype = new Xex.Term ('selector'); - -(function () { - var selectors = {}; - selectors["@<"] = selectors["@first"] = new MIM.Selector ('@<'); - selectors["@="] = selectors["@current"] = new MIM.Selector ('@='); - selectors["@>"] = selectors["@last"] = new MIM.Selector ('@>'); - selectors["@-"] = selectors["@previous"] = new MIM.Selector ('@-'); - selectors["@+"] = selectors["@next"] = new MIM.Selector ('@+'); - selectors["@["] = selectors["@previous-group"] = new MIM.Selector ('@['); - selectors["@]"] = selectors["@next-group"] = new MIM.Selector ('@]'); - - MIM.Selector.prototype.Parser = function (domain, node) - { - var name = node.firstChild.nodeValue; - var s = selectors[name]; - if (! s) - throw new Xex.ErrTerm (MIM.Error.ParseError, - "Invalid selector: " + name); - return s; - } -}) (); - -MIM.Rule = function (keyseq, actions) -{ - this.keyseq = keyseq; - if (actions) - this.actions = actions; -} -MIM.Rule.prototype = new Xex.Term ('rule'); -MIM.Rule.prototype.Parser = function (domain, node) -{ - var n; - for (n = node.firstChild; n && n.nodeType != 1; n = n.nextSibling); - if (! n) - throw new Xex.ErrTerm (MIM.Error.ParseError, "invalid rule:" + node); - var keyseq = Xex.Term.Parse (domain, n); - if (keyseq.type != 'keyseq') - throw new Xex.ErrTerm (MIM.Error.ParseError, "invalid rule:" + node); - var actions = null; - n = n.nextElement (); - if (n) - actions = Xex.Term.Parse (domain, n, null); - return new MIM.Rule (keyseq, actions); -} -MIM.Rule.prototype.toString = function () -{ - return ''; -} - -MIM.Map = function (name) -{ - this.name = name; - this.rules = new Array (); -}; - -(function () { - var proto = new Xex.Term ('map'); - - proto.Parser = function (domain, node) - { - var name = node.attributes['mname'].nodeValue; - if (! name) - throw new Xex.ErrTerm (MIM.Error.ParseError, "invalid map"); - var map = new MIM.Map (name); - for (var n = node.firstChild; n; n = n.nextSibling) - if (n.nodeType == 1) - map.rules.push (Xex.Term.Parse (domain, n)); - return map; - } - - proto.toString = function () - { - var str = ''; - var len = this.rules.length; - for (i = 0; i < len; i++) - str += this.rules[i]; - return str + ''; - } - - MIM.Map.prototype = proto; -}) (); - -Xex.CatchTag._mimtag = new Xex.SymTerm ('@mimtag'); - -MIM.Action = function (domain, terms) -{ - var args = new Array (); - args.push (Xex.CatchTag_.mimtag); - for (var i = 0; i < terms.length; i++) - args.push (terms[i]); - this.action = Xex.Funcall.prototype.New (domain, 'catch', null, args); -} - -MIM.Action.prototype.Run = function (domain) -{ - var result = this.action.Eval (domain); - if (result.type == 'error') - { - domain.context.Error = result.toString (); - return false; - } - return (result != Xex.CatchTag._mimtag); -} - -MIM.Keymap = function () -{ - this.name = 'TOP'; - this.submaps = null; -}; - -(function () { - var proto = {}; - - function add_rule (keymap, rule, branch_actions) - { - var keyseq = rule.keyseq; - var len = keyseq.val.length; - var name = ''; - - for (var i = 0; i < len; i++) - { - var key = keyseq.val[i]; - var sub = false; - - name += key.key; - if (! keymap.submaps) - keymap.submaps = {}; - else - sub = keymap.submaps[key.key]; - if (! sub) - keymap.submaps[key.key] = sub = new MIM.Keymap (); - keymap = sub; - keymap.name = name; - } - keymap.map_actions = rule.actions; - if (branch_actions) - keymap.branch_actions = branch_actions; - } - - proto.Add = function (map, branch_actions) - { - var rules = map.rules; - var len = rules.length; - - for (var i = 0; i < len; i++) - add_rule (this, rules[i], branch_actions); - } - proto.Lookup = function (keys, index) - { - var sub; - - if (index < keys.val.length && this.submaps - && ! keys.val[index]) - { - Xex.Log ('invalid key at ' + index); - throw 'invalid key'; - } - - if (index < keys.val.length && this.submaps - && (sub = this.submaps[keys.val[index].key])) - { - index++; - return sub.Lookup (keys, index); - } - return { map: this, index: index }; - } - - MIM.Keymap.prototype = proto; -}) (); - -MIM.State = function (name) -{ - this.name = name; - this.keymap = new MIM.Keymap (); -}; - -(function () { - var proto = new Xex.Term ('state'); - - proto.Parser = function (domain, node) - { - var map_list = domain.map_list; - var name = node.attributes['sname'].nodeValue; - if (! name) - throw new Xex.ErrTerm (MIM.Error.ParseError, "invalid map"); - var state = new MIM.State (name); - for (node = node.firstElement (); node; node = node.nextElement ()) - { - if (node.nodeName == 'title') - state.title = node.firstChild.nodeValue; - else - { - var n = node.firstElement (); - var branch_actions = n ? Xex.Term.Parse (domain, n, null) : null; - if (node.nodeName == 'branch') - state.keymap.Add (map_list[node.attributes['mname'].nodeValue], - branch_actions); - else if (node.nodeName == 'state-hook') - state.enter_actions = branch_actions; - else if (node.nodeName == 'catch-all-branch') - state.fallback_actions = branch_actions; - } - } - return state; - } - - proto.toString = function () - { - return '' + this.keymap + ''; - } - - MIM.State.prototype = proto; -}) (); - -(function () { - function Block (index, term) - { - this.Index = index; - if (term.IsStr) - this.Data = term.val; - else if (term.IsList) - { - this.Data = new Array (); - for (var i = 0; i < term.val.length; i++) - this.Data.push (term.val[i].val); - } - } - - Block.prototype.Count = function () { return this.Data.length; } - Block.prototype.get = function (i) - { - return (this.Data instanceof Array ? this.Data[i] : this.Data.charAt (i)); - } - - MIM.Candidates = function (ic, candidates, column) - { - this.ic = ic; - this.column = column; - this.row = 0; - this.index = 0; - this.total = 0; - this.blocks = new Array (); - - for (var i = 0; i < candidates.length; i++) - { - var block = new Block (this.total, candidates[i]); - this.blocks.push (block); - this.total += block.Count (); - } - } - - function get_col () - { - return (this.column > 0 ? this.index % this.column - : this.index - this.blocks[this.row].Index); - } - - function prev_group () - { - var col = get_col.call (this); - var nitems; - if (this.column > 0) - { - this.index -= this.column; - if (this.index >= 0) - nitems = this.column; - else - { - var lastcol = (this.total - 1) % this.column; - this.index = (col < lastcol ? this.total - lastcol + col - : this.total - 1); - this.row = this.blocks.length - 1; - nitems = lastcol + 1; - } - while (this.blocks[this.row].Index > this.index) - this.row--; - } - else - { - this.row = this.row > 0 ? this.row - 1 : this.blocks.length - 1; - nitems = this.blocks[this.row].Count (); - this.index = (this.blocks[this.row].Index - + (col < nitems ? col : nitems - 1)); - } - return nitems; - } - - function next_group () - { - var col = get_col.call (this); - var nitems; - if (this.column > 0) - { - this.index += this.column - col; - if (this.index < this.total) - { - if (this.index + col >= this.total) - { - nitems = this.total - this.index; - this.index = this.total - 1; - } - else - { - nitems = this.column; - this.index += col; - } - } - else - { - this.index = col; - this.row = 0; - } - while (this.blocks[this.row].Index + this.blocks[this.row].Count () - <= this.index) - this.row++; - } - else - { - this.row = this.row < this.blocks.length - 1 ? this.row + 1 : 0; - nitems = this.blocks[this.row].Count (); - this.index = (this.blocks[this.row].Index - + (col < nitems ? col : nitems - 1)); - } - return nitems; - } - - function prev () - { - if (this.index == 0) - { - this.index = this.total - 1; - this.row = this.blocks.length - 1; - } - else - { - this.index--; - if (this.blocks[this.row].Index > this.index) - this.row--; - } - } - - function next () - { - this.index++; - if (this.index == this.total) - { - this.index = 0; - this.row = 0; - } - else - { - var b = this.blocks[this.row]; - if (this.index == b.Index + b.Count ()) - this.row++; - } - } - - function first () - { - this.index -= get_col.call (this); - while (this.blocks[this.row].Index > this.index) - this.row--; - } - - function last () - { - var b = this.blocks[this.row]; - if (this.column > 0) - { - if (this.index + 1 < this.total) - { - this.index += this.column - get_col.call (this) + 1; - while (b.Index + b.Count () <= this.index) - b = this.blocks[++this.row]; - } - } - else - this.index = b.Index + b.Count () - 1; - } - - MIM.Candidates.prototype.Current = function () - { - var b = this.blocks[this.row]; - return b.get (this.index - b.Index); - } - - MIM.Candidates.prototype.Select = function (selector) - { - var idx = this.index; - var gidx = this.column > 0 ? idx / this.column : this.row; - if (selector.type == 'selector') - { - switch (selector.val) - { - case '@<': first.call (this); break; - case '@>': last.call (this); break; - case '@-': prev.call (this); break; - case '@+': next.call (this); break; - case '@[': prev_group.call (this); break; - case '@]': next_group.call (this); break; - default: break; - } - } - else - { - var col, start, end - if (this.column > 0) - { - col = this.index % this.column; - start = this.index - col; - end = start + this.column; - } - else - { - start = this.blocks[this.row].Index; - col = this.index - start; - end = start + this.blocks[this.row].Count; - } - if (end > this.total) - end = this.total; - this.index += selector.val - col; - if (this.index >= end) - this.index = end - 1; - if (this.column > 0) - { - if (selector.val > col) - while (this.blocks[this.row].Index + this.blocks[this.row].Count - < this.index) - this.row++; - else - while (this.blocks[this.row].Index > this.index) - this.row--; - } - } - var newgidx = this.column > 0 ? this.index / this.column : this.row; - if (this.index != idx) - this.ic.changed |= (gidx == newgidx - ? MIM.ChangedStatus.CandidateIndex - : MIM.ChangedStatus.CandidateList); - return this.Current (); - } - - MIM.Candidates.prototype.CurrentCol = function () - { - return get_col.call (this); - } - - MIM.Candidates.prototype.CurrentGroup = function () - { - var col, start, end, gnum, gidx; - if (this.column > 0) - { - gnum = Math.floor ((this.total - 1) / this.column) + 1; - col = this.index % this.column; - start = this.index - col; - gidx = start / this.column + 1; - end = start + this.column; - if (end > this.total) - end = this.total; - } - else - { - gnum = this.blocks.length; - gidx = this.row + 1; - start = this.blocks[this.row].Index; - col = this.index - start; - end = start + this.blocks[this.row].Count (); - } - var group = new Array (); - var indices = new Array (gnum, gidx, col); - group.push (indices); - var row = this.row; - var block = this.blocks[row++]; - while (start < end) - { - var c = block.get (start - block.Index); - group.push (c); - start++; - if (start == block.Index + block.Count ()) - block = this.blocks[row++]; - } - return group; - } -}) (); - -MIM.im_domain = new Xex.Domain ('input-method', null, null); -MIM.im_domain.DefType (MIM.KeySeq.prototype); -MIM.im_domain.DefType (MIM.Marker.prototype); -MIM.im_domain.DefType (MIM.Selector.prototype); -MIM.im_domain.DefType (MIM.Rule.prototype); -MIM.im_domain.DefType (MIM.Map.prototype); -MIM.im_domain.DefType (MIM.State.prototype); - -(function () { - var im_domain = MIM.im_domain; - - function Finsert (domain, vari, args) - { - var text; - if (args[0].type == 'integer') - text = String.fromCharCode (args[0].val); - else - text = args[0].val; - domain.context.ins (text, null); - return args[0]; - } - - function Finsert_candidates (domain, vari, args) - { - var ic = domain.context; - var gsize = domain.variables['candidates-group-size']; - var candidates = new MIM.Candidates (ic, args, - gsize ? gsize.val.Intval () : 0); - ic.ins (candidates.Current (), candidates); - return args[0]; - } - - function Fdelete (domain, vari, args) - { - var ic = domain.context; - var pos = args[0].IsInt ? args[0].Intval () : args[0].Position (ic); - return new Xex.IntTerm (ic.del (pos)); - } - - function Fselect (domain, vari, args) - { - var ic = domain.context; - var can = ic.candidates; - - if (can) - { - var old_text = can.Current (); - var new_text = can.Select (args[0]); - ic.rep (old_text, new_text, can); - } - else - Xex.Log ('no candidates at ' + ic.cursor_pos + ' of ' + ic.candidate_table.table.length); - return args[0]; - } - - function Fshow (domain, vari, args) - { - domain.context.candidate_show = true; - domain.context.changed |= MIM.ChangedStatus.CandidateShow; - return Xex.nil; - } - - function Fhide (domain, vari, args) - { - domain.context.candidate_show = false; - domain.context.changed |= MIM.ChangedStatus.CandidateShow; - return Xex.nil; - } - - function Fchar_at (domain, vari, args) - { - return new Xex.IntTerm (args[0].CharAt (domain.context)); - } - - function Fmove (domain, vari, args) - { - var ic = domain.context; - var pos = args[0].IsInt ? args[0].val : args[0].Position (ic); - ic.move (pos); - return new Xex.IntTerm (pos); - } - - function Fmark (domain, vari, args) - { - args[0].Mark (domain.context); - return args[0]; - } - - function Fpushback (domain, vari, args) - { - var a = (args[0].IsInt ? args[0].Intval () - : args[0].IsStr ? new KeySeq (args[0]) - : args[0]); - domain.context.pushback (a); - return args[0]; - } - - function Fpop (domain, vari, args) - { - var ic = domain.context; - if (ic.key_head < ic.keys.val.length) - ic.keys.val.splice (ic.keys_head, 1); - return Xex.nil; - } - - function Fundo (domain, vari, args) - { - var ic = domain.context; - var n = args.length == 0 ? -2 : args[0].val; - Xex.Log ('undo with arg ' + args[0]); - if (n < 0) - ic.keys.val.splice (ic.keys.val.length + n, -n); - else - ic.keys.val.splice (n, ic.keys.val.length); - ic.reset (); - return Xex.nil; - } - - function Fcommit (domain, vari, args) - { - domain.context.commit (); - return Xex.nil; - } - - function Funhandle (domain, vari, args) - { - domain.context.commit (); - return Xex.Fthrow (domain, vari, Xex.CatchTag._mimtag); - } - - function Fshift (domain, vari, args) - { - var ic = domain.context; - var state_name = args[0].val; - var state = ic.im.state_list[state_name]; - if (! state) - throw ("Unknown state: " + state_name); - ic.shift (state); - return args[0]; - } - - function Fshiftback (domain, vari, args) - { - domain.context.shift (null); - return Xex.nil; - } - - function Fkey_count (domain, vari, args) - { - return new Xex.IntTerm (domain.context.key_head); - } - - function Fsurrounding_flag (domain, vari, args) - { - return new Xex.IntTerm (-1); - } - - im_domain.DefSubr (Finsert, "insert", false, 1, 1); - im_domain.DefSubr (Finsert_candidates, "insert-candidates", false, 1, 1); - im_domain.DefSubr (Fdelete, "delete", false, 1, 1); - im_domain.DefSubr (Fselect, "select", false, 1, 1); - im_domain.DefSubr (Fshow, "show-candidates", false, 0, 0); - im_domain.DefSubr (Fhide, "hide-candidates", false, 0, 0); - im_domain.DefSubr (Fmove, "move", false, 1, 1); - im_domain.DefSubr (Fmark, "mark", false, 1, 1); - im_domain.DefSubr (Fpushback, "pushback", false, 1, 1); - im_domain.DefSubr (Fpop, "pop", false, 0, 0); - im_domain.DefSubr (Fundo, "undo", false, 0, 1); - im_domain.DefSubr (Fcommit, "commit", false, 0, 0); - im_domain.DefSubr (Funhandle, "unhandle", false, 0, 0); - im_domain.DefSubr (Fshift, "shift", false, 1, 1); - im_domain.DefSubr (Fshiftback, "shiftback", false, 0, 0); - im_domain.DefSubr (Fchar_at, "char-at", false, 1, 1); - im_domain.DefSubr (Fkey_count, "key-count", false, 0, 0); - im_domain.DefSubr (Fsurrounding_flag, "surrounding-text-flag", false, 0, 0); -}) (); - - -(function () { - function get_global_var (vname) - { - if (MIM.im_global.load_status == MIM.LoadStatus.NotLoaded) - MIM.im_global.Load () - return MIM.im_global.domain.variables[vname]; - } - - function include (node) - { - node = node.firstElement (); - if (node.nodeName != 'tags') - return null; - - var lang = null, name = null, extra = null; - for (node = node.firstElement (); node; node = node.nextElement ()) - { - if (node.nodeName == 'language') - lang = node.firstChild.nodeValue; - else if (node.nodeName == 'name') - name = node.firstChild.nodeValue; - else if (node.nodeName == 'extra-id') - extra = node.firstChild.nodeValue; - } - if (! lang || ! MIM.imlist[lang]) - return null; - if (! extra) - { - if (! name || ! (im = MIM.imlist[lang][name])) - return null; - } - else - { - if (! (im = MIM.imextra[lang][extra])) - return null; - } - if (im.load_status != MIM.LoadStatus.Loaded - && (im.load_status != MIM.LoadStatus.NotLoaded || ! im.Load ())) - return null; - return im; - } - - var parsers = { }; - - parsers['description'] = function (node) - { - this.description = node.firstChild.nodeValue; - } - parsers['variable-list'] = function (node) - { - for (node = node.firstElement (); node; node = node.nextElement ()) - { - var vname = node.attributes['vname'].nodeValue; - if (this != MIM.im_global) - { - var vari = get_global_var (vname); - if (vari != null) - this.domain.Defvar (vname, vari.desc, vari.val, vari.range); - } - vname = Xex.Term.Parse (this.domain, node) - } - } - parsers['command-list'] = function (node) - { - } - parsers['macro-list'] = function (node) - { - for (var n = node.firstElement (); n; n = n.nextElement ()) - if (n.nodeName == 'xi:include') - { - var im = include (n); - if (! im) - alert ('inclusion fail'); - else - for (var macro in im.domain.functions) - { - var func = im.domain.functions[macro]; - if (func instanceof Xex.Macro) - im.domain.CopyFunc (this.domain, macro); - } - n = n.previousSibling; - node.removeChild (n.nextSibling); - } - Xex.Term.Parse (this.domain, node.firstElement (), null); - } - parsers['title'] = function (node) - { - this.title = node.firstChild.nodeValue; - } - parsers['map-list'] = function (node) - { - for (node = node.firstElement (); node; node = node.nextElement ()) - { - if (node.nodeName == 'xi:include') - { - var im = include (node); - if (! im) - { - alert ('inclusion fail'); - continue; - } - for (var mname in im.map_list) - this.map_list[mname] = im.map_list[mname]; - } - else - { - var map = Xex.Term.Parse (this.domain, node); - this.map_list[map.name] = map; - } - } - } - parsers['state-list'] = function (node) - { - this.domain.map_list = this.map_list; - for (node = node.firstElement (); node; node = node.nextElement ()) - { - if (node.nodeName == 'xi:include') - { - var im = include (node); - if (! im) - alert ('inclusion fail'); - for (var sname in im.state_list) - { - state = im.state_list[sname]; - if (! this.initial_state) - this.initial_state = state; - this.state_list[sname] = state; - } - } - else if (node.nodeName == 'state') - { - var state = Xex.Term.Parse (this.domain, node); - if (! state.title) - state.title = this.title; - if (! this.initial_state) - this.initial_state = state; - this.state_list[state.name] = state; - } - } - delete this.domain.map_list; - } - - MIM.IM = function (lang, name, extra_id, file) - { - this.lang = lang; - this.name = name; - this.extra_id = extra_id; - this.file = file; - this.load_status = MIM.LoadStatus.NotLoaded; - this.domain = new Xex.Domain (this.lang + '-' - + (this.name != 'nil' - ? this.name : this.extra_id), - MIM.im_domain, null); - } - - var proto = { - Load: function () - { - var node = Xex.Load (null, this.file); - if (! node) - { - this.load_status = MIM.LoadStatus.Error; - return false; - } - this.map_list = {}; - this.initial_state = null; - this.state_list = {}; - for (node = node.firstElement (); node; node = node.nextElement ()) - { - var name = node.nodeName; - var parser = parsers[name]; - if (parser) - parser.call (this, node); - } - this.load_status = MIM.LoadStatus.Loaded; - return true; - } - } - - MIM.IM.prototype = proto; - - MIM.IC = function (im, target) - { - if (im.load_status == MIM.LoadStatus.NotLoaded) - im.Load (); - if (im.load_status != MIM.LoadStatus.Loaded) - alert ('im:' + im.name + ' error:' + im.load_status); - this.im = im; - this.target = target; - this.domain = new Xex.Domain ('context', im.domain, this); - this.active = true; - this.range = new Array (); - this.range[0] = this.range[1] = 0; - this.state = null; - this.initial_state = this.im.initial_state; - this.keys = new MIM.KeySeq (); - this.marker_positions = new Array (); - this.candidate_table = new MIM.CandidateTable (); - this.reset (); - } - - MIM.CandidateTable = function () - { - this.table = new Array (); - } - - MIM.CandidateTable.prototype.get = function (pos) - { - for (var i = 0; i < this.table.length; i++) - { - var elt = this.table[i]; - if (elt.from < pos && pos <= elt.to) - return elt.val; - } - } - - MIM.CandidateTable.prototype.put = function (from, to, candidates) - { - for (var i = 0; i < this.table.length; i++) - { - var elt = this.table[i]; - if (elt.from < to && elt.to > from) - { - elt.from = from; - elt.to = to; - elt.val = candidates; - return; - } - } - this.table.push ({ from: from, to: to, val: candidates }); - } - - MIM.CandidateTable.prototype.adjust = function (from, to, inserted) - { - var diff = inserted - (to - from); - if (diff == 0) - return; - for (var i = 0; i < this.table.length; i++) - { - var elt = this.table[i]; - if (elt.from >= to) - { - elt.from += diff; - elt.to += diff; - } - } - } - - MIM.CandidateTable.prototype.clear = function () - { - this.table.length = 0; - } - - function set_cursor (prefix, pos) - { - this.cursor_pos = pos; - var candidates = this.candidate_table.get (pos); - if (this.candidates != candidates) - { - this.candidates = candidates; - this.changed |= MIM.ChangedStatus.CandidateList; - } - } - - function save_state () - { - this.state_var_values = this.domain.SaveValues (); - this.state_preedit = this.preedit; - this.state_key_head = this.key_head; - this.state_pos = this.cursor_pos; - } - - function restore_state () - { - this.domain.RestoreValues (this.state_var_values); - this.preedit = this.state_preedit; - set_cursor.call (this, "restore", this.state_pos); - } - - function handle_key () - { - Xex.Log ('Key(' + this.key_head + ') "' + this.keys.val[this.key_head] - + '" in ' + this.state.name + ':' + this.keymap.name - + " key/state/commit-head/len:" - + this.key_head + '/' + this.state_key_head + '/' + this.commit_key_head + '/' + this.keys.val.length); - var out = this.state.keymap.Lookup (this.keys, this.state_key_head); - var sub = out.map; - - if (out.index > this.key_head) - { - this.key_head = out.index; - Xex.Log (' with submap', false, true); - restore_state.call (this); - this.keymap = sub; - if (sub.map_actions) - { - Xex.Log ('taking map actions:'); - if (! this.take_actions (sub.map_actions)) - return false; - } - else if (sub.submaps) - { - Xex.Log ('no map actions'); - for (var i = this.state_key_head; i < this.key_head; i++) - { - Xex.Log ('inserting key:' + this.keys.val[i].key); - this.ins (this.keys.val[i].key, null); - } - } - if (! sub.submaps) - { - Xex.Log ('terminal:'); - if (this.keymap.branch_actions) - { - Xex.Log ('branch actions:'); - if (! this.take_actions (this.keymap.branch_actions)) - return false; - } - if (sub != this.state.keymap) - this.shift (this.state); - } - } - else - { - Xex.Log (' without submap', false, true); - this.keymap = sub; - var current_state = this.state; - var map = this.keymap; - - if (map.branch_actions) - { - Xex.Log ('branch actions:'); - if (! this.take_actions (map.branch_actions)) - return false; - } - - if (map == this.keymap) - { - Xex.Log ('no state change'); - if (map == this.initial_state.keymap - && this.key_head < this.keys.val.length) - { - Xex.Log ('unhandled'); - return false; - } - if (this.keymap != current_state.keymap) - this.shift (current_state); - else if (this.keymap.actions == null) - this.shift (this.initial_state); - } - } - return true; - } - - proto = { - reset: function () - { - this.cursor_pos = 0; - this.candidate_show = false; - this.prev_state = null; - this.title = this.initial_state.title; - this.state_preedit = ''; - this.state_key_head = 0; - this.state_var_values = {}; - this.state_pos = 0; - this.key_head = 0; - this.commit_key_head = 0; - this.key_unhandled = false; - this.unhandled_key = null; - this.changed = MIM.ChangedStatus.None; - this.error_message = ''; - this.title = this.initial_state.title; - this.produced = ''; - this.preedit = ''; - this.preedit_saved = ''; - this.candidate_table.clear (); - this.candidates = null; - this.candidate_show = false; - for (var elt in this.marker_positions) - this.marker_positions[elt] = 0; - this.shift (this.initial_state); - }, - - catch_args: new Array (Xex.CatchTag._mimtag, null), - - take_actions: function (actions) - { - if (actions.length == 0) - return true;; - var func_progn = this.domain.GetFunc ('progn'); - var func_catch = this.domain.GetFunc ('catch'); - this.catch_args[1] = new Xex.Funcall (func_progn, null, actions); - var term = new Xex.Funcall (func_catch, null, this.catch_args); - term = term.Eval (this.domain); - return (! term.IsSymbol || term.val != '@mimtag'); - }, - - GetSurroundingChar: function (pos) - { - if (pos < 0) - { - pos += this.range[0]; - if (pos < 0) - return 0; - } - else - { - pos += this.range[1]; - if (pos >= this.target.value.length) - return 0; - } - return this.target.value.charCodeAt (pos); - }, - - DelSurroundText: function (pos) - { - var text; - if (pos < 0) - { - pos += this.range[0]; - if (pos <= 0) - { - pos = 0; text = ''; - } - else - text = this.target.value.substring (0, pos); - if (this.range[0] < this.target.value.length) - text += this.target.value.substring (this.range[0]); - this.target.value = text; - this.range[1] -= this.range[0] - pos; - this.range[0] = pos; - } - else - { - pos += this.range[1]; - text = this.target.value.substring (0, this.range[1]); - if (pos >= this.target.value.length) - pos = this.target.value.length; - else - text += this.target.value.substring (pos); - this.target.value = text; - } - }, - - adjust_markers: function (from, to, inserted) - { - var diff = inserted - (to - from); - - for (var name in this.marker_positions) - { - var pos = this.marker_positions[name]; - if (pos > from) - { - if (pos >= to) - this.marker_positions[name] += diff; - else if (pos > from) - this.marker_positions[name] = from; - } - } - }, - - preedit_replace: function (from, to, text, candidates) - { - var newlen = text.length; - this.preedit = (this.preedit.substring (0, from) - + text + this.preedit.substring (to)); - this.changed |= MIM.ChangedStatus.Preedit | MIM.ChangedStatus.CursorPos; - this.adjust_markers (from, to, newlen); - this.candidate_table.adjust (from, to, newlen); - if (candidates) - this.candidate_table.put (from, from + newlen, candidates) - if (this.cursor_pos >= to) - set_cursor.call (this, 'adjust', this.cursor_pos + text.length - (to - from)); - else if (this.cursor_pos > from) - set_cursor.call (this, 'adjust', from) - }, - - ins: function (text, candidates) - { - this.preedit_replace (this.cursor_pos, this.cursor_pos, text, candidates); - }, - - rep: function (old_text, new_text, candidates) - { - this.preedit_replace (this.cursor_pos - old_text.length, - this.cursor_pos, new_text, candidates); - }, - - del: function (pos) - { - var deleted = pos - this.cursor_pos; - if (pos < this.cursor_pos) - { - if (pos < 0) - { - this.DelSurroundText (pos); - deleted = - this.cursor_pos; - pos = 0; - } - if (pos < this.cursor_pos) - this.preedit_replace (pos, this.cursor_pos, '', null); - } - else - { - if (pos > this.preedit.length) - { - this.DelSurroundText (pos - this.preedit.length); - deleted = this.preedit.length - this.cursor_pos; - pos = this.preedit.length; - } - if (pos > this.cursor_pos) - this.preedit_replace (this.cursor_pos, pos, '', null); - } - return deleted; - }, - - show: function () - { - this.candidate_show = true; - this.changed |= MIM.ChangedStatus.CandidateShow; - }, - - hide: function () - { - this.candidate_show = false; - this.changed |= MIM.ChangedStatus.CandidateShow; - }, - - move: function (pos) - { - if (pos < 0) - pos = 0; - else if (pos > this.preedit.length) - pos = this.preedit.length; - if (pos != this.cursor_pos) - { - set_cursor.call (this, 'move', pos); - this.changed |= MIM.ChangedStatus.Preedit; - } - }, - - pushback: function (n) - { - if (n instanceof MIM.KeySeq) - { - if (this.key_head > 0) - this.key_head--; - if (this.key_head < this.keys.val.length) - this.keys.val.splice (this.key_head, - this.keys.val.length - this.key_head); - for (var i = 0; i < n.val.length; i++) - this.keys.val.push (n.val[i]); - return; - } - if (n > 0) - { - this.key_head -= n; - if (this.key_head < 0) - this.key_head = 0; - } - else if (n == 0) - this.key_head = 0; - else - { - this.key_head = - n; - if (this.key_head > this.keys.val.length) - this.key_head = this.keys.val.length; - } - }, - - pop: function () - { - if (this.key_head < this.keys.val.length) - this.keys.val.splice (this.key_head, 1); - }, - - commit: function () - { - if (this.preedit.length > 0) - { - this.candidate_table.clear (); - this.produced += this.preedit; - this.preedit_replace.call (this, 0, this.preedit.length, '', null); - this.preedit_saved = ''; - this.state_pos = 0; - this.commit_key_head = this.key_head; - } - }, - - shift: function (state) - { - if (state == null) - { - if (this.prev_state == null) - return; - state = this.prev_state; - } - - if (state == this.initial_state) - { - if (this.state) - { - this.commit (); - this.keys.val.splice (0, this.key_head); - this.key_head = this.state_key_head = this.commit_key_head = 0; - this.prev_state = null; - } - } - else - { - if (state != this.state) - this.prev_state = this.state; - } - if (state != this.state && state.enter_actions) - this.take_actions (state.enter_actions); - if (! this.state || this.state.title != state.title) - this.changed |= MIM.ChangedStatus.StateTitle; - this.state = state; - this.keymap = state.keymap; - save_state.call (this); - }, - - Filter: function (key) - { - if (! this.active) - { - Xex.Log ("active = false"); - this.key_unhandled = true; - this.unhandled_key = key; - return false; - } - if (key.key == '_reload') - return true; - this.changed = MIM.ChangedStatus.None; - this.produced = ''; - this.key_unhandled = false; - this.keys.val.push (key); - var count = 0; - while (this.key_head < this.keys.val.length) - { - if (! handle_key.call (this)) - { - if (this.key_head < this.keys.val.length) - { - this.unhandled_key = this.keys.val[this.key_head]; - this.keys.val.splice (this.key_head, this.key_head + 1); - } - if (this.state_key_head > 0) - this.state_key_head--; - if (this.commit_key_head > 0) - this.commit_key_head--; - this.key_unhandled = true; - break; - } - if (++count == 10) - { - this.reset (); - this.key_unhandled = true; - break; - } - } - if (this.keymap == this.initial_state.keymap) - this.commit (); - - if (this.commit_key_head > 0) - { - this.keys.val.splice (0, this.commit_key_head); - this.key_head -= this.commit_key_head; - this.state_key_head -= this.commit_key_head; - this.commit_key_head = 0; - } - if (this.key_unhandled) - { - this.keys.val.length = 0; - //this.keys.val.splice (0, this.keys.val.length); - this.key_head = this.state_key_head = this.commit_key_head = 0; - } - if (this.changed & MIM.ChangedStatus.Candidate) - { - if (this.candidate_show && this.candidates) - MIM.show (this); - else - MIM.hide (this); - } - return (! this.key_unhandled - && this.produced.length == 0); - } - } - - MIM.IC.prototype = proto; - - var node = Xex.Load (null, "imlist.xml"); - for (node = node.firstChild; node; node = node.nextSibling) - if (node.nodeName == 'input-method') - { - var lang = null, name = null, extra_id = null, file = null; - - for (var n = node.firstChild; n; n = n.nextSibling) - { - if (n.nodeName == 'language') - lang = n.firstChild.nodeValue; - else if (n.nodeName == 'name') - name = n.firstChild.nodeValue; - else if (n.nodeName == 'extra-id') - extra_id = n.firstChild.nodeValue; - else if (n.nodeName == 'filename') - file = n.firstChild.nodeValue; - } - if (name && name != 'nil') - { - if (! MIM.imlist[lang]) - MIM.imlist[lang] = {}; - MIM.imlist[lang][name] = new MIM.IM (lang, name, extra_id, file); - } - else if (extra_id && extra_id != 'nil') - { - if (! MIM.imextra[lang]) - MIM.imextra[lang] = {}; - MIM.imextra[lang][extra_id] = new MIM.IM (lang, name, extra_id, file); - } - } - if (MIM.imextra.t && MIM.imextra.t.global) - MIM.im_global = MIM.imextra.t.global; - else - { - MIM.im_global = new MIM.IM ('t', 'nil', 'global', null); - MIM.im_global.load_status = MIM.LoadStatus.Error; - } - node = undefined; -}) (); - -(function () { - var keys = new Array (); - keys[0x09] = 'tab'; - keys[0x08] = 'backspace'; - keys[0x0D] = 'return'; - keys[0x1B] = 'escape'; - keys[0x20] = 'space'; - keys[0x21] = 'pageup'; - keys[0x22] = 'pagedown'; - keys[0x23] = 'end'; - keys[0x24] = 'home'; - keys[0x25] = 'left'; - keys[0x26] = 'up'; - keys[0x27] = 'right'; - keys[0x28] = 'down'; - keys[0x2D] = 'insert'; - keys[0x2E] = 'delete'; - for (var i = 1; i <= 12; i++) - keys[111 + i] = "f" + i; - keys[0x90] = "numlock"; - keys[0xF0] = "capslock"; - - var keyids = {}; - keyids['U+0008'] = 'Backspace'; - keyids['U+0009'] = 'Tab'; - keyids['U+0018'] = 'Cancel'; - keyids['U+001B'] = 'Escape'; - keyids['U+0020'] = 'Space'; - keyids['U+007F'] = 'Delete'; - - var modifiers = {} - modifiers.Shift = 1; - modifiers.Control = 1; - modifiers.Alt = 1; - modifiers.AltGraph = 1; - modifiers.Meta = 1 - - MIM.decode_key_event = function (event) - { - var key = event.keyIdentifier; - - if (key) // keydown event of Chrome - { - if (modifiers[key]) - return false; - var mod = ''; - if (event.ctrlKey) mod += 'C-'; - if (event.metaKey) mod += 'M-'; - if (event.altKey) mod += 'A-'; - var keysym = keyids[key]; - if (keysym) - key = keysym; - else if (key.match(/^U\+([0-9A-Z]+)$/)) - { - if (mod.length == 0) - return false; - key = String.fromCharCode (parseInt (RegExp.$1, 16)); - } - //else - //key = key.toLowerCase (); - if (event.shiftKey) mod += 'S-'; - return new MIM.Key (mod + key); - } - else - { - key = ((event.type == 'keydown' || event.keyCode) ? event.keyCode - : event.charCode ? event.charCode - : false); - if (! key) - return false; - if (event.type == 'keydown') - { - key = keys[key]; - if (! key) - return false; - if (event.shiftKey) key = "S-" + key ; - } - else - key = String.fromCharCode (key); - } - if (event.altKey) key = "A-" + key ; - if (event.ctrlKey) key = "C-" + key ; - return new MIM.Key (key); - } -}) (); - -MIM.add_event_listener - = (window.addEventListener - ? function (target, type, listener) { - target.addEventListener (type, listener, false); - } - : window.attachEvent - ? function (target, type, listener) { - target.attachEvent ('on' + type, - function() { - listener.call (target, window.event); - }); - } - : function (target, type, listener) { - target['on' + type] - = function (e) { listener.call (target, e || window.event); }; - }); - -MIM.debug_print = function (event, ic) -{ - if (! MIM.debug) - return; - if (! MIM.debug_nodes) - { - MIM.debug_nodes = new Array (); - MIM.debug_nodes['status0'] = document.getElementById ('status0'); - MIM.debug_nodes['status1'] = document.getElementById ('status1'); - MIM.debug_nodes['keydown'] = document.getElementById ('keydown'); - MIM.debug_nodes['keypress'] = document.getElementById ('keypress'); - MIM.debug_nodes['keymap0'] = document.getElementById ('keymap0'); - MIM.debug_nodes['keymap1'] = document.getElementById ('keymap1'); - MIM.debug_nodes['preedit0'] = document.getElementById ('preedit0'); - MIM.debug_nodes['preedit1'] = document.getElementById ('preedit1'); - } - var target = event.target; - var code = event.keyCode; - var ch = event.type == 'keypress' ? event.charCode : 0; - var key = MIM.decode_key_event (event); - var index; - - MIM.debug_nodes[event.type].innerHTML = "" + code + "/" + ch + ":" + key + '/' + event.keyIdentifier; - index = (event.type == 'keydown' ? '0' : '1'); - if (ic) - MIM.debug_nodes['status' + index].innerHTML = ic.im.load_status; - else - MIM.debug_nodes['status' + index].innerHTML = 'no IM'; - MIM.debug_nodes['keymap' + index].innerHTML = ic.state.name; - MIM.debug_nodes['preedit' + index].innerHTML = ic.preedit; - if (index == 0) - { - MIM.debug_nodes.keypress.innerHTML = ''; - MIM.debug_nodes.status1.innerHTML = ''; - MIM.debug_nodes.keymap1.innerHTML = ''; - MIM.debug_nodes.preedit1.innerHTML = '' - } -}; - -MIM.get_range = function (target, ic) -{ - var from, to; - if (target.selectionStart != null) // for Mozilla - { - from = target.selectionStart; - to = target.selectionEnd; - } - else // for IE - { - var r = document.selection.createRange (); - var rr = r.duplicate (); - - rr.moveToElementText (target); - rr.setEndPoint ('EndToEnd', range); - from = rr.text.length - r.text.length; - to = rr.text.length; - } - if (from == to - && from == ic.range[0] + ic.cursor_pos - && (ic.preedit.length == 0 - || ic.preedit == target.value.substring (ic.range[0], ic.range[1]))) - return true; - Xex.Log ('reset ic'); - ic.reset (); - ic.range[0] = from; - ic.range[1] = to; - return false; -}; - -(function () { - var temp; - - var style_props = { - width: 'width', - height: 'height', - padingLeft: 'padding-left', - paddingRight: 'padding-right', - paddingTop: 'padding-top', - paddintBottom: 'padding-bottom', - borderLeftStyle: 'border-left-style', - borderRightStyle: 'border-right-style', - borderTopStyle: 'border-top-style', - borderBottomStyle: 'border-bottom-style', - borderLeftWidth: 'border-left-width', - borderRightWidth: 'border-right-width', - borderTopWidth: 'border-top-width', - borderBottomWidth: 'border-bottom-width', - fontFamily: 'font-family', - fontSize: 'font-size', - lineHeight: 'line-height', - letterSpacing: 'letter-spacing', - wordSpacing: 'word-spacing' }; - - function copy_style (from, to) - { - var from_style = getComputedStyle(from,''); - for(var name in style_props) - to.style[name] = from_style.getPropertyValue (style_props[name]); - to.style.left = from.offsetLeft + 'px'; - to.style.top = from.offsetTop + 'px'; - to.style.width = from.offsetWidth; - to.style.height = from.offsetHeight; - } - - MIM.get_preedit_pos = function (target, ic) - { - if (! temp) - { - temp = document.createElement ('div'); - temp.style.visibility = 'hidden'; - temp.style.position = 'absolute'; - temp.appendChild (document.createElement ('span')); - temp.appendChild (document.createElement ('span')); - document.getElementsByTagName ('body')[0].appendChild (temp); - } - if (temp.ic != ic) - { - temp.ic = ic; - copy_style (target, temp); - ic.abs_top = 0; - ic.abs_left = 0; - for (var elm = target.offsetParent; elm; elm = elm.offsetParent) - { - ic.abs_top += elm.offsetTop; - ic.abs_left += elm.offsetLeft; - } - } - temp.firstChild.innerText = target.value.substr (0, ic.range[0]); - temp.lastChild.innerText = "." + target.value.substr (ic.range[0], ic.range[1]); - ic.abs_y = (ic.abs_top + temp.lastChild.offsetTop - + temp.lastChild.offsetHeight - target.scrollTop); - ic.abs_x0 = ic.abs_left + temp.lastChild.offsetLeft; - ic.abs_x1 = ic.abs_x0 + temp.lastChild.offsetWidth; - } -}) (); - -MIM.set_caret = function (target, ic) -{ - if (ic.preedit.length > 0) - { - MIM.get_preedit_pos (target, ic); - if (! ic.bar) - { - ic.bar = document.createElement ('div'); - ic.bar.style.position = 'absolute'; - ic.bar.style.backgroundColor = "black"; - ic.bar.style.minHeight = '1px'; - document.getElementsByTagName ('body')[0].appendChild (ic.bar); - } - ic.bar.style.display = 'block' - ic.bar.style.top = (ic.abs_y + 1) + 'px'; - ic.bar.style.left = ic.abs_x0 + 'px'; - ic.bar.style.minWidth = (ic.abs_x1 - ic.abs_x0) + 'px'; - } - else if (ic.bar) - ic.bar.style.display = 'none' -}; - -MIM.update = function (target, ic, for_focus_out) -{ - var text = target.value; - target.value = (text.substring (0, ic.range[0]) - + ic.produced - + ic.preedit - + text.substring (ic.range[1])); - ic.range[0] += ic.produced.length; - ic.range[1] = ic.range[0] + ic.preedit.length; - MIM.set_caret (target, ic); - if (! for_focus_out) - { - var pos = ic.range[0] + ic.cursor_pos; - if (target.setSelectionRange) // Mozilla - { - var scrollTop = target.scrollTop; - target.setSelectionRange (pos, pos); - target.scrollTop = scrollTop; - } - else // IE - { - var range = target.createTextRange (); - range.moveStart ('character', pos); - range.moveEnd ('character', pos); - range.select (); - } - } -}; - -(function () { - MIM.show = function (ic) - { - if (! ic.candidates) - return; - var target = ic.target; - MIM.get_preedit_pos (target, ic); - if (! ic.can_node) - { - ic.can_node = document.createElement ('table'); - ic.can_node.style.position = 'absolute'; - ic.can_node.style.display = 'none'; - ic.can_node.style.backgroundColor = "white"; - ic.can_node.style.border = "1px solid black"; - document.getElementsByTagName ('body')[0].appendChild (ic.can_node); - } - - if (ic.changed & MIM.ChangedStatus.CandidateList) - { - while (ic.can_node.childNodes.length > 0) - ic.can_node.removeChild (ic.can_node.firstChild); - var tr = document.createElement ('tr'); - var group = ic.candidates.CurrentGroup (); - var td = document.createElement ('td'); - td.innerHTML = group[0][1] + '/' + group[0][0]; - td.style.color = 'white'; - td.style.backgroundColor = 'black'; - tr.appendChild (td); - for (var i = 1; i < group.length; i++) - { - var td = document.createElement ('td'); - td.noWrap = true; - td.innerHTML = (i < 10 ? i : i == 10 ? '0' : String.fromCharCode (0x60 + (i - 10))) + '.' + group[i]; - if (i == group[0][2] + 1) - td.style.backgroundColor = 'lightblue'; - tr.appendChild (td); - } - ic.can_node.appendChild (tr); - ic.can_node.style.top = (ic.abs_y + 10) + 'px'; - ic.can_node.style.left = ic.abs_x0 + 'px'; - } - else - { - var td = ic.can_node.firstElement ().firstElement ().nextElement (); - var col = ic.candidates.CurrentCol (); - for (var i = 0; td; td = td.nextElement ()) - td.style.backgroundColor = (i++ == col ? 'lightblue' : 'white'); - } - ic.can_node.style.display = 'block'; - } - - MIM.hide = function (ic) - { - if (ic.can_node) - ic.can_node.style.display = 'none'; - } -}) (); - -MIM.focus_in = function (event) -{ - var target = event.target; - var ic = target.mim_ic; - Xex.Log ("Focus in " + target.tagName); - MIM.get_range (target, ic) - ic.Filter (MIM.Key.FocusIn); - setTimeout (function () { MIM.update (target, ic, false); }, 100); - return true; -} - -MIM.focus_out = function (event) -{ - var target = event.target; - var ic = target.mim_ic; - Xex.Log ("Focus out " + target.tagName); - ic.Filter (MIM.Key.FocusOut); - MIM.update (target, ic, true); - return true; -}; - -MIM.keydown = function (event) -{ - var target = event.target; - if (! (target.type == "text" || target.type == "textarea")) - return; - - var ic = target.mim_ic; - if (! ic || ic.im != MIM.current) - { - target.mim_ic = null; - Xex.Log ('creating IC'); - ic = new MIM.IC (MIM.current, target); - if (ic.im.load_status != MIM.LoadStatus.Loaded) - return true; - target.mim_ic = ic; - MIM.add_event_listener (target, 'focus', MIM.focus_in); - MIM.add_event_listener (target, 'blur', MIM.focus_out); - } - MIM.get_range (target, ic) - MIM.debug_print (event, ic); - ic.key = MIM.decode_key_event (event); - if (ic.key) - { - try { - var result = ic.Filter (ic.key); - } catch (e) { - Xex.Log ('Error' + e); - throw (e); - } - MIM.update (target, ic, false); - if (! ic.key_unhandled) - event.preventDefault (); - } -}; - -MIM.keypress = function (event) -{ - var target = event.target; - if (! (target.type == "text" || target.type == "textarea")) - return; - - var ic = target.mim_ic; - var i; - - try { - if (ic.im.load_status != MIM.LoadStatus.Loaded) - return; - if (! ic.key) - ic.key = MIM.decode_key_event (event); - if (! ic.key) - { - ic.reset (); - return; - } - - try { - var result = ic.Filter (ic.key); - } catch (e) { - Xex.Log ('Error:' + e); - throw (e); - } - MIM.update (target, ic, false); - if (! ic.key_unhandled) - event.preventDefault (); - } catch (e) { - Xex.Log ("error:" + e); - event.preventDefault (); - } finally { - MIM.debug_print (event, ic); - } - - return; -}; - -(function () { - var lang_category = { - European: { - cs: { name: 'Czech' }, - da: { name: 'Danish' }, - el: { name: 'Greek' }, - en: { name: 'English' }, - eo: { name: 'Esperanto' }, - fr: { name: 'French' }, - grc: { name: 'ClassicGreek' }, - hr: { name: 'Croatian' }, - hy: { name: 'Armenian' }, - ka: { name: 'Georgian' }, - kk: { name: 'Kazakh' }, - ru: { name: 'Russian' }, - sk: { name: 'Slovak' }, - sr: { name: 'Serbian' }, - sv: { name: 'Swedish' }, - yi: { name: 'Yiddish' } }, - MiddleEast: { - ar: { name: 'Arabic' }, - dv: { name: 'Divehi' }, - fa: { name: 'Persian' }, - he: { name: 'Hebrew' }, - kk: { name: 'Kazakh' }, - ps: { name: 'Pushto' }, - ug: { name: 'Uighur' }, - yi: { name: 'Yiddish' } }, - SouthAsia: { - as: { name: 'Assamese' }, - bn: { name: 'Bengali' }, - bo: { name: 'Tibetan' }, - gu: { name: 'Gujarati' }, - hi: { name: 'Hindi' }, - kn: { name: 'Kannada' }, - ks: { name: 'Kashmiri' }, - ml: { name: 'Malayalam' }, - mr: { name: 'Marathi' }, - ne: { name: 'Nepali' }, - or: { name: 'Oriya' }, - pa: { name: 'Panjabi' }, - sa: { name: 'Sanskirit' }, - sd: { name: 'Sindhi' }, - si: { name: 'Sinhalese' }, - ta: { name: 'Tamil' }, - te: { name: 'Telugu' }, - ur: { name: 'Urdu' } }, - SouthEastAsia: { - cmc: { name: 'Cham' }, - km: { name: 'Khmer'}, - lo: { name: 'Lao' }, - my: { name: 'Burmese' }, - tai: { name: 'Tai Viet' }, - th: { name: 'Thai' }, - vi: { name: 'Vietanamese' } }, - EastAsia: { - ii: { name: 'Yii' }, - ja: { name: 'Japanese' }, - ko: { name: 'Korean' }, - zh: { name: 'Chinese' } }, - Other: { - am: { name: 'Amharic' }, - ath: { name: 'Carrier' }, - bla: { name: 'Blackfoot' }, - cr: { name: 'Cree' }, - eo: { name: 'Esperanto' }, - iu: { name: 'Inuktitut' }, - nsk: { name: 'Naskapi' }, - oj: { name: 'Ojibwe' }, - t: { name: 'Generic' } } - }; - - function categorize_im () - { - var cat, lang, list, name; - for (lang in MIM.imlist) - { - list = null; - for (cat in lang_category) - if (lang_category[cat][lang]) - { - list = lang_category[cat][lang].list; - if (! list) - list = lang_category[cat][lang].list = {}; - for (name in MIM.imlist[lang]) - list[name] = MIM.imlist[lang][name]; - } - if (! list) - for (name in MIM.imlist[lang]) - Xex.Log ('no category ' + lang + '-' + name); - } - } - - var destroy_timer; - var last_target; - - function destroy () - { - clearTimeout (destroy_timer); - destroy_timer = null; - var target = document.getElementById ('mim-menu'); - if (target) - { - for (; last_target && last_target.menu_level; - last_target = last_target.parentLi) - last_target.style.backgroundColor = 'white'; - var nodes = target.getElementsByTagName ('ul'); - for (var i = 0; i < nodes.length; i++) - nodes[i].style.visibility = 'hidden'; - document.getElementsByTagName ('body')[0].removeChild (target); - } - } - - function destroy_menu () { - if (! destroy_timer) - destroy_timer = setTimeout (destroy, 1000); - return true; - } - - function show_submenu (event) - { - var target = event.target; - if (! target.menu_level) - { - if (! target.parentNode || ! target.parentNode.menu_level) - return true; - target = target.parentNode; - } - if (destroy_timer) - { - clearTimeout (destroy_timer); - destroy_timer = null; - } - if (last_target && target.parentLi != last_target) - { - last_target.style.backgroundColor = 'white'; - if (target.menu_level < last_target.menu_level) - { - last_target = last_target.parentLi; - last_target.style.backgroundColor = 'white'; - } - var uls = last_target.getElementsByTagName ('ul'); - for (var i = 0; i < uls.length; i++) - uls[i].style.visibility = 'hidden'; - } - last_target = target; - target.style.backgroundColor = 'yellow'; - if (target.menu_level < 3) - { - target.lastChild.style.visibility = 'visible'; - target.lastChild.style.left = target.clientWidth + 'px'; - } - event.preventDefault (); - } - - function select_im (event) - { - var target = event.target; - if (! target.im) - { - if (! target.parentNode || ! target.parentNode.menu_level) - { - event.preventDefault (); - return false; - } - target = target.parentNode; - } - if (target.im) - { - MIM.current = target.im; - destroy (); - } - event.preventDefault (); - } - - function create_ul (visibility) - { - var ul = document.createElement ('ul'); - ul.style.position = 'absolute'; - ul.style.margin = '0px'; - ul.style.padding = '0px'; - ul.style.border = '1px solid gray'; - ul.style.borderBottom = 'none'; - ul.style.top = '-1px'; - ul.style.backgroundColor = 'white'; - ul.style.visibility = visibility; - return ul; - } - - function create_li (level, text) - { - var li = document.createElement ('li'); - li.style.position = 'relative'; - li.style.margin = '0px'; - li.style.padding = '1px'; - li.style.borderBottom = '1px solid gray'; - li.style.top = '0px'; - li.style.listStyle = 'none'; - li.menu_level = level; - var nobr = document.createElement ('nobr'); - nobr.innerHTML = text; - li.appendChild (nobr); - return li; - } - - var menu; - - function create_menu (event) - { - var target = event.target; - - if (! ((target.type == "text" || target.type == "textarea") - && event.which == 1 && event.ctrlKey)) - return; - if (! menu) - { - categorize_im (); - menu = create_ul ('visible'); - menu.style.fontFamily = 'sans-serif'; - menu.style.fontWeight = 'bold'; - menu.id = 'mim-menu'; - menu.onmousedown = select_im; - menu.onmouseover = show_submenu; - menu.onmouseout = destroy_menu; - for (var catname in lang_category) - { - var cat = lang_category[catname]; - var li = create_li (1, catname); - var sub = create_ul ('hidden'); - for (var langname in cat) - { - var lang = cat[langname]; - if (! lang.list) - continue; - var sub_li = create_li (2, lang.name); - sub_li.parentLi = li; - var subsub = create_ul ('hidden'); - for (var name in lang.list) - { - var im = lang.list[name]; - var subsub_li = create_li (3, im.name); - subsub_li.parentLi = sub_li; - subsub_li.im = im; - subsub.appendChild (subsub_li); - } - sub_li.appendChild (subsub); - sub.appendChild (sub_li); - } - li.appendChild (sub); - menu.appendChild (li); - } - lang_category = null; - } - menu.style.left = (event.clientX - 10) + "px"; - menu.style.top = (event.clientY - 10) + "px"; - document.getElementsByTagName ('body')[0].appendChild (menu); - }; - - MIM.init = function () - { - MIM.add_event_listener (window, 'keydown', MIM.keydown); - MIM.add_event_listener (window, 'keypress', MIM.keypress); - MIM.add_event_listener (window, 'mousedown', create_menu); - if (window.location == 'http://localhost/mim/index.html') - MIM.server = 'http://localhost/mim'; - MIM.current = MIM.imlist['zh']['py-gb']; - }; -}) (); - -MIM.test = function () -{ - var im = MIM.imlist['t']['latn-post']; - var ic = new MIM.IC (im, null); - - ic.Filter (new MIM.Key ('a')); - ic.Filter (new MIM.Key ("'")); - - if (true) - document.getElementById ('text').value = ic.produced + ic.preedit; - else { - try { - document.getElementById ('text').value - = Xex.Term.Parse (domain, body).Eval (domain).toString (); - } catch (e) { - if (e instanceof Xex.ErrTerm) - alert (e); - throw e; - } - } -} - - -MIM.init_debug = function () -{ - MIM.debug = true; - Xex.LogNode = document.getElementById ('xexlog'); - Xex.Log (null); - MIM.init (); -}; -- 1.7.10.4