Refactor tag file, remove subtitle
This commit is contained in:
parent
5ac5a7b000
commit
29bba5e76e
@ -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(
|
||||||
|
@ -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(
|
||||||
|
@ -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 {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
|
@ -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?
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user