2024-12-16 09:54:21 +01:00

61 lines
2.1 KiB
Swift

final class PageGenerator {
private let content: Content
private let imageGenerator: ImageGenerator
init(content: Content, imageGenerator: ImageGenerator) {
self.content = content
self.imageGenerator = imageGenerator
}
func makeHeaders(requiredItems: [HeaderFile]) -> [HeaderElement] {
var result = [HeaderElement]()
for item in requiredItems {
guard let header = item.header(content: content) else {
#warning("Add warning on missing file assignment")
continue
}
result.append(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.sorted())
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)
}
}