Skip to content

Commit 3fdfba2

Browse files
committed
attributes
1 parent fcab3b6 commit 3fdfba2

File tree

12 files changed

+834
-36
lines changed

12 files changed

+834
-36
lines changed

Codegen/Package.resolved

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Codegen/Package.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ let package = Package(
1212
)
1313
],
1414
dependencies: [
15+
.package(url: "https://github.com/apple/swift-collections", from: "1.1.0"),
1516
.package(url: "https://github.com/omochi/CodegenKit", from: "1.4.1")
1617
],
1718
targets: [
1819
.target(
1920
name: "SRTCodegen",
2021
dependencies: [
22+
.product(name: "Collections", package: "swift-collections"),
2123
.product(name: "CodegenKit", package: "CodegenKit")
2224
]
2325
),

Codegen/Sources/SRTCodegen/Def.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import Collections
2+
13
struct Def: Codable {
24
var tagNames: [String]
35
var voidElements: [String]
@@ -8,4 +10,18 @@ struct Def: Codable {
810
voidElements.contains(tagName)
911
}
1012
}
13+
14+
var allAttributes: [String] {
15+
var attrs: OrderedSet<String> = []
16+
attrs.formUnion(elementAttributes["*"] ?? [])
17+
18+
var dict = elementAttributes
19+
dict["*"] = nil
20+
21+
for key in dict.keys.sorted() {
22+
attrs.formUnion(dict[key] ?? [])
23+
}
24+
25+
return attrs.elements
26+
}
1127
}

Codegen/Sources/SRTCodegen/Keywords.swift

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import Foundation
2+
import CodegenKit
3+
4+
struct AttributeRenderer: Renderer {
5+
var def: Def
6+
7+
func isTarget(file: URL) -> Bool {
8+
file.lastPathComponent == "Attributes.swift"
9+
}
10+
11+
func render(template: inout CodeTemplateModule.CodeTemplate, file: URL, on runner: CodegenKit.CodegenRunner) throws {
12+
let code = def.allAttributes.map { (attribute) in
13+
renderSetter(attribute: attribute)
14+
}.joined(separator: "\n")
15+
16+
template["setters"] = code
17+
}
18+
19+
private func renderSetter(attribute: String) -> String {
20+
let symbol = attribute.kebabToCamel()
21+
22+
return """
23+
public func \(renderIdentifier(symbol))(_ x: String) -> Attributes {
24+
set("\(attribute)", to: x)
25+
}
26+
27+
"""
28+
}
29+
}

Codegen/Sources/SRTCodegen/HTMLTagRenderer.swift renamed to Codegen/Sources/SRTCodegen/Renderers/HTMLTagRenderer.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,4 @@ struct HTMLTagRenderer: Renderer {
3939
4040
"""
4141
}
42-
43-
private func renderIdentifier(_ text: String) -> String {
44-
var text = text
45-
if keywords.contains(text) {
46-
text = "`\(text)`"
47-
}
48-
return text
49-
}
5042
}

Codegen/Sources/SRTCodegen/SRTCodegen.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ public struct SRTCodegen {
2121
let runner = CodegenRunner(
2222
renderers: [
2323
HTMLTagRenderer(def: def),
24-
HTMLVoidTagRenderer(def: def)
24+
HTMLVoidTagRenderer(def: def),
25+
AttributeRenderer(def: def)
2526
]
2627
)
2728

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import Foundation
2+
3+
public let keywords = [
4+
"as",
5+
"class",
6+
"default",
7+
"defer",
8+
"for",
9+
"is",
10+
"var",
11+
]
12+
13+
func renderIdentifier(_ text: String) -> String {
14+
var text = text
15+
if keywords.contains(text) {
16+
text = "`\(text)`"
17+
}
18+
return text
19+
}
20+
21+
extension String {
22+
func kebabToCamel() -> String {
23+
let strs = self.components(separatedBy: "-")
24+
25+
var result = ""
26+
for (index, str) in strs.enumerated() {
27+
if index == 0 {
28+
result += str.lowercased()
29+
} else {
30+
result += str.capitalized
31+
}
32+
}
33+
34+
return result
35+
}
36+
}

0 commit comments

Comments
 (0)