63 lines
2.2 KiB
Swift
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)
|
|
}
|
|
}
|