Add tag overview, improve assets

This commit is contained in:
Christoph Hagen
2024-12-15 21:20:12 +01:00
parent 8a3a0f1797
commit 1e67a99866
59 changed files with 1301 additions and 480 deletions

View File

@ -18,13 +18,13 @@ struct ContentPage: HtmlProducer {
private let pageContent: String
private let headers: String
private let headers: [HeaderElement]
private let footers: String
private let icons: Set<PageIcon>
init(language: ContentLanguage, dateString: String, title: String, tags: [FeedEntryData.Tag], linkTitle: String, description: String, navigationBarLinks: [NavigationBar.Link], pageContent: String, headers: String, footers: [String], icons: Set<PageIcon>) {
init(language: ContentLanguage, dateString: String, title: String, tags: [FeedEntryData.Tag], linkTitle: String, description: String, navigationBarLinks: [NavigationBar.Link], pageContent: String, headers: [HeaderElement], footers: [String], icons: Set<PageIcon>) {
self.language = language
self.dateString = dateString
self.title = title
@ -41,7 +41,7 @@ struct ContentPage: HtmlProducer {
func populate(_ result: inout String) {
// TODO: Add headers and footers from page content
result += "<!DOCTYPE html><html lang=\"\(language.rawValue)\">"
result += PageHead(title: title, description: description, additionalHeaders: headers).content
result += PageHead(items: [.charset, .viewport] + headers).content
result += "<body>"
result += NavigationBar(links: navigationBarLinks).content

View File

@ -10,25 +10,25 @@ struct GenericPage {
let links: [NavigationBar.Link]
let additionalHeaders: String
let headers: [HeaderElement]
let additionalFooter: String
let insertedContent: (inout String) -> Void
init(language: ContentLanguage, title: String, description: String, links: [NavigationBar.Link], additionalHeaders: String, additionalFooter: String, insertedContent: @escaping (inout String) -> Void) {
init(language: ContentLanguage, title: String, description: String, links: [NavigationBar.Link], headers: [HeaderElement], additionalFooter: String, insertedContent: @escaping (inout String) -> Void) {
self.language = language
self.title = title
self.description = description
self.links = links
self.additionalHeaders = additionalHeaders
self.headers = headers
self.additionalFooter = additionalFooter
self.insertedContent = insertedContent
}
var content: String {
var result = ""
result += "<!DOCTYPE html><html lang=\"\(language.rawValue)\">"
result += PageHead(title: title, description: description, additionalHeaders: additionalHeaders).content
result += PageHead(items: [.charset, .viewport] + headers).content
result += "<body>"
result += NavigationBar(links: links).content
result += "<div class=\"content\"><div style=\"height: 70px;\"></div>"

View File

@ -1,71 +0,0 @@
import Foundation
struct PageInFeed {
private let swiperStyleSheetPath = "/assets/swiper/swiper-bundle.min.css"
private let swiperJsPath = "/assets/swiper/swiper-bundle.min.js"
let language: ContentLanguage
let title: String
let showTitle: Bool
let description: String
let navigationBarLinks: [NavigationBar.Link]
let pageNumber: Int
let totalPages: Int
let posts: [FeedEntryData]
private var swiperHeader: String {
"<link rel='stylesheet' href='\(swiperStyleSheetPath)' />"
}
private var swiperIsNeeded: Bool {
posts.contains(where: { $0.images.count > 1 })
}
private var headers: String {
swiperIsNeeded ? swiperHeader : ""
}
var content: String {
let footer = swiperIsNeeded ? swiperInits : ""
return GenericPage(
language: language,
title: title,
description: description,
links: navigationBarLinks,
additionalHeaders: headers,
additionalFooter: footer) { content in
if showTitle {
content += "<h1>\(title)</h1>"
}
for post in posts {
content += FeedEntry(data: post).content
}
if totalPages > 1 {
content += PostFeedPageNavigation(currentPage: pageNumber, numberOfPages: totalPages, language: language).content
}
}.content
}
private var swiperInits: String {
var result = "<script src='\(swiperJsPath)'></script><script>"
for post in posts {
guard post.images.count > 1 else {
continue
}
result += ImageGallery.swiperInit(id: post.entryId)
}
result += "</script>"
return result
}
}