Add title suffix, extract HTML elements

Fix header calls
This commit is contained in:
Christoph Hagen 2022-08-28 11:14:11 +02:00
parent 9c74f76650
commit 4036452d2c
8 changed files with 49 additions and 34 deletions

View File

@ -28,6 +28,7 @@
E253C87F28B8FBB00076B6D0 /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E253C87E28B8FBB00076B6D0 /* Data+Extensions.swift */; }; E253C87F28B8FBB00076B6D0 /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E253C87E28B8FBB00076B6D0 /* Data+Extensions.swift */; };
E253C88128B8FBFF0076B6D0 /* NSSize+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E253C88028B8FBFF0076B6D0 /* NSSize+Extensions.swift */; }; E253C88128B8FBFF0076B6D0 /* NSSize+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E253C88028B8FBFF0076B6D0 /* NSSize+Extensions.swift */; };
E253C88328B8FC470076B6D0 /* NSImage+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E253C88228B8FC470076B6D0 /* NSImage+Extensions.swift */; }; E253C88328B8FC470076B6D0 /* NSImage+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E253C88228B8FC470076B6D0 /* NSImage+Extensions.swift */; };
E253C88528BA32FB0076B6D0 /* HTMLElementsGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E253C88428BA32FB0076B6D0 /* HTMLElementsGenerator.swift */; };
E2C5A5D528A0223C00102A25 /* HeaderTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2C5A5D428A0223C00102A25 /* HeaderTemplate.swift */; }; E2C5A5D528A0223C00102A25 /* HeaderTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2C5A5D428A0223C00102A25 /* HeaderTemplate.swift */; };
E2C5A5D728A022C500102A25 /* TemplateFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2C5A5D628A022C500102A25 /* TemplateFactory.swift */; }; E2C5A5D728A022C500102A25 /* TemplateFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2C5A5D628A022C500102A25 /* TemplateFactory.swift */; };
E2C5A5D928A023FA00102A25 /* PageHeadTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2C5A5D828A023FA00102A25 /* PageHeadTemplate.swift */; }; E2C5A5D928A023FA00102A25 /* PageHeadTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2C5A5D828A023FA00102A25 /* PageHeadTemplate.swift */; };
@ -88,6 +89,7 @@
E253C87E28B8FBB00076B6D0 /* Data+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Extensions.swift"; sourceTree = "<group>"; }; E253C87E28B8FBB00076B6D0 /* Data+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Extensions.swift"; sourceTree = "<group>"; };
E253C88028B8FBFF0076B6D0 /* NSSize+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSSize+Extensions.swift"; sourceTree = "<group>"; }; E253C88028B8FBFF0076B6D0 /* NSSize+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSSize+Extensions.swift"; sourceTree = "<group>"; };
E253C88228B8FC470076B6D0 /* NSImage+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSImage+Extensions.swift"; sourceTree = "<group>"; }; E253C88228B8FC470076B6D0 /* NSImage+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSImage+Extensions.swift"; sourceTree = "<group>"; };
E253C88428BA32FB0076B6D0 /* HTMLElementsGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTMLElementsGenerator.swift; sourceTree = "<group>"; };
E2C5A5D428A0223C00102A25 /* HeaderTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderTemplate.swift; sourceTree = "<group>"; }; E2C5A5D428A0223C00102A25 /* HeaderTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderTemplate.swift; sourceTree = "<group>"; };
E2C5A5D628A022C500102A25 /* TemplateFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateFactory.swift; sourceTree = "<group>"; }; E2C5A5D628A022C500102A25 /* TemplateFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TemplateFactory.swift; sourceTree = "<group>"; };
E2C5A5D828A023FA00102A25 /* PageHeadTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageHeadTemplate.swift; sourceTree = "<group>"; }; E2C5A5D828A023FA00102A25 /* PageHeadTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageHeadTemplate.swift; sourceTree = "<group>"; };
@ -180,6 +182,7 @@
E22E87A7289F0E7B00E51191 /* PageGenerator.swift */, E22E87A7289F0E7B00E51191 /* PageGenerator.swift */,
E22E879D289EFDFC00E51191 /* OverviewPageGenerator.swift */, E22E879D289EFDFC00E51191 /* OverviewPageGenerator.swift */,
E2F8FA1D28A539C500632026 /* MarkdownProcessor.swift */, E2F8FA1D28A539C500632026 /* MarkdownProcessor.swift */,
E253C88428BA32FB0076B6D0 /* HTMLElementsGenerator.swift */,
); );
path = Generators; path = Generators;
sourceTree = "<group>"; sourceTree = "<group>";
@ -325,6 +328,7 @@
E2C5A5D728A022C500102A25 /* TemplateFactory.swift in Sources */, E2C5A5D728A022C500102A25 /* TemplateFactory.swift in Sources */,
E22E8772289D8C2700E51191 /* IndexPageGenerator.swift in Sources */, E22E8772289D8C2700E51191 /* IndexPageGenerator.swift in Sources */,
E2F8FA3A28AE313A00632026 /* ValidationLog.swift in Sources */, E2F8FA3A28AE313A00632026 /* ValidationLog.swift in Sources */,
E253C88528BA32FB0076B6D0 /* HTMLElementsGenerator.swift in Sources */,
E2C5A5D528A0223C00102A25 /* HeaderTemplate.swift in Sources */, E2C5A5D528A0223C00102A25 /* HeaderTemplate.swift in Sources */,
E22E876C289D855D00E51191 /* ThumbnailStyle.swift in Sources */, E22E876C289D855D00E51191 /* ThumbnailStyle.swift in Sources */,
E2F8FA2D28AD2F5300632026 /* GenericMetadata.swift in Sources */, E2F8FA2D28AD2F5300632026 /* GenericMetadata.swift in Sources */,

