2025-01-17 23:24:56 +01:00

94 lines
3.1 KiB
Swift

import Foundation
final class FeedPageGenerator {
let results: PageGenerationResults
let content: Content
init(content: Content, results: PageGenerationResults) {
self.content = content
self.results = results
}
private func includeSwiper(in headers: inout Set<HeaderElement>) {
if let swiperCss = content.settings.posts.swiperCssFile {
headers.insert(.css(file: swiperCss, order: HeaderElement.swiperCssFileOrder))
results.require(file: swiperCss)
}
if let swiperJs = content.settings.posts.swiperJsFile {
headers.insert(.js(file: swiperJs, defer: true))
results.require(file: swiperJs)
}
}
func generatePage(language: ContentLanguage,
posts: [FeedEntryData],
title: String?,
description: String?,
image: FileResource?,
pageUrl: String,
pageTitle: String?,
pageNumber: Int,
totalPages: Int,
languageButtonUrl: String,
linkPrefix: String) -> String {
var headers = content.postPageHeaders
var footer = ""
if posts.contains(where: { $0.requiresSwiper }) {
// Sort swiper style sheet before default style sheet
includeSwiper(in: &headers)
footer = swiperInitScript(posts: posts)
}
let iconUrl = content.settings.navigation.localized(in: language).rootUrl
let languageButton = NavigationBar.Link(
text: language.next.rawValue,
url: languageButtonUrl)
let imageUrl = image?.linkPreviewImage(results: results)
let pageHeader = PageHeader(
language: language,
title: title ?? pageTitle,
description: description,
image: imageUrl,
pageUrl: pageUrl,
iconUrl: iconUrl,
languageButton: languageButton,
links: content.navigationBar(in: language),
headers: headers,
icons: [])
let page = GenericPage(
header: pageHeader,
additionalFooter: footer) { content in
if let pageTitle {
content += "<h1 class='separated-headline'>\(pageTitle)</h1>"
}
for post in posts {
content += FeedEntry(data: post).content
}
if totalPages > 1 {
content += PostFeedPageNavigation(
linkPrefix: linkPrefix,
currentPage: pageNumber,
numberOfPages: totalPages).content
}
}
return page.content
}
func swiperInitScript(posts: [FeedEntryData]) -> String {
var result = "<script> window.onload = () => { "
for post in posts {
guard post.requiresSwiper else {
continue
}
result += ImageGallery.swiperInit(id: post.entryId)
}
result += "}; </script>"
return result
}
}