LMAssembly // Add saveData() to all submodels.

- Also: LMCoreNS // Variable name fix.
This commit is contained in:
ShikiSuen 2022-12-02 19:04:26 +08:00
parent 8f5bd48beb
commit e7d0259d58
5 changed files with 64 additions and 9 deletions

View File

@ -83,6 +83,15 @@ extension vChewingLM {
rangeMap.removeAll() 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] { public func valuesFor(pair: Megrez.Compositor.KeyValuePaired) -> [String] {
var pairs: [String] = [] var pairs: [String] = []
if let arrRangeRecords: [(Range<String.Index>, Int)] = rangeMap[pair.toNGramKey] { if let arrRangeRecords: [(Range<String.Index>, Int)] = rangeMap[pair.toNGramKey] {

View File

@ -119,6 +119,23 @@ extension vChewingLM {
// MARK: - Advanced features // 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 /// macOS Console.app
/// ///
/// ///

View File

@ -17,7 +17,7 @@ extension vChewingLM {
@frozen public struct LMCoreNS { @frozen public struct LMCoreNS {
public private(set) var filePath: String? public private(set) var filePath: String?
/// UTF8 /// UTF8
var rangeMap: [String: [Data]] = [:] var dataMap: [String: [Data]] = [:]
/// LMCoreNS /// LMCoreNS
var strData: String = "" var strData: String = ""
/// ///
@ -30,7 +30,7 @@ extension vChewingLM {
var shouldForceDefaultScore = false 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, reverse: Bool = false, consolidate: Bool = false, defaultScore scoreDefault: Double = 0,
forceDefaultScore: Bool = false forceDefaultScore: Bool = false
) { ) {
rangeMap = [:] dataMap = [:]
allowConsolidation = consolidate allowConsolidation = consolidate
shouldReverse = reverse shouldReverse = reverse
defaultScore = scoreDefault defaultScore = scoreDefault
@ -53,7 +53,7 @@ extension vChewingLM {
} }
/// ///
public var isLoaded: Bool { !rangeMap.isEmpty } public var isLoaded: Bool { !dataMap.isEmpty }
/// ///
/// - parameters: /// - parameters:
@ -67,7 +67,7 @@ extension vChewingLM {
let rawData = try Data(contentsOf: URL(fileURLWithPath: path)) let rawData = try Data(contentsOf: URL(fileURLWithPath: path))
let rawPlist: [String: [Data]] = let rawPlist: [String: [Data]] =
try PropertyListSerialization.propertyList(from: rawData, format: nil) as? [String: [Data]] ?? .init() try PropertyListSerialization.propertyList(from: rawData, format: nil) as? [String: [Data]] ?? .init()
rangeMap = rawPlist dataMap = rawPlist
} catch { } catch {
filePath = oldPath filePath = oldPath
vCLog("↑ Exception happened when reading plist file at: \(path).") vCLog("↑ Exception happened when reading plist file at: \(path).")
@ -81,17 +81,27 @@ extension vChewingLM {
/// ///
public mutating func clear() { public mutating func clear() {
filePath = nil filePath = nil
rangeMap.removeAll() dataMap.removeAll()
} }
// MARK: - Advanced features // 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 /// macOS Console.app
/// ///
/// ///
public func dump() { public func dump() {
var strDump = "" var strDump = ""
for entry in rangeMap { for entry in dataMap {
let netaSets: [Data] = entry.value let netaSets: [Data] = entry.value
let theKey = entry.key let theKey = entry.key
for netaSet in netaSets { for netaSet in netaSets {
@ -114,7 +124,7 @@ extension vChewingLM {
public func unigramsFor(key: String) -> [Megrez.Unigram] { public func unigramsFor(key: String) -> [Megrez.Unigram] {
var grams: [Megrez.Unigram] = [] var grams: [Megrez.Unigram] = []
var gramsHW: [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 { for netaSet in arrRangeRecords {
let strNetaSet = String(decoding: netaSet, as: UTF8.self) let strNetaSet = String(decoding: netaSet, as: UTF8.self)
let neta = Array(strNetaSet.trimmingCharacters(in: .newlines).split(separator: " ").reversed()) let neta = Array(strNetaSet.trimmingCharacters(in: .newlines).split(separator: " ").reversed())
@ -142,7 +152,7 @@ extension vChewingLM {
/// - parameters: /// - parameters:
/// - key: /// - key:
public func hasUnigramsFor(key: String) -> Bool { public func hasUnigramsFor(key: String) -> Bool {
rangeMap[cnvPhonabetToASCII(key)] != nil dataMap[cnvPhonabetToASCII(key)] != nil
} }
/// ///

View File

@ -49,6 +49,16 @@ extension vChewingLM {
dataMap.removeAll() 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] { public func valuesFor(key: String) -> [String] {
var pairs: [String] = [] var pairs: [String] = []
if let arrRangeRecords: String = dataMap[key]?.trimmingCharacters(in: .newlines) { if let arrRangeRecords: String = dataMap[key]?.trimmingCharacters(in: .newlines) {

View File

@ -68,6 +68,15 @@ extension vChewingLM {
rangeMap.removeAll() 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() { public func dump() {
var strDump = "" var strDump = ""
for entry in rangeMap { for entry in rangeMap {