Refactor tag file, remove subtitle

This commit is contained in:
Christoph Hagen 2025-01-05 17:18:23 +01:00
parent 5ac5a7b000
commit 29bba5e76e
11 changed files with 85 additions and 78 deletions

View File

@ -123,7 +123,7 @@ final class TagOverviewGenerator {
additionalFooter: "") { content in additionalFooter: "") { content in
content += "<h1 class='separated-headline'>\(header.title)</h1>" content += "<h1 class='separated-headline'>\(header.title)</h1>"
for tag in tags { for tag in tags {
let description = tag.localized.description ?? "" let description = tag.localized.linkPreviewDescription ?? ""
let image = self.makePageImage(item: tag.localized) let image = self.makePageImage(item: tag.localized)
content += RelatedPageLink( content += RelatedPageLink(

View File

@ -229,7 +229,7 @@ final class PageContentParser {
let localized = tag.localized(in: language) let localized = tag.localized(in: language)
let url = tag.absoluteUrl(in: language) let url = tag.absoluteUrl(in: language)
let title = localized.name let title = localized.name
let description = localized.description ?? "" let description = localized.linkPreviewDescription ?? ""
let image = makePageImage(item: localized) let image = makePageImage(item: localized)
return RelatedPageLink( return RelatedPageLink(

View File

@ -22,7 +22,7 @@ struct TagPageGeneratorSource: PostListPageGeneratorSource {
} }
var pageDescription: String { var pageDescription: String {
tag.localized(in: language).description ?? "" tag.localized(in: language).linkPreviewDescription ?? ""
} }
func pageUrlPrefix(for language: ContentLanguage) -> String { func pageUrlPrefix(for language: ContentLanguage) -> String {

View File

@ -7,10 +7,9 @@ extension Content {
content: self, content: self,
urlComponent: tag.urlComponent, urlComponent: tag.urlComponent,
name: tag.name, name: tag.name,
subtitle: tag.subtitle,
description: tag.description,
thumbnail: tag.thumbnail.map { images[$0] },
linkPreviewTitle: tag.linkPreviewTitle, linkPreviewTitle: tag.linkPreviewTitle,
linkPreviewDescription: tag.linkPreviewDescription,
linkPreviewImage: tag.linkPreviewImage.map { images[$0] },
originalUrl: tag.originalURL) originalUrl: tag.originalURL)
} }

View File

@ -11,7 +11,7 @@ extension Content {
var failedSaves = 0 var failedSaves = 0
failedSaves += pages.count { !storage.save(pageMetadata: $0.pageFile, for: $0.id) } failedSaves += pages.count { !storage.save(pageMetadata: $0.pageFile, for: $0.id) }
failedSaves += posts.count { !storage.save(post: $0.postFile, 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)) failedSaves.increment(!storage.save(settings: settings.file))
let fileDescriptions: [FileDescriptions] = files.sorted().compactMap { file in let fileDescriptions: [FileDescriptions] = files.sorted().compactMap { file in
@ -111,27 +111,3 @@ private extension LocalizedPost {
linkPreviewDescription: linkPreviewDescription) 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)
}
}

View File

@ -63,34 +63,43 @@ final class FileResource: Item {
return imageDimensions.width / imageDimensions.height 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 { var imageToDisplay: Image {
guard let imageData = content.storage.fileData(for: id) else { guard let imageData = content.storage.fileData(for: id) else {
print("Failed to load data for image \(id)") print("Failed to load data for image \(id)")
return failureImage return failureImage
} }
if fileSize == nil { update(fileSize: imageData.count)
DispatchQueue.main.async {
self.fileSize = imageData.count
}
}
guard let loadedImage = NSImage(data: imageData) else { guard let loadedImage = NSImage(data: imageData) else {
print("Failed to create image \(id)") print("Failed to create image \(id)")
return failureImage return failureImage
} }
if loadedImage.size != imageDimensions { update(imageDimensions: loadedImage.size)
DispatchQueue.main.async {
self.imageDimensions = loadedImage.size
}
}
return .init(nsImage: loadedImage) return .init(nsImage: loadedImage)
} }
func determineImageDimensions() { func determineImageDimensions() {
let size = getImageDimensions() let size = getImageDimensions()
self.update(imageDimensions: size)
DispatchQueue.main.async {
self.imageDimensions = size
}
} }
private func getImageDimensions() -> CGSize? { private func getImageDimensions() -> CGSize? {
@ -106,16 +115,34 @@ final class FileResource: Item {
return loadedImage.size return loadedImage.size
} }
func determineFileSize() { func update(fileSize size: Int?) {
DispatchQueue.global(qos: .userInitiated).async { guard let fileSize, let size else {
let size = self.content.storage.size(of: self.id) // First computation
DispatchQueue.main.async { DispatchQueue.main.async {
self.fileSize = size 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() { func removeGeneratedImages() {
guard type.isImage else { return }
content.imageGenerator.removeVersions(of: id) content.imageGenerator.removeVersions(of: id)
content.storage.deleteInOutputFolder(path: outputImageFolder) content.storage.deleteInOutputFolder(path: outputImageFolder)
} }

View File

@ -12,36 +12,31 @@ final class LocalizedTag: ObservableObject {
var name: String var name: String
@Published @Published
var subtitle: String? var linkPreviewTitle: String?
@Published @Published
var description: String? var linkPreviewDescription: String?
/// The image id of the thumbnail /// The image id of the thumbnail
@Published @Published
var linkPreviewImage: FileResource? var linkPreviewImage: FileResource?
@Published
var linkPreviewTitle: String?
/// The original url in the previous site layout /// The original url in the previous site layout
let originalUrl: String? let originalUrl: String?
init(content: Content, init(content: Content,
urlComponent: String, urlComponent: String,
name: String, name: String,
subtitle: String? = nil,
description: String? = nil,
thumbnail: FileResource? = nil,
linkPreviewTitle: String? = nil, linkPreviewTitle: String? = nil,
linkPreviewDescription: String? = nil,
linkPreviewImage: FileResource? = nil,
originalUrl: String? = nil) { originalUrl: String? = nil) {
self.content = content self.content = content
self.urlComponent = urlComponent self.urlComponent = urlComponent
self.name = name self.name = name
self.subtitle = subtitle
self.description = description
self.linkPreviewImage = thumbnail
self.linkPreviewTitle = linkPreviewTitle self.linkPreviewTitle = linkPreviewTitle
self.linkPreviewDescription = linkPreviewDescription
self.linkPreviewImage = linkPreviewImage
self.originalUrl = originalUrl self.originalUrl = originalUrl
} }
@ -58,7 +53,16 @@ final class LocalizedTag: ObservableObject {
extension LocalizedTag: LinkPreviewItem { 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)
} }
} }

View File

@ -71,3 +71,13 @@ final class Tag: Item {
extension Tag: LocalizedItem { extension Tag: LocalizedItem {
} }
extension Tag {
var file: TagFile {
.init(id: id,
isVisible: isVisible,
german: german.tagFile,
english: english.tagFile)
}
}

View File

@ -43,17 +43,15 @@ extension LocalizedTag {
content: .mock, content: .mock,
urlComponent: "electronics", urlComponent: "electronics",
name: "Electronics", name: "Electronics",
subtitle: "Projects with electronics", linkPreviewDescription: "Some description of the tag",
description: "Some description of the tag", linkPreviewImage: FileResource(resourceImage: "image1", type: .jpg),
thumbnail: FileResource(resourceImage: "image1", type: .jpg),
originalUrl: "projects/electronics") originalUrl: "projects/electronics")
static let german = LocalizedTag( static let german = LocalizedTag(
content: .mock, content: .mock,
urlComponent: "elektronik", urlComponent: "elektronik",
name: "Elektronik", name: "Elektronik",
subtitle: "Projekte mit Elektronik", linkPreviewDescription: "Eine Beschreibung des Tags",
description: "Eine Beschreibung des Tags", linkPreviewImage: FileResource(resourceImage: "image2", type: .jpg),
thumbnail: FileResource(resourceImage: "image2", type: .jpg),
originalUrl: "projects/electronics") originalUrl: "projects/electronics")
} }

View File

@ -24,14 +24,12 @@ struct LocalizedTagFile {
/// A custom name, different from the tag id /// A custom name, different from the tag id
let name: String let name: String
let subtitle: String?
let description: String?
let linkPreviewTitle: String? let linkPreviewTitle: String?
let linkPreviewDescription: String?
/// The image id of the thumbnail /// The image id of the thumbnail
let thumbnail: String? let linkPreviewImage: String?
/// The original url in the previous site layout /// The original url in the previous site layout
let originalURL: String? let originalURL: String?

View File

@ -31,11 +31,6 @@ struct LocalizedTagDetailView: View {
} }
} }
OptionalStringPropertyView(
title: "Subtitle",
text: $tag.subtitle,
footer: "The subtitle/tagline to use")
OptionalStringPropertyView( OptionalStringPropertyView(
title: "Preview Title", title: "Preview Title",
text: $tag.linkPreviewTitle, text: $tag.linkPreviewTitle,
@ -49,7 +44,7 @@ struct LocalizedTagDetailView: View {
OptionalTextFieldPropertyView( OptionalTextFieldPropertyView(
title: "Preview Description", title: "Preview Description",
text: $tag.description, text: $tag.linkPreviewDescription,
footer: "The description to show in previews of the page") footer: "The description to show in previews of the page")
} }
} }