Improve asset handling

This commit is contained in:
Christoph Hagen
2024-12-16 15:36:58 +01:00
parent 31d1ecb8bd
commit b22b76fd32
21 changed files with 264 additions and 85 deletions

View File

@ -1,5 +1,54 @@
import Foundation
extension Content {
func generatePage(_ page: Page) -> Bool {
guard startGenerating() else { return false }
defer { endGenerating() }
for language in ContentLanguage.allCases {
guard generateInternal(page, in: language) else {
return false
}
}
return true
}
func generatePage(_ page: Page, in language: ContentLanguage) -> Bool {
guard startGenerating() else { return false }
defer { endGenerating() }
return generateInternal(page, in: language)
}
private func startGenerating() -> Bool {
guard !isGeneratingWebsite else {
return false
}
// TODO: Fix bug where multiple generating operations can be started
// due to dispatch of locking property on main queue
DispatchQueue.main.async {
self.isGeneratingWebsite = true
}
return true
}
private func endGenerating() {
DispatchQueue.main.async {
self.isGeneratingWebsite = false
}
}
private func generateInternal(_ page: Page, in language: ContentLanguage) -> Bool {
let generator = LocalizedWebsiteGenerator(
content: self,
language: language)
if !generator.generate(page: page) {
print("Generation failed")
return false
}
return true
}
private func makeCleanAbsolutePath(_ path: String) -> String {
("/" + path).replacingOccurrences(of: "//", with: "/")
}
@ -36,10 +85,20 @@ extension Content {
tags.first { $0.id == tagId }
}
// MARK: Generation input
func navigationBar(in language: ContentLanguage) -> [NavigationBar.Link] {
settings.navigationItems.map {
.init(text: $0.title(in: language),
url: $0.absoluteUrl(in: language))
}
}
var defaultPageHeaders: Set<HeaderElement> {
var result: Set<HeaderElement> = [.charset, .viewport]
if let defaultCss = settings.posts.defaultCssFile {
result.insert(.css(file: defaultCss, order: HeaderElement.defaultCssFileOrder))
}
return result
}
}

View File

@ -25,6 +25,9 @@ final class Content: ObservableObject {
@Published
var results: [ItemId : PageGenerationResults] = [:]
@Published
var isGeneratingWebsite = false
@AppStorage("contentPath")
private var storedContentPath: String = ""

View File

@ -137,3 +137,10 @@ final class FileResource: Item {
extension FileResource: LocalizedItem {
}
extension FileResource: CustomStringConvertible {
var description: String {
id
}
}

View File

@ -44,7 +44,7 @@ final class PageSettings: ObservableObject {
defaultCssFile: defaultCssFile?.id,
codeHighlightingJsFile: codeHighlightingJsFile?.id,
audioPlayerJsFile: audioPlayerJsFile?.id,
audioPlayerCssFile: audioPlayerJsFile?.id,
audioPlayerCssFile: audioPlayerCssFile?.id,
modelViewerJsFile: modelViewerJsFile?.id)
}
}