From da92f38ad71ab43f8ade8e3f3304688c66a5b55f Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 22 Jun 2022 08:38:42 +0800 Subject: [PATCH] LMSymbolNode // Parsing symbols.dat file from LibChewing. --- .../LangModelRelated/LMSymbolNode.swift | 32 ++++++++++++++++++- .../LangModelRelated/mgrLangModel.swift | 6 ++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Source/Modules/LangModelRelated/LMSymbolNode.swift b/Source/Modules/LangModelRelated/LMSymbolNode.swift index 7226b28e..62c7b53d 100644 --- a/Source/Modules/LangModelRelated/LMSymbolNode.swift +++ b/Source/Modules/LangModelRelated/LMSymbolNode.swift @@ -40,6 +40,34 @@ class SymbolNode { children = Array(symbols).map { SymbolNode(String($0), nil) } } + static func parseUserSymbolNodeData() { + let path = mgrLangModel.userSymbolNodeDataPath() + // 這兩個變數單獨拿出來,省得每次都重建還要浪費算力。 + var arrLines = [String.SubSequence]() + var fieldSlice = [Substring.SubSequence]() + var arrChildren = [SymbolNode]() + do { + arrLines = try String(contentsOfFile: path, encoding: .utf8).split(separator: "\n") + for strLine in arrLines.lazy.filter({ !$0.isEmpty }) { + fieldSlice = strLine.split(separator: "=") + switch fieldSlice.count { + case 1: arrChildren.append(.init(String(fieldSlice[0]))) + case 2: arrChildren.append(.init(String(fieldSlice[0]), symbols: .init(fieldSlice[1]))) + default: break + } + } + if arrChildren.isEmpty { + root = defaultSymbolRoot + } else { + root = .init("/", arrChildren) + } + } catch { + root = defaultSymbolRoot + } + } + + // MARK: - Static data. + static let catCommonSymbols = String( format: NSLocalizedString("catCommonSymbols", comment: "")) static let catHoriBrackets = String( @@ -71,7 +99,9 @@ class SymbolNode { static let catLineSegments = String( format: NSLocalizedString("catLineSegments", comment: "")) - static let root: SymbolNode = .init( + private(set) static var root: SymbolNode = .init("/") + + private static let defaultSymbolRoot: SymbolNode = .init( "/", [ SymbolNode("`"), diff --git a/Source/Modules/LangModelRelated/mgrLangModel.swift b/Source/Modules/LangModelRelated/mgrLangModel.swift index 94111119..cfca4346 100644 --- a/Source/Modules/LangModelRelated/mgrLangModel.swift +++ b/Source/Modules/LangModelRelated/mgrLangModel.swift @@ -158,6 +158,7 @@ enum mgrLangModel { ) gLangModelCHT.loadUserSymbolData(path: userSymbolDataPath(InputMode.imeModeCHT)) gLangModelCHS.loadUserSymbolData(path: userSymbolDataPath(InputMode.imeModeCHS)) + SymbolNode.parseUserSymbolNodeData() } public static func loadUserAssociatesData() { @@ -244,6 +245,11 @@ enum mgrLangModel { return URL(fileURLWithPath: dataFolderPath(isDefaultFolder: false)).appendingPathComponent(fileName).path } + static func userSymbolNodeDataPath() -> String { + let fileName = "symbols.dat" + return URL(fileURLWithPath: dataFolderPath(isDefaultFolder: false)).appendingPathComponent(fileName).path + } + // MARK: - 檢查具體的使用者語彙檔案是否存在 static func ensureFileExists(