@@ -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 [ ]
0 commit comments