diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift index 5cbec8c3..3bb0d348 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift @@ -83,6 +83,15 @@ extension vChewingLM { rangeMap.removeAll() } + public func saveData() { + guard let filePath = filePath else { return } + do { + try strData.write(toFile: filePath, atomically: true, encoding: .utf8) + } catch { + vCLog("Failed to save current database to: \(filePath)") + } + } + public func valuesFor(pair: Megrez.Compositor.KeyValuePaired) -> [String] { var pairs: [String] = [] if let arrRangeRecords: [(Range, Int)] = rangeMap[pair.toNGramKey] { diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift index 8573f75d..c8af7615 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift @@ -119,6 +119,23 @@ extension vChewingLM { // MARK: - Advanced features + public func saveData() { + guard let filePath = filePath else { return } + var dataToWrite = strData + do { + if !temporaryMap.isEmpty { + temporaryMap.forEach { neta in + neta.value.forEach { unigram in + dataToWrite.append("\(unigram.value) \(neta.key) \(unigram.score.description)\n") + } + } + } + try dataToWrite.write(toFile: filePath, atomically: true, encoding: .utf8) + } catch { + vCLog("Failed to save current database to: \(filePath)") + } + } + /// 將當前資料庫辭典的內容以文本的形式輸出至 macOS 內建的 Console.app。 /// /// 該功能僅作偵錯之用途。 diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift index cb6be4cd..7bb9ea02 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift @@ -17,7 +17,7 @@ extension vChewingLM { @frozen public struct LMCoreNS { public private(set) var filePath: String? /// 資料庫辭典。索引內容為經過加密的注音字串,資料內容則為 UTF8 資料陣列。 - var rangeMap: [String: [Data]] = [:] + var dataMap: [String: [Data]] = [:] /// 【已作廢】資料庫字串陣列。在 LMCoreNS 內沒有作用。 var strData: String = "" /// 【已作廢】聲明原始檔案內第一、二縱列的內容是否彼此顛倒。 @@ -30,7 +30,7 @@ extension vChewingLM { var shouldForceDefaultScore = false /// 資料陣列內承載的資料筆數。 - public var count: Int { rangeMap.count } + public var count: Int { dataMap.count } /// 初期化該語言模型。 /// @@ -45,7 +45,7 @@ extension vChewingLM { reverse: Bool = false, consolidate: Bool = false, defaultScore scoreDefault: Double = 0, forceDefaultScore: Bool = false ) { - rangeMap = [:] + dataMap = [:] allowConsolidation = consolidate shouldReverse = reverse defaultScore = scoreDefault @@ -53,7 +53,7 @@ extension vChewingLM { } /// 檢測資料庫辭典內是否已經有載入的資料。 - public var isLoaded: Bool { !rangeMap.isEmpty } + public var isLoaded: Bool { !dataMap.isEmpty } /// 將資料從檔案讀入至資料庫辭典內。 /// - parameters: @@ -67,7 +67,7 @@ extension vChewingLM { let rawData = try Data(contentsOf: URL(fileURLWithPath: path)) let rawPlist: [String: [Data]] = try PropertyListSerialization.propertyList(from: rawData, format: nil) as? [String: [Data]] ?? .init() - rangeMap = rawPlist + dataMap = rawPlist } catch { filePath = oldPath vCLog("↑ Exception happened when reading plist file at: \(path).") @@ -81,17 +81,27 @@ extension vChewingLM { /// 將當前語言模組的資料庫辭典自記憶體內卸除。 public mutating func clear() { filePath = nil - rangeMap.removeAll() + dataMap.removeAll() } // MARK: - Advanced features + public func saveData() { + guard let filePath = filePath, let plistURL = URL(string: filePath) else { return } + do { + let plistData = try PropertyListSerialization.data(fromPropertyList: dataMap, format: .binary, options: 0) + try plistData.write(to: plistURL) + } catch { + vCLog("Failed to save current database to: \(filePath)") + } + } + /// 將當前資料庫辭典的內容以文本的形式輸出至 macOS 內建的 Console.app。 /// /// 該功能僅作偵錯之用途。 public func dump() { var strDump = "" - for entry in rangeMap { + for entry in dataMap { let netaSets: [Data] = entry.value let theKey = entry.key for netaSet in netaSets { @@ -114,7 +124,7 @@ extension vChewingLM { public func unigramsFor(key: String) -> [Megrez.Unigram] { var grams: [Megrez.Unigram] = [] var gramsHW: [Megrez.Unigram] = [] - guard let arrRangeRecords: [Data] = rangeMap[cnvPhonabetToASCII(key)] else { return grams } + guard let arrRangeRecords: [Data] = dataMap[cnvPhonabetToASCII(key)] else { return grams } for netaSet in arrRangeRecords { let strNetaSet = String(decoding: netaSet, as: UTF8.self) let neta = Array(strNetaSet.trimmingCharacters(in: .newlines).split(separator: " ").reversed()) @@ -142,7 +152,7 @@ extension vChewingLM { /// - parameters: /// - key: 讀音索引鍵。 public func hasUnigramsFor(key: String) -> Bool { - rangeMap[cnvPhonabetToASCII(key)] != nil + dataMap[cnvPhonabetToASCII(key)] != nil } /// 內部函式,用以將注音讀音索引鍵進行加密。 diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift index 02ff5009..a5091bba 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift @@ -49,6 +49,16 @@ extension vChewingLM { dataMap.removeAll() } + public func saveData() { + guard let filePath = filePath, let plistURL = URL(string: filePath) else { return } + do { + let plistData = try PropertyListSerialization.data(fromPropertyList: dataMap, format: .binary, options: 0) + try plistData.write(to: plistURL) + } catch { + vCLog("Failed to save current database to: \(filePath)") + } + } + public func valuesFor(key: String) -> [String] { var pairs: [String] = [] if let arrRangeRecords: String = dataMap[key]?.trimmingCharacters(in: .newlines) { diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift index 637d08a3..38a762c3 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift @@ -68,6 +68,15 @@ extension vChewingLM { rangeMap.removeAll() } + public func saveData() { + guard let filePath = filePath else { return } + do { + try strData.write(toFile: filePath, atomically: true, encoding: .utf8) + } catch { + vCLog("Failed to save current database to: \(filePath)") + } + } + public func dump() { var strDump = "" for entry in rangeMap {