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) } }