Rework storage structs, link preview

This commit is contained in:
Christoph Hagen
2025-01-08 14:59:04 +01:00
parent b99c064d10
commit a7197b9628
75 changed files with 1365 additions and 1454 deletions

View File

@@ -1,6 +1,8 @@
import Foundation
final class Page: Item {
final class Page: Item, DateItem, LocalizedItem {
override var itemType: ItemType { .page }
/**
The external link this page points to.
@@ -38,9 +40,7 @@ final class Page: Item {
@Published
var tags: [Tag]
/**
Additional files to copy, because the page content references them
*/
/// Additional files to copy, because the page content references them
@Published
var requiredFiles: [FileResource]
@@ -141,7 +141,7 @@ final class Page: Item {
content.settings.paths.pagesOutputFolderPath + "/" + localized(in: language).urlString
}
override var itemType: ItemType {
override var itemReference: ItemReference {
.page(self)
}
@@ -161,15 +161,57 @@ final class Page: Item {
if requiredFiles.contains(file) {
requiredFiles.remove(file)
}
english.remove(linkPreviewImage: file)
german.remove(linkPreviewImage: file)
english.linkPreview.remove(file)
german.linkPreview.remove(file)
}
}
extension Page: DateItem {
// MARK: Storage
}
extension Page {
extension Page: LocalizedItem {
convenience init(context: LoadingContext, id: String, data: Data) {
self.init(
content: context.content,
id: id,
externalLink: data.externalLink,
isDraft: data.isDraft,
createdDate: data.createdDate,
hideDate: data.hideDate ?? false,
startDate: data.startDate,
endDate: data.endDate,
german: .init(context: context, data: data.german),
english: .init(context: context, data: data.english),
tags: data.tags.compactMap(context.tag),
requiredFiles: data.requiredFiles?.compactMap(context.file) ?? [])
}
/// The structure to store the metadata of a page on disk
struct Data: Codable {
let isDraft: Bool
let externalLink: String?
let tags: [String]
let hideDate: Bool?
let createdDate: Date
let startDate: Date
let endDate: Date?
let german: LocalizedPage.Data
let english: LocalizedPage.Data
let requiredFiles: [String]?
}
var data: Data {
.init(
isDraft: isDraft,
externalLink: externalLink,
tags: tags.map { $0.id },
hideDate: hideDate ? true : nil,
createdDate: createdDate,
startDate: startDate,
endDate: hasEndDate ? endDate : nil,
german: german.data,
english: english.data,
requiredFiles: requiredFiles.nonEmpty?.map { $0.id }.sorted())
}
}