Skip to content

Commit 2e6a0d9

Browse files
minor benchmark updates + 1 fix to optimizedLiteral(encodedResult:) regex
1 parent 32c78f6 commit 2e6a0d9

File tree

4 files changed

+133
-26
lines changed

4 files changed

+133
-26
lines changed

Benchmarks/Benchmarks/SwiftHTMLKit/SwiftHTMLKit.swift

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -69,24 +69,24 @@ package struct SwiftHTMLKitTests : HTMLGenerator {
6969
for quality in context.user.qualities {
7070
qualities += #html(li(quality))
7171
}
72-
return #html(
73-
html(
74-
head(
75-
meta(charset: "\(context.charset)"),
76-
title("\(context.title)"),
77-
meta(content: "\(context.meta_description)", name: "description"),
78-
meta(content: "\(context.keywords_string)", name: "keywords")
79-
),
80-
body(
81-
h1("\(context.heading)"),
82-
div(attributes: [.id(context.desc_id)],
83-
p("\(context.string)")
84-
),
85-
h2("\(context.user.details_heading)"),
86-
h3("\(context.user.qualities_heading)"),
87-
ul(attributes: [.id(context.user.qualities_id)], "\(qualities)")
88-
)
89-
)
90-
)
72+
return #html {
73+
html {
74+
head {
75+
meta(charset: context.charset)
76+
title(context.title)
77+
meta(content: context.meta_description, name: "description")
78+
meta(content: context.keywords_string, name: "keywords")
79+
}
80+
body {
81+
h1(context.heading)
82+
div(attributes: [.id(context.desc_id)]) {
83+
p(context.string)
84+
}
85+
h2(context.user.details_heading)
86+
h3(context.user.qualities_heading)
87+
ul(attributes: [.id(context.user.qualities_id)], qualities)
88+
}
89+
}
90+
}
9191
}
9292
}

