2025-02-05 12:24:33 +01:00

112 lines
3.0 KiB
Swift

import Foundation
class Tag: Item, LocalizedItem {
override var itemType: ItemType { .tag }
@Published
var isVisible: Bool
@Published
var german: LocalizedTag
@Published
var english: LocalizedTag
var savedData: Data?
override init(content: Content, id: String) {
self.isVisible = true
self.english = .init(content: content, urlComponent: id, name: id)
let deId = id + "-" + ContentLanguage.german.rawValue
self.german = .init(content: content, urlComponent: deId, name: deId)
super.init(content: content, id: id)
}
init(content: Content, id: String, isVisible: Bool = true, german: LocalizedTag, english: LocalizedTag) {
self.isVisible = isVisible
self.german = german
self.english = english
super.init(content: content, id: id)
}
func isValid(id: String) -> Bool {
content.isValidIdForTagOrPageOrPost(id) &&
content.isNewIdForTag(id)
}
@discardableResult
func update(id newId: String) -> Bool {
guard content.storage.move(tag: id, to: newId) else {
print("Failed to move files of tag \(id)")
return false
}
id = newId
return true
}
// MARK: Paths
func filePathRelativeToOutputFolder(for language: ContentLanguage) -> String {
makeCleanRelativePath(internalPath(for: language))
}
private func internalPath(for language: ContentLanguage) -> String {
content.settings.paths.tagsOutputFolderPath + "/" + localized(in: language).urlComponent
}
override func absoluteUrl(in language: ContentLanguage) -> String {
makeCleanAbsolutePath(internalPath(for: language))
}
override func title(in language: ContentLanguage) -> String {
localized(in: language).title
}
override var itemReference: ItemReference {
.tagPage(self)
}
func contains(urlComponent: String) -> Bool {
german.urlComponent == urlComponent || english.urlComponent == urlComponent
}
func remove(_ file: FileResource) {
english.linkPreview.remove(file)
german.linkPreview.remove(file)
}
}
// MARK: Storage
extension Tag: StorageItem {
convenience init(context: LoadingContext, id: String, data: Data) {
self.init(
content: context.content,
id: id,
isVisible: data.isVisible ?? true,
german: .init(context: context, data: data.german),
english: .init(context: context, data: data.english))
savedData = data
}
struct Data: Codable, Equatable {
// Defaults to true if unset
let isVisible: Bool?
let german: LocalizedTag.Data
let english: LocalizedTag.Data
}
var data: Data {
.init(
isVisible: isVisible ? nil : false,
german: german.data,
english: english.data)
}
func saveToDisk(_ data: Data) -> Bool {
content.storage.save(tag: data, for: id)
}
}