Skip to content

Commit c6d3e00

Browse files
committed
fix: delete trailing ASCII when accepting prediction
1 parent 7cd4990 commit c6d3e00

2 files changed

Lines changed: 65 additions & 21 deletions

File tree

Core/Sources/Core/InputUtils/SegmentsManager.swift

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -820,16 +820,6 @@ public final class SegmentsManager {
820820
return []
821821
}
822822

823-
var matchTarget = target
824-
if let last = matchTarget.last,
825-
last.unicodeScalars.allSatisfy({ $0.isASCII && CharacterSet.letters.contains($0) }) {
826-
matchTarget.removeLast()
827-
}
828-
guard matchTarget.count >= 2 else {
829-
return []
830-
}
831-
matchTarget = matchTarget.toHiragana()
832-
833823
if let backspaceAdjustedPredictionCandidate {
834824
return [backspaceAdjustedPredictionCandidate]
835825
}
@@ -843,23 +833,51 @@ public final class SegmentsManager {
843833
guard !reading.isEmpty else {
844834
continue
845835
}
846-
let readingHiragana = reading.toHiragana()
847-
guard readingHiragana.hasPrefix(matchTarget) else {
848-
continue
836+
if let predictionCandidate = Self.makePredictionCandidate(
837+
currentTarget: target,
838+
candidateReading: reading,
839+
displayText: candidate.text
840+
) {
841+
return [predictionCandidate]
849842
}
850-
guard matchTarget.count < readingHiragana.count else {
851-
continue
852-
}
853-
let appendText = String(readingHiragana.dropFirst(matchTarget.count))
854-
guard !appendText.isEmpty else {
855-
continue
856-
}
857-
return [.init(displayText: candidate.text, appendText: appendText)]
858843
}
859844

860845
return []
861846
}
862847

848+
static func makePredictionCandidate(
849+
currentTarget: String,
850+
candidateReading: String,
851+
displayText: String
852+
) -> PredictionCandidate? {
853+
var matchTarget = currentTarget
854+
var deleteCount = 0
855+
if let last = matchTarget.last,
856+
last.unicodeScalars.allSatisfy({ $0.isASCII && CharacterSet.letters.contains($0) }) {
857+
matchTarget.removeLast()
858+
deleteCount = 1
859+
}
860+
guard matchTarget.count >= 2 else {
861+
return nil
862+
}
863+
864+
let readingHiragana = candidateReading.toHiragana()
865+
let matchTargetHiragana = matchTarget.toHiragana()
866+
guard readingHiragana.hasPrefix(matchTargetHiragana) else {
867+
return nil
868+
}
869+
guard matchTargetHiragana.count < readingHiragana.count else {
870+
return nil
871+
}
872+
873+
let appendText = String(readingHiragana.dropFirst(matchTargetHiragana.count))
874+
guard !appendText.isEmpty else {
875+
return nil
876+
}
877+
878+
return .init(displayText: displayText, appendText: appendText, deleteCount: deleteCount)
879+
}
880+
863881
private func requestTypoCorrectionCandidates(composingText targetComposingText: ComposingText, inputStyle: InputStyle) -> [String] {
864882
guard Config.DebugTypoCorrection().value && self.hasDebugTypoCorrectionWeights() else {
865883
return []
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
@testable import Core
2+
import Testing
3+
4+
@Test func testMakePredictionCandidateDeletesTrailingASCIIUsedForMatching() async throws {
5+
let candidate = SegmentsManager.makePredictionCandidate(
6+
currentTarget: "おはようございm",
7+
candidateReading: "おはようございます",
8+
displayText: "おはようございます"
9+
)
10+
11+
#expect(candidate?.displayText == "おはようございます")
12+
#expect(candidate?.appendText == "ます")
13+
#expect(candidate?.deleteCount == 1)
14+
}
15+
16+
@Test func testMakePredictionCandidateKeepsDeleteCountZeroWithoutTrailingASCII() async throws {
17+
let candidate = SegmentsManager.makePredictionCandidate(
18+
currentTarget: "おはようござい",
19+
candidateReading: "おはようございます",
20+
displayText: "おはようございます"
21+
)
22+
23+
#expect(candidate?.displayText == "おはようございます")
24+
#expect(candidate?.appendText == "ます")
25+
#expect(candidate?.deleteCount == 0)
26+
}

0 commit comments

Comments
 (0)