Reorganize saving, generate feed
This commit is contained in:
@ -1,35 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
extension Content {
|
||||
|
||||
func generateFeed(for language: ContentLanguage, bookmarkKey: String) {
|
||||
let posts = posts.map { $0.feedEntry(for: language) }
|
||||
let data = websiteData.localized(in: language)
|
||||
let navigationItems: [FeedNavigationLink] = websiteData.navigationTags.map {
|
||||
let localized = $0.localized(in: language)
|
||||
return .init(text: localized.name, url: localized.urlComponent)
|
||||
}
|
||||
|
||||
DispatchQueue.global(qos: .userInitiated).async {
|
||||
|
||||
let feed = Feed(
|
||||
language: language,
|
||||
title: data.title,
|
||||
description: data.description,
|
||||
iconDescription: data.iconDescription,
|
||||
navigationItems: navigationItems,
|
||||
posts: posts)
|
||||
let fileContent = feed.content
|
||||
Content.accessFolderFromBookmark(key: bookmarkKey) { folder in
|
||||
let outputFile = folder.appendingPathComponent("feed.html", isDirectory: false)
|
||||
do {
|
||||
try fileContent
|
||||
.data(using: .utf8)!
|
||||
.write(to: outputFile)
|
||||
} catch {
|
||||
print("Failed to save: \(error)")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
128
CHDataManagement/Model/Content+Load.swift
Normal file
128
CHDataManagement/Model/Content+Load.swift
Normal file
@ -0,0 +1,128 @@
|
||||
import Foundation
|
||||
|
||||
extension Content {
|
||||
|
||||
private func convert(_ tag: LocalizedTagFile, images: [String : ImageResource]) -> LocalizedTag {
|
||||
LocalizedTag(
|
||||
urlComponent: tag.urlComponent,
|
||||
name: tag.name,
|
||||
subtitle: tag.subtitle,
|
||||
description: tag.description,
|
||||
thumbnail: tag.thumbnail.map { images[$0] },
|
||||
originalUrl: tag.originalURL)
|
||||
}
|
||||
|
||||
private func convert(_ post: LocalizedPostFile, images: [String : ImageResource]) -> LocalizedPost {
|
||||
LocalizedPost(
|
||||
title: post.title,
|
||||
content: post.content,
|
||||
lastModified: post.lastModifiedDate,
|
||||
images: post.images.compactMap { images[$0] },
|
||||
linkPreviewImage: post.linkPreviewImage.map { images[$0] },
|
||||
linkPreviewTitle: post.linkPreviewTitle,
|
||||
linkPreviewDescription: post.linkPreviewDescription)
|
||||
}
|
||||
|
||||
private func convert(_ page: LocalizedPageFile) -> LocalizedPage {
|
||||
LocalizedPage(
|
||||
urlString: page.url,
|
||||
title: page.title,
|
||||
lastModified: page.lastModifiedDate,
|
||||
originalUrl: page.originalURL,
|
||||
files: Set(page.files),
|
||||
externalFiles: Set(page.externalFiles),
|
||||
requiredFiles: Set(page.requiredFiles),
|
||||
linkPreviewImage: page.linkPreviewImage,
|
||||
linkPreviewTitle: page.linkPreviewTitle,
|
||||
linkPreviewDescription: page.linkPreviewDescription)
|
||||
}
|
||||
|
||||
private func convert(_ websiteData: LocalizedWebsiteDataFile) -> LocalizedWebsiteData {
|
||||
.init(title: websiteData.title,
|
||||
description: websiteData.description,
|
||||
iconDescription: websiteData.iconDescription)
|
||||
}
|
||||
|
||||
func loadFromDisk() throws {
|
||||
let storage = Storage(baseFolder: URL(filePath: contentPath))
|
||||
|
||||
let websiteData = try storage.loadWebsiteData()
|
||||
|
||||
let tagData = try storage.loadAllTags()
|
||||
let pagesData = try storage.loadAllPages()
|
||||
let postsData = try storage.loadAllPosts()
|
||||
let filesData = try storage.loadAllFiles()
|
||||
|
||||
var images: [String : ImageResource] = [:]
|
||||
var files: [FileResource] = []
|
||||
var videos: [String] = []
|
||||
|
||||
for (file, url) in filesData {
|
||||
let ext = file.components(separatedBy: ".").last!.lowercased()
|
||||
let type = FileType(fileExtension: ext)
|
||||
switch type {
|
||||
case .image:
|
||||
images[file] = ImageResource(uniqueId: file, altText: .init(en: "", de: ""), fileUrl: url)
|
||||
case .file:
|
||||
files.append(FileResource(uniqueId: file, description: ""))
|
||||
case .video:
|
||||
videos.append(file)
|
||||
case .resource:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
let tags = tagData.reduce(into: [:]) { (tags, data) in
|
||||
tags[data.key] = Tag(
|
||||
isVisible: data.value.isVisible,
|
||||
german: convert(data.value.german, images: images),
|
||||
english: convert(data.value.english, images: images))
|
||||
}
|
||||
|
||||
let pages: [String : Page] = loadPages(pagesData, tags: tags)
|
||||
|
||||
let posts = postsData.map { postId, post in
|
||||
let linkedPage = post.linkedPageId.map { pages[$0] }
|
||||
let german = convert(post.german, images: images)
|
||||
let english = convert(post.english, images: images)
|
||||
|
||||
return Post(
|
||||
id: postId,
|
||||
isDraft: post.isDraft,
|
||||
createdDate: post.createdDate,
|
||||
startDate: post.startDate,
|
||||
endDate: post.endDate,
|
||||
tags: post.tags.map { tags[$0]! },
|
||||
german: german,
|
||||
english: english,
|
||||
linkedPage: linkedPage)
|
||||
}
|
||||
|
||||
self.tags = tags.values.sorted()
|
||||
self.pages = pages.values.sorted(ascending: false) { $0.startDate }
|
||||
self.files = files.sorted { $0.uniqueId }
|
||||
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))
|
||||
}
|
||||
|
||||
private func loadPages(_ pagesData: [String : PageFile], tags: [String : Tag]) -> [String : Page] {
|
||||
pagesData.reduce(into: [:]) { pages, data in
|
||||
let (pageId, page) = data
|
||||
pages[pageId] = Page(
|
||||
id: pageId,
|
||||
isDraft: page.isDraft,
|
||||
createdDate: page.createdDate,
|
||||
startDate: page.startDate,
|
||||
endDate: page.endDate,
|
||||
german: convert(page.german),
|
||||
english: convert(page.english),
|
||||
tags: page.tags.map { tags[$0]! })
|
||||
}
|
||||
}
|
||||
|
||||
}
|
133
CHDataManagement/Model/Content+Save.swift
Normal file
133
CHDataManagement/Model/Content+Save.swift
Normal file
@ -0,0 +1,133 @@
|
||||
import Foundation
|
||||
|
||||
extension Content {
|
||||
|
||||
func saveToDisk() {
|
||||
//print("Starting save")
|
||||
for page in pages {
|
||||
storage.save(pageMetadata: page.pageFile, for: page.id)
|
||||
}
|
||||
|
||||
for post in posts {
|
||||
storage.save(post: post.postFile, for: post.id)
|
||||
}
|
||||
|
||||
for tag in tags {
|
||||
storage.save(tagMetadata: tag.tagFile, for: tag.id)
|
||||
}
|
||||
storage.save(websiteData: websiteData.dataFile)
|
||||
|
||||
do {
|
||||
try storage.deletePostFiles(notIn: posts.map { $0.id })
|
||||
try storage.deletePageFiles(notIn: pages.map { $0.id })
|
||||
try storage.deleteTagFiles(notIn: tags.map { $0.id })
|
||||
let allFiles = files.map { $0.uniqueId } + images.map { $0.id } + videos
|
||||
try storage.deleteFiles(notIn: allFiles)
|
||||
} catch {
|
||||
print("Failed to remove unused files: \(error)")
|
||||
}
|
||||
// TODO: Remove all files that are no longer in use (they belong to deleted items)
|
||||
//print("Finished save")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private extension Page {
|
||||
|
||||
var pageFile: PageFile {
|
||||
.init(isDraft: isDraft,
|
||||
tags: tags.map { $0.id },
|
||||
createdDate: createdDate,
|
||||
startDate: startDate,
|
||||
endDate: hasEndDate ? endDate : nil,
|
||||
german: german.pageFile,
|
||||
english: english.pageFile)
|
||||
}
|
||||
}
|
||||
|
||||
private extension LocalizedPage {
|
||||
|
||||
var pageFile: LocalizedPageFile {
|
||||
.init(url: urlString,
|
||||
files: files.sorted(),
|
||||
externalFiles: externalFiles.sorted(),
|
||||
requiredFiles: requiredFiles.sorted(),
|
||||
title: title,
|
||||
linkPreviewImage: linkPreviewImage,
|
||||
linkPreviewTitle: linkPreviewTitle,
|
||||
linkPreviewDescription: linkPreviewDescription,
|
||||
lastModifiedDate: lastModified,
|
||||
originalURL: originalUrl)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private extension Post {
|
||||
|
||||
var postFile: PostFile {
|
||||
.init(
|
||||
isDraft: isDraft,
|
||||
createdDate: createdDate,
|
||||
startDate: startDate,
|
||||
endDate: hasEndDate ? endDate : nil,
|
||||
tags: tags.map { $0.id },
|
||||
german: german.postFile,
|
||||
english: english.postFile,
|
||||
linkedPageId: linkedPage?.id)
|
||||
}
|
||||
}
|
||||
|
||||
private extension LocalizedPost {
|
||||
|
||||
var postFile: LocalizedPostFile {
|
||||
.init(images: images.map { $0.id },
|
||||
title: title.nonEmpty,
|
||||
content: content,
|
||||
lastModifiedDate: lastModified,
|
||||
linkPreviewImage: linkPreviewImage?.id,
|
||||
linkPreviewTitle: linkPreviewTitle,
|
||||
linkPreviewDescription: linkPreviewDescription)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private extension Tag {
|
||||
|
||||
var tagFile: TagFile {
|
||||
.init(id: id,
|
||||
isVisible: isVisible,
|
||||
german: german.tagFile,
|
||||
english: english.tagFile)
|
||||
}
|
||||
}
|
||||
|
||||
private extension LocalizedTag {
|
||||
|
||||
var tagFile: LocalizedTagFile {
|
||||
.init(urlComponent: urlComponent,
|
||||
name: name,
|
||||
subtitle: subtitle,
|
||||
description: description,
|
||||
thumbnail: thumbnail?.id,
|
||||
originalURL: originalUrl)
|
||||
}
|
||||
}
|
||||
|
||||
private extension WebsiteData {
|
||||
|
||||
var dataFile: WebsiteDataFile {
|
||||
.init(
|
||||
navigationTags: navigationTags.map { $0.id },
|
||||
german: german.dataFile,
|
||||
english: english.dataFile)
|
||||
}
|
||||
}
|
||||
|
||||
private extension LocalizedWebsiteData {
|
||||
|
||||
var dataFile: LocalizedWebsiteDataFile {
|
||||
.init(title: title,
|
||||
description: description,
|
||||
iconDescription: iconDescription)
|
||||
}
|
||||
}
|
@ -97,159 +97,6 @@ final class Content: ObservableObject {
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
|
||||
private func convert(_ tag: LocalizedTagFile, images: [String : ImageResource]) -> LocalizedTag {
|
||||
LocalizedTag(
|
||||
urlComponent: tag.urlComponent,
|
||||
name: tag.name,
|
||||
subtitle: tag.subtitle,
|
||||
description: tag.description,
|
||||
thumbnail: tag.thumbnail.map { images[$0] },
|
||||
originalUrl: tag.originalURL)
|
||||
}
|
||||
|
||||
private func convert(_ post: LocalizedPostFile, images: [String : ImageResource]) -> LocalizedPost {
|
||||
LocalizedPost(
|
||||
title: post.title,
|
||||
content: post.content,
|
||||
lastModified: post.lastModifiedDate,
|
||||
images: post.images.compactMap { images[$0] },
|
||||
linkPreviewImage: post.linkPreviewImage.map { images[$0] },
|
||||
linkPreviewTitle: post.linkPreviewTitle,
|
||||
linkPreviewDescription: post.linkPreviewDescription)
|
||||
}
|
||||
|
||||
private func convert(_ page: LocalizedPageFile) -> LocalizedPage {
|
||||
LocalizedPage(
|
||||
urlString: page.url,
|
||||
title: page.title,
|
||||
lastModified: page.lastModifiedDate,
|
||||
originalUrl: page.originalURL,
|
||||
files: Set(page.files),
|
||||
externalFiles: Set(page.externalFiles),
|
||||
requiredFiles: Set(page.requiredFiles),
|
||||
linkPreviewImage: page.linkPreviewImage,
|
||||
linkPreviewTitle: page.linkPreviewTitle,
|
||||
linkPreviewDescription: page.linkPreviewDescription)
|
||||
}
|
||||
|
||||
private func convert(_ websiteData: LocalizedWebsiteDataFile) -> LocalizedWebsiteData {
|
||||
.init(title: websiteData.title,
|
||||
description: websiteData.description,
|
||||
iconDescription: websiteData.iconDescription)
|
||||
}
|
||||
|
||||
func loadFromDisk() throws {
|
||||
let storage = Storage(baseFolder: URL(filePath: contentPath))
|
||||
|
||||
let websiteData = try storage.loadWebsiteData()
|
||||
|
||||
let tagData = try storage.loadAllTags()
|
||||
let pagesData = try storage.loadAllPages()
|
||||
let postsData = try storage.loadAllPosts()
|
||||
let filesData = try storage.loadAllFiles()
|
||||
|
||||
var images: [String : ImageResource] = [:]
|
||||
var files: [FileResource] = []
|
||||
var videos: [String] = []
|
||||
|
||||
for (file, url) in filesData {
|
||||
let ext = file.components(separatedBy: ".").last!.lowercased()
|
||||
let type = FileType(fileExtension: ext)
|
||||
switch type {
|
||||
case .image:
|
||||
images[file] = ImageResource(uniqueId: file, altText: .init(en: "", de: ""), fileUrl: url)
|
||||
case .file:
|
||||
files.append(FileResource(uniqueId: file, description: ""))
|
||||
case .video:
|
||||
videos.append(file)
|
||||
case .resource:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
let tags = tagData.reduce(into: [:]) { (tags, data) in
|
||||
tags[data.key] = Tag(
|
||||
isVisible: data.value.isVisible,
|
||||
german: convert(data.value.german, images: images),
|
||||
english: convert(data.value.english, images: images))
|
||||
}
|
||||
|
||||
let pages: [String : Page] = loadPages(pagesData, tags: tags)
|
||||
|
||||
let posts = postsData.map { postId, post in
|
||||
let linkedPage = post.linkedPageId.map { pages[$0] }
|
||||
let german = convert(post.german, images: images)
|
||||
let english = convert(post.english, images: images)
|
||||
|
||||
return Post(
|
||||
id: postId,
|
||||
isDraft: post.isDraft,
|
||||
createdDate: post.createdDate,
|
||||
startDate: post.startDate,
|
||||
endDate: post.endDate,
|
||||
tags: post.tags.map { tags[$0]! },
|
||||
german: german,
|
||||
english: english,
|
||||
linkedPage: linkedPage)
|
||||
}
|
||||
|
||||
self.tags = tags.values.sorted()
|
||||
self.pages = pages.values.sorted(ascending: false) { $0.startDate }
|
||||
self.files = files.sorted { $0.uniqueId }
|
||||
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))
|
||||
}
|
||||
|
||||
private func loadPages(_ pagesData: [String : PageFile], tags: [String : Tag]) -> [String : Page] {
|
||||
pagesData.reduce(into: [:]) { pages, data in
|
||||
let (pageId, page) = data
|
||||
pages[pageId] = Page(
|
||||
id: pageId,
|
||||
isDraft: page.isDraft,
|
||||
createdDate: page.createdDate,
|
||||
startDate: page.startDate,
|
||||
endDate: page.endDate,
|
||||
german: convert(page.german),
|
||||
english: convert(page.english),
|
||||
tags: page.tags.map { tags[$0]! })
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: Saving
|
||||
|
||||
func saveToDisk() {
|
||||
//print("Starting save")
|
||||
for page in pages {
|
||||
storage.save(pageMetadata: page.pageFile, for: page.id)
|
||||
}
|
||||
|
||||
for post in posts {
|
||||
storage.save(post: post.postFile, for: post.id)
|
||||
}
|
||||
|
||||
for tag in tags {
|
||||
storage.save(tagMetadata: tag.tagFile, for: tag.id)
|
||||
}
|
||||
storage.save(websiteData: websiteData.dataFile)
|
||||
|
||||
do {
|
||||
try storage.deletePostFiles(notIn: posts.map { $0.id })
|
||||
try storage.deletePageFiles(notIn: pages.map { $0.id })
|
||||
try storage.deleteTagFiles(notIn: tags.map { $0.id })
|
||||
let allFiles = files.map { $0.uniqueId } + images.map { $0.id } + videos
|
||||
try storage.deleteFiles(notIn: allFiles)
|
||||
} catch {
|
||||
print("Failed to remove unused files: \(error)")
|
||||
}
|
||||
// TODO: Remove all files that are no longer in use (they belong to deleted items)
|
||||
//print("Finished save")
|
||||
}
|
||||
|
||||
// MARK: Folder access
|
||||
|
||||
static func accessFolderFromBookmark(key: String, operation: (URL) -> Void) {
|
||||
|
@ -1,30 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
extension Page {
|
||||
|
||||
var pageFile: PageFile {
|
||||
.init(isDraft: isDraft,
|
||||
tags: tags.map { $0.id },
|
||||
createdDate: createdDate,
|
||||
startDate: startDate,
|
||||
endDate: hasEndDate ? endDate : nil,
|
||||
german: german.pageFile,
|
||||
english: english.pageFile)
|
||||
}
|
||||
}
|
||||
|
||||
extension LocalizedPage {
|
||||
|
||||
var pageFile: LocalizedPageFile {
|
||||
.init(url: urlString,
|
||||
files: files.sorted(),
|
||||
externalFiles: externalFiles.sorted(),
|
||||
requiredFiles: requiredFiles.sorted(),
|
||||
title: title,
|
||||
linkPreviewImage: linkPreviewImage,
|
||||
linkPreviewTitle: linkPreviewTitle,
|
||||
linkPreviewDescription: linkPreviewDescription,
|
||||
lastModifiedDate: lastModified,
|
||||
originalURL: originalUrl)
|
||||
}
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
extension Post {
|
||||
|
||||
var postFile: PostFile {
|
||||
.init(
|
||||
isDraft: isDraft,
|
||||
createdDate: createdDate,
|
||||
startDate: startDate,
|
||||
endDate: hasEndDate ? endDate : nil,
|
||||
tags: tags.map { $0.id },
|
||||
german: german.postFile,
|
||||
english: english.postFile,
|
||||
linkedPageId: linkedPage?.id)
|
||||
}
|
||||
}
|
||||
|
||||
extension LocalizedPost {
|
||||
|
||||
var postFile: LocalizedPostFile {
|
||||
.init(images: images.map { $0.id },
|
||||
title: title.nonEmpty,
|
||||
content: content,
|
||||
lastModifiedDate: lastModified,
|
||||
linkPreviewImage: linkPreviewImage?.id,
|
||||
linkPreviewTitle: linkPreviewTitle,
|
||||
linkPreviewDescription: linkPreviewDescription)
|
||||
}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
extension Tag {
|
||||
|
||||
var tagFile: TagFile {
|
||||
.init(id: id,
|
||||
isVisible: isVisible,
|
||||
german: german.tagFile,
|
||||
english: english.tagFile)
|
||||
}
|
||||
}
|
||||
|
||||
extension LocalizedTag {
|
||||
|
||||
var tagFile: LocalizedTagFile {
|
||||
.init(urlComponent: urlComponent,
|
||||
name: name,
|
||||
subtitle: subtitle,
|
||||
description: description,
|
||||
thumbnail: thumbnail?.id,
|
||||
originalURL: originalUrl)
|
||||
}
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
import Foundation
|
||||
|
||||
extension WebsiteData {
|
||||
|
||||
var dataFile: WebsiteDataFile {
|
||||
.init(
|
||||
navigationTags: navigationTags.map { $0.id },
|
||||
german: german.dataFile,
|
||||
english: english.dataFile)
|
||||
}
|
||||
}
|
||||
|
||||
extension LocalizedWebsiteData {
|
||||
|
||||
var dataFile: LocalizedWebsiteDataFile {
|
||||
.init(title: title,
|
||||
description: description,
|
||||
iconDescription: iconDescription)
|
||||
}
|
||||
}
|
102
CHDataManagement/Model/WebsiteGenerator.swift
Normal file
102
CHDataManagement/Model/WebsiteGenerator.swift
Normal file
@ -0,0 +1,102 @@
|
||||
import Foundation
|
||||
|
||||
struct WebsiteGeneratorConfiguration {
|
||||
|
||||
let language: ContentLanguage
|
||||
|
||||
let postsPerPage: Int
|
||||
|
||||
let postFeedTitle: String
|
||||
|
||||
let postFeedDescription: String
|
||||
|
||||
let postFeedUrlPrefix: String
|
||||
}
|
||||
|
||||
final class WebsiteGenerator {
|
||||
|
||||
let language: ContentLanguage
|
||||
|
||||
let content: Content
|
||||
|
||||
let postsPerPage: Int
|
||||
|
||||
let postFeedTitle: String
|
||||
|
||||
let postFeedDescription: String
|
||||
|
||||
let postFeedUrlPrefix: String
|
||||
|
||||
init(content: Content, configuration: WebsiteGeneratorConfiguration) {
|
||||
self.content = content
|
||||
self.language = configuration.language
|
||||
self.postsPerPage = configuration.postsPerPage
|
||||
self.postFeedTitle = configuration.postFeedTitle
|
||||
self.postFeedDescription = configuration.postFeedDescription
|
||||
self.postFeedUrlPrefix = configuration.postFeedUrlPrefix
|
||||
}
|
||||
|
||||
func generateWebsite() {
|
||||
createPostFeedPages()
|
||||
}
|
||||
|
||||
private func createPostFeedPages() {
|
||||
let totalCount = content.posts.count
|
||||
guard totalCount > 0 else { return }
|
||||
|
||||
let navBarData = createNavigationBarData()
|
||||
|
||||
let numberOfPages = (totalCount + postsPerPage - 1) / postsPerPage // Round up
|
||||
for pageIndex in 1...numberOfPages {
|
||||
let startIndex = (pageIndex - 1) * postsPerPage
|
||||
let endIndex = min(pageIndex * postsPerPage, totalCount)
|
||||
let postsOnPage = content.posts[startIndex..<endIndex]
|
||||
createPostFeedPage(pageIndex, pageCount: numberOfPages, posts: postsOnPage, bar: navBarData)
|
||||
}
|
||||
}
|
||||
|
||||
private func createNavigationBarData() -> NavigationBarData {
|
||||
let data = content.websiteData.localized(in: language)
|
||||
let navigationItems: [NavigationBarLink] = content.websiteData.navigationTags.map {
|
||||
let localized = $0.localized(in: language)
|
||||
return .init(text: localized.name, url: localized.urlComponent)
|
||||
}
|
||||
return NavigationBarData(
|
||||
navigationIconPath: "/assets/icons/ch.svg",
|
||||
iconDescription: data.iconDescription,
|
||||
navigationItems: navigationItems)
|
||||
}
|
||||
|
||||
private func createPostFeedPage(_ pageIndex: Int, pageCount: Int, posts: ArraySlice<Post>, bar: NavigationBarData) {
|
||||
let posts = posts.map { $0.feedEntry(for: language) }
|
||||
|
||||
let feed = PageInFeed(
|
||||
language: language,
|
||||
title: postFeedTitle,
|
||||
description: postFeedDescription,
|
||||
navigationBarData: bar,
|
||||
pageNumber: pageIndex,
|
||||
totalPages: pageCount,
|
||||
posts: posts)
|
||||
let fileContent = feed.content
|
||||
|
||||
if pageIndex == 1 {
|
||||
save(fileContent, to: "\(postFeedUrlPrefix).html")
|
||||
} else {
|
||||
save(fileContent, to: "\(postFeedUrlPrefix)-\(pageIndex).html")
|
||||
}
|
||||
}
|
||||
|
||||
private func save(_ content: String, to relativePath: String) {
|
||||
Content.accessFolderFromBookmark(key: Storage.outputPathBookmarkKey) { folder in
|
||||
let outputFile = folder.appendingPathComponent(relativePath, isDirectory: false)
|
||||
do {
|
||||
try content
|
||||
.data(using: .utf8)!
|
||||
.write(to: outputFile)
|
||||
} catch {
|
||||
print("Failed to save: \(error)")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user