Megrez // 2.5.2 update, adding [Node].smashedPairs(), etc.
- Also consolidating certain methods.
This commit is contained in:
parent
c13d223bb2
commit
b75ab569b7
|
@ -59,9 +59,6 @@ extension Megrez {
|
|||
didSet { clear() }
|
||||
}
|
||||
|
||||
/// 允許查詢當前游標位置屬於第幾個幅位座標(從 0 開始算)。
|
||||
public private(set) var cursorRegionMap: [Int: Int] = .init()
|
||||
|
||||
/// 初期化一個組字器。
|
||||
/// - Parameter langModel: 要對接的語言模組。
|
||||
public init(with langModel: LangModelProtocol, separator: String = "-") {
|
||||
|
@ -79,7 +76,6 @@ extension Megrez {
|
|||
keys.removeAll()
|
||||
spans.removeAll()
|
||||
walkedNodes.removeAll()
|
||||
cursorRegionMap.removeAll()
|
||||
}
|
||||
|
||||
/// 在游標位置插入給定的索引鍵。
|
||||
|
@ -138,7 +134,7 @@ extension Megrez {
|
|||
case .rear:
|
||||
if target == 0 { return false }
|
||||
}
|
||||
guard let currentRegion = cursorRegionMap[target] else { return false }
|
||||
guard let currentRegion = walkedNodes.cursorRegionMap[target] else { return false }
|
||||
|
||||
let aRegionForward = max(currentRegion - 1, 0)
|
||||
let currentRegionBorderRear: Int = walkedNodes[0..<currentRegion].map(\.spanLength).reduce(0, +)
|
||||
|
@ -312,19 +308,4 @@ extension Megrez.Compositor {
|
|||
}
|
||||
return nodesChanged
|
||||
}
|
||||
|
||||
/// 更新游標跳轉換算表。
|
||||
mutating func updateCursorJumpingTables() {
|
||||
var cursorRegionMapDict = [Int: Int]()
|
||||
cursorRegionMapDict[-1] = 0 // 防呆
|
||||
var counter = 0
|
||||
for (i, theNode) in walkedNodes.enumerated() {
|
||||
for _ in 0..<theNode.spanLength {
|
||||
cursorRegionMapDict[counter] = i
|
||||
counter += 1
|
||||
}
|
||||
}
|
||||
cursorRegionMapDict[counter] = walkedNodes.count
|
||||
cursorRegionMap = cursorRegionMapDict
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,10 +15,7 @@ extension Megrez.Compositor {
|
|||
/// - Returns: 爬軌結果+該過程是否順利執行。
|
||||
@discardableResult public mutating func walk() -> (walkedNode: [Node], succeeded: Bool) {
|
||||
var result = [Node]()
|
||||
defer {
|
||||
walkedNodes = result
|
||||
updateCursorJumpingTables()
|
||||
}
|
||||
defer { walkedNodes = result }
|
||||
guard !spans.isEmpty else { return (result, true) }
|
||||
|
||||
var vertexSpans = [[Vertex]]()
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
// ====================
|
||||
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
|
||||
|
||||
import Foundation
|
||||
|
||||
extension Megrez.Compositor {
|
||||
/// 字詞節點。
|
||||
///
|
||||
|
@ -197,23 +199,26 @@ extension Array where Element == Megrez.Compositor.Node {
|
|||
|
||||
/// 返回一連串的節點起點。結果為 (Result A, Result B) 辭典陣列。
|
||||
/// Result A 以索引查座標,Result B 以座標查索引。
|
||||
public var nodeBorderPointDictPair: ([Int: Int], [Int: Int]) {
|
||||
private var nodeBorderPointDictPair: (regionCursorMap: [Int: Int], cursorRegionMap: [Int: Int]) {
|
||||
// Result A 以索引查座標,Result B 以座標查索引。
|
||||
var resultA = [Int: Int]()
|
||||
var resultB = [Int: Int]()
|
||||
var i = 0
|
||||
for (j, neta) in enumerated() {
|
||||
resultA[j] = i
|
||||
var resultB: [Int: Int] = [-1: 0] // 防呆
|
||||
var cursorCounter = 0
|
||||
for (nodeCounter, neta) in enumerated() {
|
||||
resultA[nodeCounter] = cursorCounter
|
||||
neta.keyArray.forEach { _ in
|
||||
resultB[i] = j
|
||||
i += 1
|
||||
resultB[cursorCounter] = nodeCounter
|
||||
cursorCounter += 1
|
||||
}
|
||||
}
|
||||
resultA[resultA.count] = i
|
||||
resultB[i] = resultB.count
|
||||
resultA[count] = cursorCounter
|
||||
resultB[cursorCounter] = count
|
||||
return (resultA, resultB)
|
||||
}
|
||||
|
||||
/// 返回一個辭典,以座標查索引。允許以游標位置查詢其屬於第幾個幅位座標(從 0 開始算)。
|
||||
public var cursorRegionMap: [Int: Int] { nodeBorderPointDictPair.cursorRegionMap }
|
||||
|
||||
/// 總讀音單元數量。在絕大多數情況下,可視為總幅位長度。
|
||||
public var totalKeyCount: Int { map(\.keyArray.count).reduce(0, +) }
|
||||
|
||||
|
@ -227,9 +232,9 @@ extension Array where Element == Megrez.Compositor.Node {
|
|||
let cursor = Swift.max(0, cursor) // 防呆
|
||||
nilReturn = cursor..<cursor
|
||||
// 下文按道理來講不應該會出現 nilReturn。
|
||||
guard let rearNodeID = nodeBorderPointDictPair.1[cursor] else { return nilReturn }
|
||||
guard let rearIndex = nodeBorderPointDictPair.0[rearNodeID] else { return nilReturn }
|
||||
guard let frontIndex = nodeBorderPointDictPair.0[rearNodeID + 1] else { return nilReturn }
|
||||
guard let rearNodeID = nodeBorderPointDictPair.cursorRegionMap[cursor] else { return nilReturn }
|
||||
guard let rearIndex = nodeBorderPointDictPair.regionCursorMap[rearNodeID] else { return nilReturn }
|
||||
guard let frontIndex = nodeBorderPointDictPair.regionCursorMap[rearNodeID + 1] else { return nilReturn }
|
||||
return rearIndex..<frontIndex
|
||||
}
|
||||
|
||||
|
@ -254,4 +259,25 @@ extension Array where Element == Megrez.Compositor.Node {
|
|||
var useless = 0
|
||||
return findNode(at: cursor, target: &useless)
|
||||
}
|
||||
|
||||
/// 提供一組逐字的字音配對陣列(不使用 Megrez 的 KeyValuePaired 類型),但字音不匹配的節點除外。
|
||||
public var smashedPairs: [(key: String, value: String)] {
|
||||
var arrData = [(key: String, value: String)]()
|
||||
let separator = Megrez.Compositor.theSeparator
|
||||
forEach { node in
|
||||
if node.isReadingMismatched {
|
||||
var newKey = node.joinedKey()
|
||||
if !separator.isEmpty, newKey != separator, newKey.contains(separator) {
|
||||
newKey = newKey.replacingOccurrences(of: separator, with: "\t")
|
||||
}
|
||||
arrData.append((key: newKey, value: node.value))
|
||||
return
|
||||
}
|
||||
let arrValueChars = node.value.map(\.description)
|
||||
node.keyArray.enumerated().forEach { i, key in
|
||||
arrData.append((key: key, value: arrValueChars[i]))
|
||||
}
|
||||
}
|
||||
return arrData
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue