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() }
|
didSet { clear() }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 允許查詢當前游標位置屬於第幾個幅位座標(從 0 開始算)。
|
|
||||||
public private(set) var cursorRegionMap: [Int: Int] = .init()
|
|
||||||
|
|
||||||
/// 初期化一個組字器。
|
/// 初期化一個組字器。
|
||||||
/// - Parameter langModel: 要對接的語言模組。
|
/// - Parameter langModel: 要對接的語言模組。
|
||||||
public init(with langModel: LangModelProtocol, separator: String = "-") {
|
public init(with langModel: LangModelProtocol, separator: String = "-") {
|
||||||
|
@ -79,7 +76,6 @@ extension Megrez {
|
||||||
keys.removeAll()
|
keys.removeAll()
|
||||||
spans.removeAll()
|
spans.removeAll()
|
||||||
walkedNodes.removeAll()
|
walkedNodes.removeAll()
|
||||||
cursorRegionMap.removeAll()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 在游標位置插入給定的索引鍵。
|
/// 在游標位置插入給定的索引鍵。
|
||||||
|
@ -138,7 +134,7 @@ extension Megrez {
|
||||||
case .rear:
|
case .rear:
|
||||||
if target == 0 { return false }
|
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 aRegionForward = max(currentRegion - 1, 0)
|
||||||
let currentRegionBorderRear: Int = walkedNodes[0..<currentRegion].map(\.spanLength).reduce(0, +)
|
let currentRegionBorderRear: Int = walkedNodes[0..<currentRegion].map(\.spanLength).reduce(0, +)
|
||||||
|
@ -312,19 +308,4 @@ extension Megrez.Compositor {
|
||||||
}
|
}
|
||||||
return nodesChanged
|
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: 爬軌結果+該過程是否順利執行。
|
/// - Returns: 爬軌結果+該過程是否順利執行。
|
||||||
@discardableResult public mutating func walk() -> (walkedNode: [Node], succeeded: Bool) {
|
@discardableResult public mutating func walk() -> (walkedNode: [Node], succeeded: Bool) {
|
||||||
var result = [Node]()
|
var result = [Node]()
|
||||||
defer {
|
defer { walkedNodes = result }
|
||||||
walkedNodes = result
|
|
||||||
updateCursorJumpingTables()
|
|
||||||
}
|
|
||||||
guard !spans.isEmpty else { return (result, true) }
|
guard !spans.isEmpty else { return (result, true) }
|
||||||
|
|
||||||
var vertexSpans = [[Vertex]]()
|
var vertexSpans = [[Vertex]]()
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
// ====================
|
// ====================
|
||||||
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
|
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
extension Megrez.Compositor {
|
extension Megrez.Compositor {
|
||||||
/// 字詞節點。
|
/// 字詞節點。
|
||||||
///
|
///
|
||||||
|
@ -197,23 +199,26 @@ extension Array where Element == Megrez.Compositor.Node {
|
||||||
|
|
||||||
/// 返回一連串的節點起點。結果為 (Result A, Result B) 辭典陣列。
|
/// 返回一連串的節點起點。結果為 (Result A, Result B) 辭典陣列。
|
||||||
/// 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 以座標查索引。
|
// Result A 以索引查座標,Result B 以座標查索引。
|
||||||
var resultA = [Int: Int]()
|
var resultA = [Int: Int]()
|
||||||
var resultB = [Int: Int]()
|
var resultB: [Int: Int] = [-1: 0] // 防呆
|
||||||
var i = 0
|
var cursorCounter = 0
|
||||||
for (j, neta) in enumerated() {
|
for (nodeCounter, neta) in enumerated() {
|
||||||
resultA[j] = i
|
resultA[nodeCounter] = cursorCounter
|
||||||
neta.keyArray.forEach { _ in
|
neta.keyArray.forEach { _ in
|
||||||
resultB[i] = j
|
resultB[cursorCounter] = nodeCounter
|
||||||
i += 1
|
cursorCounter += 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
resultA[resultA.count] = i
|
resultA[count] = cursorCounter
|
||||||
resultB[i] = resultB.count
|
resultB[cursorCounter] = count
|
||||||
return (resultA, resultB)
|
return (resultA, resultB)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 返回一個辭典,以座標查索引。允許以游標位置查詢其屬於第幾個幅位座標(從 0 開始算)。
|
||||||
|
public var cursorRegionMap: [Int: Int] { nodeBorderPointDictPair.cursorRegionMap }
|
||||||
|
|
||||||
/// 總讀音單元數量。在絕大多數情況下,可視為總幅位長度。
|
/// 總讀音單元數量。在絕大多數情況下,可視為總幅位長度。
|
||||||
public var totalKeyCount: Int { map(\.keyArray.count).reduce(0, +) }
|
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) // 防呆
|
let cursor = Swift.max(0, cursor) // 防呆
|
||||||
nilReturn = cursor..<cursor
|
nilReturn = cursor..<cursor
|
||||||
// 下文按道理來講不應該會出現 nilReturn。
|
// 下文按道理來講不應該會出現 nilReturn。
|
||||||
guard let rearNodeID = nodeBorderPointDictPair.1[cursor] else { return nilReturn }
|
guard let rearNodeID = nodeBorderPointDictPair.cursorRegionMap[cursor] else { return nilReturn }
|
||||||
guard let rearIndex = nodeBorderPointDictPair.0[rearNodeID] else { return nilReturn }
|
guard let rearIndex = nodeBorderPointDictPair.regionCursorMap[rearNodeID] else { return nilReturn }
|
||||||
guard let frontIndex = nodeBorderPointDictPair.0[rearNodeID + 1] else { return nilReturn }
|
guard let frontIndex = nodeBorderPointDictPair.regionCursorMap[rearNodeID + 1] else { return nilReturn }
|
||||||
return rearIndex..<frontIndex
|
return rearIndex..<frontIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,4 +259,25 @@ extension Array where Element == Megrez.Compositor.Node {
|
||||||
var useless = 0
|
var useless = 0
|
||||||
return findNode(at: cursor, target: &useless)
|
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