Add navigation settings, fix page generation

This commit is contained in:
Christoph Hagen
2025-01-02 11:56:51 +01:00
parent 922ba4ebe7
commit 4d4275e072
43 changed files with 921 additions and 581 deletions

View File

@ -0,0 +1,26 @@
import Foundation
final class LocalizedNavigationSettings: ObservableObject {
@Published
var rootUrl: String
init(rootUrl: String) {
self.rootUrl = rootUrl
}
init(file: LocalizedNavigationSettingsFile) {
self.rootUrl = file.rootUrl
}
var file: LocalizedNavigationSettingsFile {
.init(rootUrl: rootUrl)
}
}
extension LocalizedNavigationSettings {
static var `default`: LocalizedNavigationSettings {
.init(rootUrl: "/")
}
}

View File

@ -17,9 +17,18 @@ final class LocalizedPostSettings: ObservableObject {
self.feedUrlPrefix = feedUrlPrefix
}
// MARK: Storage
init(file: LocalizedPostSettingsFile) {
self.title = file.feedTitle
self.description = file.feedDescription
self.feedUrlPrefix = file.feedUrlPrefix
}
var file: LocalizedPostSettingsFile {
.init(
feedTitle: title,
feedDescription: description,
feedUrlPrefix: feedUrlPrefix)
}
}

View File

@ -0,0 +1,71 @@
import Foundation
final class NavigationSettings: ObservableObject {
/// The items to show in the navigation bar
@Published
var navigationItems: [Item]
@Published
var german: LocalizedNavigationSettings
@Published
var english: LocalizedNavigationSettings
init(navigationItems: [Item], german: LocalizedNavigationSettings, english: LocalizedNavigationSettings) {
self.navigationItems = navigationItems
self.german = german
self.english = english
}
init(file: NavigationSettingsFile,
tags: [String : Tag],
pages: [String : Page],
files: [String : FileResource],
posts: [String : Post],
tagOverview: TagOverviewPage?) {
#warning("Notify about missing links")
self.navigationItems = file.navigationItems.compactMap { raw in
guard let type = ItemType(rawValue: raw, posts: posts, pages: pages, tags: tags) else {
return nil
}
switch type {
case .general:
return nil
case .post(let post):
return post
case .feed:
return nil // TODO: Provide feed object
case .page(let page):
return page
case .tagPage(let tag):
return tag
case .tagOverview:
return tagOverview
}
}
self.german = LocalizedNavigationSettings(file: file.german)
self.english = LocalizedNavigationSettings(file: file.english)
}
var file: NavigationSettingsFile {
.init(
navigationItems: navigationItems.map { $0.itemType.id },
german: german.file,
english: english.file)
}
}
extension NavigationSettings: LocalizedItem {
}
extension NavigationSettings {
static var `default`: NavigationSettings {
.init(navigationItems: [],
german: .default,
english: .default)
}
}

View File

@ -31,6 +31,8 @@ final class PostSettings: ObservableObject {
self.defaultCssFile = defaultCssFile
}
// MARK: Storage
init(file: PostSettingsFile, files: [String : FileResource]) {
self.postsPerPage = file.postsPerPage
self.contentWidth = file.contentWidth
@ -38,4 +40,12 @@ final class PostSettings: ObservableObject {
self.swiperJsFile = file.swiperJsFile.map { files[$0] }
self.defaultCssFile = file.defaultCssFile.map { files[$0] }
}
var file: PostSettingsFile {
.init(postsPerPage: postsPerPage,
contentWidth: contentWidth,
swiperCssFile: swiperCssFile?.id,
swiperJsFile: swiperJsFile?.id,
defaultCssFile: defaultCssFile?.id)
}
}

View File

@ -7,7 +7,7 @@ final class Settings: ObservableObject {
/// The items to show in the navigation bar
@Published
var navigationItems: [Item]
var navigation: NavigationSettings
@Published
var posts: PostSettings
@ -21,9 +21,9 @@ final class Settings: ObservableObject {
@Published
var english: LocalizedPostSettings
init(paths: PathSettings, navigationItems: [Item], posts: PostSettings, pages: PageSettings, german: LocalizedPostSettings, english: LocalizedPostSettings) {
init(paths: PathSettings, navigation: NavigationSettings, posts: PostSettings, pages: PageSettings, german: LocalizedPostSettings, english: LocalizedPostSettings) {
self.paths = paths
self.navigationItems = navigationItems
self.navigation = navigation
self.posts = posts
self.pages = pages
self.german = german
@ -36,4 +36,48 @@ final class Settings: ObservableObject {
case .german: return german
}
}
init(file: SettingsFile,
tags: [String : Tag],
pages: [String : Page],
files: [String : FileResource],
posts: [String : Post],
tagOverview: TagOverviewPage?) {
self.navigation = NavigationSettings(
file: file.navigation,
tags: tags,
pages: pages,
files: files,
posts: posts,
tagOverview: tagOverview)
self.posts = PostSettings(file: file.posts, files: files)
self.pages = PageSettings(file: file.pages, files: files)
self.paths = PathSettings(file: file.paths)
self.german = .init(file: file.german)
self.english = .init(file: file.english)
}
var file: SettingsFile {
.init(
paths: paths.file,
navigation: navigation.file,
posts: posts.file,
pages: pages.file,
german: german.file,
english: english.file)
}
}
extension Settings {
static let `default`: Settings = .init(
paths: .default,
navigation: .default,
posts: .default,
pages: .default,
german: .german,
english: .english)
}