2024-12-16 15:36:58 +01:00

63 lines
2.2 KiB
Swift

final class PageGenerator {
private let content: Content
private let imageGenerator: ImageGenerator
init(content: Content, imageGenerator: ImageGenerator) {
self.content = content
self.imageGenerator = imageGenerator
}
private func makeHeaders(requiredItems: Set<KnownHeaderElement>) -> Set<HeaderElement> {
var result = content.defaultPageHeaders
for item in requiredItems {
guard let header = item.header(content: content) else {
print("Missing header \(item)")
#warning("Add warning on missing file assignment")
continue
}
result.insert(header)
}
return result
}
func generate(page: Page, language: ContentLanguage) throws -> (page: String, results: PageGenerationResults) {
let contentGenerator = PageContentParser(
content: content,
language: language)
let rawPageContent = try content.storage.pageContent(for: page.id, language: language)
let pageContent = contentGenerator.generatePage(from: rawPageContent)
contentGenerator.requestImages(imageGenerator)
let localized = page.localized(in: language)
let tags: [FeedEntryData.Tag] = page.tags.map { tag in
.init(name: tag.localized(in: language).name,
url: content.absoluteUrlToTag(tag, language: language))
}
let headers = makeHeaders(requiredItems: contentGenerator.results.requiredHeaders)
print("Headers for page: \(headers)")
let fullPage = ContentPage(
language: language,
dateString: page.dateText(in: language),
title: localized.title,
tags: tags,
linkTitle: localized.linkPreviewTitle ?? localized.title,
description: localized.linkPreviewDescription ?? "",
navigationBarLinks: content.navigationBar(in: language),
pageContent: pageContent,
headers: headers,
footers: contentGenerator.results.requiredFooters.sorted(),
icons: contentGenerator.results.requiredIcons)
.content
return (fullPage, contentGenerator.results)
}
}