Benchmarks/Package.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ let package = Package(
1313
.package(url: "https://github.com/swiftlang/swift-syntax", from: "600.0.0"),
1414
// dsls
1515
.package(name: "swift-htmlkit", path: "../"),
16-
.package(url: "https://github.com/sliemeobn/elementary", exact: "0.4.1"),
16+
.package(url: "https://github.com/sliemeobn/elementary", exact: "0.5.3"),
1717
.package(url: "https://github.com/vapor-community/HTMLKit", exact: "2.8.1"),
18-
.package(url: "https://github.com/pointfreeco/swift-html", exact: "0.4.1"),
18+
.package(url: "https://github.com/pointfreeco/swift-html", exact: "0.5.0"),
1919
.package(url: "https://github.com/RandomHashTags/fork-bb-swift-html", branch: "main"),
2020
.package(url: "https://github.com/JohnSundell/Plot", exact: "0.14.0"),
2121
//.package(url: "https://github.com/toucansites/toucan", from: "1.0.0-alpha.1"), // unstable
@@ -27,9 +27,9 @@ let package = Package(
2727
//.package(url: "https://github.com/vapor/leaf", exact: "4.4.0"), // tight integration with Vapor
2828

2929
// networking
30-
.package(url: "https://github.com/apple/swift-nio", from: "2.75.0"),
31-
.package(url: "https://github.com/vapor/vapor", from: "4.106.0"),
32-
.package(url: "https://github.com/hummingbird-project/hummingbird", from: "2.1.0")
30+
.package(url: "https://github.com/apple/swift-nio", from: "2.84.0"),
31+
.package(url: "https://github.com/vapor/vapor", from: "4.115.0"),
32+
.package(url: "https://github.com/hummingbird-project/hummingbird", from: "2.15.0")
3333
],
3434
targets: [
3535
.target(

Sources/HTMLKitParse/ExpandHTMLMacro.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ extension HTMLKitUtilities {
110110
}
111111

112112
static func optimizedLiteral(encodedResult: String) -> String {
113-
let regex = try! Regex.init("( \\+ String\\(describing: [\\w\\s\\(\\)\\[\\]]+\\) \\+ )")
113+
let regex = try! Regex.init("( \\+ String\\(describing: [\\.\\w\\s\\(\\)\\[\\]]+\\) \\+ )")
114114
var interpolation = encodedResult.matches(of: regex)
115115
guard !interpolation.isEmpty else {
116116
return encodedResult

Tests/HTMLKitTests/InterpolationTests.swift

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ struct InterpolationTests {
7272
// MARK: multi-line func
7373
@Test func interpolationMultilineFunc() {
7474
var expected:String = "<div>Bikini Bottom: Spongebob Squarepants, Patrick Star, Squidward Tentacles, Mr. Krabs, Sandy Cheeks, Pearl Krabs</div>"
75-
var string:String = #html(
75+
var string:String = #html(representation: .literal, // TODO: fix (get HTMLResultRepresentation.literalOptimized to work here)
7676
div(
7777
"Bikini Bottom: ",
7878
InterpolationTests.spongebobCharacter(
@@ -350,4 +350,111 @@ extension InterpolationTests {
350350
}
351351
}
352352

353+
354+
#if canImport(FoundationEssentials)
355+
356+
import FoundationEssentials
357+
358+
extension InterpolationTests {
359+
@Test func interpolationDynamic2() {
360+
let context = HTMLContext()
361+
var qualities:String = ""
362+
for quality in context.user.qualities {
363+
qualities += #html(li(quality))
364+
}
365+
let _:String = #html {
366+
html {
367+
head {
368+
meta(charset: context.charset)
369+
title(context.title)
370+
meta(content: context.meta_description, name: "description")
371+
meta(content: context.keywords_string, name: "keywords")
372+
}
373+
body {
374+
h1(context.heading)
375+
div(attributes: [.id(context.desc_id)]) {
376+
p(context.string)
377+
}
378+
h2(context.user.details_heading)
379+
h3(context.user.qualities_heading)
380+
ul(attributes: [.id(context.user.qualities_id)], qualities)
381+
}
382+
}
383+
}
384+
}
385+
386+
package struct HTMLContext {
387+
package let charset:String, title:String, keywords:[String], meta_description:String
388+
package let heading:String, desc_id:String
389+
package let string:String, integer:Int, double:Double, float:Float, boolean:Bool
390+
package let now:Date
391+
package let user:User
392+
393+
package var keywords_string : String {
394+
var s:String = ""
395+
for keyword in keywords {
396+
s += "," + keyword
397+
}
398+
s.removeFirst()
399+
return s
400+
}
401+
402+
package init() {
403+
charset = "utf-8"
404+
title = "DynamicView"
405+
keywords = ["swift", "html", "benchmark"]
406+
meta_description = "This website is to benchmark the performance of different Swift DSL libraries."
407+
408+
heading = "Dynamic HTML Benchmark"
409+
desc_id = "desc"
410+
// 5 paragraphs of lorem ipsum
411+
let lorem_ipsum:String = """
412+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse eget ornare ligula, sit amet pretium justo. Nunc vestibulum sollicitudin sem sed ultricies. Nullam ultrices mattis rutrum. Quisque venenatis lacus non tortor aliquam elementum. Nullam dictum, dolor vel efficitur semper, metus nisi porta elit, in tincidunt nunc eros quis nunc. Aliquam id eros sed leo feugiat aliquet quis eget augue. Praesent molestie quis libero vulputate cursus. Aenean lobortis cursus lacinia. Quisque imperdiet suscipit mi in rutrum. Suspendisse potenti.
413+
414+
In condimentum non turpis non porta. In vehicula rutrum risus eget placerat. Nulla neque quam, dignissim eu luctus at, elementum at nisl. Cras volutpat mi sem, at congue felis pellentesque sed. Sed maximus orci vel enim iaculis condimentum. Integer maximus consectetur arcu quis aliquet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas eget feugiat elit. Maecenas pellentesque, urna at iaculis pretium, diam lectus dapibus est, et fermentum nisl ex vel ligula. Aliquam dignissim dapibus est, nec tincidunt tortor sagittis in. Vestibulum id lacus a nunc auctor ultricies. Praesent ante sapien, ultricies vel lorem id, tempus mollis justo. Curabitur sollicitudin, augue hendrerit suscipit tristique, sem lacus consectetur leo, id eleifend diam tellus sit amet nulla. Etiam metus augue, consequat ut dictum a, aliquet nec neque. Vestibulum gravida vel ligula at interdum. Nam cursus sapien non malesuada lobortis.
415+
416+
Nulla in viverra mauris. Pellentesque non sollicitudin lacus, vitae pharetra neque. Praesent sodales odio nisi, quis condimentum orci ornare a. Aliquam erat volutpat. Maecenas purus mauris, aliquet rutrum metus eget, consectetur fringilla felis. Proin pulvinar tellus nulla, nec iaculis neque venenatis sed. In vel dui quam. Integer aliquam ligula ipsum, mattis commodo quam elementum ut. Aenean tortor neque, blandit fermentum velit ut, rutrum gravida ex.
417+
418+
Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed diam eget nibh semper varius. Phasellus sed feugiat turpis, sit amet pharetra erat. Integer eleifend tortor ut mauris lobortis consequat. Aliquam fermentum mollis fringilla. Morbi et enim in ligula luctus facilisis quis sed leo. Nullam ut suscipit arcu, eu hendrerit eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla maximus tempus dui. In aliquam neque ut urna euismod, vitae ullamcorper nisl fermentum. Integer ac ultricies erat, id volutpat leo. Morbi faucibus tortor at lectus feugiat, quis ultricies lectus dictum. Pellentesque congue blandit ligula, nec convallis lectus volutpat congue. Nam lobortis sapien nec nulla accumsan, a pharetra quam convallis. Donec vulputate rutrum dolor ac cursus. Mauris condimentum convallis malesuada.
419+
420+
Mauris eros quam, dictum id elementum et, pharetra in metus. Quisque fermentum congue risus, accumsan consectetur neque aliquam quis. Vestibulum ipsum massa, euismod faucibus est in, condimentum venenatis risus. Quisque congue vehicula tellus, et dignissim augue accumsan ac. Pellentesque tristique ornare ligula, vitae iaculis dui varius vel. Ut sed sem sed purus facilisis porta quis eu tortor. Donec in vehicula tortor. Sed eget aliquet enim. Mauris tincidunt placerat risus, ut gravida lacus vehicula eget. Curabitur ultrices sapien tortor, eu gravida velit efficitur sed. Suspendisse eu volutpat est, ut bibendum velit. Maecenas mollis sit amet sapien laoreet pulvinar. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi lorem ante, volutpat et accumsan a, fermentum vel metus.
421+
""".replacingOccurrences(of: "\n", with: "")
422+
var string:String = lorem_ipsum
423+
/*for _ in 1..<10 {
424+
string += lorem_ipsum
425+
}*/
426+
self.string = string
427+
428+
integer = 293785
429+
double = 39848.9348019843
430+
float = 616905.2098238
431+
boolean = true
432+
433+
now = Date.now
434+
435+
user = User()
436+
}
437+
}
438+
package struct User {
439+
package let details_heading:String, qualities_heading:String, qualities_id:String
440+
441+
package let id:UInt64, email:String, username:String
442+
package let qualities:[String]
443+
package let comment_ids:Set<Int>
444+
445+
init() {
446+
details_heading = "User Details"
447+
qualities_heading = "Qualities"
448+
qualities_id = "user-qualities"
449+
450+
id = 63821
451+
email = "test@gmail.com"
452+
username = "User \(id)"
453+
qualities = ["funny", "smart", "beautiful", "open-minded", "friendly", "hard-working", "team-player"]
454+
comment_ids = [895823, 293, 2384, 1294, 93, 872341, 2089792, 7823, 504985, 35590]
455+
}
456+
}
457+
}
458+
#endif
459+
353460
#endif

0 commit comments

Comments
 (0)