LMCassette // Support parsing `%quick` section.

This commit is contained in:
ShikiSuen 2023-06-05 23:48:27 +08:00
parent d4c50ac47b
commit 7a1783d160
1 changed files with 20 additions and 1 deletions

View File

@ -61,6 +61,7 @@ public extension vChewingLM {
/// - `%endkey`
/// - `%wildcardkey`
/// - `%keyname begin` `%keyname end` Swift
/// - `%quick begin` `%quick end` value
/// - `%chardef begin` `%chardef end`
/// - `%octagram begin` `%octagram end`
///
@ -78,11 +79,19 @@ public extension vChewingLM {
let lineReader = try LineReader(file: fileHandle)
var theMaxKeyLength = 1
var loadingKeys = false
var loadingQuickSets = false
var loadingCharDefinitions = false
var loadingOctagramData = false
for strLine in lineReader {
if !loadingKeys, strLine.contains("%keyname"), strLine.contains("begin") { loadingKeys = true }
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") {
loadingCharDefinitions = true
}
@ -103,6 +112,16 @@ public extension vChewingLM {
let strSecondCell = cells[1].trimmingCharacters(in: .newlines)
if loadingKeys, !cells[0].contains("%keyname") {
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") {
theMaxKeyLength = max(theMaxKeyLength, cells[0].count)
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)
}
guard !loadingKeys, !loadingCharDefinitions, !loadingOctagramData else { continue }
guard !loadingKeys, !loadingQuickSets, !loadingCharDefinitions, !loadingOctagramData else { continue }
if nameENG.isEmpty, strLine.contains("%ename ") {
for neta in cells[1].components(separatedBy: ";") {
let subNetaGroup = neta.components(separatedBy: ":")