Improve page indicators, adding items
This commit is contained in:
@ -23,10 +23,12 @@ extension Content {
|
||||
}
|
||||
|
||||
func isValidIdForTagOrPageOrPost(_ id: String) -> Bool {
|
||||
!id.isEmpty &&
|
||||
id.rangeOfCharacter(from: Content.disallowedCharactersInIds) == nil
|
||||
}
|
||||
|
||||
func isValidIdForFile(_ id: String) -> Bool {
|
||||
!id.isEmpty &&
|
||||
id.rangeOfCharacter(from: Content.disallowedCharactersInFileIds) == nil
|
||||
}
|
||||
|
||||
|
@ -48,4 +48,11 @@ extension ContentLanguage {
|
||||
case .german: return "German"
|
||||
}
|
||||
}
|
||||
|
||||
var shortText: String {
|
||||
switch self {
|
||||
case .english: "EN"
|
||||
case .german: "DE"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,108 +0,0 @@
|
||||
import Foundation
|
||||
/*
|
||||
final class TagOverviewPage: Item {
|
||||
|
||||
static let id = "all-tags"
|
||||
|
||||
@Published
|
||||
var german: LocalizedTagOverviewPage
|
||||
|
||||
@Published
|
||||
var english: LocalizedTagOverviewPage
|
||||
|
||||
|
||||
init(content: Content, german: LocalizedTagOverviewPage, english: LocalizedTagOverviewPage) {
|
||||
self.german = german
|
||||
self.english = english
|
||||
super.init(content: content, id: TagOverviewPage.id)
|
||||
}
|
||||
|
||||
override var itemType: ItemType {
|
||||
.tagOverview
|
||||
}
|
||||
|
||||
override func title(in language: ContentLanguage) -> String {
|
||||
localized(in: language).title
|
||||
}
|
||||
|
||||
override func absoluteUrl(in language: ContentLanguage) -> String {
|
||||
makeCleanAbsolutePath(internalPath(for: language))
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
func contains(urlComponent: String) -> Bool {
|
||||
english.urlComponent == urlComponent || german.urlComponent == urlComponent
|
||||
}
|
||||
|
||||
var file: TagOverviewFile {
|
||||
.init(german: german.file,
|
||||
english: english.file)
|
||||
}
|
||||
}
|
||||
|
||||
extension TagOverviewPage: LocalizedItem {
|
||||
|
||||
}
|
||||
|
||||
final class LocalizedTagOverviewPage: ObservableObject {
|
||||
|
||||
unowned let content: Content
|
||||
|
||||
@Published
|
||||
var title: String
|
||||
|
||||
/**
|
||||
The string to use when creating the url for the page.
|
||||
*/
|
||||
@Published
|
||||
var urlComponent: String
|
||||
|
||||
@Published
|
||||
var linkPreviewImage: FileResource?
|
||||
|
||||
@Published
|
||||
var linkPreviewTitle: String?
|
||||
|
||||
@Published
|
||||
var linkPreviewDescription: String?
|
||||
|
||||
init(content: Content, title: String, urlString: String, linkPreviewImage: FileResource? = nil, linkPreviewTitle: String? = nil, linkPreviewDescription: String? = nil) {
|
||||
self.content = content
|
||||
self.title = title
|
||||
self.urlComponent = urlString
|
||||
self.linkPreviewImage = linkPreviewImage
|
||||
self.linkPreviewTitle = linkPreviewTitle
|
||||
self.linkPreviewDescription = linkPreviewDescription
|
||||
}
|
||||
|
||||
init(content: Content, file: LocalizedTagOverviewFile, image: FileResource?) {
|
||||
self.content = content
|
||||
self.title = file.title
|
||||
self.urlComponent = file.url
|
||||
self.linkPreviewImage = image
|
||||
self.linkPreviewTitle = file.linkPreviewTitle
|
||||
self.linkPreviewDescription = file.linkPreviewDescription
|
||||
}
|
||||
|
||||
var file: LocalizedTagOverviewFile {
|
||||
.init(url: urlComponent,
|
||||
title: title,
|
||||
linkPreviewImage: linkPreviewImage?.id,
|
||||
linkPreviewTitle: linkPreviewTitle,
|
||||
linkPreviewDescription: linkPreviewDescription)
|
||||
}
|
||||
|
||||
func isValid(urlComponent: String) -> Bool {
|
||||
!urlComponent.isEmpty &&
|
||||
content.isValidIdForTagOrPageOrPost(urlComponent) &&
|
||||
!content.containsTag(withUrlComponent: urlComponent)
|
||||
}
|
||||
}
|
||||
*/
|
@ -82,7 +82,9 @@ final class ModelLoader {
|
||||
if pages.isEmpty { print("No pages loaded") }
|
||||
|
||||
pages.forEach { pageId, data in
|
||||
context.pages[pageId] = Page(context: context, id: pageId, data: data)
|
||||
let page = Page(context: context, id: pageId, data: data)
|
||||
page.updateContentExistence()
|
||||
context.pages[pageId] = page
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -40,6 +40,9 @@ final class LocalizedPage: ObservableObject {
|
||||
@Published
|
||||
var hideTitle: Bool
|
||||
|
||||
@Published
|
||||
var hasContent: Bool = false
|
||||
|
||||
init(content: Content,
|
||||
urlString: String,
|
||||
title: String,
|
||||
|
@ -153,8 +153,26 @@ final class Page: Item, DateItem, LocalizedItem {
|
||||
content.storage.pageContent(for: id, language: language)
|
||||
}
|
||||
|
||||
func hasContent(in language: ContentLanguage) -> Bool {
|
||||
content.storage.hasPageContent(for: id, language: language)
|
||||
func save(pageContent: String, in language: ContentLanguage) -> Bool {
|
||||
guard content.storage.save(pageContent: pageContent, for: id, in: language) else {
|
||||
return false
|
||||
}
|
||||
localized(in: language).hasContent = true
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
Update the `hasContent` property of all localized pages.
|
||||
*/
|
||||
func updateContentExistence() {
|
||||
for language in ContentLanguage.allCases {
|
||||
localized(in: language).hasContent = content.storage.hasPageContent(for: id, language: language)
|
||||
}
|
||||
}
|
||||
|
||||
/// All languages for which the page has no content
|
||||
var missingContentLanguages: [ContentLanguage] {
|
||||
ContentLanguage.allCases.filter { !localized(in: $0).hasContent }
|
||||
}
|
||||
|
||||
func remove(_ file: FileResource) {
|
||||
|
@ -81,6 +81,7 @@ final class Post: Item, DateItem, LocalizedItem {
|
||||
func toggle(_ tag: Tag) {
|
||||
if let linkedPage {
|
||||
linkedPage.toggle(tag)
|
||||
didChange() // Otherwise tags will not be updated
|
||||
return
|
||||
}
|
||||
guard let index = tags.firstIndex(of: tag) else {
|
||||
|
Reference in New Issue
Block a user