View File

@ -0,0 +1,12 @@
import Foundation
struct HTMLElementsGenerator {
init() {
}
func make(title: String, suffix: String) -> String {
"\(title)<span class=\"suffix\">\(suffix)</span>"
}
}

View File

@ -20,7 +20,7 @@ struct IndexPageGenerator {
content[.head] = factory.pageHead.generate(page: site, language: language) content[.head] = factory.pageHead.generate(page: site, language: language)
content[.topBar] = factory.topBar.generate(sectionUrl: nil, languageButton: languageButton) content[.topBar] = factory.topBar.generate(sectionUrl: nil, languageButton: languageButton)
content[.contentClass] = "overview" content[.contentClass] = "overview"
content[.header] = makeHeader(localized: localized) content[.header] = makeHeader(page: site, metadata: localized, language: language)
content[.content] = factory.overviewSection.generate( content[.content] = factory.overviewSection.generate(
sections: site.elements, sections: site.elements,
in: site, in: site,
@ -33,12 +33,8 @@ struct IndexPageGenerator {
log.add(info: "Generated \(url.lastPathComponent)", source: site.path) log.add(info: "Generated \(url.lastPathComponent)", source: site.path)
} }
private func makeHeader(localized: Element.LocalizedMetadata) -> String { private func makeHeader(page: Element, metadata: Element.LocalizedMetadata, language: String) -> String {
var content = [HeaderKey : String]() let content = factory.makeHeaderContent(page: page, metadata: metadata, language: language)
content[.title] = localized.title
#warning("Add title suffix")
content[.subtitle] = localized.subtitle
content[.titleText] = localized.description
return factory.factory.centeredHeader.generate(content) return factory.factory.centeredHeader.generate(content)
} }
} }

View File

@ -24,7 +24,7 @@ struct OverviewPageGenerator {
sectionUrl: section.sectionUrl(for: language), sectionUrl: section.sectionUrl(for: language),
languageButton: languageButton) languageButton: languageButton)
content[.contentClass] = "overview" content[.contentClass] = "overview"
content[.header] = makeHeader(metadata: metadata, language: language, backText: backLinkText) content[.header] = makeHeader(page: section, metadata: metadata, language: language)
content[.content] = makeContent(section: section, language: language) content[.content] = makeContent(section: section, language: language)
content[.footer] = section.customFooterContent() content[.footer] = section.customFooterContent()
guard factory.page.generate(content, to: url) else { guard factory.page.generate(content, to: url) else {
@ -45,15 +45,8 @@ struct OverviewPageGenerator {
} }
} }
private func makeHeader(metadata: Element.LocalizedMetadata, private func makeHeader(page: Element, metadata: Element.LocalizedMetadata, language: String) -> String {
language: String, let content = factory.makeHeaderContent(page: page, metadata: metadata, language: language)
backText: String?) -> String {
var content = [HeaderKey : String]()
content[.title] = metadata.title
#warning("Add title suffix")
content[.subtitle] = metadata.subtitle
content[.titleText] = metadata.description
content[.backLink] = backText.unwrapped { factory.makeBackLink(text: $0, language: language) }
return factory.factory.centeredHeader.generate(content) return factory.factory.centeredHeader.generate(content)
} }
} }

