Sort file lists for consistent storage

This commit is contained in:
Christoph Hagen 2024-11-20 14:25:10 +01:00
parent 8ae2a237cc
commit cb22ae34f2
6 changed files with 76 additions and 23 deletions

View File

@ -219,9 +219,9 @@ final class Importer {
} }
let page = LocalizedPageFile( let page = LocalizedPageFile(
url: id, url: id,
files: pageFiles, files: pageFiles.sorted(),
externalFiles: externalFiles, externalFiles: externalFiles.sorted(),
requiredFiles: requiredFiles, requiredFiles: requiredFiles.sorted(),
title: content.title!, title: content.title!,
linkPreviewImage: thumbnail?.name, linkPreviewImage: thumbnail?.name,
linkPreviewTitle: content.linkPreviewTitle, linkPreviewTitle: content.linkPreviewTitle,
@ -320,7 +320,7 @@ final class Importer {
let images = page.linkPreviewImage.map { [$0] } ?? [] let images = page.linkPreviewImage.map { [$0] } ?? []
return LocalizedPostFile( return LocalizedPostFile(
images: Set(images), images: images.sorted(),
title: page.linkPreviewTitle ?? page.title, title: page.linkPreviewTitle ?? page.title,
content: content, content: content,
lastModifiedDate: nil) lastModifiedDate: nil)

View File

@ -255,23 +255,31 @@ final class Content: ObservableObject {
private func loadPages(_ pagesData: [String : PageFile], tags: [String : Tag]) -> [String : Page] { private func loadPages(_ pagesData: [String : PageFile], tags: [String : Tag]) -> [String : Page] {
pagesData.reduce(into: [:]) { pages, data in pagesData.reduce(into: [:]) { pages, data in
let (pageId, page) = data let (pageId, page) = data
let german = page.german
let germanPage = LocalizedPage( let germanPage = LocalizedPage(
urlString: page.german.url, urlString: german.url,
title: page.german.title, title: german.title,
lastModified: page.german.lastModifiedDate, lastModified: german.lastModifiedDate,
originalUrl: page.german.originalURL, originalUrl: german.originalURL,
files: page.german.files, files: Set(german.files),
externalFiles: page.german.externalFiles, externalFiles: Set(german.externalFiles),
requiredFiles: page.german.requiredFiles) requiredFiles: Set(german.requiredFiles),
linkPreviewImage: german.linkPreviewImage,
linkPreviewTitle: german.linkPreviewTitle,
linkPreviewDescription: german.linkPreviewDescription)
let english = page.english
let englishPage = LocalizedPage( let englishPage = LocalizedPage(
urlString: page.english.url, urlString: english.url,
title: page.english.title, title: english.title,
lastModified: page.english.lastModifiedDate, lastModified: english.lastModifiedDate,
originalUrl: page.english.originalURL, originalUrl: english.originalURL,
files: page.english.files, files: Set(english.files),
externalFiles: page.english.externalFiles, externalFiles: Set(english.externalFiles),
requiredFiles: page.english.requiredFiles) requiredFiles: Set(english.requiredFiles),
linkPreviewImage: english.linkPreviewImage,
linkPreviewTitle: english.linkPreviewTitle,
linkPreviewDescription: english.linkPreviewDescription)
pages[pageId] = Page( pages[pageId] = Page(
id: pageId, id: pageId,

View File

@ -55,13 +55,25 @@ final class LocalizedPage: ObservableObject {
@Published @Published
var requiredFiles: Set<String> = [] var requiredFiles: Set<String> = []
@Published
var linkPreviewImage: String?
@Published
var linkPreviewTitle: String?
@Published
var linkPreviewDescription: String?
init(urlString: String, init(urlString: String,
title: String, title: String,
lastModified: Date? = nil, lastModified: Date? = nil,
originalUrl: String? = nil, originalUrl: String? = nil,
files: Set<String> = [], files: Set<String> = [],
externalFiles: Set<String> = [], externalFiles: Set<String> = [],
requiredFiles: Set<String> = []) { requiredFiles: Set<String> = [],
linkPreviewImage: String? = nil,
linkPreviewTitle: String? = nil,
linkPreviewDescription: String? = nil) {
self.urlString = urlString self.urlString = urlString
self.title = title self.title = title
self.lastModified = lastModified self.lastModified = lastModified
@ -69,6 +81,9 @@ final class LocalizedPage: ObservableObject {
self.files = files self.files = files
self.externalFiles = externalFiles self.externalFiles = externalFiles
self.requiredFiles = requiredFiles self.requiredFiles = requiredFiles
self.linkPreviewImage = linkPreviewImage
self.linkPreviewTitle = linkPreviewTitle
self.linkPreviewDescription = linkPreviewDescription
} }
@MainActor @MainActor

View File

@ -0,0 +1,30 @@
import Foundation
extension Page {
var pageFile: PageFile {
.init(isDraft: isDraft,
tags: tags.map { $0.id },
createdDate: createdDate,
startDate: startDate,
endDate: hasEndDate ? endDate : nil,
german: german.pageFile,
english: english.pageFile)
}
}
extension LocalizedPage {
var pageFile: LocalizedPageFile {
.init(url: urlString,
files: files.sorted(),
externalFiles: externalFiles.sorted(),
requiredFiles: requiredFiles.sorted(),
title: title,
linkPreviewImage: linkPreviewImage,
linkPreviewTitle: linkPreviewTitle,
linkPreviewDescription: linkPreviewDescription,
lastModifiedDate: lastModified,
originalURL: originalUrl)
}
}

View File

@ -31,18 +31,18 @@ struct LocalizedPageFile {
/** /**
The files (images, videos, other files) used in the page. The files (images, videos, other files) used in the page.
*/ */
let files: Set<String> let files: [String]
/** /**
The additional files required for the page to function correctly, but which are not stored with the content. The additional files required for the page to function correctly, but which are not stored with the content.
*/ */
let externalFiles: Set<String> let externalFiles: [String]
/** /**
Specifies additional files which should be copied to the destination when generating the content. Specifies additional files which should be copied to the destination when generating the content.
- Note: This property defaults to an empty set. - Note: This property defaults to an empty set.
*/ */
let requiredFiles: Set<String> let requiredFiles: [String]
let title: String let title: String

View File

@ -28,7 +28,7 @@ extension PostFile: Codable {
*/ */
struct LocalizedPostFile { struct LocalizedPostFile {
let images: Set<String> let images: [String]
let title: String? let title: String?