Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed1ab3b3 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi
Browse files

Improve accent error handling in exact match logic.

Bug: 16963362
Change-Id: I50a48806bc3147388d165faab6b572415a851f29
parent 54099574
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -19,17 +19,18 @@
namespace latinime {

const ErrorTypeUtils::ErrorType ErrorTypeUtils::NOT_AN_ERROR = 0x0;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::MATCH_WITH_CASE_ERROR = 0x1;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::MATCH_WITH_ACCENT_ERROR = 0x2;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::MATCH_WITH_DIGRAPH = 0x4;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::INTENTIONAL_OMISSION = 0x8;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::EDIT_CORRECTION = 0x10;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::PROXIMITY_CORRECTION = 0x20;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::COMPLETION = 0x40;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::NEW_WORD = 0x80;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::MATCH_WITH_WRONG_CASE = 0x1;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::MATCH_WITH_MISSING_ACCENT = 0x2;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::MATCH_WITH_WRONG_ACCENT = 0x4;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::MATCH_WITH_DIGRAPH = 0x8;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::INTENTIONAL_OMISSION = 0x10;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::EDIT_CORRECTION = 0x20;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::PROXIMITY_CORRECTION = 0x40;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::COMPLETION = 0x80;
const ErrorTypeUtils::ErrorType ErrorTypeUtils::NEW_WORD = 0x100;

const ErrorTypeUtils::ErrorType ErrorTypeUtils::ERRORS_TREATED_AS_AN_EXACT_MATCH =
        NOT_AN_ERROR | MATCH_WITH_CASE_ERROR | MATCH_WITH_ACCENT_ERROR | MATCH_WITH_DIGRAPH;
        NOT_AN_ERROR | MATCH_WITH_WRONG_CASE | MATCH_WITH_MISSING_ACCENT | MATCH_WITH_DIGRAPH;

const ErrorTypeUtils::ErrorType
        ErrorTypeUtils::ERRORS_TREATED_AS_AN_EXACT_MATCH_WITH_INTENTIONAL_OMISSION =
+3 −2
Original line number Diff line number Diff line
@@ -30,8 +30,9 @@ class ErrorTypeUtils {
    typedef uint32_t ErrorType;

    static const ErrorType NOT_AN_ERROR;
    static const ErrorType MATCH_WITH_CASE_ERROR;
    static const ErrorType MATCH_WITH_ACCENT_ERROR;
    static const ErrorType MATCH_WITH_WRONG_CASE;
    static const ErrorType MATCH_WITH_MISSING_ACCENT;
    static const ErrorType MATCH_WITH_WRONG_ACCENT;
    static const ErrorType MATCH_WITH_DIGRAPH;
    // Treat error as an intentional omission when the CorrectionType is omission and the node can
    // be intentional omission.
+2 −2
Original line number Diff line number Diff line
@@ -51,10 +51,10 @@ class TypingScoring : public Scoring {
        }
        if (boostExactMatches && ErrorTypeUtils::isExactMatch(containedErrorTypes)) {
            score += ScoringParams::EXACT_MATCH_PROMOTION;
            if ((ErrorTypeUtils::MATCH_WITH_CASE_ERROR & containedErrorTypes) != 0) {
            if ((ErrorTypeUtils::MATCH_WITH_WRONG_CASE & containedErrorTypes) != 0) {
                score -= ScoringParams::CASE_ERROR_PENALTY_FOR_EXACT_MATCH;
            }
            if ((ErrorTypeUtils::MATCH_WITH_ACCENT_ERROR & containedErrorTypes) != 0) {
            if ((ErrorTypeUtils::MATCH_WITH_MISSING_ACCENT & containedErrorTypes) != 0) {
                score -= ScoringParams::ACCENT_ERROR_PENALTY_FOR_EXACT_MATCH;
            }
            if ((ErrorTypeUtils::MATCH_WITH_DIGRAPH & containedErrorTypes) != 0) {
+19 −10
Original line number Diff line number Diff line
@@ -36,25 +36,34 @@ ErrorTypeUtils::ErrorType TypingWeighting::getErrorType(const CorrectionType cor
                // Compare the node code point with original primary code point on the keyboard.
                const ProximityInfoState *const pInfoState =
                        traverseSession->getProximityInfoState(0);
                const int primaryOriginalCodePoint = pInfoState->getPrimaryOriginalCodePointAt(
                const int primaryCodePoint = pInfoState->getPrimaryCodePointAt(
                        dicNode->getInputIndex(0));
                const int nodeCodePoint = dicNode->getNodeCodePoint();
                if (primaryOriginalCodePoint == nodeCodePoint) {
                // TODO: Check whether the input code point is on the keyboard.
                if (primaryCodePoint == nodeCodePoint) {
                    // Node code point is same as original code point on the keyboard.
                    return ErrorTypeUtils::NOT_AN_ERROR;
                } else if (CharUtils::toLowerCase(primaryOriginalCodePoint) ==
                } else if (CharUtils::toLowerCase(primaryCodePoint) ==
                        CharUtils::toLowerCase(nodeCodePoint)) {
                    // Only cases of the code points are different.
                    return ErrorTypeUtils::MATCH_WITH_CASE_ERROR;
                } else if (CharUtils::toBaseCodePoint(primaryOriginalCodePoint) ==
                        CharUtils::toBaseCodePoint(nodeCodePoint)) {
                    return ErrorTypeUtils::MATCH_WITH_WRONG_CASE;
                } else if (primaryCodePoint == CharUtils::toBaseCodePoint(nodeCodePoint)) {
                    // Node code point is a variant of original code point.
                    return ErrorTypeUtils::MATCH_WITH_ACCENT_ERROR;
                } else {
                    return ErrorTypeUtils::MATCH_WITH_MISSING_ACCENT;
                } else if (CharUtils::toBaseCodePoint(primaryCodePoint)
                        == CharUtils::toBaseCodePoint(nodeCodePoint)) {
                    // Base code points are the same but the code point is intentionally input.
                    return ErrorTypeUtils::MATCH_WITH_WRONG_ACCENT;
                } else if (CharUtils::toLowerCase(primaryCodePoint)
                        == CharUtils::toBaseLowerCase(nodeCodePoint)) {
                    // Node code point is a variant of original code point and the cases are also
                    // different.
                    return ErrorTypeUtils::MATCH_WITH_ACCENT_ERROR
                            | ErrorTypeUtils::MATCH_WITH_CASE_ERROR;
                    return ErrorTypeUtils::MATCH_WITH_MISSING_ACCENT
                            | ErrorTypeUtils::MATCH_WITH_WRONG_CASE;
                } else {
                    // Base code points are the same and the cases are different.
                    return ErrorTypeUtils::MATCH_WITH_WRONG_ACCENT
                            | ErrorTypeUtils::MATCH_WITH_WRONG_CASE;
                }
            }
            break;