final class PageGenerator { private let content: Content private let imageGenerator: ImageGenerator private let navigationBarLinks: [NavigationBar.Link] init(content: Content, imageGenerator: ImageGenerator, navigationBarLinks: [NavigationBar.Link]) { self.content = content self.imageGenerator = imageGenerator self.navigationBarLinks = navigationBarLinks } 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 = AdditionalPageHeaders( headers: contentGenerator.results.requiredHeaders, assetPath: content.settings.pages.javascriptFilesPath) let fullPage = ContentPage( language: language, dateString: page.dateText(in: language), title: localized.title, tags: tags, linkTitle: localized.linkPreviewTitle ?? localized.title, description: localized.linkPreviewDescription ?? "", navigationBarLinks: navigationBarLinks, pageContent: pageContent, headers: headers.content, footers: contentGenerator.results.requiredFooters.sorted()) .content return (fullPage, contentGenerator.results) } }