Update generation

- Move to global objects for files and validation
- Only write changed files
- Check images for changes before scaling
- Simplify code
This commit is contained in:
Christoph Hagen
2022-08-26 17:40:51 +02:00
parent 91d5bcb66d
commit 80d3c08a93
54 changed files with 1344 additions and 2419 deletions

View File

@ -2,7 +2,7 @@ import Foundation
protocol ThumbnailTemplate {
func generate(_ content: [ThumbnailKey : String], shouldIndent: Bool) throws -> String
func generate(_ content: [ThumbnailKey : String], shouldIndent: Bool) -> String
}
enum ThumbnailKey: String, CaseIterable {

View File

@ -31,27 +31,14 @@ struct LocalizedSiteTemplate {
topBar.language
}
// MARK: Thumbnails
func thumbnail(style: ThumbnailStyle) -> ThumbnailTemplate {
switch style {
case .large:
return factory.largeThumbnail
case .square:
return factory.squareThumbnail
case .small:
return factory.smallThumbnail
}
}
// MARK: Pages
var page: PageTemplate {
factory.page
}
init(factory: TemplateFactory, language: String, site: Site, files: FileProcessor) throws {
self.author = site.metadata.author
init(factory: TemplateFactory, language: String, site: Element) throws {
self.author = site.author
self.factory = factory
let df = DateFormatter()
@ -70,28 +57,23 @@ struct LocalizedSiteTemplate {
df3.locale = Locale(identifier: language)
self.day = df3
let metadata = site.localized(for: language)
let sections = site.elements.map {
PrefilledTopBarTemplate.SectionInfo(
id: $0.sectionId,
name: $0.title(for: language),
url: "\($0.path)/\(language).html")
}
let metadata = site.localized(for: language)
let title = site.metadata.topBarTitle ?? metadata.linkPreviewTitle
self.topBar = try .init(
template: factory.topBar,
language: language,
sections: sections,
topBarWebsiteTitle: title)
topBarWebsiteTitle: site.topBarTitle)
self.pageHead = PageHeadGenerator(
factory: factory,
files: files)
factory: factory)
self.overviewSection = OverviewSectionGenerator(
factory: factory,
files: files)
factory: factory)
self.placeholder = factory.placeholder.generate([
.title: metadata.placeholderTitle,
@ -108,8 +90,6 @@ struct LocalizedSiteTemplate {
return backNavigation.generate(content)
}
#warning("Move HTML code to single location")
func makePrevText(_ text: String) -> String {
"<span class=\"icon-back\"></span>\(text)"
}
@ -118,7 +98,10 @@ struct LocalizedSiteTemplate {
"\(text)<span class=\"icon-next\"></span>"
}
func makeDateString(start: Date, end: Date?) -> String {
func makeDateString(start: Date?, end: Date?) -> String {
guard let start = start else {
return ""
}
guard let end = end else {
return fullDateFormatter.string(from: start)
}

View File

@ -17,19 +17,19 @@ struct PrefilledTopBarTemplate {
self.topBarWebsiteTitle = topBarWebsiteTitle
}
func generate(section: String?, languageButton: String?) -> String {
func generate(sectionUrl: String?, languageButton: String?) -> String {
var content = [TopBarTemplate.Key : String]()
content[.title] = topBarWebsiteTitle
content[.titleLink] = topBarWebsiteTitle(language: language)
content[.elements] = elements(activeSection: section)
content[.elements] = elements(activeSectionUrl: sectionUrl)
content[.languageButton] = languageButton.unwrapped(topBarLanguageButton) ?? ""
return topBar.generate(content)
}
private func elements(activeSection: String?) -> String {
private func elements(activeSectionUrl: String?) -> String {
sections
.map {
topBarNavigationLink(url: $0.url, text: $0.name, isActive: activeSection == $0.id)
topBarNavigationLink(url: $0.url, text: $0.name, isActive: activeSectionUrl == $0.url)
}
.joined(separator: "\n")
}
@ -49,8 +49,6 @@ struct PrefilledTopBarTemplate {
struct SectionInfo {
let id: String
let name: String
let url: String

View File

@ -20,17 +20,13 @@ extension Template {
}
init(from url: URL) throws {
let raw = try wrap(.failedToLoadTemplate(url.lastPathComponent)) {
try String(contentsOf: url)
}
let raw = try String(contentsOf: url)
self.init(raw: raw)
}
func generate(_ content: [Key : String], to url: URL) throws {
func generate(_ content: [Key : String], to url: URL) -> Bool {
let content = generate(content)
try wrap(.failedToWriteFile(url.path)) {
try content.createFolderAndWrite(to: url)
}
return files.write(content, to: url)
}
func generate(_ content: [Key : String], shouldIndent: Bool = false) -> String {