Add command for pretty page links

This commit is contained in:
Christoph Hagen
2022-09-25 17:19:07 +02:00
parent 66dcd43082
commit f2ee06b1d7
7 changed files with 144 additions and 7 deletions

View File

@ -119,6 +119,13 @@ extension Element {
It can also be set to manually write a page.
*/
let externalUrl: String?
/**
The text to display for content related to the current page.
This property is mandatory at root level, and is propagated to child elements.
*/
let relatedContentText: String
}
}
@ -162,6 +169,8 @@ extension Element.LocalizedMetadata {
self.thumbnailSuffix = log.unused(data.thumbnailSuffix, "thumbnailSuffix", source: source)
self.cornerText = log.unused(data.cornerText, "cornerText", source: source)
self.externalUrl = log.unexpected(data.externalUrl, name: "externalUrl", source: source)
self.relatedContentText = log
.required(data.relatedContentText, name: "relatedContentText", source: source) ?? ""
guard isComplete else {
return nil
@ -197,6 +206,7 @@ extension Element.LocalizedMetadata {
self.thumbnailSuffix = data.thumbnailSuffix
self.cornerText = data.cornerText
self.externalUrl = data.externalUrl
self.relatedContentText = data.relatedContentText ?? parent.relatedContentText
guard isComplete else {
return nil

View File

@ -421,6 +421,10 @@ extension Element {
return pathRelativeToRootForContainedInputFile(thumbnailFile)
}
/**
The full url (relative to root) for the localized page
- Parameter language: The language of the page where the url should point
*/
func fullPageUrl(for language: String) -> String {
localized(for: language).externalUrl ?? localizedPath(for: language)
}
@ -611,4 +615,42 @@ extension Element {
}
return nil
}
var pathComponents: [String] {
path.components(separatedBy: "/")
}
var lastPathComponent: String {
pathComponents.last!
}
func find(elementWithFolder folder: String) -> Element? {
elements.first { $0.lastPathComponent == folder }
}
func makePath(language: String, from root: Element) -> [String] {
let parts = pathComponents.dropLast()
var result = [String]()
var node = root
for part in parts {
guard let child = node.find(elementWithFolder: part) else {
return result
}
result.append(child.title(for: language))
node = child
}
return result
}
func findParent(from root: Element) -> Element? {
let parts = pathComponents.dropLast()
var node = root
for part in pathComponents.dropLast() {
guard let child = node.find(elementWithFolder: part) else {
return node
}
node = child
}
return node
}
}

View File

@ -112,6 +112,13 @@ extension GenericMetadata {
It can also be set to manually write a page.
*/
let externalUrl: String?
/**
The text to display for content related to the current page.
This property is mandatory at root level, and is propagated to child elements.
*/
let relatedContentText: String?
}
}
@ -134,6 +141,7 @@ extension GenericMetadata.LocalizedMetadata: Codable {
.thumbnailSuffix,
.cornerText,
.externalUrl,
.relatedContentText,
]
}
@ -163,7 +171,8 @@ extension GenericMetadata.LocalizedMetadata {
titleSuffix: nil,
thumbnailSuffix: nil,
cornerText: nil,
externalUrl: nil)
externalUrl: nil,
relatedContentText: nil)
}
/**
@ -184,7 +193,8 @@ extension GenericMetadata.LocalizedMetadata {
titleSuffix: nil,
thumbnailSuffix: nil,
cornerText: nil,
externalUrl: nil)
externalUrl: nil,
relatedContentText: "")
}
static var full: GenericMetadata.LocalizedMetadata {
@ -202,6 +212,7 @@ extension GenericMetadata.LocalizedMetadata {
titleSuffix: "",
thumbnailSuffix: "",
cornerText: "",
externalUrl: "")
externalUrl: "",
relatedContentText: "")
}
}