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()
}
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<String.Index>, Int)] = rangeMap[pair.toNGramKey] {

View File

@ -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
///
///

View File

@ -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
}
///

View File

@ -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) {

View File

@ -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 {