summaryrefslogtreecommitdiff
path: root/i18npool/source/inputchecker
diff options
context:
space:
mode:
authorOliver Bolte <obo@openoffice.org>2005-11-16 09:19:15 +0000
committerOliver Bolte <obo@openoffice.org>2005-11-16 09:19:15 +0000
commit56dad432009302bdb35388607fb2765111287875 (patch)
tree2e1c2ab1d44fb6e4060d5a56ca79d39eaf617362 /i18npool/source/inputchecker
parent2dc627781a8155fcc2bd65c2a6ceb259c6bf09a1 (diff)
INTEGRATION: CWS thaiissues (1.2.240); FILE MERGED
2005/09/29 12:00:18 os 1.2.240.5: RESYNC: (1.2-1.3); FILE MERGED 2005/09/19 22:50:24 khong 1.2.240.4: #i42661# update input sequence correction rule from James 2005/08/29 19:39:57 khong 1.2.240.3: #i42661# add input sequence correction 2005/08/29 18:59:34 khong 1.2.240.2: #i42661# add input sequence correction 2005/08/27 00:18:44 khong 1.2.240.1: #i42661# add input sequence correction, #i52055# apply input sequence checking patch
Diffstat (limited to 'i18npool/source/inputchecker')
-rw-r--r--i18npool/source/inputchecker/inputsequencechecker_th.cxx77
1 files changed, 69 insertions, 8 deletions
diff --git a/i18npool/source/inputchecker/inputsequencechecker_th.cxx b/i18npool/source/inputchecker/inputsequencechecker_th.cxx
index 4cd6d166be87..300e0719bf5a 100644
--- a/i18npool/source/inputchecker/inputsequencechecker_th.cxx
+++ b/i18npool/source/inputchecker/inputsequencechecker_th.cxx
@@ -4,9 +4,9 @@
*
* $RCSfile: inputsequencechecker_th.cxx,v $
*
- * $Revision: 1.3 $
+ * $Revision: 1.4 $
*
- * last change: $Author: rt $ $Date: 2005-09-07 17:17:48 $
+ * last change: $Author: obo $ $Date: 2005-11-16 10:19:15 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
@@ -56,7 +56,7 @@ sal_Char _TAC_celltype_inputcheck[17][17] = {
/* 10 */ 'X', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
/* 20 */ 'X', 'A', 'A', 'A', 'A', 'S', 'A', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C',
/* 30 */ 'X', 'S', 'A', 'S', 'S', 'S', 'S', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
- /* 40 */ 'X', 'S', 'A', 'S', 'A', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
+ /* 40 */ 'X', 'A', 'A', 'A', 'A', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
/* 50 */ 'X', 'A', 'A', 'A', 'A', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
/* 60 */ 'X', 'A', 'A', 'A', 'S', 'A', 'S', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R',
/* 70 */ 'X', 'A', 'A', 'A', 'A', 'S', 'A', 'R', 'R', 'R', 'C', 'C', 'R', 'R', 'R', 'R', 'R',
@@ -78,13 +78,10 @@ sal_Bool _TAC_Composible[3][5] = {
/* Mode 2 */ {sal_True, sal_True, sal_False, sal_False, sal_True} // STRICT = 2
};
-sal_Bool SAL_CALL
-InputSequenceChecker_th::checkInputSequence(const OUString& Text, sal_Int32 nStartPos,
- sal_Unicode inputChar, sal_Int16 inputCheckMode) throw(com::sun::star::uno::RuntimeException)
+static sal_Bool SAL_CALL check(sal_Unicode ch1, sal_Unicode ch2, sal_Int16 inputCheckMode)
{
sal_Int16 composible_class;
- sal_Unicode currentChar = Text[nStartPos];
- switch (_TAC_celltype_inputcheck[getCharType(currentChar)][getCharType(inputChar)]) {
+ switch (_TAC_celltype_inputcheck[getCharType(ch1)][getCharType(ch2)]) {
case 'A': composible_class = 0; break;
case 'C': composible_class = 1; break;
case 'S': composible_class = 2; break;
@@ -95,4 +92,68 @@ InputSequenceChecker_th::checkInputSequence(const OUString& Text, sal_Int32 nSta
return (_TAC_Composible[inputCheckMode][composible_class]);
}
+sal_Bool SAL_CALL
+InputSequenceChecker_th::checkInputSequence(const OUString& Text, sal_Int32 nStartPos,
+ sal_Unicode inputChar, sal_Int16 inputCheckMode) throw(com::sun::star::uno::RuntimeException)
+{
+ return check(Text[nStartPos], inputChar, inputCheckMode);
+}
+
+sal_Int32 SAL_CALL
+InputSequenceChecker_th::correctInputSequence(OUString& Text,
+ sal_Int32 nStartPos,
+ sal_Unicode inputChar,
+ sal_Int16 inputCheckMode)
+ throw(com::sun::star::uno::RuntimeException)
+{
+/* 9 rules for input sequence correction, see issue i42661 for detail,
+
+http://www.openoffice.org/issues/show_bug.cgi?id=42661
+
+<abv> = <av1>|<av2>|<av3>|<bv1>|<bv2>
+<abv1> = <av1>|<bv1>
+<thanthakhat> = 0E4C (karan)
+
+1. <cons> <abv>_x + <abv>_y => <cons> <abv>_y (replace)
+2. <cons> <tone>_x + <tone>_y => <cons> <tone>_y (replace)
+3. <cons> <abv> <tone>_x + <tone>_y => <cons> <abv> <tone>_y (replace)
+4. <cons> <abv>_x <tone> + <abv>_y => <cons> <abv>_y <tone> (replace, reorder)
+5. <cons> <tone> + <abv> => <cons> <abv> <tone> (reorder)
+6. <cons> <fv1> + <tone> => <cons> <tone> <fv1> (reorder)
+7. <cons> <tone>_x <fv1> + <tone>_y => <cons> <tone>_y <fv1> (replace, reorder)
+8. <cons> <thanthakhat> + <abv1> => <cons> <abv1> <thanthakhat> (reorder)
+9. <cons> <abv1>_x <thanthakhat> + <abv1>_y => <cons> <abv1>_y <thanthakhat>(reorder, replace)
+*/
+#define CT_ABV(t) (t>=CT_AV1 && t<=CT_AV3 || t==CT_BV1 || t==CT_BV2)
+#define CT_ABV1(t) (t==CT_AV1 || t==CT_BV1)
+
+ if (check(Text[nStartPos], inputChar, inputCheckMode))
+ Text = Text.replaceAt(++nStartPos, 0, OUString(inputChar));
+ else if (nStartPos > 0 && getCharType(Text[nStartPos-1]) == CT_CONS) {
+ sal_uInt16 t1=getCharType(Text[nStartPos]), t2=getCharType(inputChar);
+ if (CT_ABV(t1) && CT_ABV(t2) || // 1.
+ t1==CT_TONE && t2==CT_TONE) // 2.
+ Text = Text.replaceAt(nStartPos, 1, OUString(inputChar));
+ else if (t1==CT_TONE && CT_ABV(t2) || // 5.
+ t1==CT_FV1 && t2==CT_TONE || // 6.
+ Text[nStartPos]==0x0E4C && CT_ABV1(t2)) // 8.
+ Text = Text.replaceAt(nStartPos++, 0, OUString(inputChar));
+ else
+ nStartPos=Text.getLength();
+ } else if (nStartPos > 1 && getCharType(Text[nStartPos-2]) == CT_CONS) {
+ sal_uInt16 t1=getCharType(Text[nStartPos-1]), t2=getCharType(Text[nStartPos]), t3=getCharType(inputChar);
+ if (CT_ABV(t1) && t2==CT_TONE && t3==CT_TONE) // 3.
+ Text = Text.replaceAt(nStartPos, 1, OUString(inputChar));
+ else if (CT_ABV(t1) && t2==CT_TONE && CT_ABV(t3) || // 4.
+ t1==CT_TONE && t2==CT_FV1 && t3==CT_TONE || // 7.
+ CT_ABV1(t1) && Text[nStartPos]==0x0E4C && CT_ABV1(t3)) // 9.
+ Text = Text.replaceAt(nStartPos-1, 1, OUString(inputChar));
+ else
+ nStartPos=Text.getLength();
+ } else
+ nStartPos=Text.getLength();
+
+ return nStartPos;
+}
+
} } } }