Allow header selection for pages

This commit is contained in:
Christoph Hagen
2022-09-04 20:36:43 +02:00
parent a7e7bc21fc
commit 1c13f4fc60
6 changed files with 65 additions and 20 deletions

View File

@@ -102,12 +102,13 @@ struct Element {
let overviewItemCount: Int
/**
Indicate that no header should be generated automatically.
Indicate the header type to be generated automatically.
This option assumes that custom header code is present in the page source files
- Note: If not specified, this property defaults to `false`.
If this option is set to `none`, then custom header code should be present in the page source files
- Note: If not specified, this property defaults to `left`.
- Note: Overview pages are always using `center`.
*/
let useCustomHeader: Bool
let headerType: HeaderType
/**
The localized metadata for each language.
@@ -162,13 +163,16 @@ struct Element {
self.thumbnailStyle = log.unused(metadata.thumbnailStyle, "thumbnailStyle", source: source) ?? .large
self.useManualSorting = log.unused(metadata.useManualSorting, "useManualSorting", source: source) ?? true
self.overviewItemCount = metadata.overviewItemCount ?? Element.overviewItemCountDefault
self.useCustomHeader = metadata.useCustomHeader ?? false
self.headerType = log.headerType(metadata.headerType, source: source)
self.languages = log.required(metadata.languages, name: "languages", source: source)?
.compactMap { language in
.init(atRoot: folder, data: language)
} ?? []
// All properties initialized
guard !languages.isEmpty else {
log.add(error: "No languages found", source: source)
return nil
}
files.add(page: path, id: id)
try self.readElements(in: folder, source: nil)
@@ -214,9 +218,10 @@ struct Element {
log.add(warning: "Set 'endDate', but no 'date'", source: source)
}
}
self.state = log.state(metadata.state, source: source)
let state = log.state(metadata.state, source: source)
self.state = state
self.sortIndex = metadata.sortIndex.ifNil {
if parent.useManualSorting {
if state != .hidden, parent.useManualSorting {
log.add(error: "No 'sortIndex', but parent defines 'useManualSorting' = true", source: source)
}
}
@@ -226,7 +231,7 @@ struct Element {
self.thumbnailStyle = log.thumbnailStyle(metadata.thumbnailStyle, source: source)
self.useManualSorting = metadata.useManualSorting ?? false
self.overviewItemCount = metadata.overviewItemCount ?? parent.overviewItemCount
self.useCustomHeader = metadata.useCustomHeader ?? false
self.headerType = log.headerType(metadata.headerType, source: source)
self.languages = parent.languages.compactMap { parentData in
guard let data = metadata.languages?.first(where: { $0.language == parentData.language }) else {
log.add(info: "Language '\(parentData.language)' not found", source: source)

View File

@@ -101,12 +101,13 @@ struct GenericMetadata {
let overviewItemCount: Int?
/**
Indicate that no header should be generated automatically.
Indicate the header type to be generated automatically.
This option assumes that custom header code is present in the page source files
- Note: If not specified, this property defaults to `false`.
If this option is set to `none`, then custom header code should be present in the page source files
- Note: If not specified, this property defaults to `left`.
- Note: Overview pages are always using `center`.
*/
let useCustomHeader: Bool?
let headerType: String?
/**
The localized metadata for each language.
@@ -130,7 +131,7 @@ extension GenericMetadata: Codable {
.thumbnailStyle,
.useManualSorting,
.overviewItemCount,
.useCustomHeader,
.headerType,
.languages,
]
}
@@ -200,7 +201,7 @@ extension GenericMetadata {
thumbnailStyle: "",
useManualSorting: false,
overviewItemCount: 6,
useCustomHeader: false,
headerType: "left",
languages: [.full])
}
}

View File

@@ -0,0 +1,19 @@
import Foundation
enum HeaderType: String {
/**
The standard page header, left-aligned
*/
case left
/**
The standard overview header, centered
*/
case center
/**
The element provides it's own header, so don't generate any.
*/
case none
}

View File

@@ -93,6 +93,17 @@ final class ValidationLog {
return state
}
func headerType(_ raw: String?, source: String) -> HeaderType {
guard let raw = raw else {
return .left
}
guard let type = HeaderType(rawValue: raw) else {
add(warning: "Invalid 'headerType' '\(raw)', using 'left'", source: source)
return .left
}
return type
}
func thumbnailStyle(_ raw: String?, source: String) -> ThumbnailStyle {
guard let raw = raw else {
return .large

View File

@@ -33,9 +33,7 @@ struct PageGenerator {
content[.topBar] = factory.topBar.generate(sectionUrl: sectionUrl, languageButton: nextLanguage, page: page)
content[.contentClass] = "content"
if !page.useCustomHeader {
content[.header] = makeHeader(page: page, metadata: metadata, language: language)
}
content[.header] = makeHeader(page: page, metadata: metadata, language: language)
content[.content] = pageContent
content[.previousPageLinkText] = previousPage.unwrapped { factory.factory.html.makePrevText($0.text) }
content[.previousPageUrl] = previousPage?.link
@@ -74,9 +72,16 @@ struct PageGenerator {
}
}
private func makeHeader(page: Element, metadata: Element.LocalizedMetadata, language: String) -> String {
private func makeHeader(page: Element, metadata: Element.LocalizedMetadata, language: String) -> String? {
let content = factory.makeHeaderContent(page: page, metadata: metadata, language: language)
return factory.factory.leftHeader.generate(content)
switch page.headerType {
case .none:
return nil
case .left:
return factory.factory.leftHeader.generate(content)
case .center:
return factory.factory.centeredHeader.generate(content)
}
}
}