Skip to content

Commit e753ee4

Browse files
authored
fix: delete trailing ASCII when accepting prediction (#300)
* fix: delete trailing ASCII when accepting prediction * fix: remove stale swiftlint disable * build: update AzooKeyKanaKanjiConverter revision
1 parent 7cd4990 commit e753ee4

3 files changed

Lines changed: 66 additions & 23 deletions

File tree

Core/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ let package = Package(
2121
)
2222
],
2323
dependencies: [
24-
.package(url: "https://github.com/azooKey/AzooKeyKanaKanjiConverter", revision: "23544d6ea30822fd498caeff2dbc04d78b268134", traits: kanaKanjiConverterTraits),
24+
.package(url: "https://github.com/azooKey/AzooKeyKanaKanjiConverter", revision: "e57b2c82cdecdeb8dc9058a8d04264e79bea1ab3", traits: kanaKanjiConverterTraits),
2525
.package(url: "https://github.com/apple/swift-crypto.git", from: "3.0.0"),
2626
.package(url: "https://github.com/weichsel/ZIPFoundation.git", from: "0.9.0")
2727
],

Core/Sources/Core/InputUtils/SegmentsManager.swift

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -809,7 +809,6 @@ public final class SegmentsManager {
809809
suggestSelectionIndex = nil
810810
}
811811

812-
// swiftlint:disable:next cyclomatic_complexity
813812
public func requestPredictionCandidates() -> [PredictionCandidate] {
814813
guard Config.DebugPredictiveTyping().value else {
815814
return []
@@ -820,16 +819,6 @@ public final class SegmentsManager {
820819
return []
821820
}
822821

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-
833822
if let backspaceAdjustedPredictionCandidate {
834823
return [backspaceAdjustedPredictionCandidate]
835824
}
@@ -843,23 +832,51 @@ public final class SegmentsManager {
843832
guard !reading.isEmpty else {
844833
continue
845834
}
846-
let readingHiragana = reading.toHiragana()
847-
guard readingHiragana.hasPrefix(matchTarget) else {
848-
continue
849-
}
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
835+
if let predictionCandidate = Self.makePredictionCandidate(
836+
currentTarget: target,
837+
candidateReading: reading,
838+
displayText: candidate.text
839+
) {
840+
return [predictionCandidate]
856841
}
857-
return [.init(displayText: candidate.text, appendText: appendText)]
858842
}
859843

860844
return []
861845
}
862846

847+
static func makePredictionCandidate(
848+
currentTarget: String,
849+
candidateReading: String,
850+
displayText: String
851+
) -> PredictionCandidate? {
852+
var matchTarget = currentTarget
853+
var deleteCount = 0
854+
if let last = matchTarget.last,
855+
last.unicodeScalars.allSatisfy({ $0.isASCII && CharacterSet.letters.contains($0) }) {
856+
matchTarget.removeLast()
857+
deleteCount = 1
858+
}
859+
guard matchTarget.count >= 2 else {
860+
return nil
861+
}
862+
863+
let readingHiragana = candidateReading.toHiragana()
864+
let matchTargetHiragana = matchTarget.toHiragana()
865+
guard readingHiragana.hasPrefix(matchTargetHiragana) else {
866+
return nil
867+
}
868+
guard matchTargetHiragana.count < readingHiragana.count else {
869+
return nil
870+
}
871+
872+
let appendText = String(readingHiragana.dropFirst(matchTargetHiragana.count))
873+
guard !appendText.isEmpty else {
874+
return nil
875+
}
876+
877+
return .init(displayText: displayText, appendText: appendText, deleteCount: deleteCount)
878+
}
879+
863880
private func requestTypoCorrectionCandidates(composingText targetComposingText: ComposingText, inputStyle: InputStyle) -> [String] {
864881
guard Config.DebugTypoCorrection().value && self.hasDebugTypoCorrectionWeights() else {
865882
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)