Improve settings, sidebars
This commit is contained in:
@ -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] {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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 = []
|
||||
|
@ -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
|
||||
}
|
||||
}
|
19
CHDataManagement/Model/Settings/LocalizedPostSettings.swift
Normal file
19
CHDataManagement/Model/Settings/LocalizedPostSettings.swift
Normal 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
|
||||
}
|
||||
}
|
15
CHDataManagement/Model/Settings/LocalizedSettings.swift
Normal file
15
CHDataManagement/Model/Settings/LocalizedSettings.swift
Normal 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
|
||||
}
|
||||
}
|
17
CHDataManagement/Model/Settings/NavigationBarSettings.swift
Normal file
17
CHDataManagement/Model/Settings/NavigationBarSettings.swift
Normal 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
|
||||
}
|
||||
}
|
17
CHDataManagement/Model/Settings/PostSettings.swift
Normal file
17
CHDataManagement/Model/Settings/PostSettings.swift
Normal 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
|
||||
}
|
||||
}
|
34
CHDataManagement/Model/Settings/Settings.swift
Normal file
34
CHDataManagement/Model/Settings/Settings.swift
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user