Improve settings, sidebars

This commit is contained in:
Christoph Hagen
2024-12-04 22:54:05 +01:00
parent b3cc4a57db
commit c3309197c0
36 changed files with 968 additions and 426 deletions

View File

@ -37,16 +37,18 @@ extension Content {
linkPreviewDescription: page.linkPreviewDescription)
}
private func convert(_ websiteData: LocalizedWebsiteDataFile) -> LocalizedWebsiteData {
.init(title: websiteData.title,
description: websiteData.description,
iconDescription: websiteData.iconDescription)
private func convert(_ settings: LocalizedSettingsFile) -> LocalizedSettings {
.init(navigationBarIconDescription: settings.navigationBarIconDescription,
posts: .init(
title: settings.posts.feedTitle,
description: settings.posts.feedDescription,
feedUrlPrefix: settings.posts.feedUrlPrefix))
}
func loadFromDisk() throws {
let storage = Storage(baseFolder: URL(filePath: contentPath))
let websiteData = try storage.loadWebsiteData()
let settings = try storage.loadSettings()
let tagData = try storage.loadAllTags()
let pagesData = try storage.loadAllPages()
@ -104,10 +106,25 @@ extension Content {
self.images = images.values.sorted { $0.id }
self.videos = videos
self.posts = posts.sorted(ascending: false) { $0.startDate }
self.websiteData = WebsiteData(
navigationTags: websiteData.navigationTags.map { tags[$0]! },
german: convert(websiteData.german),
english: convert(websiteData.english))
self.settings = makeSettings(settings, tags: tags)
}
private func makeSettings(_ settings: SettingsFile, tags: [String : Tag]) -> Settings {
let navigationBar = NavigationBarSettings(
iconPath: settings.navigationBar.navigationIconPath,
tags: settings.navigationBar.navigationTags.map { tags[$0]! })
let posts = PostSettings(
postsPerPage: settings.posts.postsPerPage,
contentWidth: settings.posts.contentWidth)
return Settings(
outputDirectoryPath: settings.outputDirectoryPath,
navigationBar: navigationBar,
posts: posts,
german: convert(settings.german),
english: convert(settings.english))
}
private func loadPages(_ pagesData: [String : PageFile], tags: [String : Tag]) -> [String : Page] {

View File

@ -15,7 +15,7 @@ extension Content {
for tag in tags {
storage.save(tagMetadata: tag.tagFile, for: tag.id)
}
storage.save(websiteData: websiteData.dataFile)
storage.save(settings: settings.file)
do {
try storage.deletePostFiles(notIn: posts.map { $0.id })
@ -113,21 +113,48 @@ private extension LocalizedTag {
}
}
private extension WebsiteData {
private extension NavigationBarSettings {
var dataFile: WebsiteDataFile {
var file: NavigationBarSettingsFile {
.init(navigationIconPath: iconPath,
navigationTags: tags.map { $0.id })
}
}
extension Settings {
var file: SettingsFile {
.init(
navigationTags: navigationTags.map { $0.id },
german: german.dataFile,
english: english.dataFile)
outputDirectoryPath: outputDirectoryPath,
navigationBar: navigationBar.file,
posts: posts.file,
german: german.file,
english: english.file)
}
}
private extension LocalizedWebsiteData {
private extension PostSettings {
var dataFile: LocalizedWebsiteDataFile {
.init(title: title,
description: description,
iconDescription: iconDescription)
var file: PostSettingsFile {
.init(postsPerPage: postsPerPage,
contentWidth: contentWidth)
}
}
private extension LocalizedSettings {
var file: LocalizedSettingsFile {
.init(navigationBarIconDescription: navigationBarIconDescription,
posts: posts.file)
}
}
private extension LocalizedPostSettings {
var file: LocalizedPostSettingsFile {
.init(
feedTitle: title,
feedDescription: description,
feedUrlPrefix: feedUrlPrefix)
}
}

View File

@ -5,7 +5,7 @@ import Combine
final class Content: ObservableObject {
@Published
var websiteData: WebsiteData
var settings: Settings
@Published
var posts: [Post]
@ -39,7 +39,7 @@ final class Content: ObservableObject {
private var cancellables = Set<AnyCancellable>()
init(websiteData: WebsiteData,
init(settings: Settings,
posts: [Post],
pages: [Page],
tags: [Tag],
@ -47,7 +47,7 @@ final class Content: ObservableObject {
files: [FileResource],
videos: [String],
storedContentPath: String) {
self.websiteData = websiteData
self.settings = settings
self.posts = posts
self.pages = pages
self.tags = tags
@ -69,7 +69,7 @@ final class Content: ObservableObject {
init() {
self.storage = Storage(baseFolder: URL(filePath: ""))
self.websiteData = .mock
self.settings = .mock
self.posts = []
self.pages = []
self.tags = []

View File

@ -1,19 +0,0 @@
import Foundation
final class LocalizedWebsiteData: ObservableObject {
@Published
var title: String
@Published
var description: String
@Published
var iconDescription: String
init(title: String, description: String, iconDescription: String) {
self.title = title
self.description = description
self.iconDescription = iconDescription
}
}

View File

@ -0,0 +1,19 @@
import Foundation
final class LocalizedPostSettings: ObservableObject {
@Published
var title: String
@Published
var description: String
@Published
var feedUrlPrefix: String
init(title: String, description: String, feedUrlPrefix: String) {
self.title = title
self.description = description
self.feedUrlPrefix = feedUrlPrefix
}
}

View File

@ -0,0 +1,15 @@
import Foundation
final class LocalizedSettings: ObservableObject {
@Published
var navigationBarIconDescription: String
@Published
var posts: LocalizedPostSettings
init(navigationBarIconDescription: String, posts: LocalizedPostSettings) {
self.navigationBarIconDescription = navigationBarIconDescription
self.posts = posts
}
}

View File

@ -0,0 +1,17 @@
import Foundation
final class NavigationBarSettings: ObservableObject {
/// The path to the main icon in the navigation bar
@Published
var iconPath: String
/// The tags to show in the navigation bar
@Published
var tags: [Tag]
init(iconPath: String, tags: [Tag]) {
self.iconPath = iconPath
self.tags = tags
}
}

View File

@ -0,0 +1,17 @@
import Foundation
final class PostSettings: ObservableObject {
/// The number of posts to show in a single page of the news feed
@Published
var postsPerPage: Int
/// The maximum width of the main content
@Published
var contentWidth: CGFloat
init(postsPerPage: Int, contentWidth: CGFloat) {
self.postsPerPage = postsPerPage
self.contentWidth = contentWidth
}
}

View File

@ -0,0 +1,34 @@
import Foundation
final class Settings: ObservableObject {
@Published
var outputDirectoryPath: String
@Published
var navigationBar: NavigationBarSettings
@Published
var posts: PostSettings
@Published
var german: LocalizedSettings
@Published
var english: LocalizedSettings
init(outputDirectoryPath: String, navigationBar: NavigationBarSettings, posts: PostSettings, german: LocalizedSettings, english: LocalizedSettings) {
self.outputDirectoryPath = outputDirectoryPath
self.navigationBar = navigationBar
self.posts = posts
self.german = german
self.english = english
}
func localized(in language: ContentLanguage) -> LocalizedSettings {
switch language {
case .english: return english
case .german: return german
}
}
}

View File

@ -1,26 +0,0 @@
import Foundation
final class WebsiteData: ObservableObject {
@Published
var navigationTags: [Tag]
@Published
var german: LocalizedWebsiteData
@Published
var english: LocalizedWebsiteData
init(navigationTags: [Tag] = [], german: LocalizedWebsiteData, english: LocalizedWebsiteData) {
self.navigationTags = navigationTags
self.german = german
self.english = english
}
func localized(in language: ContentLanguage) -> LocalizedWebsiteData {
switch language {
case .english: return english
case .german: return german
}
}
}