From 29bba5e76e50d74ad3dd75b8ea72d3ef1d967dca Mon Sep 17 00:00:00 2001 From: Christoph Hagen Date: Sun, 5 Jan 2025 17:18:23 +0100 Subject: [PATCH] Refactor tag file, remove subtitle --- .../TagOverviewGenerator.swift | 2 +- .../Generator/PageContentGenerator.swift | 2 +- .../Post Lists/TagPageGeneratorSource.swift | 2 +- CHDataManagement/Model/Content+Load.swift | 5 +- CHDataManagement/Model/Content+Save.swift | 26 +------- CHDataManagement/Model/FileResource.swift | 61 +++++++++++++------ CHDataManagement/Model/LocalizedTag.swift | 30 +++++---- CHDataManagement/Model/Tag.swift | 10 +++ .../Preview Content/Tag+Mock.swift | 10 ++- CHDataManagement/Storage/Model/TagFile.swift | 8 +-- .../Views/Tags/LocalizedTagDetailView.swift | 7 +-- 11 files changed, 85 insertions(+), 78 deletions(-) diff --git a/CHDataManagement/Generator/Page Generators/TagOverviewGenerator.swift b/CHDataManagement/Generator/Page Generators/TagOverviewGenerator.swift index c367099..9a2fd7c 100644 --- a/CHDataManagement/Generator/Page Generators/TagOverviewGenerator.swift +++ b/CHDataManagement/Generator/Page Generators/TagOverviewGenerator.swift @@ -123,7 +123,7 @@ final class TagOverviewGenerator { additionalFooter: "") { content in content += "

\(header.title)

" for tag in tags { - let description = tag.localized.description ?? "" + let description = tag.localized.linkPreviewDescription ?? "" let image = self.makePageImage(item: tag.localized) content += RelatedPageLink( diff --git a/CHDataManagement/Generator/PageContentGenerator.swift b/CHDataManagement/Generator/PageContentGenerator.swift index b9f0a94..6c2d647 100644 --- a/CHDataManagement/Generator/PageContentGenerator.swift +++ b/CHDataManagement/Generator/PageContentGenerator.swift @@ -229,7 +229,7 @@ final class PageContentParser { let localized = tag.localized(in: language) let url = tag.absoluteUrl(in: language) let title = localized.name - let description = localized.description ?? "" + let description = localized.linkPreviewDescription ?? "" let image = makePageImage(item: localized) return RelatedPageLink( diff --git a/CHDataManagement/Generator/Post Lists/TagPageGeneratorSource.swift b/CHDataManagement/Generator/Post Lists/TagPageGeneratorSource.swift index 68b7d86..d10af14 100644 --- a/CHDataManagement/Generator/Post Lists/TagPageGeneratorSource.swift +++ b/CHDataManagement/Generator/Post Lists/TagPageGeneratorSource.swift @@ -22,7 +22,7 @@ struct TagPageGeneratorSource: PostListPageGeneratorSource { } var pageDescription: String { - tag.localized(in: language).description ?? "" + tag.localized(in: language).linkPreviewDescription ?? "" } func pageUrlPrefix(for language: ContentLanguage) -> String { diff --git a/CHDataManagement/Model/Content+Load.swift b/CHDataManagement/Model/Content+Load.swift index c33c125..16aac72 100644 --- a/CHDataManagement/Model/Content+Load.swift +++ b/CHDataManagement/Model/Content+Load.swift @@ -7,10 +7,9 @@ extension Content { content: self, urlComponent: tag.urlComponent, name: tag.name, - subtitle: tag.subtitle, - description: tag.description, - thumbnail: tag.thumbnail.map { images[$0] }, linkPreviewTitle: tag.linkPreviewTitle, + linkPreviewDescription: tag.linkPreviewDescription, + linkPreviewImage: tag.linkPreviewImage.map { images[$0] }, originalUrl: tag.originalURL) } diff --git a/CHDataManagement/Model/Content+Save.swift b/CHDataManagement/Model/Content+Save.swift index 7116418..d3c963e 100644 --- a/CHDataManagement/Model/Content+Save.swift +++ b/CHDataManagement/Model/Content+Save.swift @@ -11,7 +11,7 @@ extension Content { var failedSaves = 0 failedSaves += pages.count { !storage.save(pageMetadata: $0.pageFile, for: $0.id) } failedSaves += posts.count { !storage.save(post: $0.postFile, for: $0.id) } - failedSaves += tags.count { !storage.save(tagMetadata: $0.tagFile, for: $0.id) } + failedSaves += tags.count { !storage.save(tagMetadata: $0.file, for: $0.id) } failedSaves.increment(!storage.save(settings: settings.file)) let fileDescriptions: [FileDescriptions] = files.sorted().compactMap { file in @@ -111,27 +111,3 @@ private extension LocalizedPost { linkPreviewDescription: linkPreviewDescription) } } - - -private extension Tag { - - var tagFile: TagFile { - .init(id: id, - isVisible: isVisible, - german: german.tagFile, - english: english.tagFile) - } -} - -private extension LocalizedTag { - - var tagFile: LocalizedTagFile { - .init(urlComponent: urlComponent, - name: name, - subtitle: subtitle, - description: description, - linkPreviewTitle: linkPreviewTitle, - thumbnail: linkPreviewImage?.id, - originalURL: originalUrl) - } -} diff --git a/CHDataManagement/Model/FileResource.swift b/CHDataManagement/Model/FileResource.swift index 18fae2b..9899f45 100644 --- a/CHDataManagement/Model/FileResource.swift +++ b/CHDataManagement/Model/FileResource.swift @@ -63,34 +63,43 @@ final class FileResource: Item { return imageDimensions.width / imageDimensions.height } + private func update(imageDimensions size: CGSize?) { + guard let imageDimensions, let size else { + // First computation + DispatchQueue.main.async { + self.imageDimensions = size + } + return + } + guard imageDimensions != size else { + return + } + // Image must have changed, so force regeneration + DispatchQueue.main.async { + self.imageDimensions = size + self.didChange() + self.removeGeneratedImages() + } + } + var imageToDisplay: Image { guard let imageData = content.storage.fileData(for: id) else { print("Failed to load data for image \(id)") return failureImage } - if fileSize == nil { - DispatchQueue.main.async { - self.fileSize = imageData.count - } - } + update(fileSize: imageData.count) guard let loadedImage = NSImage(data: imageData) else { print("Failed to create image \(id)") return failureImage } - if loadedImage.size != imageDimensions { - DispatchQueue.main.async { - self.imageDimensions = loadedImage.size - } - } + update(imageDimensions: loadedImage.size) + return .init(nsImage: loadedImage) } func determineImageDimensions() { let size = getImageDimensions() - - DispatchQueue.main.async { - self.imageDimensions = size - } + self.update(imageDimensions: size) } private func getImageDimensions() -> CGSize? { @@ -106,16 +115,34 @@ final class FileResource: Item { return loadedImage.size } - func determineFileSize() { - DispatchQueue.global(qos: .userInitiated).async { - let size = self.content.storage.size(of: self.id) + func update(fileSize size: Int?) { + guard let fileSize, let size else { + // First computation DispatchQueue.main.async { self.fileSize = size } + return + } + guard fileSize != size else { + return + } + // File must have changed + DispatchQueue.main.async { + self.fileSize = size + self.didChange() + self.removeGeneratedImages() + } + } + + func determineFileSize() { + DispatchQueue.global(qos: .userInitiated).async { + let size = self.content.storage.size(of: self.id) + self.update(fileSize: size) } } func removeGeneratedImages() { + guard type.isImage else { return } content.imageGenerator.removeVersions(of: id) content.storage.deleteInOutputFolder(path: outputImageFolder) } diff --git a/CHDataManagement/Model/LocalizedTag.swift b/CHDataManagement/Model/LocalizedTag.swift index e1f1423..9d5995f 100644 --- a/CHDataManagement/Model/LocalizedTag.swift +++ b/CHDataManagement/Model/LocalizedTag.swift @@ -12,36 +12,31 @@ final class LocalizedTag: ObservableObject { var name: String @Published - var subtitle: String? + var linkPreviewTitle: String? @Published - var description: String? + var linkPreviewDescription: String? /// The image id of the thumbnail @Published var linkPreviewImage: FileResource? - @Published - var linkPreviewTitle: String? - /// The original url in the previous site layout let originalUrl: String? init(content: Content, urlComponent: String, name: String, - subtitle: String? = nil, - description: String? = nil, - thumbnail: FileResource? = nil, linkPreviewTitle: String? = nil, + linkPreviewDescription: String? = nil, + linkPreviewImage: FileResource? = nil, originalUrl: String? = nil) { self.content = content self.urlComponent = urlComponent self.name = name - self.subtitle = subtitle - self.description = description - self.linkPreviewImage = thumbnail self.linkPreviewTitle = linkPreviewTitle + self.linkPreviewDescription = linkPreviewDescription + self.linkPreviewImage = linkPreviewImage self.originalUrl = originalUrl } @@ -58,7 +53,16 @@ final class LocalizedTag: ObservableObject { extension LocalizedTag: LinkPreviewItem { - var linkPreviewDescription: String? { - description +} + +extension LocalizedTag { + + var tagFile: LocalizedTagFile { + .init(urlComponent: urlComponent, + name: name, + linkPreviewTitle: linkPreviewTitle, + linkPreviewDescription: linkPreviewDescription, + linkPreviewImage: linkPreviewImage?.id, + originalURL: originalUrl) } } diff --git a/CHDataManagement/Model/Tag.swift b/CHDataManagement/Model/Tag.swift index b603987..c288678 100644 --- a/CHDataManagement/Model/Tag.swift +++ b/CHDataManagement/Model/Tag.swift @@ -71,3 +71,13 @@ final class Tag: Item { extension Tag: LocalizedItem { } + +extension Tag { + + var file: TagFile { + .init(id: id, + isVisible: isVisible, + german: german.tagFile, + english: english.tagFile) + } +} diff --git a/CHDataManagement/Preview Content/Tag+Mock.swift b/CHDataManagement/Preview Content/Tag+Mock.swift index 414f82c..cbc9619 100644 --- a/CHDataManagement/Preview Content/Tag+Mock.swift +++ b/CHDataManagement/Preview Content/Tag+Mock.swift @@ -43,17 +43,15 @@ extension LocalizedTag { content: .mock, urlComponent: "electronics", name: "Electronics", - subtitle: "Projects with electronics", - description: "Some description of the tag", - thumbnail: FileResource(resourceImage: "image1", type: .jpg), + linkPreviewDescription: "Some description of the tag", + linkPreviewImage: FileResource(resourceImage: "image1", type: .jpg), originalUrl: "projects/electronics") static let german = LocalizedTag( content: .mock, urlComponent: "elektronik", name: "Elektronik", - subtitle: "Projekte mit Elektronik", - description: "Eine Beschreibung des Tags", - thumbnail: FileResource(resourceImage: "image2", type: .jpg), + linkPreviewDescription: "Eine Beschreibung des Tags", + linkPreviewImage: FileResource(resourceImage: "image2", type: .jpg), originalUrl: "projects/electronics") } diff --git a/CHDataManagement/Storage/Model/TagFile.swift b/CHDataManagement/Storage/Model/TagFile.swift index b108167..3a12ca5 100644 --- a/CHDataManagement/Storage/Model/TagFile.swift +++ b/CHDataManagement/Storage/Model/TagFile.swift @@ -24,14 +24,12 @@ struct LocalizedTagFile { /// A custom name, different from the tag id let name: String - let subtitle: String? - - let description: String? - let linkPreviewTitle: String? + let linkPreviewDescription: String? + /// The image id of the thumbnail - let thumbnail: String? + let linkPreviewImage: String? /// The original url in the previous site layout let originalURL: String? diff --git a/CHDataManagement/Views/Tags/LocalizedTagDetailView.swift b/CHDataManagement/Views/Tags/LocalizedTagDetailView.swift index 612a449..a46f932 100644 --- a/CHDataManagement/Views/Tags/LocalizedTagDetailView.swift +++ b/CHDataManagement/Views/Tags/LocalizedTagDetailView.swift @@ -31,11 +31,6 @@ struct LocalizedTagDetailView: View { } } - OptionalStringPropertyView( - title: "Subtitle", - text: $tag.subtitle, - footer: "The subtitle/tagline to use") - OptionalStringPropertyView( title: "Preview Title", text: $tag.linkPreviewTitle, @@ -49,7 +44,7 @@ struct LocalizedTagDetailView: View { OptionalTextFieldPropertyView( title: "Preview Description", - text: $tag.description, + text: $tag.linkPreviewDescription, footer: "The description to show in previews of the page") } }