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:
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
Reference in New Issue
Block a user