Repo // Use JSON as factory dictionary format.

This commit is contained in:
ShikiSuen 2023-06-03 00:20:58 +08:00
parent 07da96d775
commit f99c16169e
17 changed files with 251 additions and 168 deletions

View File

@ -41,7 +41,7 @@ public enum DictType {
}
public class HotenkaChineseConverter {
public private(set) var dict: [String: [String: String]]
private(set) var dict: [String: [String: String]]
private var dictFiles: [String: [String]]
public init(plistDir: String) {
@ -57,6 +57,20 @@ public class HotenkaChineseConverter {
}
}
public init(jsonDir: String) {
dictFiles = .init()
do {
let rawData = try Data(contentsOf: URL(fileURLWithPath: jsonDir))
guard let rawJSON: [String: [String: String]] = try JSONSerialization.jsonObject(with: rawData) as? [String: [String: String]] else {
throw NSError()
}
dict = rawJSON
} catch {
NSLog("// Exception happened when reading dict json at: \(jsonDir).")
dict = .init()
}
}
public init(dictDir: String) {
dictFiles = [
"zh2TW": [String](),

View File

@ -0,0 +1,63 @@
// Swiftified by (c) 2022 and onwards The vChewing Project (MIT-NTL License).
// Rebranded from (c) Nick Chen's Obj-C library "NCChineseConverter" (MIT License).
/*
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
1. The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
2. No trademark license is granted to use the trade names, trademarks, service
marks, or product names of Contributor, except as required to fulfill notice
requirements above.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import Foundation
import XCTest
@testable import Hotenka
private let packageRootPath = URL(fileURLWithPath: #file).pathComponents.prefix(while: { $0 != "Tests" }).joined(
separator: "/"
).dropFirst()
private let testDataPath: String = packageRootPath + "/Tests/TestDictData/"
extension HotenkaTests {
func testGeneratingJSON() throws {
NSLog("// Start loading from: \(packageRootPath)")
let testInstance: HotenkaChineseConverter = .init(dictDir: testDataPath)
NSLog("// Loading complete. Generating json dict file.")
do {
try JSONSerialization.data(withJSONObject: testInstance.dict, options: .sortedKeys).write(to: URL(fileURLWithPath: testDataPath + "convdict.json"))
} catch {
NSLog("// Error on writing strings to file: \(error)")
}
}
func testSampleWithJSON() throws {
NSLog("// Start loading json from: \(packageRootPath)")
let testInstance2: HotenkaChineseConverter = .init(jsonDir: testDataPath + "convdict.json")
NSLog("// Successfully loading json dictionary.")
let oriString = "为中华崛起而读书"
let result1 = testInstance2.convert(oriString, to: .zhHantTW)
let result2 = testInstance2.convert(result1, to: .zhHantKX)
let result3 = testInstance2.convert(result2, to: .zhHansJP)
NSLog("// Results: \(result1) \(result2) \(result3)")
XCTAssertEqual(result1, "為中華崛起而讀書")
XCTAssertEqual(result2, "爲中華崛起而讀書")
XCTAssertEqual(result3, "為中華崛起而読書")
}
}

View File

@ -1,7 +1,7 @@
.PHONY: lint format
.PHONY: format
format:
@swiftformat --swiftversion 5.5 --indent 2 ./
lint:
@git ls-files --exclude-standard | grep -E '\.swift$$' | swiftlint --fix --autocorrect
@git ls-files --exclude-standard | grep -E '\.swift$$' | swiftlint --fix --autocorrect

View File

@ -51,24 +51,24 @@ public extension vChewingLM {
/// LMCoreEX 滿
/// LMReplacements LMAssociates 使
/// LMCoreEX 2010-2013 mac
/// LMCoreNS plist
/// LMCoreNS JSON
//
// Reverse
// Reverse
var lmCore = LMCoreNS(
var lmCore = LMCoreJSON(
reverse: false, consolidate: false, defaultScore: -9.9, forceDefaultScore: false
)
var lmMisc = LMCoreNS(
var lmMisc = LMCoreJSON(
reverse: true, consolidate: false, defaultScore: -1.0, forceDefaultScore: false
)
//
// 100MB
static var lmCNS = vChewingLM.LMCoreNS(
static var lmCNS = vChewingLM.LMCoreJSON(
reverse: true, consolidate: false, defaultScore: -11.0, forceDefaultScore: false
)
static var lmSymbols = vChewingLM.LMCoreNS(
static var lmSymbols = vChewingLM.LMCoreJSON(
reverse: true, consolidate: false, defaultScore: -13.0, forceDefaultScore: false
)
@ -92,7 +92,7 @@ public extension vChewingLM {
// MARK: -
public func resetFactoryPlistModels() {
public func resetFactoryJSONModels() {
lmCore.clear()
lmMisc.clear()
Self.lmCNS.clear()
@ -100,43 +100,43 @@ public extension vChewingLM {
}
public var isCoreLMLoaded: Bool { lmCore.isLoaded }
public func loadLanguageModel(plist: (dict: [String: [Data]]?, path: String)) {
guard let plistDict = plist.dict else {
vCLog("lmCore: File access failure: \(plist.path)")
public func loadLanguageModel(json: (dict: [String: [String]]?, path: String)) {
guard let jsonDict = json.dict else {
vCLog("lmCore: File access failure: \(json.path)")
return
}
lmCore.load((dict: plistDict, path: plist.path))
vCLog("lmCore: \(lmCore.count) entries of data loaded from: \(plist.path)")
lmCore.load((dict: jsonDict, path: json.path))
vCLog("lmCore: \(lmCore.count) entries of data loaded from: \(json.path)")
}
public var isCNSDataLoaded: Bool { Self.lmCNS.isLoaded }
public func loadCNSData(plist: (dict: [String: [Data]]?, path: String)) {
guard let plistDict = plist.dict else {
vCLog("lmCNS: File access failure: \(plist.path)")
public func loadCNSData(json: (dict: [String: [String]]?, path: String)) {
guard let jsonDict = json.dict else {
vCLog("lmCNS: File access failure: \(json.path)")
return
}
Self.lmCNS.load((dict: plistDict, path: plist.path))
vCLog("lmCNS: \(Self.lmCNS.count) entries of data loaded from: \(plist.path)")
Self.lmCNS.load((dict: jsonDict, path: json.path))
vCLog("lmCNS: \(Self.lmCNS.count) entries of data loaded from: \(json.path)")
}
public var isMiscDataLoaded: Bool { lmMisc.isLoaded }
public func loadMiscData(plist: (dict: [String: [Data]]?, path: String)) {
guard let plistDict = plist.dict else {
vCLog("lmCore: File access failure: \(plist.path)")
public func loadMiscData(json: (dict: [String: [String]]?, path: String)) {
guard let jsonDict = json.dict else {
vCLog("lmCore: File access failure: \(json.path)")
return
}
lmMisc.load((dict: plistDict, path: plist.path))
vCLog("lmMisc: \(lmMisc.count) entries of data loaded from: \(plist.path)")
lmMisc.load((dict: jsonDict, path: json.path))
vCLog("lmMisc: \(lmMisc.count) entries of data loaded from: \(json.path)")
}
public var isSymbolDataLoaded: Bool { Self.lmSymbols.isLoaded }
public func loadSymbolData(plist: (dict: [String: [Data]]?, path: String)) {
guard let plistDict = plist.dict else {
vCLog("lmCore: File access failure: \(plist.path)")
public func loadSymbolData(json: (dict: [String: [String]]?, path: String)) {
guard let jsonDict = json.dict else {
vCLog("lmCore: File access failure: \(json.path)")
return
}
Self.lmSymbols.load((dict: plistDict, path: plist.path))
vCLog("lmSymbols: \(Self.lmSymbols.count) entries of data loaded from: \(plist.path)")
Self.lmSymbols.load((dict: jsonDict, path: json.path))
vCLog("lmSymbols: \(Self.lmSymbols.count) entries of data loaded from: \(json.path)")
}
// Async LMMgr Async GCD

View File

@ -11,13 +11,13 @@ import Megrez
import Shared
public extension vChewingLM {
/// LMCore LMCoreNS plist
/// LMCore LMCoreNS json
/// mac
/// 使 plist
@frozen struct LMCoreNS {
/// 使 json
@frozen struct LMCoreJSON {
public private(set) var filePath: String?
/// UTF8
var dataMap: [String: [Data]] = [:]
var dataMap: [String: [String]] = [:]
/// LMCoreNS
var strData: String = ""
///
@ -58,7 +58,7 @@ public extension vChewingLM {
///
/// - parameters:
/// - dictData: URL
public mutating func load(_ dictData: (dict: [String: [Data]], path: String)) {
public mutating func load(_ dictData: (dict: [String: [String]], path: String)) {
if isLoaded { return }
filePath = dictData.path
dataMap = dictData.dict
@ -74,12 +74,16 @@ public extension vChewingLM {
do {
let rawData = try Data(contentsOf: URL(fileURLWithPath: path))
let rawPlist: [String: [Data]] =
try PropertyListSerialization.propertyList(from: rawData, format: nil) as? [String: [Data]] ?? .init()
dataMap = rawPlist
if let rawJSON = try? JSONSerialization.jsonObject(with: rawData) as? [String: [String]] {
dataMap = rawJSON
} else {
filePath = oldPath
vCLog("↑ Exception happened when reading JSON file at: \(path).")
return false
}
} catch {
filePath = oldPath
vCLog("↑ Exception happened when reading plist file at: \(path).")
vCLog("↑ Exception happened when reading JSON file at: \(path).")
return false
}
@ -97,10 +101,9 @@ public extension vChewingLM {
// MARK: - Advanced features
public func saveData() {
guard let filePath = filePath, let plistURL = URL(string: filePath) else { return }
guard let filePath = filePath, let jsonURL = URL(string: filePath) else { return }
do {
let plistData = try PropertyListSerialization.data(fromPropertyList: dataMap, format: .binary, options: 0)
try plistData.write(to: plistURL)
try JSONSerialization.data(withJSONObject: dataMap, options: .sortedKeys).write(to: jsonURL)
} catch {
vCLog("Failed to save current database to: \(filePath)")
}
@ -112,10 +115,9 @@ public extension vChewingLM {
public func dump() {
var strDump = ""
for entry in dataMap {
let netaSets: [Data] = entry.value
let netaSets: [String] = entry.value
let theKey = entry.key
for netaSet in netaSets {
let strNetaSet = String(decoding: netaSet, as: UTF8.self)
for strNetaSet in netaSets {
let neta = Array(strNetaSet.trimmingCharacters(in: .newlines).components(separatedBy: " ").reversed())
let theValue = neta[0]
var theScore = defaultScore
@ -131,9 +133,8 @@ public extension vChewingLM {
public func getHaninSymbolMenuUnigrams() -> [Megrez.Unigram] {
let key = "_punctuation_list"
var grams: [Megrez.Unigram] = []
guard let arrRangeRecords: [Data] = dataMap[cnvPhonabetToASCII(key)] else { return grams }
for netaSet in arrRangeRecords {
let strNetaSet = String(decoding: netaSet, as: UTF8.self)
guard let arrRangeRecords: [String] = dataMap[cnvPhonabetToASCII(key)] else { return grams }
for strNetaSet in arrRangeRecords {
let neta = Array(strNetaSet.trimmingCharacters(in: .newlines).split(separator: " ").reversed())
let theValue: String = .init(neta[0])
var theScore = defaultScore
@ -155,9 +156,8 @@ public extension vChewingLM {
if key == "_punctuation_list" { return [] }
var grams: [Megrez.Unigram] = []
var gramsHW: [Megrez.Unigram] = []
guard let arrRangeRecords: [Data] = dataMap[cnvPhonabetToASCII(key)] else { return grams }
for netaSet in arrRangeRecords {
let strNetaSet = String(decoding: netaSet, as: UTF8.self)
guard let arrRangeRecords: [String] = dataMap[cnvPhonabetToASCII(key)] else { return grams }
for strNetaSet in arrRangeRecords {
let neta = Array(strNetaSet.trimmingCharacters(in: .newlines).split(separator: " ").reversed())
let theValue: String = .init(neta[0])
var theScore = defaultScore
@ -187,7 +187,7 @@ public extension vChewingLM {
///
///
/// 使 plist
/// 使 json
///
/// ASCII
/// - parameters:

View File

@ -11,12 +11,12 @@ import Shared
public extension vChewingLM {
@frozen struct LMRevLookup {
public private(set) var dataMap: [String: [Data]] = [:]
public private(set) var dataMap: [String: [String]] = [:]
public private(set) var filePath: String = ""
public init(data dictData: (dict: [String: [Data]]?, path: String)) {
public init(data dictData: (dict: [String: [String]]?, path: String)) {
guard let theDict = dictData.dict else {
vCLog("↑ Exception happened when reading plist file at: \(dictData.path).")
vCLog("↑ Exception happened when reading JSON file at: \(dictData.path).")
return
}
filePath = dictData.path
@ -27,11 +27,14 @@ public extension vChewingLM {
if path.isEmpty { return }
do {
let rawData = try Data(contentsOf: URL(fileURLWithPath: path))
let rawPlist: [String: [Data]] =
try PropertyListSerialization.propertyList(from: rawData, format: nil) as? [String: [Data]] ?? .init()
dataMap = rawPlist
if let rawJSON = try? JSONSerialization.jsonObject(with: rawData) as? [String: [String]] {
dataMap = rawJSON
} else {
vCLog("↑ Exception happened when reading JSON file at: \(path).")
return
}
} catch {
vCLog("↑ Exception happened when reading plist file at: \(path).")
vCLog("↑ Exception happened when reading JSON file at: \(path).")
return
}
filePath = path
@ -40,7 +43,7 @@ public extension vChewingLM {
public func query(with kanji: String) -> [String]? {
guard let resultData = dataMap[kanji] else { return nil }
let resultArray = resultData.compactMap {
let result = restorePhonabetFromASCII(String(decoding: $0, as: UTF8.self))
let result = restorePhonabetFromASCII($0)
return result.isEmpty ? nil : result
}
return resultArray.isEmpty ? nil : resultArray

View File

@ -199,6 +199,7 @@ public extension vChewingLM.LMUserOverride {
}
func saveData(toURL fileURL: URL? = nil) {
// 使 JSONSerialization
let encoder = JSONEncoder()
do {
guard let jsonData = try? encoder.encode(mutLRUMap) else { return }
@ -211,6 +212,7 @@ public extension vChewingLM.LMUserOverride {
}
func loadData(fromURL fileURL: URL) {
// 使 JSONSerialization
let decoder = JSONDecoder()
do {
let data = try Data(contentsOf: fileURL, options: .mappedIfSafe)

View File

@ -9,7 +9,7 @@
import Hotenka
public enum ChineseConverter {
public static let shared = HotenkaChineseConverter(plistDir: LMMgr.getBundleDataPath("convdict"))
public static let shared = HotenkaChineseConverter(jsonDir: LMMgr.getBundleDataPath("convdict", ext: "json"))
private static var punctuationConversionTable: [(String, String)] = [
("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""),

View File

@ -56,7 +56,7 @@ public class LMMgr {
public static func loadCoreLanguageModelFile(
filenameSansExtension: String, langModel lm: vChewingLM.LMInstantiator
) {
lm.loadLanguageModel(plist: Self.getDictionaryData(filenameSansExtension))
lm.loadLanguageModel(json: Self.getDictionaryData(filenameSansExtension))
}
public static func loadDataModelsOnAppDelegate() {
@ -66,22 +66,22 @@ public class LMMgr {
group.enter()
globalQueue.async {
if !Self.lmCHT.isCNSDataLoaded {
Self.lmCHT.loadCNSData(plist: Self.getDictionaryData("data-cns"))
Self.lmCHT.loadCNSData(json: Self.getDictionaryData("data-cns"))
}
if !Self.lmCHT.isMiscDataLoaded {
Self.lmCHT.loadMiscData(plist: Self.getDictionaryData("data-zhuyinwen"))
Self.lmCHT.loadMiscData(json: Self.getDictionaryData("data-zhuyinwen"))
}
if !Self.lmCHT.isSymbolDataLoaded {
Self.lmCHT.loadSymbolData(plist: Self.getDictionaryData("data-symbols"))
Self.lmCHT.loadSymbolData(json: Self.getDictionaryData("data-symbols"))
}
if !Self.lmCHS.isCNSDataLoaded {
Self.lmCHS.loadCNSData(plist: Self.getDictionaryData("data-cns"))
Self.lmCHS.loadCNSData(json: Self.getDictionaryData("data-cns"))
}
if !Self.lmCHS.isMiscDataLoaded {
Self.lmCHS.loadMiscData(plist: Self.getDictionaryData("data-zhuyinwen"))
Self.lmCHS.loadMiscData(json: Self.getDictionaryData("data-zhuyinwen"))
}
if !Self.lmCHS.isSymbolDataLoaded {
Self.lmCHS.loadSymbolData(plist: Self.getDictionaryData("data-symbols"))
Self.lmCHS.loadSymbolData(json: Self.getDictionaryData("data-symbols"))
}
group.leave()
}
@ -125,23 +125,23 @@ public class LMMgr {
switch mode {
case .imeModeCHS:
if !Self.lmCHS.isCNSDataLoaded {
Self.lmCHS.loadCNSData(plist: Self.getDictionaryData("data-cns"))
Self.lmCHS.loadCNSData(json: Self.getDictionaryData("data-cns"))
}
if !Self.lmCHS.isMiscDataLoaded {
Self.lmCHS.loadMiscData(plist: Self.getDictionaryData("data-zhuyinwen"))
Self.lmCHS.loadMiscData(json: Self.getDictionaryData("data-zhuyinwen"))
}
if !Self.lmCHS.isSymbolDataLoaded {
Self.lmCHS.loadSymbolData(plist: Self.getDictionaryData("data-symbols"))
Self.lmCHS.loadSymbolData(json: Self.getDictionaryData("data-symbols"))
}
case .imeModeCHT:
if !Self.lmCHT.isCNSDataLoaded {
Self.lmCHT.loadCNSData(plist: Self.getDictionaryData("data-cns"))
Self.lmCHT.loadCNSData(json: Self.getDictionaryData("data-cns"))
}
if !Self.lmCHT.isMiscDataLoaded {
Self.lmCHT.loadMiscData(plist: Self.getDictionaryData("data-zhuyinwen"))
Self.lmCHT.loadMiscData(json: Self.getDictionaryData("data-zhuyinwen"))
}
if !Self.lmCHT.isSymbolDataLoaded {
Self.lmCHT.loadSymbolData(plist: Self.getDictionaryData("data-symbols"))
Self.lmCHT.loadSymbolData(json: Self.getDictionaryData("data-symbols"))
}
default: break
}
@ -183,10 +183,10 @@ public class LMMgr {
}
}
public static func reloadFactoryDictionaryPlists() {
public static func reloadFactoryDictionaryFiles() {
FrmRevLookupWindow.reloadData()
LMMgr.lmCHS.resetFactoryPlistModels()
LMMgr.lmCHT.resetFactoryPlistModels()
LMMgr.lmCHS.resetFactoryJSONModels()
LMMgr.lmCHT.resetFactoryJSONModels()
if PrefMgr.shared.onlyLoadFactoryLangModelsIfNeeded {
LMMgr.loadDataModel(IMEApp.currentInputMode)
} else {

View File

@ -24,10 +24,10 @@ public extension LMMgr {
// 使
static func getBundleDataPath(_ filenameSansExt: String, factory: Bool = false) -> String {
static func getBundleDataPath(_ filenameSansExt: String, factory: Bool = false, ext: String) -> String {
let factory = PrefMgr.shared.useExternalFactoryDict ? factory : true
let factoryPath = Bundle.main.path(forResource: filenameSansExt, ofType: "plist")!
let containerPath = Self.appSupportURL.appendingPathComponent("vChewingFactoryData/\(filenameSansExt).plist").path
let factoryPath = Bundle.main.path(forResource: filenameSansExt, ofType: ext)!
let containerPath = Self.appSupportURL.appendingPathComponent("vChewingFactoryData/\(filenameSansExt).\(ext)").path
.expandingTildeInPath
var isFailed = false
if !factory {
@ -42,14 +42,14 @@ public extension LMMgr {
// MARK: - Containers nil
static func getDictionaryData(_ filenameSansExt: String, factory: Bool = false) -> (
dict: [String: [Data]]?, path: String
dict: [String: [String]]?, path: String
) {
let factory = PrefMgr.shared.useExternalFactoryDict ? factory : true
let factoryResultURL = Bundle.main.url(forResource: filenameSansExt, withExtension: "plist")
let containerResultURL = Self.appSupportURL.appendingPathComponent("vChewingFactoryData/\(filenameSansExt).plist")
var lastReadPath = factoryResultURL?.path ?? "Factory file missing: \(filenameSansExt).plist"
let factoryResultURL = Bundle.main.url(forResource: filenameSansExt, withExtension: "json")
let containerResultURL = Self.appSupportURL.appendingPathComponent("vChewingFactoryData/\(filenameSansExt).json")
var lastReadPath = factoryResultURL?.path ?? "Factory file missing: \(filenameSansExt).json"
func getPlistData(url: URL?) -> [String: [Data]]? {
func getJSONData(url: URL?) -> [String: [String]]? {
var isFailed = false
var isFolder = ObjCBool(false)
guard let url = url else {
@ -60,12 +60,12 @@ public extension LMMgr {
if !FileManager.default.fileExists(atPath: url.path, isDirectory: &isFolder) { isFailed = true }
if !isFailed, !FileManager.default.isReadableFile(atPath: url.path) { isFailed = true }
if isFailed {
vCLog("↑ Exception happened when reading plist file at: \(url.path).")
vCLog("↑ Exception happened when reading json file at: \(url.path).")
return nil
}
do {
let rawData = try Data(contentsOf: url)
return try PropertyListSerialization.propertyList(from: rawData, format: nil) as? [String: [Data]] ?? nil
return try? JSONSerialization.jsonObject(with: rawData) as? [String: [String]]
} catch {
return nil
}
@ -73,10 +73,10 @@ public extension LMMgr {
let result =
factory
? getPlistData(url: factoryResultURL)
: getPlistData(url: containerResultURL) ?? getPlistData(url: factoryResultURL)
? getJSONData(url: factoryResultURL)
: getJSONData(url: containerResultURL) ?? getJSONData(url: factoryResultURL)
if result == nil {
vCLog("↑ Exception happened when reading plist file at: \(lastReadPath).")
vCLog("↑ Exception happened when reading json file at: \(lastReadPath).")
}
return (dict: result, path: lastReadPath)
}
@ -108,7 +108,7 @@ public extension LMMgr {
/// - Parameter mode:
/// - Returns: URL
static func userSCPCSequencesURL(_ mode: Shared.InputMode) -> URL {
let fileName = (mode == .imeModeCHT) ? "data-plain-bpmf-cht.plist" : "data-plain-bpmf-chs.plist"
let fileName = (mode == .imeModeCHT) ? "data-plain-bpmf-cht.json" : "data-plain-bpmf-chs.json"
return URL(fileURLWithPath: dataFolderPath(isDefaultFolder: false)).appendingPathComponent(fileName)
}

View File

@ -133,7 +133,7 @@ struct VwrPrefPaneDictionary: View {
Toggle(
LocalizedStringKey("Read external factory dictionary plists if possible"),
isOn: $useExternalFactoryDict.onChange {
LMMgr.reloadFactoryDictionaryPlists()
LMMgr.reloadFactoryDictionaryFiles()
}
)
Text(

View File

@ -322,7 +322,7 @@ class CtlPrefWindow: NSWindowController, NSWindowDelegate {
}
@IBAction func toggledExternalFactoryPlistDataOnOff(_: NSButton) {
LMMgr.reloadFactoryDictionaryPlists()
LMMgr.reloadFactoryDictionaryFiles()
}
@IBAction func resetSpecifiedUserDataFolder(_: Any) {

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -15,17 +15,17 @@
5B0E22B228FC318C00EB7ACA /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0E22B128FC318C00EB7ACA /* Preferences.swift */; };
5B0EF55D28CDBF7100F8F7CE /* frmClientListMgr.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B0EF55C28CDBF7100F8F7CE /* frmClientListMgr.xib */; };
5B0EF55F28CDBF8E00F8F7CE /* CtlClientListMgr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0EF55E28CDBF8E00F8F7CE /* CtlClientListMgr.swift */; };
5B1C98B929436CEE0019B807 /* data-bpmf-reverse-lookup.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.plist */; };
5B1C98BB29436CF60019B807 /* data-bpmf-reverse-lookup.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.plist */; };
5B1C98B929436CEE0019B807 /* data-bpmf-reverse-lookup.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.json */; };
5B1C98BB29436CF60019B807 /* data-bpmf-reverse-lookup.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.json */; };
5B21176C287539BB000443A9 /* SessionCtl_HandleStates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B21176B287539BB000443A9 /* SessionCtl_HandleStates.swift */; };
5B21176E28753B35000443A9 /* SessionCtl_HandleDisplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B21176D28753B35000443A9 /* SessionCtl_HandleDisplay.swift */; };
5B21177028753B9D000443A9 /* SessionCtl_Delegates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B21176F28753B9D000443A9 /* SessionCtl_Delegates.swift */; };
5B253E7E2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E782945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.plist */; };
5B253E7F2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E792945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.plist */; };
5B253E802945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7A2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.plist */; };
5B253E812945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7B2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.plist */; };
5B253E822945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7C2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.plist */; };
5B253E832945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7D2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.plist */; };
5B253E7E2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E782945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.json */; };
5B253E7F2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E792945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.json */; };
5B253E802945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7A2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.json */; };
5B253E812945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7B2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.json */; };
5B253E822945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7C2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.json */; };
5B253E832945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7D2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.json */; };
5B2E009428FD1E8100E78D6E /* VwrPrefPaneCassette.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B2E009328FD1E8100E78D6E /* VwrPrefPaneCassette.swift */; };
5B30BF282944867800BD87A9 /* CtlRevLookupWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B30BF272944867800BD87A9 /* CtlRevLookupWindow.swift */; };
5B3133BF280B229700A4A505 /* InputHandler_HandleStates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B3133BE280B229700A4A505 /* InputHandler_HandleStates.swift */; };
@ -50,7 +50,7 @@
5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B7BC4AE27AFFBE800F66C24 /* frmPrefWindow.xib */; };
5B7DA80328BF6BC600D7B2AD /* fixinstall.sh in Resources */ = {isa = PBXBuildFile; fileRef = 5B7DA80228BF6BBA00D7B2AD /* fixinstall.sh */; };
5B7F225D2808501000DDD3CB /* InputHandler_HandleInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7F225C2808501000DDD3CB /* InputHandler_HandleInput.swift */; };
5B84579E2871AD2200C93B01 /* convdict.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B84579C2871AD2200C93B01 /* convdict.plist */; };
5B84579E2871AD2200C93B01 /* convdict.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B84579C2871AD2200C93B01 /* convdict.json */; };
5B8457A12871ADBE00C93B01 /* ChineseConverterBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B8457A02871ADBE00C93B01 /* ChineseConverterBridge.swift */; };
5B963C9D28D5BFB800DCEE88 /* CocoaExtension in Frameworks */ = {isa = PBXBuildFile; productRef = 5B963C9C28D5BFB800DCEE88 /* CocoaExtension */; };
5B963CA328D5C23600DCEE88 /* SwiftExtension in Frameworks */ = {isa = PBXBuildFile; productRef = 5B963CA228D5C23600DCEE88 /* SwiftExtension */; };
@ -77,11 +77,11 @@
5BBC2DA328F5212100C986F6 /* RelocationDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BBC2DA228F5212100C986F6 /* RelocationDetector.swift */; };
5BBC2DA528F521C200C986F6 /* AppDelegate_Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BBC2DA428F521C200C986F6 /* AppDelegate_Extension.swift */; };
5BC2652227E04B7E00700291 /* uninstall.sh in Resources */ = {isa = PBXBuildFile; fileRef = 5BC2652127E04B7B00700291 /* uninstall.sh */; };
5BC4479D2865686500EDC323 /* data-chs.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71C283B4AEA0078EB25 /* data-chs.plist */; };
5BC4479E2865686500EDC323 /* data-cht.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB720283B4AEA0078EB25 /* data-cht.plist */; };
5BC4479F2865686500EDC323 /* data-cns.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71D283B4AEA0078EB25 /* data-cns.plist */; };
5BC447A02865686500EDC323 /* data-symbols.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */; };
5BC447A12865686500EDC323 /* data-zhuyinwen.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */; };
5BC4479D2865686500EDC323 /* data-chs.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71C283B4AEA0078EB25 /* data-chs.json */; };
5BC4479E2865686500EDC323 /* data-cht.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB720283B4AEA0078EB25 /* data-cht.json */; };
5BC4479F2865686500EDC323 /* data-cns.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71D283B4AEA0078EB25 /* data-cns.json */; };
5BC447A02865686500EDC323 /* data-symbols.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71E283B4AEA0078EB25 /* data-symbols.json */; };
5BC447A12865686500EDC323 /* data-zhuyinwen.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.json */; };
5BC447A628656A1900EDC323 /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BC447A228656A1900EDC323 /* Placeholder.swift */; };
5BC5E01E28DDE4770094E427 /* NotifierUI in Frameworks */ = {isa = PBXBuildFile; productRef = 5BC5E01D28DDE4770094E427 /* NotifierUI */; };
5BC5E02128DDEFE00094E427 /* TooltipUI in Frameworks */ = {isa = PBXBuildFile; productRef = 5BC5E02028DDEFE00094E427 /* TooltipUI */; };
@ -98,11 +98,11 @@
5BDB7A4728D4824A001AC277 /* Tekkon in Frameworks */ = {isa = PBXBuildFile; productRef = 5BDB7A4628D4824A001AC277 /* Tekkon */; };
5BE1F8A928F86AB5006C7FF5 /* InputHandler_HandleEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE1F8A828F86AB5006C7FF5 /* InputHandler_HandleEvent.swift */; };
5BE377A0288FED8D0037365B /* InputHandler_HandleComposition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE3779F288FED8D0037365B /* InputHandler_HandleComposition.swift */; };
5BEDB721283B4C250078EB25 /* data-cns.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71D283B4AEA0078EB25 /* data-cns.plist */; };
5BEDB722283B4C250078EB25 /* data-zhuyinwen.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */; };
5BEDB723283B4C250078EB25 /* data-cht.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB720283B4AEA0078EB25 /* data-cht.plist */; };
5BEDB724283B4C250078EB25 /* data-symbols.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */; };
5BEDB725283B4C250078EB25 /* data-chs.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71C283B4AEA0078EB25 /* data-chs.plist */; };
5BEDB721283B4C250078EB25 /* data-cns.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71D283B4AEA0078EB25 /* data-cns.json */; };
5BEDB722283B4C250078EB25 /* data-zhuyinwen.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.json */; };
5BEDB723283B4C250078EB25 /* data-cht.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB720283B4AEA0078EB25 /* data-cht.json */; };
5BEDB724283B4C250078EB25 /* data-symbols.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71E283B4AEA0078EB25 /* data-symbols.json */; };
5BEDB725283B4C250078EB25 /* data-chs.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71C283B4AEA0078EB25 /* data-chs.json */; };
5BF018F9299923BD00248CDD /* VwrPrefPaneBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF018F8299923BD00248CDD /* VwrPrefPaneBehavior.swift */; };
5BF018FB299923C000248CDD /* VwrPrefPaneOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF018FA299923C000248CDD /* VwrPrefPaneOutput.swift */; };
5BF018FD299923C200248CDD /* VwrPrefPaneCandidates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF018FC299923C100248CDD /* VwrPrefPaneCandidates.swift */; };
@ -211,17 +211,17 @@
5B18BA7227C7BD8B0056EB19 /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = "<group>"; };
5B18BA7327C7BD8C0056EB19 /* LICENSE-JPN.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "LICENSE-JPN.txt"; sourceTree = "<group>"; };
5B18BA7427C7BD8C0056EB19 /* LICENSE-CHT.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "LICENSE-CHT.txt"; sourceTree = "<group>"; };
5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup.plist"; path = "Data/data-bpmf-reverse-lookup.plist"; sourceTree = "<group>"; };
5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-bpmf-reverse-lookup.json"; path = "Data/data-bpmf-reverse-lookup.json"; sourceTree = "<group>"; };
5B20430B28BEFC0C00BFC6FD /* vChewing.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = vChewing.entitlements; sourceTree = "<group>"; };
5B21176B287539BB000443A9 /* SessionCtl_HandleStates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCtl_HandleStates.swift; sourceTree = "<group>"; };
5B21176D28753B35000443A9 /* SessionCtl_HandleDisplay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCtl_HandleDisplay.swift; sourceTree = "<group>"; };
5B21176F28753B9D000443A9 /* SessionCtl_Delegates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCtl_Delegates.swift; sourceTree = "<group>"; };
5B253E782945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS1.plist"; path = "Data/data-bpmf-reverse-lookup-CNS1.plist"; sourceTree = "<group>"; };
5B253E792945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS3.plist"; path = "Data/data-bpmf-reverse-lookup-CNS3.plist"; sourceTree = "<group>"; };
5B253E7A2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS2.plist"; path = "Data/data-bpmf-reverse-lookup-CNS2.plist"; sourceTree = "<group>"; };
5B253E7B2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS6.plist"; path = "Data/data-bpmf-reverse-lookup-CNS6.plist"; sourceTree = "<group>"; };
5B253E7C2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS4.plist"; path = "Data/data-bpmf-reverse-lookup-CNS4.plist"; sourceTree = "<group>"; };
5B253E7D2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS5.plist"; path = "Data/data-bpmf-reverse-lookup-CNS5.plist"; sourceTree = "<group>"; };
5B253E782945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-bpmf-reverse-lookup-CNS1.json"; path = "Data/data-bpmf-reverse-lookup-CNS1.json"; sourceTree = "<group>"; };
5B253E792945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-bpmf-reverse-lookup-CNS3.json"; path = "Data/data-bpmf-reverse-lookup-CNS3.json"; sourceTree = "<group>"; };
5B253E7A2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-bpmf-reverse-lookup-CNS2.json"; path = "Data/data-bpmf-reverse-lookup-CNS2.json"; sourceTree = "<group>"; };
5B253E7B2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-bpmf-reverse-lookup-CNS6.json"; path = "Data/data-bpmf-reverse-lookup-CNS6.json"; sourceTree = "<group>"; };
5B253E7C2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-bpmf-reverse-lookup-CNS4.json"; path = "Data/data-bpmf-reverse-lookup-CNS4.json"; sourceTree = "<group>"; };
5B253E7D2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-bpmf-reverse-lookup-CNS5.json"; path = "Data/data-bpmf-reverse-lookup-CNS5.json"; sourceTree = "<group>"; };
5B2DB17127AF8771006D874E /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; name = Makefile; path = Data/Makefile; sourceTree = "<group>"; };
5B2E009328FD1E8100E78D6E /* VwrPrefPaneCassette.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VwrPrefPaneCassette.swift; sourceTree = "<group>"; };
5B2F2BB3286216A500B8557B /* vChewingTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = vChewingTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
@ -251,7 +251,7 @@
5B7BC4B227AFFC0B00F66C24 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/frmPrefWindow.strings; sourceTree = "<group>"; };
5B7DA80228BF6BBA00D7B2AD /* fixinstall.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; lineEnding = 0; path = fixinstall.sh; sourceTree = "<group>"; };
5B7F225C2808501000DDD3CB /* InputHandler_HandleInput.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = InputHandler_HandleInput.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
5B84579C2871AD2200C93B01 /* convdict.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = convdict.plist; sourceTree = "<group>"; };
5B84579C2871AD2200C93B01 /* convdict.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = convdict.json; sourceTree = "<group>"; };
5B8457A02871ADBE00C93B01 /* ChineseConverterBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChineseConverterBridge.swift; sourceTree = "<group>"; };
5B963C9B28D5BE4100DCEE88 /* vChewing_CocoaExtension */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = vChewing_CocoaExtension; path = Packages/vChewing_CocoaExtension; sourceTree = "<group>"; };
5B963C9E28D5C14600DCEE88 /* vChewing_Shared */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = vChewing_Shared; path = Packages/vChewing_Shared; sourceTree = "<group>"; };
@ -301,11 +301,11 @@
5BE1F8A828F86AB5006C7FF5 /* InputHandler_HandleEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputHandler_HandleEvent.swift; sourceTree = "<group>"; };
5BE3779F288FED8D0037365B /* InputHandler_HandleComposition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputHandler_HandleComposition.swift; sourceTree = "<group>"; };
5BE8A8C4281EE65300197741 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = "<group>"; };
5BEDB71C283B4AEA0078EB25 /* data-chs.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-chs.plist"; path = "Data/data-chs.plist"; sourceTree = "<group>"; };
5BEDB71D283B4AEA0078EB25 /* data-cns.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-cns.plist"; path = "Data/data-cns.plist"; sourceTree = "<group>"; };
5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-symbols.plist"; path = "Data/data-symbols.plist"; sourceTree = "<group>"; };
5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-zhuyinwen.plist"; path = "Data/data-zhuyinwen.plist"; sourceTree = "<group>"; };
5BEDB720283B4AEA0078EB25 /* data-cht.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-cht.plist"; path = "Data/data-cht.plist"; sourceTree = "<group>"; };
5BEDB71C283B4AEA0078EB25 /* data-chs.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-chs.json"; path = "Data/data-chs.json"; sourceTree = "<group>"; };
5BEDB71D283B4AEA0078EB25 /* data-cns.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-cns.json"; path = "Data/data-cns.json"; sourceTree = "<group>"; };
5BEDB71E283B4AEA0078EB25 /* data-symbols.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-symbols.json"; path = "Data/data-symbols.json"; sourceTree = "<group>"; };
5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-zhuyinwen.json"; path = "Data/data-zhuyinwen.json"; sourceTree = "<group>"; };
5BEDB720283B4AEA0078EB25 /* data-cht.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-cht.json"; path = "Data/data-cht.json"; sourceTree = "<group>"; };
5BF018F8299923BD00248CDD /* VwrPrefPaneBehavior.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VwrPrefPaneBehavior.swift; sourceTree = "<group>"; };
5BF018FA299923C000248CDD /* VwrPrefPaneOutput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VwrPrefPaneOutput.swift; sourceTree = "<group>"; };
5BF018FC299923C100248CDD /* VwrPrefPaneCandidates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VwrPrefPaneCandidates.swift; sourceTree = "<group>"; };
@ -456,7 +456,7 @@
5B62A33027AE78E500A19448 /* Resources */ = {
isa = PBXGroup;
children = (
5B84579C2871AD2200C93B01 /* convdict.plist */,
5B84579C2871AD2200C93B01 /* convdict.json */,
5B09307828B6FC3B0021F8C5 /* shortcuts.html */,
5BF9DA2428840E6200DBD48E /* template-associatedPhrases-chs.txt */,
5BF9DA2C2884247800DBD48E /* template-associatedPhrases-cht.txt */,
@ -518,18 +518,18 @@
5B62A35027AE7F6600A19448 /* Data */ = {
isa = PBXGroup;
children = (
5B253E782945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.plist */,
5B253E7A2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.plist */,
5B253E792945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.plist */,
5B253E7C2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.plist */,
5B253E7D2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.plist */,
5B253E7B2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.plist */,
5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.plist */,
5BEDB71C283B4AEA0078EB25 /* data-chs.plist */,
5BEDB720283B4AEA0078EB25 /* data-cht.plist */,
5BEDB71D283B4AEA0078EB25 /* data-cns.plist */,
5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */,
5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */,
5B253E782945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.json */,
5B253E7A2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.json */,
5B253E792945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.json */,
5B253E7C2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.json */,
5B253E7D2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.json */,
5B253E7B2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.json */,
5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.json */,
5BEDB71C283B4AEA0078EB25 /* data-chs.json */,
5BEDB720283B4AEA0078EB25 /* data-cht.json */,
5BEDB71D283B4AEA0078EB25 /* data-cns.json */,
5BEDB71E283B4AEA0078EB25 /* data-symbols.json */,
5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.json */,
5B2DB17127AF8771006D874E /* Makefile */,
);
name = Data;
@ -923,12 +923,12 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
5BC4479D2865686500EDC323 /* data-chs.plist in Resources */,
5BC4479E2865686500EDC323 /* data-cht.plist in Resources */,
5B1C98BB29436CF60019B807 /* data-bpmf-reverse-lookup.plist in Resources */,
5BC4479F2865686500EDC323 /* data-cns.plist in Resources */,
5BC447A02865686500EDC323 /* data-symbols.plist in Resources */,
5BC447A12865686500EDC323 /* data-zhuyinwen.plist in Resources */,
5BC4479D2865686500EDC323 /* data-chs.json in Resources */,
5BC4479E2865686500EDC323 /* data-cht.json in Resources */,
5B1C98BB29436CF60019B807 /* data-bpmf-reverse-lookup.json in Resources */,
5BC4479F2865686500EDC323 /* data-cns.json in Resources */,
5BC447A02865686500EDC323 /* data-symbols.json in Resources */,
5BC447A12865686500EDC323 /* data-zhuyinwen.json in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -936,7 +936,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
5B84579E2871AD2200C93B01 /* convdict.plist in Resources */,
5B84579E2871AD2200C93B01 /* convdict.json in Resources */,
D4E33D8A27A838CF006DB1CF /* Localizable.strings in Resources */,
5B70F4EC2A0BE900005EA8C4 /* MenuIcon-TCVIM@2x.png in Resources */,
5BF9DA2828840E6200DBD48E /* template-exclusions.txt in Resources */,
@ -948,21 +948,21 @@
6A2E40F6253A69DA00D1AE1D /* Images.xcassets in Resources */,
5B70F4EA2A0BE900005EA8C4 /* MenuIcon-SCVIM.png in Resources */,
D4E33D8F27A838F0006DB1CF /* InfoPlist.strings in Resources */,
5BEDB723283B4C250078EB25 /* data-cht.plist in Resources */,
5BEDB721283B4C250078EB25 /* data-cns.plist in Resources */,
5BEDB723283B4C250078EB25 /* data-cht.json in Resources */,
5BEDB721283B4C250078EB25 /* data-cns.json in Resources */,
5BBC2D9F28F51C0400C986F6 /* LICENSE-CHT.txt in Resources */,
5BF9DA2D288427E000DBD48E /* template-associatedPhrases-cht.txt in Resources */,
5BBC2D9E28F51C0400C986F6 /* LICENSE.txt in Resources */,
5BEDB725283B4C250078EB25 /* data-chs.plist in Resources */,
5BEDB725283B4C250078EB25 /* data-chs.json in Resources */,
5BF9DA2928840E6200DBD48E /* template-associatedPhrases-chs.txt in Resources */,
5B09307628B6FC3B0021F8C5 /* shortcuts.html in Resources */,
5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */,
5BF9DA2B28840E6200DBD48E /* template-userphrases.txt in Resources */,
5BEDB722283B4C250078EB25 /* data-zhuyinwen.plist in Resources */,
5BEDB722283B4C250078EB25 /* data-zhuyinwen.json in Resources */,
5BF9DA2728840E6200DBD48E /* template-usersymbolphrases.txt in Resources */,
5B1C98B929436CEE0019B807 /* data-bpmf-reverse-lookup.plist in Resources */,
5B1C98B929436CEE0019B807 /* data-bpmf-reverse-lookup.json in Resources */,
5BBC2DA128F51C0400C986F6 /* LICENSE-CHS.txt in Resources */,
5BEDB724283B4C250078EB25 /* data-symbols.plist in Resources */,
5BEDB724283B4C250078EB25 /* data-symbols.json in Resources */,
5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */,
5BF9DA2A28840E6200DBD48E /* template-replacements.txt in Resources */,
6A187E2616004C5900466B2E /* MainMenu.xib in Resources */,
@ -970,12 +970,12 @@
5BC2652227E04B7E00700291 /* uninstall.sh in Resources */,
5BAD0CD527D701F6003D127F /* vChewingKeyLayout.bundle in Resources */,
5BBC2DA028F51C0400C986F6 /* LICENSE-JPN.txt in Resources */,
5B253E7E2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.plist in Resources */,
5B253E802945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.plist in Resources */,
5B253E7F2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.plist in Resources */,
5B253E822945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.plist in Resources */,
5B253E832945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.plist in Resources */,
5B253E812945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.plist in Resources */,
5B253E7E2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.json in Resources */,
5B253E802945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.json in Resources */,
5B253E7F2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.json in Resources */,
5B253E822945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.json in Resources */,
5B253E832945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.json in Resources */,
5B253E812945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.json in Resources */,
5B70F4EB2A0BE900005EA8C4 /* MenuIcon-SCVIM@2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -1045,18 +1045,18 @@
outputFileListPaths = (
);
outputPaths = (
"$(SRCROOT)/Source/Data/data-chs.plist",
"$(SRCROOT)/Source/Data/data-cht.plist",
"$(SRCROOT)/Source/Data/data-cns.plist",
"$(SRCROOT)/Source/Data/data-zhuyinwen.plist",
"$(SRCROOT)/Source/Data/data-symbols.plist",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup.plist",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS1.plist",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS2.plist",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS3.plist",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS4.plist",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS5.plist",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS6.plist",
"$(SRCROOT)/Source/Data/data-chs.json",
"$(SRCROOT)/Source/Data/data-cht.json",
"$(SRCROOT)/Source/Data/data-cns.json",
"$(SRCROOT)/Source/Data/data-zhuyinwen.json",
"$(SRCROOT)/Source/Data/data-symbols.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS1.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS2.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS3.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS4.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS5.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS6.json",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;