210 lines
6.7 KiB
Swift
210 lines
6.7 KiB
Swift
//
|
||
// CLUI.swift
|
||
// Crush
|
||
//
|
||
// Created by Leon on 2025/7/11.
|
||
//
|
||
|
||
import Foundation
|
||
|
||
let EPConfigShadowPrefix = "@SHA:"
|
||
let EPConfigGradientPrefix = "@GRA:"
|
||
|
||
class CLBaseTokens {
|
||
static var shared = CLBaseTokens()
|
||
// MARK: - Properties
|
||
|
||
var globalTokens: [String: Any]?
|
||
var sysDarkTokens: [String: Any]?
|
||
var sysLightTokens: [String: Any]?
|
||
|
||
var globalKeys: [String]?
|
||
var sysDarkKeys: [String]?
|
||
var sysLightKeys: [String]?
|
||
|
||
// MARK: - Singleton
|
||
// static let shared = CLBaseTokens()
|
||
|
||
init() {
|
||
initialTokens()
|
||
}
|
||
|
||
// MARK: - Initial
|
||
private func initialTokens() {
|
||
// 加载 global tokens
|
||
if let json1Path = Bundle.main.path(forResource: "token_global", ofType: "json"),
|
||
let json1Data = try? Data(contentsOf: URL(fileURLWithPath: json1Path)),
|
||
let dict1 = try? JSONSerialization.jsonObject(with: json1Data, options: []) as? [String: Any] {
|
||
globalTokens = dict1
|
||
globalKeys = dict1.keys.sorted()
|
||
//assert(dict1 != nil, "json should be valid")
|
||
}
|
||
|
||
// 加载 sysDark tokens
|
||
if let json2Path = Bundle.main.path(forResource: "token_sys_normal", ofType: "json"),
|
||
let json2Data = try? Data(contentsOf: URL(fileURLWithPath: json2Path)),
|
||
let dict2 = try? JSONSerialization.jsonObject(with: json2Data, options: []) as? [String: Any] {
|
||
sysDarkTokens = dict2
|
||
sysDarkKeys = dict2.keys.sorted()
|
||
}
|
||
|
||
assert(sysDarkTokens != nil)
|
||
}
|
||
|
||
// MARK: - Public Methods
|
||
|
||
/// ⚠️ 只针对单 token 的情况,保留此方法,不推荐使用
|
||
func getTokenByKey(_ key: String) -> String {
|
||
var value: String?
|
||
|
||
if let sysDarkKeys = sysDarkKeys, sysDarkKeys.contains(key) {
|
||
value = sysDarkTokens?[key] as? String
|
||
}
|
||
|
||
if value == nil, let globalKeys = globalKeys, globalKeys.contains(key) {
|
||
value = globalTokens?[key] as? String
|
||
}
|
||
|
||
guard let finalValue = value else {
|
||
print("\(key) UI Token Key may doesn't exist")
|
||
return ""
|
||
}
|
||
|
||
if finalValue.contains("$") {
|
||
let keyNew = finalValue.replacingOccurrences(of: "$", with: "")
|
||
return getTokenByKey(keyNew)
|
||
}
|
||
|
||
return finalValue
|
||
}
|
||
|
||
func getTokensByKey(_ key: String) -> [String] {
|
||
var value: String?
|
||
|
||
|
||
if let sysKeys = sysDarkKeys {
|
||
if sysKeys.contains(key){
|
||
value = sysDarkTokens?[key] as? String
|
||
}
|
||
}
|
||
|
||
if value == nil, let globalKeys = globalKeys, globalKeys.contains(key) {
|
||
value = globalTokens?[key] as? String
|
||
}
|
||
|
||
guard let finalValue = value else {
|
||
print("❌\(key)❌ UI Token Key doesn't exist ❌❌")
|
||
return []
|
||
}
|
||
|
||
let params = finalValue.components(separatedBy: ",")
|
||
var arrayM: [String] = []
|
||
|
||
for per in params {
|
||
let dealPer = per.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
if dealPer.contains("$") {
|
||
var keyNew = dealPer
|
||
keyNew = keyNew.replacingOccurrences(of: EPConfigShadowPrefix, with: "")
|
||
keyNew = keyNew.replacingOccurrences(of: EPConfigGradientPrefix, with: "")
|
||
|
||
if keyNew.contains("&") {
|
||
let keys = keyNew.components(separatedBy: "&")
|
||
var multi: [String] = []
|
||
|
||
for perKey in keys {
|
||
let keyNew2 = perKey.replacingOccurrences(of: "$", with: "")
|
||
let value = getTokenByKey(keyNew2)
|
||
multi.append(value)
|
||
}
|
||
|
||
let covertValues = multi.joined(separator: "&")
|
||
arrayM.append(covertValues)
|
||
} else {
|
||
var values: [String] = []
|
||
var tempKey = keyNew
|
||
while tempKey.contains("$") {
|
||
tempKey = tempKey.replacingOccurrences(of: "$", with: "")
|
||
values = getTokensByKey(tempKey)
|
||
arrayM.append(contentsOf: values)
|
||
}
|
||
}
|
||
} else {
|
||
arrayM.append(dealPer)
|
||
}
|
||
}
|
||
|
||
return arrayM
|
||
}
|
||
|
||
// MARK: - Always Dark
|
||
|
||
/// ⚠️ 只针对单 token 的情况,保留此方法,不推荐使用
|
||
func getDarkToken(_ key: String) -> String {
|
||
var value: String?
|
||
|
||
if let sysDarkKeys = sysDarkKeys, sysDarkKeys.contains(key) {
|
||
value = sysDarkTokens?[key] as? String
|
||
}
|
||
|
||
if value == nil, let globalKeys = globalKeys, globalKeys.contains(key) {
|
||
value = globalTokens?[key] as? String
|
||
}
|
||
|
||
guard let finalValue = value else {
|
||
print("❌\(key)❌ UI Token Key doesn't exist ❌❌")
|
||
return ""
|
||
}
|
||
|
||
if finalValue.contains("$") {
|
||
let keyNew = finalValue.replacingOccurrences(of: "$", with: "")
|
||
return getTokenByKey(keyNew)
|
||
}
|
||
|
||
return finalValue
|
||
}
|
||
|
||
func getDarkTokens(_ key: String) -> [String] {
|
||
var value: String?
|
||
|
||
if let sysDarkKeys = sysDarkKeys, sysDarkKeys.contains(key) {
|
||
value = sysDarkTokens?[key] as? String
|
||
}
|
||
|
||
if value == nil, let globalKeys = globalKeys, globalKeys.contains(key) {
|
||
value = globalTokens?[key] as? String
|
||
}
|
||
|
||
guard let finalValue = value else {
|
||
print("❌\(key)❌ UI Token Key doesn't exist ❌❌")
|
||
return []
|
||
}
|
||
|
||
let params = finalValue.components(separatedBy: ",")
|
||
var arrayM: [String] = []
|
||
|
||
for per in params {
|
||
let dealPer = per.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
if dealPer.contains("$") {
|
||
var keyNew = dealPer
|
||
keyNew = keyNew.replacingOccurrences(of: EPConfigShadowPrefix, with: "")
|
||
keyNew = keyNew.replacingOccurrences(of: EPConfigGradientPrefix, with: "")
|
||
|
||
var values: [String] = []
|
||
while keyNew.contains("$") {
|
||
keyNew = keyNew.replacingOccurrences(of: "$", with: "")
|
||
values = getTokensByKey(keyNew)
|
||
arrayM.append(contentsOf: values)
|
||
}
|
||
} else {
|
||
arrayM.append(dealPer)
|
||
}
|
||
}
|
||
|
||
return arrayM
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|