diff options
author | 2011-10-06 08:25:23 -0700 | |
---|---|---|
committer | 2011-10-06 08:25:23 -0700 | |
commit | c1368a8efce58f3e513e490e78ade396ef03b1e8 (patch) | |
tree | 4b2bc5b375abf62f7c26a11ac4da243a9aaefa35 /native/src/correction.cpp | |
parent | 3d36cdcd2d4a4cfb6fab6d89f1a6fcc62dfce6e6 (diff) | |
parent | 57834c20a5f2e4c944e09eb4fcddb440bbd46e20 (diff) | |
download | latinime-c1368a8efce58f3e513e490e78ade396ef03b1e8.tar.gz latinime-c1368a8efce58f3e513e490e78ade396ef03b1e8.tar.xz latinime-c1368a8efce58f3e513e490e78ade396ef03b1e8.zip |
Merge "Fix a bug of the conversion of the correction algorithm"
Diffstat (limited to 'native/src/correction.cpp')
-rw-r--r-- | native/src/correction.cpp | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/native/src/correction.cpp b/native/src/correction.cpp index d1e866d9d..a08a21bd2 100644 --- a/native/src/correction.cpp +++ b/native/src/correction.cpp @@ -299,23 +299,41 @@ Correction::CorrectionType Correction::processCharAndCalcState( // TODO: Change the limit if we'll allow two or more proximity chars with corrections const bool checkProximityChars = noCorrectionsHappenedSoFar || mProximityCount == 0; - const ProximityInfo::ProximityType matchedProximityCharId = secondTransposing + ProximityInfo::ProximityType matchedProximityCharId = secondTransposing ? ProximityInfo::EQUIVALENT_CHAR : mProximityInfo->getMatchedProximityId(mInputIndex, c, checkProximityChars); if (ProximityInfo::UNRELATED_CHAR == matchedProximityCharId) { - // TODO: Optimize - // As the current char turned out to be an unrelated char, - // we will try other correction-types. Please note that mCorrectionStates[mOutputIndex] - // here refers to the previous state. - if (canTryCorrection && mCorrectionStates[mOutputIndex].mProximityMatching + if (canTryCorrection && mOutputIndex > 0 + && mCorrectionStates[mOutputIndex].mProximityMatching && mCorrectionStates[mOutputIndex].mExceeding && isEquivalentChar(mProximityInfo->getMatchedProximityId( - mInputIndex, mWord[mOutputIndex], false))) { + mInputIndex, mWord[mOutputIndex - 1], false))) { + if (DEBUG_CORRECTION) { + LOGI("CONVERSION p->e %c", mWord[mOutputIndex - 1]); + } // Conversion p->e + // Example: + // wearth -> earth + // px -> (E)mmmmm ++mExcessiveCount; --mProximityCount; - } else if (mInputIndex < mInputLength - 1 && mOutputIndex > 0 && mTransposedCount > 0 + mExcessivePos = mOutputIndex - 1; + ++mInputIndex; + // Here, we are doing something equivalent to matchedProximityCharId, + // but we already know that "excessive char correction" just happened + // so that we just need to check "mProximityCount == 0". + matchedProximityCharId = + mProximityInfo->getMatchedProximityId(mInputIndex, c, mProximityCount == 0); + } + } + + if (ProximityInfo::UNRELATED_CHAR == matchedProximityCharId) { + // TODO: Optimize + // As the current char turned out to be an unrelated char, + // we will try other correction-types. Please note that mCorrectionStates[mOutputIndex] + // here refers to the previous state. + if (mInputIndex < mInputLength - 1 && mOutputIndex > 0 && mTransposedCount > 0 && !mCorrectionStates[mOutputIndex].mTransposing && mCorrectionStates[mOutputIndex - 1].mTransposing && isEquivalentChar(mProximityInfo->getMatchedProximityId( @@ -425,6 +443,11 @@ Correction::CorrectionType Correction::processCharAndCalcState( || isSameAsUserTypedLength) && isTerminal) { mTerminalInputIndex = mInputIndex - 1; mTerminalOutputIndex = mOutputIndex - 1; + if (DEBUG_CORRECTION) { + DUMP_WORD(mWord, mOutputIndex); + LOGI("ONTERMINAL(1): %d, %d, %d, %d, %c", mProximityCount, mSkippedCount, + mTransposedCount, mExcessiveCount, c); + } return ON_TERMINAL; } else { return NOT_ON_TERMINAL; |