LMCassette // Enhanced support for `%quick` section.

This commit is contained in:
ShikiSuen 2023-06-14 00:03:55 +08:00
parent 5f2fb57f91
commit e771654a2f
4 changed files with 33488 additions and 12 deletions

View File

@ -15,6 +15,20 @@ public extension vChewingLM.LMInstantiator {
var cassetteWildcardKey: String { Self.lmCassette.wildcardKey } var cassetteWildcardKey: String { Self.lmCassette.wildcardKey }
/// ///
var maxCassetteKeyLength: Int { Self.lmCassette.maxKeyLength } var maxCassetteKeyLength: Int { Self.lmCassette.maxKeyLength }
/// `%quick`
var nullCandidateInCassette: String { Self.lmCassette.nullCandidate }
///
var cassetteSelectionKey: String? {
let result = Self.lmCassette.selectionKeys
return result.isEmpty ? nil : result
}
/// 調 `%quick`
/// - Parameter key:
/// - Returns:
func cassetteQuickSetsFor(key: String) -> String? {
Self.lmCassette.quickSetsFor(key: key)
}
/// ///
/// - Parameter char: /// - Parameter char:

View File

@ -20,12 +20,14 @@ public extension vChewingLM {
public private(set) var nameENG: String = "" public private(set) var nameENG: String = ""
public private(set) var nameCJK: String = "" public private(set) var nameCJK: String = ""
public private(set) var nameIntl: String = "" public private(set) var nameIntl: String = ""
public private(set) var nullCandidate: String = ""
/// ///
public private(set) var maxKeyLength: Int = 1 public private(set) var maxKeyLength: Int = 1
public private(set) var selectionKeys: [String] = [] public private(set) var selectionKeys: String = ""
public private(set) var endKeys: [String] = [] public private(set) var endKeys: [String] = []
public private(set) var wildcardKey: String = "" public private(set) var wildcardKey: String = ""
public private(set) var keyNameMap: [String: String] = [:] public private(set) var keyNameMap: [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 reverseLookupMap: [String: [String]] = [:] public private(set) var reverseLookupMap: [String: [String]] = [:]
@ -40,7 +42,7 @@ public extension vChewingLM {
/// ///
public var wildcard: String { wildcardKey.isEmpty ? "" : wildcardKey } public var wildcard: String { wildcardKey.isEmpty ? "" : wildcardKey }
/// /// charDef
public var count: Int { charDefMap.count } public var count: Int { charDefMap.count }
/// ///
public var isLoaded: Bool { !charDefMap.isEmpty } public var isLoaded: Bool { !charDefMap.isEmpty }
@ -60,6 +62,7 @@ public extension vChewingLM {
/// - `%selkey` /// - `%selkey`
/// - `%endkey` /// - `%endkey`
/// - `%wildcardkey` /// - `%wildcardkey`
/// - `%nullcandidate` `%quick`
/// - `%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`
@ -90,7 +93,7 @@ public extension vChewingLM {
} }
if loadingQuickSets, strLine.contains("%quick"), strLine.contains("end") { if loadingQuickSets, strLine.contains("%quick"), strLine.contains("end") {
loadingQuickSets = false loadingQuickSets = false
if charDefMap.keys.contains(wildcardKey) { wildcardKey = "" } if quickDefMap.keys.contains(wildcardKey) { wildcardKey = "" }
} }
if !loadingCharDefinitions, strLine.contains("%chardef"), strLine.contains("begin") { if !loadingCharDefinitions, strLine.contains("%chardef"), strLine.contains("begin") {
loadingCharDefinitions = true loadingCharDefinitions = true
@ -114,14 +117,7 @@ public extension vChewingLM {
keyNameMap[strFirstCell] = cells[1].trimmingCharacters(in: .newlines) keyNameMap[strFirstCell] = cells[1].trimmingCharacters(in: .newlines)
} else if loadingQuickSets, !strLine.contains("%quick") { } else if loadingQuickSets, !strLine.contains("%quick") {
theMaxKeyLength = max(theMaxKeyLength, cells[0].count) theMaxKeyLength = max(theMaxKeyLength, cells[0].count)
let arrSecondCell = strSecondCell.map(\.description) quickDefMap[strFirstCell, default: .init()].append(strSecondCell)
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)
@ -156,8 +152,9 @@ public extension vChewingLM {
} }
if nameCJK.isEmpty, strLine.contains("%cname ") { nameCJK = strSecondCell } if nameCJK.isEmpty, strLine.contains("%cname ") { nameCJK = strSecondCell }
if nameShort.isEmpty, strLine.contains("%sname ") { nameShort = strSecondCell } if nameShort.isEmpty, strLine.contains("%sname ") { nameShort = strSecondCell }
if nullCandidate.isEmpty, strLine.contains("%nullcandidate ") { nullCandidate = strSecondCell }
if selectionKeys.isEmpty, strLine.contains("%selkey ") { if selectionKeys.isEmpty, strLine.contains("%selkey ") {
selectionKeys = cells[1].map(\.description).deduplicated selectionKeys = cells[1].description
} }
if endKeys.isEmpty, strLine.contains("%endkey ") { if endKeys.isEmpty, strLine.contains("%endkey ") {
endKeys = cells[1].map(\.description).deduplicated endKeys = cells[1].map(\.description).deduplicated
@ -182,7 +179,9 @@ public extension vChewingLM {
public mutating func clear() { public mutating func clear() {
filePath = nil filePath = nil
nullCandidate.removeAll()
keyNameMap.removeAll() keyNameMap.removeAll()
quickDefMap.removeAll()
charDefMap.removeAll() charDefMap.removeAll()
charDefWildcardMap.removeAll() charDefWildcardMap.removeAll()
nameShort.removeAll() nameShort.removeAll()
@ -199,6 +198,11 @@ public extension vChewingLM {
norm = 0 norm = 0
} }
public func quickSetsFor(key: String) -> String? {
guard let result = quickDefMap[key] as String? else { return nil }
return result.isEmpty ? nil : result
}
/// ///
/// - parameters: /// - parameters:
/// - key: /// - key:

View File

@ -39,4 +39,26 @@ final class LMCassetteTests: XCTestCase {
XCTAssertEqual(lmCassette.endKeys.count, 0) XCTAssertEqual(lmCassette.endKeys.count, 0)
XCTAssertEqual(lmCassette.selectionKeys.count, 10) XCTAssertEqual(lmCassette.selectionKeys.count, 10)
} }
func testCassetteLoadArray30() throws {
let pathCINFile = testDataPath + "array30.cin"
var lmCassette = vChewingLM.LMCassette()
NSLog("LMCassette: Start loading CIN.")
lmCassette.open(pathCINFile)
NSLog("LMCassette: Finished loading CIN. Entries: \(lmCassette.count)")
XCTAssertFalse(lmCassette.quickDefMap.isEmpty)
print(lmCassette.quickSetsFor(key: ",.") ?? "")
XCTAssertEqual(lmCassette.keyNameMap.count, 41)
XCTAssertEqual(lmCassette.charDefMap.count, 29537)
XCTAssertEqual(lmCassette.charDefWildcardMap.count, 11973)
XCTAssertEqual(lmCassette.octagramMap.count, 0)
XCTAssertEqual(lmCassette.octagramDividedMap.count, 0)
XCTAssertEqual(lmCassette.nameShort, "AR30")
XCTAssertEqual(lmCassette.nameENG, "array30")
XCTAssertEqual(lmCassette.nameCJK, "行列30")
XCTAssertEqual(lmCassette.nameIntl, "Array 30:en;行列30:zh-Hans;行列30:zh-Hant")
XCTAssertEqual(lmCassette.maxKeyLength, 5)
XCTAssertEqual(lmCassette.endKeys.count, 10)
XCTAssertEqual(lmCassette.selectionKeys.count, 10)
}
} }

File diff suppressed because it is too large Load Diff