import Foundation final class LocalizedTag: ObservableObject { unowned let content: Content @Published var urlComponent: String /// A custom name, different from the tag id @Published var name: String @Published var linkPreview: LinkPreview /// The original url in the previous site layout let originalUrl: String? init(content: Content, urlComponent: String, name: String, linkPreview: LinkPreview = .init(), originalUrl: String? = nil) { self.content = content self.urlComponent = urlComponent self.name = name self.linkPreview = linkPreview self.originalUrl = originalUrl } func isValid(urlComponent: String) -> Bool { !urlComponent.isEmpty && content.isValidIdForTagOrPageOrPost(urlComponent) && !content.containsTag(withUrlComponent: urlComponent) } /// The title to display when considering multiple items of this tag var title: String { linkPreview.title ?? name } } // MARK: Storage extension LocalizedTag { convenience init(context: LoadingContext, data: Data) { self.init( content: context.content, urlComponent: data.urlComponent, name: data.name, linkPreview: .init(context: context, data: data.linkPreview), originalUrl: data.originalUrl) } struct Data: Codable { let urlComponent: String let name: String let linkPreview: LinkPreview.Data let originalUrl: String? } var data: Data { .init(urlComponent: urlComponent, name: name, linkPreview: linkPreview.data, originalUrl: originalUrl) } }