LMCassette // Add support for `%symboldef` section.

This commit is contained in:
ShikiSuen 2023-06-19 21:55:24 +08:00
parent a6ccb51172
commit 7a76cc89d2
1 changed files with 22 additions and 1 deletions

View File

@ -30,6 +30,7 @@ public extension vChewingLM {
public private(set) var quickDefMap: [String: String] = [:] public private(set) var quickDefMap: [String: String] = [:]
public private(set) var charDefMap: [String: [String]] = [:] public private(set) var charDefMap: [String: [String]] = [:]
public private(set) var charDefWildcardMap: [String: [String]] = [:] public private(set) var charDefWildcardMap: [String: [String]] = [:]
public private(set) var symbolDefMap: [String: [String]] = [:]
public private(set) var reverseLookupMap: [String: [String]] = [:] public private(set) var reverseLookupMap: [String: [String]] = [:]
/// [:] /// [:]
public private(set) var octagramMap: [String: Int] = [:] public private(set) var octagramMap: [String: Int] = [:]
@ -66,6 +67,7 @@ public extension vChewingLM {
/// - `%keyname begin` `%keyname end` Swift /// - `%keyname begin` `%keyname end` Swift
/// - `%quick begin` `%quick end` value /// - `%quick begin` `%quick end` value
/// - `%chardef begin` `%chardef end` /// - `%chardef begin` `%chardef end`
/// - `%symboldef begin` `%symboldef end`
/// - `%octagram begin` `%octagram end` /// - `%octagram begin` `%octagram end`
/// ///
/// - Parameter path: /// - Parameter path:
@ -84,10 +86,12 @@ public extension vChewingLM {
var loadingKeys = false var loadingKeys = false
var loadingQuickSets = false var loadingQuickSets = false
var loadingCharDefinitions = false var loadingCharDefinitions = false
var loadingSymbolDefinitions = 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 }
// %quick
if !loadingQuickSets, strLine.contains("%quick"), strLine.contains("begin") { if !loadingQuickSets, strLine.contains("%quick"), strLine.contains("begin") {
loadingQuickSets = true loadingQuickSets = true
} }
@ -95,6 +99,7 @@ public extension vChewingLM {
loadingQuickSets = false loadingQuickSets = false
if quickDefMap.keys.contains(wildcardKey) { wildcardKey = "" } if quickDefMap.keys.contains(wildcardKey) { wildcardKey = "" }
} }
// %chardef
if !loadingCharDefinitions, strLine.contains("%chardef"), strLine.contains("begin") { if !loadingCharDefinitions, strLine.contains("%chardef"), strLine.contains("begin") {
loadingCharDefinitions = true loadingCharDefinitions = true
} }
@ -102,12 +107,22 @@ public extension vChewingLM {
loadingCharDefinitions = false loadingCharDefinitions = false
if charDefMap.keys.contains(wildcardKey) { wildcardKey = "" } if charDefMap.keys.contains(wildcardKey) { wildcardKey = "" }
} }
// %symboldef
if !loadingSymbolDefinitions, strLine.contains("%symboldef"), strLine.contains("begin") {
loadingSymbolDefinitions = true
}
if loadingSymbolDefinitions, strLine.contains("%symboldef"), strLine.contains("end") {
loadingSymbolDefinitions = false
if symbolDefMap.keys.contains(wildcardKey) { wildcardKey = "" }
}
// %octagram
if !loadingOctagramData, strLine.contains("%octagram"), strLine.contains("begin") { if !loadingOctagramData, strLine.contains("%octagram"), strLine.contains("begin") {
loadingOctagramData = true loadingOctagramData = true
} }
if loadingOctagramData, strLine.contains("%octagram"), strLine.contains("end") { if loadingOctagramData, strLine.contains("%octagram"), strLine.contains("end") {
loadingOctagramData = false loadingOctagramData = false
} }
// Start data parsing.
let cells: [String.SubSequence] = let cells: [String.SubSequence] =
strLine.contains("\t") ? strLine.split(separator: "\t") : strLine.split(separator: " ") strLine.contains("\t") ? strLine.split(separator: "\t") : strLine.split(separator: " ")
guard cells.count >= 2 else { continue } guard cells.count >= 2 else { continue }
@ -118,7 +133,9 @@ public extension vChewingLM {
} else if loadingQuickSets, !strLine.contains("%quick") { } else if loadingQuickSets, !strLine.contains("%quick") {
theMaxKeyLength = max(theMaxKeyLength, cells[0].count) theMaxKeyLength = max(theMaxKeyLength, cells[0].count)
quickDefMap[strFirstCell, default: .init()].append(strSecondCell) quickDefMap[strFirstCell, default: .init()].append(strSecondCell)
} else if loadingCharDefinitions, !strLine.contains("%chardef") { } else if loadingCharDefinitions, !loadingSymbolDefinitions,
!strLine.contains("%chardef"), !strLine.contains("%symboldef")
{
theMaxKeyLength = max(theMaxKeyLength, cells[0].count) theMaxKeyLength = max(theMaxKeyLength, cells[0].count)
charDefMap[strFirstCell, default: []].append(strSecondCell) charDefMap[strFirstCell, default: []].append(strSecondCell)
reverseLookupMap[strSecondCell, default: []].append(strFirstCell) reverseLookupMap[strSecondCell, default: []].append(strFirstCell)
@ -127,6 +144,10 @@ public extension vChewingLM {
keyComps.removeLast() keyComps.removeLast()
charDefWildcardMap[keyComps.joined() + wildcard, default: []].append(strSecondCell) charDefWildcardMap[keyComps.joined() + wildcard, default: []].append(strSecondCell)
} }
} else if loadingSymbolDefinitions, !strLine.contains("%chardef"), !strLine.contains("%symboldef") {
theMaxKeyLength = max(theMaxKeyLength, cells[0].count)
symbolDefMap[strFirstCell, default: []].append(strSecondCell)
reverseLookupMap[strSecondCell, default: []].append(strFirstCell)
} else if loadingOctagramData, !strLine.contains("%octagram") { } else if loadingOctagramData, !strLine.contains("%octagram") {
guard let countValue = Int(cells[1]) else { continue } guard let countValue = Int(cells[1]) else { continue }
switch cells.count { switch cells.count {