112 lines
3.0 KiB
Swift
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)
|
|
}
|
|
}
|