View File

@ -61,21 +61,8 @@ 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 backText = page.backLinkText(for: language) let content = factory.makeHeaderContent(page: page, metadata: metadata, language: language)
var content = [HeaderKey : String]()
content[.backLink] = factory.makeBackLink(text: backText, language: language)
if let suffix = metadata.titleSuffix {
content[.title] = make(title: metadata.title, suffix: suffix)
} else {
content[.title] = metadata.title
}
content[.subtitle] = metadata.subtitle
content[.date] = factory.makeDateString(start: page.date, end: page.endDate)
return factory.factory.leftHeader.generate(content) return factory.factory.leftHeader.generate(content)
} }
private func make(title: String, suffix: String) -> String {
"\(title)<span class=\"suffix\">\(suffix)</span>"
}
} }

View File

@ -16,7 +16,7 @@ struct ThumbnailListGenerator {
private func itemContent(_ item: Element, parent: Element, language: String, style: ThumbnailStyle) -> String { private func itemContent(_ item: Element, parent: Element, language: String, style: ThumbnailStyle) -> String {
let fullThumbnailPath = item.thumbnailFilePath(for: language) let fullThumbnailPath = item.thumbnailFilePath(for: language)
let relativeImageUrl = parent.relativePathToFileWithPath(fullThumbnailPath) let relativeImageUrl = parent.relativePathToFileWithPath(fullThumbnailPath)
let metadata = item.localized(for: language)
var content = [ThumbnailKey : String]() var content = [ThumbnailKey : String]()
if item.state.hasThumbnailLink { if item.state.hasThumbnailLink {
@ -27,8 +27,11 @@ struct ThumbnailListGenerator {
} }
content[.image] = relativeImageUrl content[.image] = relativeImageUrl
content[.title] = item.title(for: language) if style == .large, let suffix = metadata.thumbnailSuffix {
#warning("Generate thumbnail suffix") content[.title] = factory.html.make(title: metadata.title, suffix: suffix)
} else {
content[.title] = metadata.title
}
content[.image2x] = relativeImageUrl.insert("@2x", beforeLast: ".") content[.image2x] = relativeImageUrl.insert("@2x", beforeLast: ".")
content[.corner] = item.cornerText(for: language).unwrapped { content[.corner] = item.cornerText(for: language).unwrapped {
factory.largeThumbnail.makeCorner(text: $0) factory.largeThumbnail.makeCorner(text: $0)

View File

@ -142,5 +142,20 @@ struct LocalizedSiteTemplate {
return fullDateFormatter.string(from: start) return fullDateFormatter.string(from: start)
.insert(" - \(day.string(from: end))", beforeLast: ",") .insert(" - \(day.string(from: end))", beforeLast: ",")
} }
func makeHeaderContent(page: Element, metadata: Element.LocalizedMetadata, language: String) -> [HeaderKey : String] {
let backText = page.backLinkText(for: language)
var content = [HeaderKey : String]()
content[.backLink] = makeBackLink(text: backText, language: language)
if let suffix = metadata.titleSuffix {
content[.title] = factory.html.make(title: metadata.title, suffix: suffix)
} else {
content[.title] = metadata.title
}
content[.subtitle] = metadata.subtitle
content[.date] = makeDateString(start: page.date, end: page.endDate)
return content
}
} }

View File

@ -51,6 +51,10 @@ final class TemplateFactory {
let video: PageVideoTemplate let video: PageVideoTemplate
// MARK: HTML
let html: HTMLElementsGenerator
// MARK: Init // MARK: Init
init(templateFolder: URL) throws { init(templateFolder: URL) throws {
@ -69,5 +73,6 @@ final class TemplateFactory {
self.page = try .init(in: templateFolder) self.page = try .init(in: templateFolder)
self.image = try .init(in: templateFolder) self.image = try .init(in: templateFolder)
self.video = try .init(in: templateFolder) self.video = try .init(in: templateFolder)
self.html = .init()
} }
} }