Repo // Use JSON as factory dictionary format.
This commit is contained in:
parent
07da96d775
commit
f99c16169e
|
@ -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](),
|
||||
|
|
|
@ -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, "為中華崛起而読書")
|
||||
}
|
||||
}
|
Binary file not shown.
|
@ -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
|
||||
|
|
|
@ -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 的多任務並行共結來完成。
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)] = [
|
||||
("【", "︻"), ("】", "︼"), ("〖", "︗"), ("〗", "︘"), ("〔", "︹"), ("〕", "︺"), ("《", "︽"), ("》", "︾"),
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -133,7 +133,7 @@ struct VwrPrefPaneDictionary: View {
|
|||
Toggle(
|
||||
LocalizedStringKey("Read external factory dictionary plists if possible"),
|
||||
isOn: $useExternalFactoryDict.onChange {
|
||||
LMMgr.reloadFactoryDictionaryPlists()
|
||||
LMMgr.reloadFactoryDictionaryFiles()
|
||||
}
|
||||
)
|
||||
Text(
|
||||
|
|
|
@ -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.
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue