final class PageGenerator { private let content: Content init(content: Content) { self.content = content } private func makeHeaders(requiredItems: Set) -> Set { 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, results: PageGenerationResults) -> String? { let contentGenerator = PageContentParser( content: content, language: language, results: results) guard let rawPageContent = content.storage.pageContent(for: page.id, language: language) else { return nil } let pageContent = contentGenerator.generatePage(from: rawPageContent) 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: results.requiredHeaders) results.require(files: headers.compactMap { $0.file }) 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: results.requiredFooters.sorted(), icons: results.requiredIcons) .content return fullPage } }