From b75ab569b76c91a26a8b4cfaa8e8ed7647953040 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Thu, 15 Dec 2022 15:16:31 +0800 Subject: [PATCH] Megrez // 2.5.2 update, adding [Node].smashedPairs(), etc. - Also consolidating certain methods. --- .../Sources/Megrez/1_Compositor.swift | 21 +------- .../Sources/Megrez/2_Walker.swift | 5 +- .../Sources/Megrez/6_Node.swift | 50 ++++++++++++++----- 3 files changed, 40 insertions(+), 36 deletions(-) diff --git a/Packages/vChewing_Megrez/Sources/Megrez/1_Compositor.swift b/Packages/vChewing_Megrez/Sources/Megrez/1_Compositor.swift index 8b125e58..9b9dd3e1 100644 --- a/Packages/vChewing_Megrez/Sources/Megrez/1_Compositor.swift +++ b/Packages/vChewing_Megrez/Sources/Megrez/1_Compositor.swift @@ -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.. (walkedNode: [Node], succeeded: Bool) { var result = [Node]() - defer { - walkedNodes = result - updateCursorJumpingTables() - } + defer { walkedNodes = result } guard !spans.isEmpty else { return (result, true) } var vertexSpans = [[Vertex]]() diff --git a/Packages/vChewing_Megrez/Sources/Megrez/6_Node.swift b/Packages/vChewing_Megrez/Sources/Megrez/6_Node.swift index 4f1911ab..1f0746c4 100644 --- a/Packages/vChewing_Megrez/Sources/Megrez/6_Node.swift +++ b/Packages/vChewing_Megrez/Sources/Megrez/6_Node.swift @@ -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..