LMCassette // Support parsing `%quick` section.
This commit is contained in:
parent
d4c50ac47b
commit
7a1783d160
|
@ -61,6 +61,7 @@ public extension vChewingLM {
|
||||||
/// - `%endkey` 是會觸發組字事件的按鍵。
|
/// - `%endkey` 是會觸發組字事件的按鍵。
|
||||||
/// - `%wildcardkey` 決定磁帶的萬能鍵名稱,只有第一個字元會生效。
|
/// - `%wildcardkey` 決定磁帶的萬能鍵名稱,只有第一個字元會生效。
|
||||||
/// - `%keyname begin` 至 `%keyname end` 之間是字根翻譯表,先讀取為 Swift 辭典以備用。
|
/// - `%keyname begin` 至 `%keyname end` 之間是字根翻譯表,先讀取為 Swift 辭典以備用。
|
||||||
|
/// - `%quick begin` 至 `%quick end` 之間則是簡碼資料,對應的 value 得拆成單個漢字。
|
||||||
/// - `%chardef begin` 至 `%chardef end` 之間則是詞庫資料。
|
/// - `%chardef begin` 至 `%chardef end` 之間則是詞庫資料。
|
||||||
/// - `%octagram begin` 至 `%octagram end` 之間則是詞語頻次資料。
|
/// - `%octagram begin` 至 `%octagram end` 之間則是詞語頻次資料。
|
||||||
/// 第三欄資料為對應字根、可有可無。第一欄與第二欄分別為「字詞」與「統計頻次」。
|
/// 第三欄資料為對應字根、可有可無。第一欄與第二欄分別為「字詞」與「統計頻次」。
|
||||||
|
@ -78,11 +79,19 @@ public extension vChewingLM {
|
||||||
let lineReader = try LineReader(file: fileHandle)
|
let lineReader = try LineReader(file: fileHandle)
|
||||||
var theMaxKeyLength = 1
|
var theMaxKeyLength = 1
|
||||||
var loadingKeys = false
|
var loadingKeys = false
|
||||||
|
var loadingQuickSets = false
|
||||||
var loadingCharDefinitions = false
|
var loadingCharDefinitions = false
|
||||||
var loadingOctagramData = false
|
var loadingOctagramData = false
|
||||||
for strLine in lineReader {
|
for strLine in lineReader {
|
||||||
if !loadingKeys, strLine.contains("%keyname"), strLine.contains("begin") { loadingKeys = true }
|
if !loadingKeys, strLine.contains("%keyname"), strLine.contains("begin") { loadingKeys = true }
|
||||||
if loadingKeys, strLine.contains("%keyname"), strLine.contains("end") { loadingKeys = false }
|
if loadingKeys, strLine.contains("%keyname"), strLine.contains("end") { loadingKeys = false }
|
||||||
|
if !loadingQuickSets, strLine.contains("%quick"), strLine.contains("begin") {
|
||||||
|
loadingQuickSets = true
|
||||||
|
}
|
||||||
|
if loadingQuickSets, strLine.contains("%quick"), strLine.contains("end") {
|
||||||
|
loadingQuickSets = false
|
||||||
|
if charDefMap.keys.contains(wildcardKey) { wildcardKey = "" }
|
||||||
|
}
|
||||||
if !loadingCharDefinitions, strLine.contains("%chardef"), strLine.contains("begin") {
|
if !loadingCharDefinitions, strLine.contains("%chardef"), strLine.contains("begin") {
|
||||||
loadingCharDefinitions = true
|
loadingCharDefinitions = true
|
||||||
}
|
}
|
||||||
|
@ -103,6 +112,16 @@ public extension vChewingLM {
|
||||||
let strSecondCell = cells[1].trimmingCharacters(in: .newlines)
|
let strSecondCell = cells[1].trimmingCharacters(in: .newlines)
|
||||||
if loadingKeys, !cells[0].contains("%keyname") {
|
if loadingKeys, !cells[0].contains("%keyname") {
|
||||||
keyNameMap[strFirstCell] = cells[1].trimmingCharacters(in: .newlines)
|
keyNameMap[strFirstCell] = cells[1].trimmingCharacters(in: .newlines)
|
||||||
|
} else if loadingQuickSets, !strLine.contains("%quick") {
|
||||||
|
theMaxKeyLength = max(theMaxKeyLength, cells[0].count)
|
||||||
|
let arrSecondCell = strSecondCell.map(\.description)
|
||||||
|
charDefMap[strFirstCell, default: []].append(contentsOf: arrSecondCell)
|
||||||
|
reverseLookupMap[strSecondCell, default: []].append(contentsOf: arrSecondCell)
|
||||||
|
var keyComps = strFirstCell.map(\.description)
|
||||||
|
while !keyComps.isEmpty {
|
||||||
|
keyComps.removeLast()
|
||||||
|
charDefWildcardMap[keyComps.joined() + wildcard, default: []].append(contentsOf: arrSecondCell)
|
||||||
|
}
|
||||||
} else if loadingCharDefinitions, !strLine.contains("%chardef") {
|
} else if loadingCharDefinitions, !strLine.contains("%chardef") {
|
||||||
theMaxKeyLength = max(theMaxKeyLength, cells[0].count)
|
theMaxKeyLength = max(theMaxKeyLength, cells[0].count)
|
||||||
charDefMap[strFirstCell, default: []].append(strSecondCell)
|
charDefMap[strFirstCell, default: []].append(strSecondCell)
|
||||||
|
@ -121,7 +140,7 @@ public extension vChewingLM {
|
||||||
}
|
}
|
||||||
norm += Self.fscale ** (Double(cells[0].count) / 3.0 - 1.0) * Double(countValue)
|
norm += Self.fscale ** (Double(cells[0].count) / 3.0 - 1.0) * Double(countValue)
|
||||||
}
|
}
|
||||||
guard !loadingKeys, !loadingCharDefinitions, !loadingOctagramData else { continue }
|
guard !loadingKeys, !loadingQuickSets, !loadingCharDefinitions, !loadingOctagramData else { continue }
|
||||||
if nameENG.isEmpty, strLine.contains("%ename ") {
|
if nameENG.isEmpty, strLine.contains("%ename ") {
|
||||||
for neta in cells[1].components(separatedBy: ";") {
|
for neta in cells[1].components(separatedBy: ";") {
|
||||||
let subNetaGroup = neta.components(separatedBy: ":")
|
let subNetaGroup = neta.components(separatedBy: ":")
|
||||||
|
|
Loading…
Reference in New Issue