Add labels to posts

This commit is contained in:
Christoph Hagen
2025-01-26 20:32:44 +01:00
parent 06b4c1ed76
commit 42fa08b43d
15 changed files with 273 additions and 30 deletions

View File

@ -1,12 +1,5 @@
struct ContentLabel {
let icon: PageIcon
let value: String
}
struct ContentLabels {
struct ContentLabels: HtmlProducer {
private let labels: [ContentLabel]
@ -14,15 +7,14 @@ struct ContentLabels {
self.labels = labels
}
var content: String {
func populate(_ result: inout String) {
guard !labels.isEmpty else {
return ""
return
}
var result = "<div class='labels-container'>"
result += "<div class='labels-container'>"
for label in labels {
result += "<div><svg><use href='#\(label.icon.icon.name)'></use></svg>\(label.value)</div>"
}
result += "</div>"
return result
}
}

View File

@ -0,0 +1,15 @@
protocol HtmlProducer {
func populate(_ result: inout String)
}
extension HtmlProducer {
var content: String {
var result = ""
populate(&result)
return result
}
}

View File

@ -84,6 +84,14 @@ enum PageIcon: String, CaseIterable {
case .leftRightArrow:return Icon.LeftRightArrow.self
}
}
var svgString: String {
icon.content
}
var name: String {
icon.name
}
}
extension PageIcon: Hashable {

View File

@ -1,17 +1,3 @@
protocol HtmlProducer {
func populate(_ result: inout String)
}
extension HtmlProducer {
var content: String {
var result = ""
populate(&result)
return result
}
}
struct TagList: HtmlProducer {
let tags: [FeedEntryData.Tag]

View File

@ -32,7 +32,8 @@ struct FeedEntry {
if let title = data.title {
result += "<h2>\(title.htmlEscaped())</h2>"
}
result += TagList(tags: data.tags).content
TagList(tags: data.tags).populate(&result)
ContentLabels(labels: data.labels).populate(&result)
for paragraph in data.text {
result += "<p>\(paragraph)</p>"

View File

@ -11,16 +11,19 @@ struct FeedEntryData {
let tags: [Tag]
let labels: [ContentLabel]
let text: [String]
let media: Media?
init(entryId: String, title: String?, textAboveTitle: String, link: Link?, tags: [Tag], text: [String], media: Media?) {
init(entryId: String, title: String?, textAboveTitle: String, link: Link?, tags: [Tag], labels: [ContentLabel], text: [String], media: Media?) {
self.entryId = entryId
self.title = title
self.textAboveTitle = textAboveTitle
self.link = link
self.tags = tags
self.labels = labels
self.text = text
self.media = media
}