@@ -159,15 +159,27 @@ extension Array where Element == Megrez.GramInPath {
159159 maxContext: Int = 3
160160 )
161161 -> ( ngramKey: String , candidate: String , headReading: String ) ? {
162- let perceptedGIP : Megrez . GramInPath ?
163- if let cursor, ( 0 ..< self . totalKeyCount) . contains ( cursor) {
164- perceptedGIP = findGram ( at: cursor) ? . gram
162+ let headInfo : ( pair: Megrez . GramInPath , range: Range < Int > ) ?
163+ let resolvedCursor : Int
164+ if let cursor, ( 0 ..< totalKeyCount) . contains ( cursor) , let hit = findGram ( at: cursor) {
165+ headInfo = ( pair: hit. gram, range: hit. range)
166+ resolvedCursor = Swift . max ( hit. range. lowerBound, Swift . min ( cursor, hit. range. upperBound - 1 ) )
167+ } else if let tail = last {
168+ let lowerBound = totalKeyCount - tail. keyArray. count
169+ headInfo = ( pair: tail, range: lowerBound ..< totalKeyCount)
170+ resolvedCursor = Swift . max ( lowerBound, totalKeyCount - 1 )
165171 } else {
166- perceptedGIP = last
172+ headInfo = nil
173+ resolvedCursor = 0
167174 }
168- guard let perceptedGIP else { return nil }
175+ guard let headInfo else { return nil }
176+ let headPair = headInfo. pair
177+ let headRange = headInfo. range
178+ let headKeyOffset = Swift . max ( 0 , resolvedCursor - headRange. lowerBound)
179+ guard headPair. keyArray. indices. contains ( headKeyOffset) else { return nil }
180+
169181 var arrGIPs = self
170- while arrGIPs. last? . gram !== perceptedGIP . gram { arrGIPs. removeLast ( ) }
182+ while arrGIPs. last? . gram !== headPair . gram { arrGIPs. removeLast ( ) }
171183 var isHead = true
172184 var outputCells = [ String] ( )
173185 loopProc: while !arrGIPs. isEmpty, let frontendPair = arrGIPs. last {
@@ -178,10 +190,17 @@ extension Array where Element == Megrez.GramInPath {
178190 guard !frontendPair. isReadingMismatched else { return nil }
179191 guard !frontendPair. value. isEmpty else { return nil }
180192 guard !frontendPair. keyArray. joined ( ) . isEmpty else { return nil }
193+ if isHead {
194+ let index = headKeyOffset
195+ guard frontendPair. keyArray. indices. contains ( index) else { return nil }
196+ let key = frontendPair. keyArray [ index]
197+ guard !key. contains ( " _ " ) else { return nil }
198+ return key
199+ }
181200 let keyChain = frontendPair. keyArray. joined ( separator: " - " )
182201 guard !keyChain. contains ( " _ " ) else { return nil }
183202 // 前置單元只記錄讀音,在其後的單元則同時記錄讀音與字詞
184- return isHead ? keyChain : " ( \( keyChain) : \( frontendPair. value) ) "
203+ return " ( \( keyChain) : \( frontendPair. value) ) "
185204 }
186205
187206 guard let keyCellStr = makeNGramKeyCell ( isHead: isHead) else { break loopProc }
@@ -190,10 +209,11 @@ extension Array where Element == Megrez.GramInPath {
190209 if isHead { isHead = false }
191210 }
192211 guard !outputCells. isEmpty else { return nil }
212+ let headReading = headPair. keyArray [ headKeyOffset]
193213 return (
194214 " ( \( outputCells. joined ( separator: " , " ) ) ) " ,
195- perceptedGIP . gram . value,
196- perceptedGIP . joinedCurrentKey ( by : " - " )
215+ headPair . value,
216+ headReading
197217 )
198218 }
199219}
0 commit comments