Improve asset handling
This commit is contained in:
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -25,6 +25,9 @@ final class Content: ObservableObject {
|
||||
@Published
|
||||
var results: [ItemId : PageGenerationResults] = [:]
|
||||
|
||||
@Published
|
||||
var isGeneratingWebsite = false
|
||||
|
||||
@AppStorage("contentPath")
|
||||
private var storedContentPath: String = ""
|
||||
|
||||
|
@ -137,3 +137,10 @@ final class FileResource: Item {
|
||||
extension FileResource: LocalizedItem {
|
||||
|
||||
}
|
||||
|
||||
extension FileResource: CustomStringConvertible {
|
||||
|
||||
var description: String {
|
||||
id
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user