90 lines
2.6 KiB
Swift
90 lines
2.6 KiB
Swift
import Foundation
|
|
|
|
final class FeedPageGenerator {
|
|
|
|
let content: Content
|
|
|
|
init(content: Content) {
|
|
self.content = content
|
|
}
|
|
|
|
func navigationBar(in language: ContentLanguage) -> [NavigationBar.Link] {
|
|
content.settings.navigationItems.map {
|
|
.init(text: $0.title(in: language),
|
|
url: $0.absoluteUrl(in: language))
|
|
}
|
|
}
|
|
|
|
var swiperIncludes: [HeaderElement] {
|
|
var result = [HeaderElement]()
|
|
if let swiperCss = content.settings.posts.swiperCssFile {
|
|
result.append(.css(swiperCss))
|
|
} else {
|
|
#warning("Add warning message")
|
|
}
|
|
if let swiperJs = content.settings.posts.swiperJsFile {
|
|
result.append(.js(file: swiperJs, defer: true))
|
|
} else {
|
|
#warning("Add warning message")
|
|
}
|
|
return result
|
|
}
|
|
|
|
var defaultHeaders: [HeaderElement] {
|
|
if let header = content.settings.posts.defaultCssFile {
|
|
return [.css(header)]
|
|
} else {
|
|
#warning("Add warning message")
|
|
return []
|
|
}
|
|
}
|
|
|
|
func generatePage(language: ContentLanguage,
|
|
posts: [FeedEntryData],
|
|
title: String,
|
|
description: String,
|
|
showTitle: Bool,
|
|
pageNumber: Int,
|
|
totalPages: Int) -> String {
|
|
var headers = defaultHeaders
|
|
var footer = ""
|
|
if posts.contains(where: { $0.images.count > 1 }) {
|
|
headers += swiperIncludes
|
|
footer = swiperInitScript(posts: posts)
|
|
}
|
|
|
|
let page = GenericPage(
|
|
language: language,
|
|
title: title,
|
|
description: description,
|
|
links: navigationBar(in: language),
|
|
headers: headers,
|
|
additionalFooter: footer) { content in
|
|
if showTitle {
|
|
content += "<h1>\(title)</h1>"
|
|
}
|
|
for post in posts {
|
|
content += FeedEntry(data: post).content
|
|
}
|
|
if totalPages > 1 {
|
|
content += PostFeedPageNavigation(currentPage: pageNumber, numberOfPages: totalPages, language: language).content
|
|
}
|
|
|
|
}
|
|
return page.content
|
|
}
|
|
|
|
func swiperInitScript(posts: [FeedEntryData]) -> String {
|
|
var result = "<script>"
|
|
for post in posts {
|
|
guard post.images.count > 1 else {
|
|
continue
|
|
}
|
|
result += ImageGallery.swiperInit(id: post.entryId)
|
|
}
|
|
result += "</script>"
|
|
return result
|
|
|
|
}
|
|
}
|