Improve page indicators, adding items

This commit is contained in:
Christoph Hagen
2025-01-09 13:27:38 +01:00
parent 0590224f02
commit 0db6e411c3
23 changed files with 238 additions and 206 deletions

View File

@ -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
}

View File

@ -48,4 +48,11 @@ extension ContentLanguage {
case .german: return "German"
}
}
var shortText: String {
switch self {
case .english: "EN"
case .german: "DE"
}
}
}

View File

@ -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)
}
}
*/

View File

@ -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
}
}

View File

@ -40,6 +40,9 @@ final class LocalizedPage: ObservableObject {
@Published
var hideTitle: Bool
@Published
var hasContent: Bool = false
init(content: Content,
urlString: String,
title: String,

View File

@ -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) {

View File

@ -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 {