75 lines
1.5 KiB
Swift
75 lines
1.5 KiB
Swift
import Foundation
|
|
|
|
class Item: ObservableObject, Identifiable {
|
|
|
|
unowned let content: Content
|
|
|
|
/// A dummy property to force views to update when properties change
|
|
@Published
|
|
private var changeToggle = false
|
|
|
|
@Published
|
|
var id: String
|
|
|
|
init(content: Content, id: String) {
|
|
self.content = content
|
|
self.id = id
|
|
}
|
|
|
|
func didChange() {
|
|
DispatchQueue.main.async {
|
|
self.changeToggle.toggle()
|
|
}
|
|
}
|
|
|
|
func makeCleanAbsolutePath(_ path: String) -> String {
|
|
"/" + makeCleanRelativePath(path)
|
|
}
|
|
|
|
func makeCleanRelativePath(_ path: String) -> String {
|
|
path.components(separatedBy: "/").filter { !$0.isEmpty }.joined(separator: "/")
|
|
}
|
|
|
|
func title(in language: ContentLanguage) -> String {
|
|
fatalError()
|
|
}
|
|
|
|
func absoluteUrl(in language: ContentLanguage) -> String {
|
|
fatalError()
|
|
}
|
|
|
|
var itemType: ItemType {
|
|
fatalError()
|
|
}
|
|
|
|
var itemReference: ItemReference {
|
|
fatalError()
|
|
}
|
|
|
|
var itemId: ItemId {
|
|
.init(type: itemType, id: id)
|
|
}
|
|
}
|
|
|
|
extension Item: Equatable {
|
|
|
|
static func == (lhs: Item, rhs: Item) -> Bool {
|
|
lhs.id == rhs.id && lhs.itemType == rhs.itemType
|
|
}
|
|
}
|
|
|
|
extension Item: Hashable {
|
|
|
|
func hash(into hasher: inout Hasher) {
|
|
hasher.combine(id)
|
|
hasher.combine(itemType)
|
|
}
|
|
}
|
|
|
|
extension Item: Comparable {
|
|
|
|
static func < (lhs: Item, rhs: Item) -> Bool {
|
|
lhs.id < rhs.id && lhs.itemType < rhs.itemType
|
|
}
|
|
}
|