From 8f5bd48beb0bf9af60d20449b80c483bf5eba7d7 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 2 Dec 2022 17:27:15 +0800 Subject: [PATCH] LMAssembly // Store file paths of all sub-language-models. - Also: LMPlainBPMF // Variable name fix. --- .../SubLMs/lmAssociates.swift | 6 +++++ .../LangModelAssembly/SubLMs/lmCassette.swift | 10 +++++++-- .../LangModelAssembly/SubLMs/lmCoreEX.swift | 8 +++++++ .../LangModelAssembly/SubLMs/lmCoreNS.swift | 6 +++++ .../SubLMs/lmPlainBopomofo.swift | 22 ++++++++++++------- .../SubLMs/lmReplacements.swift | 6 +++++ 6 files changed, 48 insertions(+), 10 deletions(-) diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift index 0c873596..5cbec8c3 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift @@ -13,6 +13,7 @@ import Shared extension vChewingLM { @frozen public struct LMAssociates { + public private(set) var filePath: String? var rangeMap: [String: [(Range, Int)]] = [:] var strData: String = "" @@ -37,6 +38,8 @@ extension vChewingLM { @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } + let oldPath = filePath + filePath = nil LMConsolidator.fixEOF(path: path) LMConsolidator.consolidate(path: path, pragma: true) @@ -45,11 +48,13 @@ extension vChewingLM { let rawStrData = try String(contentsOfFile: path, encoding: .utf8) replaceData(textData: rawStrData) } catch { + filePath = oldPath vCLog("\(error)") vCLog("↑ Exception happened when reading data at: \(path).") return false } + filePath = path return true } @@ -74,6 +79,7 @@ extension vChewingLM { } public mutating func clear() { + filePath = nil rangeMap.removeAll() } diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCassette.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCassette.swift index d85c3a51..3945ed05 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCassette.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCassette.swift @@ -15,6 +15,7 @@ import Shared extension vChewingLM { /// 磁帶模組,用來方便使用者自行擴充字根輸入法。 @frozen public struct LMCassette { + public private(set) var filePath: String? public private(set) var nameShort: String = "" public private(set) var nameENG: String = "" public private(set) var nameCJK: String = "" @@ -67,6 +68,8 @@ extension vChewingLM { /// - Returns: 是否載入成功。 @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } + let oldPath = filePath + filePath = nil if FileManager.default.fileExists(atPath: path) { do { guard let fileHandle = FileHandle(forReadingAtPath: path) else { @@ -146,17 +149,20 @@ extension vChewingLM { } maxKeyLength = theMaxKeyLength keyNameMap[wildcardKey] = keyNameMap[wildcardKey] ?? "?" + filePath = path return true } catch { vCLog("CIN Loading Failed: File Access Error.") - return false } + } else { + vCLog("CIN Loading Failed: File Missing.") } - vCLog("CIN Loading Failed: File Missing.") + filePath = oldPath return false } public mutating func clear() { + filePath = nil keyNameMap.removeAll() charDefMap.removeAll() charDefWildcardMap.removeAll() diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift index 9bd0adc9..8573f75d 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift @@ -17,6 +17,7 @@ extension vChewingLM { /// 資料記錄原理與上游 C++ 的 ParselessLM 差不多,但用的是 Swift 原生手段。 /// 主要時間消耗仍在 For 迴圈,但這個算法可以顯著減少記憶體佔用。 @frozen public struct LMCoreEX { + public private(set) var filePath: String? /// 資料庫辭典。索引內容為注音字串,資料內容則為字串首尾範圍、方便自 strData 取資料。 var rangeMap: [String: [Range]] = [:] /// 資料庫追加辭典。 @@ -60,6 +61,10 @@ extension vChewingLM { /// - path: 給定路徑。 @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } + + let oldPath = filePath + filePath = nil + var consolidated = false if allowConsolidation { @@ -76,11 +81,13 @@ extension vChewingLM { } replaceData(textData: rawStrData) } catch { + filePath = oldPath vCLog("\(error)") vCLog("↑ Exception happened when reading data at: \(path).") return false } + filePath = path return true } @@ -106,6 +113,7 @@ extension vChewingLM { /// 將當前語言模組的資料庫辭典自記憶體內卸除。 public mutating func clear() { + filePath = nil rangeMap.removeAll() } diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift index 89569f46..cb6be4cd 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift @@ -15,6 +15,7 @@ extension vChewingLM { /// 這樣一來可以節省在舊 mac 機種內的資料讀入速度。 /// 目前僅針對輸入法原廠語彙資料檔案使用 plist 格式。 @frozen public struct LMCoreNS { + public private(set) var filePath: String? /// 資料庫辭典。索引內容為經過加密的注音字串,資料內容則為 UTF8 資料陣列。 var rangeMap: [String: [Data]] = [:] /// 【已作廢】資料庫字串陣列。在 LMCoreNS 內沒有作用。 @@ -59,6 +60,8 @@ extension vChewingLM { /// - path: 給定路徑。 @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } + let oldPath = filePath + filePath = nil do { let rawData = try Data(contentsOf: URL(fileURLWithPath: path)) @@ -66,15 +69,18 @@ extension vChewingLM { try PropertyListSerialization.propertyList(from: rawData, format: nil) as? [String: [Data]] ?? .init() rangeMap = rawPlist } catch { + filePath = oldPath vCLog("↑ Exception happened when reading plist file at: \(path).") return false } + filePath = path return true } /// 將當前語言模組的資料庫辭典自記憶體內卸除。 public mutating func clear() { + filePath = nil rangeMap.removeAll() } diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift index eb25dc67..02ff5009 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift @@ -12,46 +12,52 @@ import Shared extension vChewingLM { @frozen public struct LMPlainBopomofo { - var rangeMap: [String: String] = [:] + public private(set) var filePath: String? + var dataMap: [String: String] = [:] - public var count: Int { rangeMap.count } + public var count: Int { dataMap.count } public init() { - rangeMap = [:] + dataMap = [:] } - public var isLoaded: Bool { !rangeMap.isEmpty } + public var isLoaded: Bool { !dataMap.isEmpty } @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } + let oldPath = filePath + filePath = nil do { let rawData = try Data(contentsOf: URL(fileURLWithPath: path)) let rawPlist: [String: String] = try PropertyListSerialization.propertyList(from: rawData, format: nil) as? [String: String] ?? .init() - rangeMap = rawPlist + dataMap = rawPlist } catch { + filePath = oldPath vCLog("\(error)") vCLog("↑ Exception happened when reading data at: \(path).") return false } + filePath = path return true } public mutating func clear() { - rangeMap.removeAll() + filePath = nil + dataMap.removeAll() } public func valuesFor(key: String) -> [String] { var pairs: [String] = [] - if let arrRangeRecords: String = rangeMap[key]?.trimmingCharacters(in: .newlines) { + if let arrRangeRecords: String = dataMap[key]?.trimmingCharacters(in: .newlines) { pairs.append(contentsOf: arrRangeRecords.map { String($0) }) } return pairs.deduplicated } - public func hasValuesFor(key: String) -> Bool { rangeMap.keys.contains(key) } + public func hasValuesFor(key: String) -> Bool { dataMap.keys.contains(key) } } } diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift index 86a7c250..637d08a3 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift @@ -11,6 +11,7 @@ import Shared extension vChewingLM { @frozen public struct LMReplacements { + public private(set) var filePath: String? var rangeMap: [String: Range] = [:] var strData: String = "" @@ -24,6 +25,8 @@ extension vChewingLM { @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } + let oldPath = filePath + filePath = nil LMConsolidator.fixEOF(path: path) LMConsolidator.consolidate(path: path, pragma: true) @@ -32,11 +35,13 @@ extension vChewingLM { let rawStrData = try String(contentsOfFile: path, encoding: .utf8) replaceData(textData: rawStrData) } catch { + filePath = oldPath vCLog("\(error)") vCLog("↑ Exception happened when reading data at: \(path).") return false } + filePath = path return true } @@ -59,6 +64,7 @@ extension vChewingLM { } public mutating func clear() { + filePath = nil rangeMap.removeAll() }