Skip to content

Commit 4129bfa

Browse files
committed
Add symbolicTraits to font resource code generation
1 parent f5a97ef commit 4129bfa

File tree

11 files changed

+154
-33
lines changed

11 files changed

+154
-33
lines changed

Examples/XCResourceExample/XCResourceExampleLib/Sources/Resources/ResourceAccess/FontResource.swift

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,28 @@
22
// Do Not Edit Directly!
33

44
import Foundation
5+
import CoreText
56

6-
public struct FontResource: Hashable, Sendable {
7+
public struct FontResource: Equatable, Sendable {
78
public let fontName: String
89
public let familyName: String
910
public let style: String
11+
public let symbolicTraits: CTFontSymbolicTraits
1012
public let relativePath: String
1113
public let bundle: Bundle
1214

1315
public init(
1416
fontName: String,
1517
familyName: String,
1618
style: String,
19+
symbolicTraits: CTFontSymbolicTraits,
1720
relativePath: String,
1821
bundle: Bundle
1922
) {
2023
self.fontName = fontName
2124
self.familyName = familyName
2225
self.style = style
26+
self.symbolicTraits = symbolicTraits
2327
self.relativePath = relativePath
2428
self.bundle = bundle
2529
}
@@ -64,6 +68,7 @@ public extension FontResource {
6468
fontName: "Cambria",
6569
familyName: "Cambria",
6670
style: "Regular",
71+
symbolicTraits: [],
6772
relativePath: "Fonts/Cambria.ttc",
6873
bundle: Bundle.module)
6974

@@ -73,6 +78,7 @@ public extension FontResource {
7378
fontName: "CambriaMath",
7479
familyName: "Cambria Math",
7580
style: "Regular",
81+
symbolicTraits: [],
7682
relativePath: "Fonts/Cambria.ttc",
7783
bundle: Bundle.module)
7884

@@ -82,83 +88,95 @@ public extension FontResource {
8288
fontName: "OpenSans-Bold",
8389
familyName: "Open Sans",
8490
style: "Bold",
91+
symbolicTraits: [.traitBold],
8592
relativePath: "Fonts/OpenSans/OpenSans-Bold.ttf",
8693
bundle: Bundle.module)
8794

8895
static let openSansBoldItalic: FontResource = .init(
8996
fontName: "OpenSans-BoldItalic",
9097
familyName: "Open Sans",
9198
style: "Bold Italic",
99+
symbolicTraits: [.traitItalic, .traitBold],
92100
relativePath: "Fonts/OpenSans/OpenSans-BoldItalic.ttf",
93101
bundle: Bundle.module)
94102

95103
static let openSansExtraBold: FontResource = .init(
96104
fontName: "OpenSans-ExtraBold",
97105
familyName: "Open Sans",
98106
style: "ExtraBold",
107+
symbolicTraits: [.traitBold],
99108
relativePath: "Fonts/OpenSans/OpenSans-ExtraBold.ttf",
100109
bundle: Bundle.module)
101110

102111
static let openSansExtraBoldItalic: FontResource = .init(
103112
fontName: "OpenSans-ExtraBoldItalic",
104113
familyName: "Open Sans",
105114
style: "ExtraBold Italic",
115+
symbolicTraits: [.traitItalic, .traitBold],
106116
relativePath: "Fonts/OpenSans/OpenSans-ExtraBoldItalic.ttf",
107117
bundle: Bundle.module)
108118

109119
static let openSansItalic: FontResource = .init(
110120
fontName: "OpenSans-Italic",
111121
familyName: "Open Sans",
112122
style: "Italic",
123+
symbolicTraits: [.traitItalic],
113124
relativePath: "Fonts/OpenSans/OpenSans-Italic.ttf",
114125
bundle: Bundle.module)
115126

116127
static let openSansLight: FontResource = .init(
117128
fontName: "OpenSans-Light",
118129
familyName: "Open Sans",
119130
style: "Light",
131+
symbolicTraits: [],
120132
relativePath: "Fonts/OpenSans/OpenSans-Light.ttf",
121133
bundle: Bundle.module)
122134

123135
static let openSansLightItalic: FontResource = .init(
124136
fontName: "OpenSans-LightItalic",
125137
familyName: "Open Sans",
126138
style: "Light Italic",
139+
symbolicTraits: [.traitItalic],
127140
relativePath: "Fonts/OpenSans/OpenSans-LightItalic.ttf",
128141
bundle: Bundle.module)
129142

130143
static let openSansMedium: FontResource = .init(
131144
fontName: "OpenSans-Medium",
132145
familyName: "Open Sans",
133146
style: "Medium",
147+
symbolicTraits: [],
134148
relativePath: "Fonts/OpenSans/OpenSans-Medium.ttf",
135149
bundle: Bundle.module)
136150

137151
static let openSansMediumItalic: FontResource = .init(
138152
fontName: "OpenSans-MediumItalic",
139153
familyName: "Open Sans",
140154
style: "Medium Italic",
155+
symbolicTraits: [.traitItalic],
141156
relativePath: "Fonts/OpenSans/OpenSans-MediumItalic.ttf",
142157
bundle: Bundle.module)
143158

144159
static let openSansRegular: FontResource = .init(
145160
fontName: "OpenSans-Regular",
146161
familyName: "Open Sans",
147162
style: "Regular",
163+
symbolicTraits: [],
148164
relativePath: "Fonts/OpenSans/OpenSans-Regular.ttf",
149165
bundle: Bundle.module)
150166

151167
static let openSansSemiBold: FontResource = .init(
152168
fontName: "OpenSans-SemiBold",
153169
familyName: "Open Sans",
154170
style: "SemiBold",
171+
symbolicTraits: [.traitBold],
155172
relativePath: "Fonts/OpenSans/OpenSans-SemiBold.ttf",
156173
bundle: Bundle.module)
157174

158175
static let openSansSemiBoldItalic: FontResource = .init(
159176
fontName: "OpenSans-SemiBoldItalic",
160177
familyName: "Open Sans",
161178
style: "SemiBold Italic",
179+
symbolicTraits: [.traitItalic, .traitBold],
162180
relativePath: "Fonts/OpenSans/OpenSans-SemiBoldItalic.ttf",
163181
bundle: Bundle.module)
164182
}

Sources/FontResourceGen/CodeGenerator/DefaultTypeDeclarationGenerator.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,26 @@ class DefaultTypeDeclarationGenerator: TypeDeclarationGenerator {
55
let accessLevel = accessLevel.map({ $0 + " " }) ?? ""
66

77
return """
8-
\(accessLevel)struct \(resourceTypeName): Hashable, Sendable {
8+
\(accessLevel)struct \(resourceTypeName): Equatable, Sendable {
99
\(accessLevel)let fontName: String
1010
\(accessLevel)let familyName: String
1111
\(accessLevel)let style: String
12+
\(accessLevel)let symbolicTraits: CTFontSymbolicTraits
1213
\(accessLevel)let relativePath: String
1314
\(accessLevel)let bundle: Bundle
1415
1516
\(accessLevel)init(
1617
fontName: String,
1718
familyName: String,
1819
style: String,
20+
symbolicTraits: CTFontSymbolicTraits,
1921
relativePath: String,
2022
bundle: Bundle
2123
) {
2224
self.fontName = fontName
2325
self.familyName = familyName
2426
self.style = style
27+
self.symbolicTraits = symbolicTraits
2528
self.relativePath = relativePath
2629
self.bundle = bundle
2730
}

Sources/FontResourceGen/CodeGenerator/DefaultValueDeclarationGenerator.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Foundation
2+
import CoreText
23

34
class DefaultValueDeclarationGenerator: ValueDeclarationGenerator {
45
func generateValueListDeclaration(for request: ValueDeclarationRequest) -> String? {
@@ -71,6 +72,7 @@ class DefaultValueDeclarationGenerator: ValueDeclarationGenerator {
7172
fontName: "\(font.fontName)",
7273
familyName: "\(font.familyName)",
7374
style: "\(font.style)",
75+
symbolicTraits: \(font.symbolicTraits.description),
7476
relativePath: "\(relativePath(of: font, for: request))",
7577
bundle: \(request.bundle))
7678
@@ -96,3 +98,26 @@ class DefaultValueDeclarationGenerator: ValueDeclarationGenerator {
9698
return result
9799
}
98100
}
101+
102+
extension CTFontSymbolicTraits {
103+
fileprivate var description: String {
104+
let allTraits: [(trait: CTFontSymbolicTraits, string: String)] = [
105+
(.traitItalic, ".traitItalic"),
106+
(.traitBold, ".traitBold"),
107+
(.traitExpanded, ".traitExpanded"),
108+
(.traitCondensed, ".traitCondensed"),
109+
(.traitMonoSpace, ".traitMonoSpace"),
110+
(.traitVertical, ".traitVertical"),
111+
(.traitUIOptimized, ".traitUIOptimized"),
112+
(.traitColorGlyphs, ".traitColorGlyphs"),
113+
(.traitComposite, ".traitComposite"),
114+
]
115+
116+
let joinedTraits = allTraits
117+
.filter({ contains($0.trait) })
118+
.map(\.string)
119+
.joined(separator: ", ")
120+
121+
return "[\(joinedTraits)]"
122+
}
123+
}

Sources/FontResourceGen/Font.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import Foundation
2+
import CoreText
23
import XCResourceUtil
34

45
struct Font: Equatable, Sendable, SettableByKeyPath {
56
var fontName: String
67
var familyName: String
78
var style: String
9+
var symbolicTraits: CTFontSymbolicTraits
810
var relativePath: String
911

1012
func id(transformingToLatin: Bool, strippingCombiningMarks: Bool) -> String {

Sources/FontResourceGen/FontImporter/FontLoader.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@ class FontLoader {
1616
let postScriptName = CTFontCopyPostScriptName(font) as String
1717
let familyName = CTFontCopyFamilyName(font) as String
1818
let style = (CTFontCopyAttribute(font, kCTFontStyleNameAttribute) as? String) ?? ""
19+
let symbolicTraits = CTFontGetSymbolicTraits(font)
1920

2021
return Font(fontName: postScriptName,
2122
familyName: familyName,
2223
style: style,
24+
symbolicTraits: symbolicTraits,
2325
relativePath: path)
2426
}
2527
}

Sources/XCResourceCommand/Commands/FontsToSwift.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ struct FontsToSwift: ParsableCommand {
2121
// MARK: - Default values
2222

2323
enum Default {
24-
static let dependencies: [String] = ["Foundation"]
24+
static let dependencies: [String] = ["Foundation", "CoreText"]
2525
static let bundle: String = "Bundle.main"
2626
static let transformsToLatin: Bool = false
2727
static let stripsCombiningMarks: Bool = false

0 commit comments

Comments
 (0)