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 class HotenkaChineseConverter {
public private(set) var dict: [String: [String: String]] private(set) var dict: [String: [String: String]]
private var dictFiles: [String: [String]] private var dictFiles: [String: [String]]
public init(plistDir: 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) { public init(dictDir: String) {
dictFiles = [ dictFiles = [
"zh2TW": [String](), "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,4 +1,4 @@
.PHONY: lint format .PHONY: format
format: format:
@swiftformat --swiftversion 5.5 --indent 2 ./ @swiftformat --swiftversion 5.5 --indent 2 ./

View File

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

View File

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

View File

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

View File

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

View File

@ -9,7 +9,7 @@
import Hotenka import Hotenka
public enum ChineseConverter { 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)] = [ private static var punctuationConversionTable: [(String, String)] = [
("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""), ("", ""),

View File

@ -56,7 +56,7 @@ public class LMMgr {
public static func loadCoreLanguageModelFile( public static func loadCoreLanguageModelFile(
filenameSansExtension: String, langModel lm: vChewingLM.LMInstantiator filenameSansExtension: String, langModel lm: vChewingLM.LMInstantiator
) { ) {
lm.loadLanguageModel(plist: Self.getDictionaryData(filenameSansExtension)) lm.loadLanguageModel(json: Self.getDictionaryData(filenameSansExtension))
} }
public static func loadDataModelsOnAppDelegate() { public static func loadDataModelsOnAppDelegate() {
@ -66,22 +66,22 @@ public class LMMgr {
group.enter() group.enter()
globalQueue.async { globalQueue.async {
if !Self.lmCHT.isCNSDataLoaded { if !Self.lmCHT.isCNSDataLoaded {
Self.lmCHT.loadCNSData(plist: Self.getDictionaryData("data-cns")) Self.lmCHT.loadCNSData(json: Self.getDictionaryData("data-cns"))
} }
if !Self.lmCHT.isMiscDataLoaded { if !Self.lmCHT.isMiscDataLoaded {
Self.lmCHT.loadMiscData(plist: Self.getDictionaryData("data-zhuyinwen")) Self.lmCHT.loadMiscData(json: Self.getDictionaryData("data-zhuyinwen"))
} }
if !Self.lmCHT.isSymbolDataLoaded { if !Self.lmCHT.isSymbolDataLoaded {
Self.lmCHT.loadSymbolData(plist: Self.getDictionaryData("data-symbols")) Self.lmCHT.loadSymbolData(json: Self.getDictionaryData("data-symbols"))
} }
if !Self.lmCHS.isCNSDataLoaded { if !Self.lmCHS.isCNSDataLoaded {
Self.lmCHS.loadCNSData(plist: Self.getDictionaryData("data-cns")) Self.lmCHS.loadCNSData(json: Self.getDictionaryData("data-cns"))
} }
if !Self.lmCHS.isMiscDataLoaded { if !Self.lmCHS.isMiscDataLoaded {
Self.lmCHS.loadMiscData(plist: Self.getDictionaryData("data-zhuyinwen")) Self.lmCHS.loadMiscData(json: Self.getDictionaryData("data-zhuyinwen"))
} }
if !Self.lmCHS.isSymbolDataLoaded { if !Self.lmCHS.isSymbolDataLoaded {
Self.lmCHS.loadSymbolData(plist: Self.getDictionaryData("data-symbols")) Self.lmCHS.loadSymbolData(json: Self.getDictionaryData("data-symbols"))
} }
group.leave() group.leave()
} }
@ -125,23 +125,23 @@ public class LMMgr {
switch mode { switch mode {
case .imeModeCHS: case .imeModeCHS:
if !Self.lmCHS.isCNSDataLoaded { if !Self.lmCHS.isCNSDataLoaded {
Self.lmCHS.loadCNSData(plist: Self.getDictionaryData("data-cns")) Self.lmCHS.loadCNSData(json: Self.getDictionaryData("data-cns"))
} }
if !Self.lmCHS.isMiscDataLoaded { if !Self.lmCHS.isMiscDataLoaded {
Self.lmCHS.loadMiscData(plist: Self.getDictionaryData("data-zhuyinwen")) Self.lmCHS.loadMiscData(json: Self.getDictionaryData("data-zhuyinwen"))
} }
if !Self.lmCHS.isSymbolDataLoaded { if !Self.lmCHS.isSymbolDataLoaded {
Self.lmCHS.loadSymbolData(plist: Self.getDictionaryData("data-symbols")) Self.lmCHS.loadSymbolData(json: Self.getDictionaryData("data-symbols"))
} }
case .imeModeCHT: case .imeModeCHT:
if !Self.lmCHT.isCNSDataLoaded { if !Self.lmCHT.isCNSDataLoaded {
Self.lmCHT.loadCNSData(plist: Self.getDictionaryData("data-cns")) Self.lmCHT.loadCNSData(json: Self.getDictionaryData("data-cns"))
} }
if !Self.lmCHT.isMiscDataLoaded { if !Self.lmCHT.isMiscDataLoaded {
Self.lmCHT.loadMiscData(plist: Self.getDictionaryData("data-zhuyinwen")) Self.lmCHT.loadMiscData(json: Self.getDictionaryData("data-zhuyinwen"))
} }
if !Self.lmCHT.isSymbolDataLoaded { if !Self.lmCHT.isSymbolDataLoaded {
Self.lmCHT.loadSymbolData(plist: Self.getDictionaryData("data-symbols")) Self.lmCHT.loadSymbolData(json: Self.getDictionaryData("data-symbols"))
} }
default: break default: break
} }
@ -183,10 +183,10 @@ public class LMMgr {
} }
} }
public static func reloadFactoryDictionaryPlists() { public static func reloadFactoryDictionaryFiles() {
FrmRevLookupWindow.reloadData() FrmRevLookupWindow.reloadData()
LMMgr.lmCHS.resetFactoryPlistModels() LMMgr.lmCHS.resetFactoryJSONModels()
LMMgr.lmCHT.resetFactoryPlistModels() LMMgr.lmCHT.resetFactoryJSONModels()
if PrefMgr.shared.onlyLoadFactoryLangModelsIfNeeded { if PrefMgr.shared.onlyLoadFactoryLangModelsIfNeeded {
LMMgr.loadDataModel(IMEApp.currentInputMode) LMMgr.loadDataModel(IMEApp.currentInputMode)
} else { } 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 factory = PrefMgr.shared.useExternalFactoryDict ? factory : true
let factoryPath = Bundle.main.path(forResource: filenameSansExt, ofType: "plist")! let factoryPath = Bundle.main.path(forResource: filenameSansExt, ofType: ext)!
let containerPath = Self.appSupportURL.appendingPathComponent("vChewingFactoryData/\(filenameSansExt).plist").path let containerPath = Self.appSupportURL.appendingPathComponent("vChewingFactoryData/\(filenameSansExt).\(ext)").path
.expandingTildeInPath .expandingTildeInPath
var isFailed = false var isFailed = false
if !factory { if !factory {
@ -42,14 +42,14 @@ public extension LMMgr {
// MARK: - Containers nil // MARK: - Containers nil
static func getDictionaryData(_ filenameSansExt: String, factory: Bool = false) -> ( 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 factory = PrefMgr.shared.useExternalFactoryDict ? factory : true
let factoryResultURL = Bundle.main.url(forResource: filenameSansExt, withExtension: "plist") let factoryResultURL = Bundle.main.url(forResource: filenameSansExt, withExtension: "json")
let containerResultURL = Self.appSupportURL.appendingPathComponent("vChewingFactoryData/\(filenameSansExt).plist") let containerResultURL = Self.appSupportURL.appendingPathComponent("vChewingFactoryData/\(filenameSansExt).json")
var lastReadPath = factoryResultURL?.path ?? "Factory file missing: \(filenameSansExt).plist" 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 isFailed = false
var isFolder = ObjCBool(false) var isFolder = ObjCBool(false)
guard let url = url else { guard let url = url else {
@ -60,12 +60,12 @@ public extension LMMgr {
if !FileManager.default.fileExists(atPath: url.path, isDirectory: &isFolder) { isFailed = true } if !FileManager.default.fileExists(atPath: url.path, isDirectory: &isFolder) { isFailed = true }
if !isFailed, !FileManager.default.isReadableFile(atPath: url.path) { isFailed = true } if !isFailed, !FileManager.default.isReadableFile(atPath: url.path) { isFailed = true }
if isFailed { if isFailed {
vCLog("↑ Exception happened when reading plist file at: \(url.path).") vCLog("↑ Exception happened when reading json file at: \(url.path).")
return nil return nil
} }
do { do {
let rawData = try Data(contentsOf: url) 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 { } catch {
return nil return nil
} }
@ -73,10 +73,10 @@ public extension LMMgr {
let result = let result =
factory factory
? getPlistData(url: factoryResultURL) ? getJSONData(url: factoryResultURL)
: getPlistData(url: containerResultURL) ?? getPlistData(url: factoryResultURL) : getJSONData(url: containerResultURL) ?? getJSONData(url: factoryResultURL)
if result == nil { 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) return (dict: result, path: lastReadPath)
} }
@ -108,7 +108,7 @@ public extension LMMgr {
/// - Parameter mode: /// - Parameter mode:
/// - Returns: URL /// - Returns: URL
static func userSCPCSequencesURL(_ mode: Shared.InputMode) -> 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) return URL(fileURLWithPath: dataFolderPath(isDefaultFolder: false)).appendingPathComponent(fileName)
} }

View File

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

View File

@ -322,7 +322,7 @@ class CtlPrefWindow: NSWindowController, NSWindowDelegate {
} }
@IBAction func toggledExternalFactoryPlistDataOnOff(_: NSButton) { @IBAction func toggledExternalFactoryPlistDataOnOff(_: NSButton) {
LMMgr.reloadFactoryDictionaryPlists() LMMgr.reloadFactoryDictionaryFiles()
} }
@IBAction func resetSpecifiedUserDataFolder(_: Any) { @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 */; }; 5B0E22B228FC318C00EB7ACA /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0E22B128FC318C00EB7ACA /* Preferences.swift */; };
5B0EF55D28CDBF7100F8F7CE /* frmClientListMgr.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B0EF55C28CDBF7100F8F7CE /* frmClientListMgr.xib */; }; 5B0EF55D28CDBF7100F8F7CE /* frmClientListMgr.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B0EF55C28CDBF7100F8F7CE /* frmClientListMgr.xib */; };
5B0EF55F28CDBF8E00F8F7CE /* CtlClientListMgr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B0EF55E28CDBF8E00F8F7CE /* CtlClientListMgr.swift */; }; 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 */; }; 5B1C98B929436CEE0019B807 /* data-bpmf-reverse-lookup.json in Resources */ = {isa = PBXBuildFile; fileRef = 5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.json */; };
5B1C98BB29436CF60019B807 /* data-bpmf-reverse-lookup.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.plist */; }; 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 */; }; 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 */; }; 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 */; }; 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 */; }; 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.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E792945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.plist */; }; 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.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7A2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.plist */; }; 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.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7B2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.plist */; }; 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.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7C2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.plist */; }; 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.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5B253E7D2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.plist */; }; 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 */; }; 5B2E009428FD1E8100E78D6E /* VwrPrefPaneCassette.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B2E009328FD1E8100E78D6E /* VwrPrefPaneCassette.swift */; };
5B30BF282944867800BD87A9 /* CtlRevLookupWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B30BF272944867800BD87A9 /* CtlRevLookupWindow.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 */; }; 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 */; }; 5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B7BC4AE27AFFBE800F66C24 /* frmPrefWindow.xib */; };
5B7DA80328BF6BC600D7B2AD /* fixinstall.sh in Resources */ = {isa = PBXBuildFile; fileRef = 5B7DA80228BF6BBA00D7B2AD /* fixinstall.sh */; }; 5B7DA80328BF6BC600D7B2AD /* fixinstall.sh in Resources */ = {isa = PBXBuildFile; fileRef = 5B7DA80228BF6BBA00D7B2AD /* fixinstall.sh */; };
5B7F225D2808501000DDD3CB /* InputHandler_HandleInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B7F225C2808501000DDD3CB /* InputHandler_HandleInput.swift */; }; 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 */; }; 5B8457A12871ADBE00C93B01 /* ChineseConverterBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B8457A02871ADBE00C93B01 /* ChineseConverterBridge.swift */; };
5B963C9D28D5BFB800DCEE88 /* CocoaExtension in Frameworks */ = {isa = PBXBuildFile; productRef = 5B963C9C28D5BFB800DCEE88 /* CocoaExtension */; }; 5B963C9D28D5BFB800DCEE88 /* CocoaExtension in Frameworks */ = {isa = PBXBuildFile; productRef = 5B963C9C28D5BFB800DCEE88 /* CocoaExtension */; };
5B963CA328D5C23600DCEE88 /* SwiftExtension in Frameworks */ = {isa = PBXBuildFile; productRef = 5B963CA228D5C23600DCEE88 /* SwiftExtension */; }; 5B963CA328D5C23600DCEE88 /* SwiftExtension in Frameworks */ = {isa = PBXBuildFile; productRef = 5B963CA228D5C23600DCEE88 /* SwiftExtension */; };
@ -77,11 +77,11 @@
5BBC2DA328F5212100C986F6 /* RelocationDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BBC2DA228F5212100C986F6 /* RelocationDetector.swift */; }; 5BBC2DA328F5212100C986F6 /* RelocationDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BBC2DA228F5212100C986F6 /* RelocationDetector.swift */; };
5BBC2DA528F521C200C986F6 /* AppDelegate_Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BBC2DA428F521C200C986F6 /* AppDelegate_Extension.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 */; }; 5BC2652227E04B7E00700291 /* uninstall.sh in Resources */ = {isa = PBXBuildFile; fileRef = 5BC2652127E04B7B00700291 /* uninstall.sh */; };
5BC4479D2865686500EDC323 /* data-chs.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71C283B4AEA0078EB25 /* data-chs.plist */; }; 5BC4479D2865686500EDC323 /* data-chs.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71C283B4AEA0078EB25 /* data-chs.json */; };
5BC4479E2865686500EDC323 /* data-cht.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB720283B4AEA0078EB25 /* data-cht.plist */; }; 5BC4479E2865686500EDC323 /* data-cht.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB720283B4AEA0078EB25 /* data-cht.json */; };
5BC4479F2865686500EDC323 /* data-cns.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71D283B4AEA0078EB25 /* data-cns.plist */; }; 5BC4479F2865686500EDC323 /* data-cns.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71D283B4AEA0078EB25 /* data-cns.json */; };
5BC447A02865686500EDC323 /* data-symbols.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */; }; 5BC447A02865686500EDC323 /* data-symbols.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71E283B4AEA0078EB25 /* data-symbols.json */; };
5BC447A12865686500EDC323 /* data-zhuyinwen.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */; }; 5BC447A12865686500EDC323 /* data-zhuyinwen.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.json */; };
5BC447A628656A1900EDC323 /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BC447A228656A1900EDC323 /* Placeholder.swift */; }; 5BC447A628656A1900EDC323 /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BC447A228656A1900EDC323 /* Placeholder.swift */; };
5BC5E01E28DDE4770094E427 /* NotifierUI in Frameworks */ = {isa = PBXBuildFile; productRef = 5BC5E01D28DDE4770094E427 /* NotifierUI */; }; 5BC5E01E28DDE4770094E427 /* NotifierUI in Frameworks */ = {isa = PBXBuildFile; productRef = 5BC5E01D28DDE4770094E427 /* NotifierUI */; };
5BC5E02128DDEFE00094E427 /* TooltipUI in Frameworks */ = {isa = PBXBuildFile; productRef = 5BC5E02028DDEFE00094E427 /* TooltipUI */; }; 5BC5E02128DDEFE00094E427 /* TooltipUI in Frameworks */ = {isa = PBXBuildFile; productRef = 5BC5E02028DDEFE00094E427 /* TooltipUI */; };
@ -98,11 +98,11 @@
5BDB7A4728D4824A001AC277 /* Tekkon in Frameworks */ = {isa = PBXBuildFile; productRef = 5BDB7A4628D4824A001AC277 /* Tekkon */; }; 5BDB7A4728D4824A001AC277 /* Tekkon in Frameworks */ = {isa = PBXBuildFile; productRef = 5BDB7A4628D4824A001AC277 /* Tekkon */; };
5BE1F8A928F86AB5006C7FF5 /* InputHandler_HandleEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BE1F8A828F86AB5006C7FF5 /* InputHandler_HandleEvent.swift */; }; 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 */; }; 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 */; }; 5BEDB721283B4C250078EB25 /* data-cns.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71D283B4AEA0078EB25 /* data-cns.json */; };
5BEDB722283B4C250078EB25 /* data-zhuyinwen.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */; }; 5BEDB722283B4C250078EB25 /* data-zhuyinwen.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.json */; };
5BEDB723283B4C250078EB25 /* data-cht.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB720283B4AEA0078EB25 /* data-cht.plist */; }; 5BEDB723283B4C250078EB25 /* data-cht.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB720283B4AEA0078EB25 /* data-cht.json */; };
5BEDB724283B4C250078EB25 /* data-symbols.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */; }; 5BEDB724283B4C250078EB25 /* data-symbols.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71E283B4AEA0078EB25 /* data-symbols.json */; };
5BEDB725283B4C250078EB25 /* data-chs.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71C283B4AEA0078EB25 /* data-chs.plist */; }; 5BEDB725283B4C250078EB25 /* data-chs.json in Resources */ = {isa = PBXBuildFile; fileRef = 5BEDB71C283B4AEA0078EB25 /* data-chs.json */; };
5BF018F9299923BD00248CDD /* VwrPrefPaneBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF018F8299923BD00248CDD /* VwrPrefPaneBehavior.swift */; }; 5BF018F9299923BD00248CDD /* VwrPrefPaneBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF018F8299923BD00248CDD /* VwrPrefPaneBehavior.swift */; };
5BF018FB299923C000248CDD /* VwrPrefPaneOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF018FA299923C000248CDD /* VwrPrefPaneOutput.swift */; }; 5BF018FB299923C000248CDD /* VwrPrefPaneOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF018FA299923C000248CDD /* VwrPrefPaneOutput.swift */; };
5BF018FD299923C200248CDD /* VwrPrefPaneCandidates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BF018FC299923C100248CDD /* VwrPrefPaneCandidates.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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS3.plist"; path = "Data/data-bpmf-reverse-lookup-CNS3.plist"; 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.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS2.plist"; path = "Data/data-bpmf-reverse-lookup-CNS2.plist"; 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.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS6.plist"; path = "Data/data-bpmf-reverse-lookup-CNS6.plist"; 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.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS4.plist"; path = "Data/data-bpmf-reverse-lookup-CNS4.plist"; 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.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-bpmf-reverse-lookup-CNS5.plist"; path = "Data/data-bpmf-reverse-lookup-CNS5.plist"; 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>"; }; 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>"; }; 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; }; 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>"; }; 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>"; }; 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; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 5BEDB71C283B4AEA0078EB25 /* data-chs.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = "data-chs.json"; path = "Data/data-chs.json"; sourceTree = "<group>"; };
5BEDB71D283B4AEA0078EB25 /* data-cns.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-cns.plist"; path = "Data/data-cns.plist"; 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.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-symbols.plist"; path = "Data/data-symbols.plist"; 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.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-zhuyinwen.plist"; path = "Data/data-zhuyinwen.plist"; 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.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = "data-cht.plist"; path = "Data/data-cht.plist"; 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>"; }; 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>"; }; 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>"; }; 5BF018FC299923C100248CDD /* VwrPrefPaneCandidates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VwrPrefPaneCandidates.swift; sourceTree = "<group>"; };
@ -456,7 +456,7 @@
5B62A33027AE78E500A19448 /* Resources */ = { 5B62A33027AE78E500A19448 /* Resources */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5B84579C2871AD2200C93B01 /* convdict.plist */, 5B84579C2871AD2200C93B01 /* convdict.json */,
5B09307828B6FC3B0021F8C5 /* shortcuts.html */, 5B09307828B6FC3B0021F8C5 /* shortcuts.html */,
5BF9DA2428840E6200DBD48E /* template-associatedPhrases-chs.txt */, 5BF9DA2428840E6200DBD48E /* template-associatedPhrases-chs.txt */,
5BF9DA2C2884247800DBD48E /* template-associatedPhrases-cht.txt */, 5BF9DA2C2884247800DBD48E /* template-associatedPhrases-cht.txt */,
@ -518,18 +518,18 @@
5B62A35027AE7F6600A19448 /* Data */ = { 5B62A35027AE7F6600A19448 /* Data */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5B253E782945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.plist */, 5B253E782945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.json */,
5B253E7A2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.plist */, 5B253E7A2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.json */,
5B253E792945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.plist */, 5B253E792945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.json */,
5B253E7C2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.plist */, 5B253E7C2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.json */,
5B253E7D2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.plist */, 5B253E7D2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.json */,
5B253E7B2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.plist */, 5B253E7B2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.json */,
5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.plist */, 5B1C98B729436CED0019B807 /* data-bpmf-reverse-lookup.json */,
5BEDB71C283B4AEA0078EB25 /* data-chs.plist */, 5BEDB71C283B4AEA0078EB25 /* data-chs.json */,
5BEDB720283B4AEA0078EB25 /* data-cht.plist */, 5BEDB720283B4AEA0078EB25 /* data-cht.json */,
5BEDB71D283B4AEA0078EB25 /* data-cns.plist */, 5BEDB71D283B4AEA0078EB25 /* data-cns.json */,
5BEDB71E283B4AEA0078EB25 /* data-symbols.plist */, 5BEDB71E283B4AEA0078EB25 /* data-symbols.json */,
5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.plist */, 5BEDB71F283B4AEA0078EB25 /* data-zhuyinwen.json */,
5B2DB17127AF8771006D874E /* Makefile */, 5B2DB17127AF8771006D874E /* Makefile */,
); );
name = Data; name = Data;
@ -923,12 +923,12 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
5BC4479D2865686500EDC323 /* data-chs.plist in Resources */, 5BC4479D2865686500EDC323 /* data-chs.json in Resources */,
5BC4479E2865686500EDC323 /* data-cht.plist in Resources */, 5BC4479E2865686500EDC323 /* data-cht.json in Resources */,
5B1C98BB29436CF60019B807 /* data-bpmf-reverse-lookup.plist in Resources */, 5B1C98BB29436CF60019B807 /* data-bpmf-reverse-lookup.json in Resources */,
5BC4479F2865686500EDC323 /* data-cns.plist in Resources */, 5BC4479F2865686500EDC323 /* data-cns.json in Resources */,
5BC447A02865686500EDC323 /* data-symbols.plist in Resources */, 5BC447A02865686500EDC323 /* data-symbols.json in Resources */,
5BC447A12865686500EDC323 /* data-zhuyinwen.plist in Resources */, 5BC447A12865686500EDC323 /* data-zhuyinwen.json in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -936,7 +936,7 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
5B84579E2871AD2200C93B01 /* convdict.plist in Resources */, 5B84579E2871AD2200C93B01 /* convdict.json in Resources */,
D4E33D8A27A838CF006DB1CF /* Localizable.strings in Resources */, D4E33D8A27A838CF006DB1CF /* Localizable.strings in Resources */,
5B70F4EC2A0BE900005EA8C4 /* MenuIcon-TCVIM@2x.png in Resources */, 5B70F4EC2A0BE900005EA8C4 /* MenuIcon-TCVIM@2x.png in Resources */,
5BF9DA2828840E6200DBD48E /* template-exclusions.txt in Resources */, 5BF9DA2828840E6200DBD48E /* template-exclusions.txt in Resources */,
@ -948,21 +948,21 @@
6A2E40F6253A69DA00D1AE1D /* Images.xcassets in Resources */, 6A2E40F6253A69DA00D1AE1D /* Images.xcassets in Resources */,
5B70F4EA2A0BE900005EA8C4 /* MenuIcon-SCVIM.png in Resources */, 5B70F4EA2A0BE900005EA8C4 /* MenuIcon-SCVIM.png in Resources */,
D4E33D8F27A838F0006DB1CF /* InfoPlist.strings in Resources */, D4E33D8F27A838F0006DB1CF /* InfoPlist.strings in Resources */,
5BEDB723283B4C250078EB25 /* data-cht.plist in Resources */, 5BEDB723283B4C250078EB25 /* data-cht.json in Resources */,
5BEDB721283B4C250078EB25 /* data-cns.plist in Resources */, 5BEDB721283B4C250078EB25 /* data-cns.json in Resources */,
5BBC2D9F28F51C0400C986F6 /* LICENSE-CHT.txt in Resources */, 5BBC2D9F28F51C0400C986F6 /* LICENSE-CHT.txt in Resources */,
5BF9DA2D288427E000DBD48E /* template-associatedPhrases-cht.txt in Resources */, 5BF9DA2D288427E000DBD48E /* template-associatedPhrases-cht.txt in Resources */,
5BBC2D9E28F51C0400C986F6 /* LICENSE.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 */, 5BF9DA2928840E6200DBD48E /* template-associatedPhrases-chs.txt in Resources */,
5B09307628B6FC3B0021F8C5 /* shortcuts.html in Resources */, 5B09307628B6FC3B0021F8C5 /* shortcuts.html in Resources */,
5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */, 5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */,
5BF9DA2B28840E6200DBD48E /* template-userphrases.txt 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 */, 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 */, 5BBC2DA128F51C0400C986F6 /* LICENSE-CHS.txt in Resources */,
5BEDB724283B4C250078EB25 /* data-symbols.plist in Resources */, 5BEDB724283B4C250078EB25 /* data-symbols.json in Resources */,
5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */, 5B7BC4B027AFFBE800F66C24 /* frmPrefWindow.xib in Resources */,
5BF9DA2A28840E6200DBD48E /* template-replacements.txt in Resources */, 5BF9DA2A28840E6200DBD48E /* template-replacements.txt in Resources */,
6A187E2616004C5900466B2E /* MainMenu.xib in Resources */, 6A187E2616004C5900466B2E /* MainMenu.xib in Resources */,
@ -970,12 +970,12 @@
5BC2652227E04B7E00700291 /* uninstall.sh in Resources */, 5BC2652227E04B7E00700291 /* uninstall.sh in Resources */,
5BAD0CD527D701F6003D127F /* vChewingKeyLayout.bundle in Resources */, 5BAD0CD527D701F6003D127F /* vChewingKeyLayout.bundle in Resources */,
5BBC2DA028F51C0400C986F6 /* LICENSE-JPN.txt in Resources */, 5BBC2DA028F51C0400C986F6 /* LICENSE-JPN.txt in Resources */,
5B253E7E2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.plist in Resources */, 5B253E7E2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS1.json in Resources */,
5B253E802945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.plist in Resources */, 5B253E802945AF6700680C67 /* data-bpmf-reverse-lookup-CNS2.json in Resources */,
5B253E7F2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.plist in Resources */, 5B253E7F2945AF6700680C67 /* data-bpmf-reverse-lookup-CNS3.json in Resources */,
5B253E822945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.plist in Resources */, 5B253E822945AF6700680C67 /* data-bpmf-reverse-lookup-CNS4.json in Resources */,
5B253E832945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.plist in Resources */, 5B253E832945AF6700680C67 /* data-bpmf-reverse-lookup-CNS5.json in Resources */,
5B253E812945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.plist in Resources */, 5B253E812945AF6700680C67 /* data-bpmf-reverse-lookup-CNS6.json in Resources */,
5B70F4EB2A0BE900005EA8C4 /* MenuIcon-SCVIM@2x.png in Resources */, 5B70F4EB2A0BE900005EA8C4 /* MenuIcon-SCVIM@2x.png in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -1045,18 +1045,18 @@
outputFileListPaths = ( outputFileListPaths = (
); );
outputPaths = ( outputPaths = (
"$(SRCROOT)/Source/Data/data-chs.plist", "$(SRCROOT)/Source/Data/data-chs.json",
"$(SRCROOT)/Source/Data/data-cht.plist", "$(SRCROOT)/Source/Data/data-cht.json",
"$(SRCROOT)/Source/Data/data-cns.plist", "$(SRCROOT)/Source/Data/data-cns.json",
"$(SRCROOT)/Source/Data/data-zhuyinwen.plist", "$(SRCROOT)/Source/Data/data-zhuyinwen.json",
"$(SRCROOT)/Source/Data/data-symbols.plist", "$(SRCROOT)/Source/Data/data-symbols.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup.plist", "$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS1.plist", "$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS1.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS2.plist", "$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS2.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS3.plist", "$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS3.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS4.plist", "$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS4.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS5.plist", "$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS5.json",
"$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS6.plist", "$(SRCROOT)/Source/Data/data-bpmf-reverse-lookup-CNS6.json",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;