LMAssembly // Add saveData() to all submodels.
- Also: LMCoreNS // Variable name fix.
This commit is contained in:
parent
8f5bd48beb
commit
e7d0259d58
|
@ -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] {
|
||||||
|
|
|
@ -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。
|
||||||
///
|
///
|
||||||
/// 該功能僅作偵錯之用途。
|
/// 該功能僅作偵錯之用途。
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 內部函式,用以將注音讀音索引鍵進行加密。
|
/// 內部函式,用以將注音讀音索引鍵進行加密。
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue