Improve header handling for post lists

This commit is contained in:
Christoph Hagen
2025-05-02 10:00:59 +02:00
parent fa2f749b70
commit 26e74d0952
4 changed files with 24 additions and 11 deletions

View File

@@ -95,7 +95,10 @@ extension HeaderElement: Hashable {
extension HeaderElement: Comparable { extension HeaderElement: Comparable {
static func < (lhs: HeaderElement, rhs: HeaderElement) -> Bool { static func < (lhs: HeaderElement, rhs: HeaderElement) -> Bool {
lhs.order < rhs.order guard lhs.order == rhs.order else {
return lhs.order < rhs.order
}
return lhs.content < rhs.content
} }
} }

View File

@@ -11,15 +11,16 @@ final class FeedPageGenerator {
self.results = results self.results = results
} }
private func includeSwiper(in headers: inout Set<HeaderElement>) { private func makeHeaders(requiredItems: Set<KnownHeaderElement>, results: PageGenerationResults) -> Set<HeaderElement> {
if let swiperCss = content.settings.posts.swiperCssFile { var result = content.postPageHeaders
headers.insert(.css(file: swiperCss, order: HeaderElement.swiperCssFileOrder)) for item in requiredItems {
results.require(file: swiperCss) guard let header = item.header(content: content) else {
results.warning("Header \(item) not configured in settings")
continue
} }
if let swiperJs = content.settings.posts.swiperJsFile { result.insert(header)
headers.insert(.js(file: swiperJs, defer: true))
results.require(file: swiperJs)
} }
return result
} }
func generatePage(language: ContentLanguage, func generatePage(language: ContentLanguage,
@@ -33,13 +34,16 @@ final class FeedPageGenerator {
totalPages: Int, totalPages: Int,
languageButtonUrl: String, languageButtonUrl: String,
linkPrefix: String) -> String { linkPrefix: String) -> String {
var headers = content.postPageHeaders
var footer = "" var footer = ""
var requiredHeaders = Set<KnownHeaderElement>()
if posts.contains(where: { $0.requiresSwiper }) { if posts.contains(where: { $0.requiresSwiper }) {
// Sort swiper style sheet before default style sheet // Sort swiper style sheet before default style sheet
includeSwiper(in: &headers) requiredHeaders.formUnion([.swiperJs, .swiperCss])
footer = swiperInitScript(posts: posts) footer = swiperInitScript(posts: posts)
} }
let headers = makeHeaders(requiredItems: requiredHeaders, results: results)
results.require(files: headers.compactMap { $0.requiredFile })
results.require(headers: requiredHeaders)
let iconUrl = content.settings.navigation.localized(in: language).rootUrl let iconUrl = content.settings.navigation.localized(in: language).rootUrl
let languageButton = NavigationBar.Link( let languageButton = NavigationBar.Link(

View File

@@ -116,6 +116,8 @@ final class PostListPageGenerator {
// Includes leading slash // Includes leading slash
let pageUrl = pageUrl(in: language, pageNumber: pageIndex) let pageUrl = pageUrl(in: language, pageNumber: pageIndex)
#warning("Use results for each individual posts page")
let fileContent = feedPageGenerator.generatePage( let fileContent = feedPageGenerator.generatePage(
language: language, language: language,
posts: posts, posts: posts,

View File

@@ -242,6 +242,10 @@ final class PageGenerationResults: ObservableObject {
onMain { self.requiredHeaders.formUnion(headers) } onMain { self.requiredHeaders.formUnion(headers) }
} }
func require<S>(headers: S) where S: Sequence, S.Element == KnownHeaderElement {
onMain { self.requiredHeaders.formUnion(headers) }
}
func require(icon: PageIcon) { func require(icon: PageIcon) {
onMain { self.requiredIcons.insert(icon) } onMain { self.requiredIcons.insert(icon) }
} }