Generate navigation links
This commit is contained in:
@@ -3,20 +3,13 @@ import Ink
|
||||
|
||||
struct PageGenerator {
|
||||
|
||||
struct NavigationLink {
|
||||
|
||||
let link: String
|
||||
|
||||
let text: String
|
||||
}
|
||||
|
||||
private let factory: LocalizedSiteTemplate
|
||||
|
||||
init(factory: LocalizedSiteTemplate) {
|
||||
self.factory = factory
|
||||
}
|
||||
|
||||
func generate(page: Element, language: String, nextPage: NavigationLink?, previousPage: NavigationLink?) {
|
||||
func generate(page: Element, language: String, previousPage: Element?, nextPage: Element?) {
|
||||
guard !page.isExternalPage else {
|
||||
return
|
||||
}
|
||||
@@ -35,10 +28,10 @@ struct PageGenerator {
|
||||
|
||||
content[.header] = makeHeader(page: page, metadata: metadata, language: language)
|
||||
content[.content] = pageContent
|
||||
content[.previousPageLinkText] = previousPage.unwrapped { factory.factory.html.makePrevText($0.text) }
|
||||
content[.previousPageUrl] = previousPage?.link
|
||||
content[.nextPageLinkText] = nextPage.unwrapped { factory.factory.html.makeNextText($0.text) }
|
||||
content[.nextPageUrl] = nextPage?.link
|
||||
content[.previousPageLinkText] = previousText(for: previousPage, language: language)
|
||||
content[.previousPageUrl] = navLink(from: page, to: previousPage, language: language)
|
||||
content[.nextPageLinkText] = nextText(for: nextPage, language: language)
|
||||
content[.nextPageUrl] = navLink(from: page, to: nextPage, language: language)
|
||||
content[.footer] = page.customFooterContent()
|
||||
|
||||
if pageIncludesCode {
|
||||
@@ -58,6 +51,27 @@ struct PageGenerator {
|
||||
files.generated(page: path)
|
||||
}
|
||||
|
||||
private func navLink(from element: Element, to destination: Element?, language: String) -> String? {
|
||||
guard let fullPath = destination?.fullPageUrl(for: language) else {
|
||||
return nil
|
||||
}
|
||||
return element.relativePathToOtherSiteElement(file: fullPath)
|
||||
}
|
||||
|
||||
private func previousText(for element: Element?, language: String) -> String? {
|
||||
guard let text = element?.localized(for: language).navigationTextAsPreviousPage else {
|
||||
return nil
|
||||
}
|
||||
return factory.factory.html.makePrevText(text)
|
||||
}
|
||||
|
||||
private func nextText(for element: Element?, language: String) -> String? {
|
||||
guard let text = element?.localized(for: language).navigationTextAsNextPage else {
|
||||
return nil
|
||||
}
|
||||
return factory.factory.html.makeNextText(text)
|
||||
}
|
||||
|
||||
private func makeContent(page: Element, metadata: Element.LocalizedMetadata, language: String, path: String) -> (content: String, includesCode: Bool, isEmpty: Bool) {
|
||||
let create = configuration.createMdFilesIfMissing
|
||||
if let raw = files.contentOfOptionalFile(atPath: path, source: page.path, createEmptyFileIfMissing: create)?
|
||||
|
@@ -1,5 +1,7 @@
|
||||
import Foundation
|
||||
|
||||
typealias LinkedElement = (previous: Element?, element: Element, next: Element?)
|
||||
|
||||
struct SiteGenerator {
|
||||
|
||||
let templates: TemplateFactory
|
||||
@@ -26,22 +28,21 @@ struct SiteGenerator {
|
||||
let overviewGenerator = OverviewPageGenerator(factory: template)
|
||||
let pageGenerator = PageGenerator(factory: template)
|
||||
|
||||
var elementsToProcess: [Element] = [site]
|
||||
while let element = elementsToProcess.popLast() {
|
||||
var elementsToProcess: [LinkedElement] = [(nil, site, nil)]
|
||||
while let (previous, element, next) = elementsToProcess.popLast() {
|
||||
// Move recursively down to all pages
|
||||
elementsToProcess.append(contentsOf: element.elements)
|
||||
elementsToProcess.append(contentsOf: element.linkedElements)
|
||||
|
||||
processAllFiles(for: element)
|
||||
|
||||
if !element.elements.isEmpty {
|
||||
overviewGenerator.generate(section: element, language: language)
|
||||
} else {
|
||||
#warning("Determine previous and next pages (with relative links)")
|
||||
pageGenerator.generate(
|
||||
page: element,
|
||||
language: language,
|
||||
nextPage: nil,
|
||||
previousPage: nil)
|
||||
previousPage: previous,
|
||||
nextPage: next)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user