Improve storage
This commit is contained in:
@ -92,10 +92,8 @@ struct AddFileView: View {
|
||||
continue
|
||||
}
|
||||
if let url = file.url {
|
||||
do {
|
||||
try content.storage.copyFile(at: url, fileId: file.uniqueId)
|
||||
} catch {
|
||||
print("Failed to import file '\(file.uniqueId)' at \(url.path()): \(error)")
|
||||
guard content.storage.importExternalFile(at: url, fileId: file.uniqueId) else {
|
||||
print("Failed to import file '\(file.uniqueId)' at \(url.path())")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -6,19 +6,15 @@ struct FolderOnDiskPropertyView: View {
|
||||
let title: LocalizedStringKey
|
||||
|
||||
@Binding
|
||||
var folder: URL?
|
||||
|
||||
@Binding
|
||||
var isStale: Bool
|
||||
var folder: SecurityBookmark?
|
||||
|
||||
let footer: LocalizedStringKey
|
||||
|
||||
let update: (URL) -> Void
|
||||
|
||||
init(title: LocalizedStringKey, folder: Binding<URL?>, isStale: Binding<Bool>, footer: LocalizedStringKey, update: @escaping (URL) -> Void) {
|
||||
init(title: LocalizedStringKey, folder: Binding<SecurityBookmark?>, footer: LocalizedStringKey, update: @escaping (URL) -> Void) {
|
||||
self.title = title
|
||||
self._folder = folder
|
||||
self._isStale = isStale
|
||||
self.footer = footer
|
||||
self.update = update
|
||||
}
|
||||
@ -29,7 +25,7 @@ struct FolderOnDiskPropertyView: View {
|
||||
HStack(alignment: .firstTextBaseline) {
|
||||
Text(title)
|
||||
.font(.headline)
|
||||
if isStale {
|
||||
if folder == nil || folder?.isStale == true {
|
||||
Image(systemSymbol: .exclamationmarkTriangle)
|
||||
.foregroundStyle(.yellow)
|
||||
}
|
||||
@ -43,7 +39,7 @@ struct FolderOnDiskPropertyView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
Text(folder?.path() ?? "No folder selected")
|
||||
Text(folder?.url.path() ?? "No folder selected")
|
||||
.padding(.bottom, 5)
|
||||
Text(footer)
|
||||
.foregroundStyle(.secondary)
|
||||
|
@ -65,22 +65,21 @@ struct LocalizedPageContentView: View {
|
||||
|
||||
private func loadContent() {
|
||||
let language = language
|
||||
do {
|
||||
let content = try page.content.storage.pageContent(for: pageId, language: language)
|
||||
|
||||
guard content != "" else {
|
||||
pageContent = "New file"
|
||||
DispatchQueue.main.async {
|
||||
didChangeContent = false
|
||||
}
|
||||
return
|
||||
}
|
||||
pageContent = content
|
||||
checkContent()
|
||||
} catch {
|
||||
print("Failed to load page content: \(error)")
|
||||
guard let content = page.content.storage.pageContent(for: pageId, language: language) else {
|
||||
print("Failed to load page content")
|
||||
pageContent = "Failed to load"
|
||||
return
|
||||
}
|
||||
guard content != "" else {
|
||||
pageContent = "New file"
|
||||
DispatchQueue.main.async {
|
||||
didChangeContent = false
|
||||
}
|
||||
return
|
||||
}
|
||||
pageContent = content
|
||||
checkContent()
|
||||
|
||||
DispatchQueue.main.async {
|
||||
didChangeContent = false
|
||||
}
|
||||
@ -94,12 +93,11 @@ struct LocalizedPageContentView: View {
|
||||
guard didChangeContent else {
|
||||
return
|
||||
}
|
||||
do {
|
||||
try page.content.storage.save(pageContent: pageContent, for: pageId, language: language)
|
||||
didChangeContent = false
|
||||
} catch {
|
||||
print("Failed to save content: \(error)")
|
||||
guard page.content.storage.save(pageContent: pageContent, for: pageId, language: language) else {
|
||||
print("Failed to save content")
|
||||
return
|
||||
}
|
||||
didChangeContent = false
|
||||
}
|
||||
|
||||
private func checkContent() {
|
||||
|
@ -82,17 +82,8 @@ struct PageDetailView: View {
|
||||
}
|
||||
|
||||
private func generate() {
|
||||
guard let url = content.storage.outputPath else {
|
||||
print("Invalid output path")
|
||||
return
|
||||
}
|
||||
|
||||
guard FileManager.default.fileExists(atPath: url.path) else {
|
||||
print("Missing output folder")
|
||||
return
|
||||
}
|
||||
DispatchQueue.global(qos: .userInitiated).async {
|
||||
let success = content.generatePage(page)
|
||||
let success = content.generateFeed()
|
||||
DispatchQueue.main.async {
|
||||
didGenerateWebsite = success
|
||||
}
|
||||
|
@ -54,14 +54,13 @@ final class PageIssueChecker: ObservableObject {
|
||||
|
||||
let hasPreviousIssues = issues.contains { $0.page == page && $0.language == language }
|
||||
let pageIssues: [PageIssue]
|
||||
do {
|
||||
let rawPageContent = try page.content.storage.pageContent(for: page.id, language: language)
|
||||
if let rawPageContent = page.content.storage.pageContent(for: page.id, language: language) {
|
||||
_ = parser.generatePage(from: rawPageContent)
|
||||
pageIssues = parser.results.issues.map {
|
||||
PageIssue(page: page, language: language, message: $0)
|
||||
}
|
||||
} catch {
|
||||
let message = PageContentAnomaly.failedToLoadContent(error)
|
||||
} else {
|
||||
let message = PageContentAnomaly.failedToLoadContent
|
||||
let error = PageIssue(page: page, language: language, message: message)
|
||||
pageIssues = [error]
|
||||
}
|
||||
|
@ -90,6 +90,8 @@ struct PageIssueView: View {
|
||||
return [.init(name: "Retry", action: retryPageCheck)]
|
||||
case .failedToLoadContent:
|
||||
return [.init(name: "Retry", action: retryPageCheck)]
|
||||
case .failedToParseContent:
|
||||
return [.init(name: "Retry", action: retryPageCheck)]
|
||||
case .missingFile(let missing, _):
|
||||
return [
|
||||
.init(name: "Select file", action: { selectFile(missingFile: missing) }),
|
||||
@ -284,23 +286,22 @@ struct PageIssueView: View {
|
||||
}
|
||||
|
||||
private func replace(_ oldString: String, with newString: String, in page: Page, language: ContentLanguage) {
|
||||
do {
|
||||
let pageContent = try content.storage.pageContent(for: page.id, language: language)
|
||||
.replacingOccurrences(of: oldString, with: newString)
|
||||
try content.storage.save(pageContent: pageContent, for: page.id, language: language)
|
||||
guard let pageContent = content.storage.pageContent(for: page.id, language: language) else {
|
||||
print("Failed to replace in page \(page.id) (\(language)), no content")
|
||||
return
|
||||
}
|
||||
let modified = pageContent.replacingOccurrences(of: oldString, with: newString)
|
||||
|
||||
guard content.storage.save(pageContent: modified, for: page.id, language: language) else {
|
||||
print("Replaced \(oldString) with \(newString) in page \(page.id) (\(language))")
|
||||
} catch {
|
||||
print("Failed to replace in page \(page.id) (\(language)): \(error)")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
private func findOccurrences(of searchString: String, in page: Page, language: ContentLanguage) -> [String] {
|
||||
let parts: [String]
|
||||
do {
|
||||
parts = try content.storage.pageContent(for: page.id, language: language)
|
||||
.components(separatedBy: searchString)
|
||||
} catch {
|
||||
print("Failed to get page content to find occurrences: \(error.localizedDescription)")
|
||||
guard let parts = content.storage.pageContent(for: page.id, language: language)?
|
||||
.components(separatedBy: searchString) else {
|
||||
print("Failed to get page content to find occurrences, no content")
|
||||
return []
|
||||
}
|
||||
|
||||
|
@ -51,6 +51,9 @@ struct GenerationContentView: View {
|
||||
.progressViewStyle(.circular)
|
||||
.frame(height: 25)
|
||||
}
|
||||
Button(action: updateGeneratedImages) {
|
||||
Text("Update images")
|
||||
}
|
||||
Text(generatorText)
|
||||
Spacer()
|
||||
}
|
||||
@ -58,7 +61,16 @@ struct GenerationContentView: View {
|
||||
}
|
||||
}
|
||||
|
||||
private func updateGeneratedImages() {
|
||||
content.recalculateGeneratedImages()
|
||||
}
|
||||
|
||||
private func generateFeed() {
|
||||
DispatchQueue.main.async {
|
||||
_ = content.generateFeed()
|
||||
}
|
||||
#warning("Update feed generation")
|
||||
/*
|
||||
guard let url = content.storage.outputPath else {
|
||||
print("Invalid output path")
|
||||
return
|
||||
@ -83,6 +95,7 @@ struct GenerationContentView: View {
|
||||
self.generatorText = "Generation complete"
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,16 +17,14 @@ struct PathSettingsView: View {
|
||||
|
||||
FolderOnDiskPropertyView(
|
||||
title: "Content Folder",
|
||||
folder: $content.storage.contentPath,
|
||||
isStale: $content.storage.contentPathUrlIsStale,
|
||||
folder: $content.storage.contentScope,
|
||||
footer: "The folder where the raw content of the website is stored") { url in
|
||||
content.update(contentPath: url)
|
||||
}
|
||||
|
||||
FolderOnDiskPropertyView(
|
||||
title: "Output Folder",
|
||||
folder: $content.storage.outputPath,
|
||||
isStale: $content.storage.outputPathUrlIsStale,
|
||||
folder: $content.storage.outputScope,
|
||||
footer: "The folder where the generated website is stored") { url in
|
||||
content.storage.save(outputPath: url)
|
||||
}
|
||||
|
Reference in New Issue
Block a user