Improve header handling for post lists
This commit is contained in:
@@ -95,7 +95,10 @@ extension HeaderElement: Hashable {
|
|||||||
extension HeaderElement: Comparable {
|
extension HeaderElement: Comparable {
|
||||||
|
|
||||||
static func < (lhs: HeaderElement, rhs: HeaderElement) -> Bool {
|
static func < (lhs: HeaderElement, rhs: HeaderElement) -> Bool {
|
||||||
lhs.order < rhs.order
|
guard lhs.order == rhs.order else {
|
||||||
|
return lhs.order < rhs.order
|
||||||
|
}
|
||||||
|
return lhs.content < rhs.content
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -11,15 +11,16 @@ final class FeedPageGenerator {
|
|||||||
self.results = results
|
self.results = results
|
||||||
}
|
}
|
||||||
|
|
||||||
private func includeSwiper(in headers: inout Set<HeaderElement>) {
|
private func makeHeaders(requiredItems: Set<KnownHeaderElement>, results: PageGenerationResults) -> Set<HeaderElement> {
|
||||||
if let swiperCss = content.settings.posts.swiperCssFile {
|
var result = content.postPageHeaders
|
||||||
headers.insert(.css(file: swiperCss, order: HeaderElement.swiperCssFileOrder))
|
for item in requiredItems {
|
||||||
results.require(file: swiperCss)
|
guard let header = item.header(content: content) else {
|
||||||
}
|
results.warning("Header \(item) not configured in settings")
|
||||||
if let swiperJs = content.settings.posts.swiperJsFile {
|
continue
|
||||||
headers.insert(.js(file: swiperJs, defer: true))
|
}
|
||||||
results.require(file: swiperJs)
|
result.insert(header)
|
||||||
}
|
}
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func generatePage(language: ContentLanguage,
|
func generatePage(language: ContentLanguage,
|
||||||
@@ -33,13 +34,16 @@ final class FeedPageGenerator {
|
|||||||
totalPages: Int,
|
totalPages: Int,
|
||||||
languageButtonUrl: String,
|
languageButtonUrl: String,
|
||||||
linkPrefix: String) -> String {
|
linkPrefix: String) -> String {
|
||||||
var headers = content.postPageHeaders
|
|
||||||
var footer = ""
|
var footer = ""
|
||||||
|
var requiredHeaders = Set<KnownHeaderElement>()
|
||||||
if posts.contains(where: { $0.requiresSwiper }) {
|
if posts.contains(where: { $0.requiresSwiper }) {
|
||||||
// Sort swiper style sheet before default style sheet
|
// Sort swiper style sheet before default style sheet
|
||||||
includeSwiper(in: &headers)
|
requiredHeaders.formUnion([.swiperJs, .swiperCss])
|
||||||
footer = swiperInitScript(posts: posts)
|
footer = swiperInitScript(posts: posts)
|
||||||
}
|
}
|
||||||
|
let headers = makeHeaders(requiredItems: requiredHeaders, results: results)
|
||||||
|
results.require(files: headers.compactMap { $0.requiredFile })
|
||||||
|
results.require(headers: requiredHeaders)
|
||||||
|
|
||||||
let iconUrl = content.settings.navigation.localized(in: language).rootUrl
|
let iconUrl = content.settings.navigation.localized(in: language).rootUrl
|
||||||
let languageButton = NavigationBar.Link(
|
let languageButton = NavigationBar.Link(
|
||||||
|
@@ -116,6 +116,8 @@ final class PostListPageGenerator {
|
|||||||
// Includes leading slash
|
// Includes leading slash
|
||||||
let pageUrl = pageUrl(in: language, pageNumber: pageIndex)
|
let pageUrl = pageUrl(in: language, pageNumber: pageIndex)
|
||||||
|
|
||||||
|
#warning("Use results for each individual posts page")
|
||||||
|
|
||||||
let fileContent = feedPageGenerator.generatePage(
|
let fileContent = feedPageGenerator.generatePage(
|
||||||
language: language,
|
language: language,
|
||||||
posts: posts,
|
posts: posts,
|
||||||
|
@@ -242,6 +242,10 @@ final class PageGenerationResults: ObservableObject {
|
|||||||
onMain { self.requiredHeaders.formUnion(headers) }
|
onMain { self.requiredHeaders.formUnion(headers) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func require<S>(headers: S) where S: Sequence, S.Element == KnownHeaderElement {
|
||||||
|
onMain { self.requiredHeaders.formUnion(headers) }
|
||||||
|
}
|
||||||
|
|
||||||
func require(icon: PageIcon) {
|
func require(icon: PageIcon) {
|
||||||
onMain { self.requiredIcons.insert(icon) }
|
onMain { self.requiredIcons.insert(icon) }
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user