import Foundation struct OverviewSectionGenerator { private let multipleSectionsTemplate: OverviewSectionTemplate private let singleSectionsTemplate: OverviewSectionCleanTemplate private let generator: ThumbnailListGenerator init(factory: TemplateFactory) { self.multipleSectionsTemplate = factory.overviewSection self.singleSectionsTemplate = factory.overviewSectionClean self.generator = ThumbnailListGenerator(factory: factory) } func generate(sections: [Element], in parent: Element, language: String, sectionItemCount: Int) -> String { sections.map { section in let metadata = section.localized(for: language) let fullUrl = section.fullPageUrl(for: language) let relativeUrl = parent.relativePathToFileWithPath(fullUrl) var content = [OverviewSectionTemplate.Key : String]() content[.url] = relativeUrl content[.title] = metadata.title content[.items] = sectionContent(section: section, in: parent, language: language, shownItemCount: sectionItemCount) content[.more] = metadata.moreLinkText return multipleSectionsTemplate.generate(content) } .joined(separator: "\n") } func generate(section: Element, language: String) -> String { var content = [OverviewSectionCleanTemplate.Key : String]() content[.items] = sectionContent(section: section, in: section, language: language, shownItemCount: nil) return singleSectionsTemplate.generate(content) } private func sectionContent(section: Element, in parent: Element, language: String, shownItemCount: Int?) -> String { let sectionItems: [Element] if let shownItemCount = shownItemCount { sectionItems = Array(section.sortedItems.prefix(shownItemCount)) } else { sectionItems = section.sortedItems } return generator.generateContent( items: sectionItems, parent: parent, language: language, style: section.thumbnailStyle) } }