Add route block

This commit is contained in:
Christoph Hagen
2025-04-29 16:56:46 +02:00
parent bbb1143600
commit 3c7681b769
13 changed files with 446 additions and 9 deletions

View File

@ -15,6 +15,8 @@ enum ContentBlock: String, CaseIterable {
case screens
case route
var processor: BlockProcessor.Type {
switch self {
case .audio: return AudioBlock.self
@ -24,6 +26,7 @@ enum ContentBlock: String, CaseIterable {
case .buttons: return ButtonsBlock.self
case .labels: return LabelsBlock.self
case .screens: return PhoneScreensBlock.self
case .route: return RouteBlock.self
}
}
}

View File

@ -0,0 +1,82 @@
struct RouteBlock: KeyedBlockProcessor {
enum Key: String {
case chartTitle
case components
case mapTitle
case image
case caption
case file
}
static let blockId: ContentBlock = .route
let content: Content
let results: PageGenerationResults
let language: ContentLanguage
init(content: Content, results: PageGenerationResults, language: ContentLanguage) {
self.content = content
self.results = results
self.language = language
}
private var thumbnailWidth: Int {
content.settings.pages.contentWidth
}
private var largeImageWidth: Int {
content.settings.pages.largeImageWidth
}
func process(_ arguments: [Key : String], markdown: Substring) -> String {
let rawComponents = arguments[.components] ?? "all"
guard let imageId = arguments[.image],
let fileId = arguments[.file],
let components = RouteViewComponents(rawValue: rawComponents) else {
invalid(markdown)
return ""
}
guard let image = content.image(imageId) else {
results.missing(file: imageId, source: "Route block")
return ""
}
guard let file = content.file(fileId) else {
results.missing(file: imageId, source: "Route block")
return ""
}
results.used(file: image)
results.require(file: file)
let thumbnail = image.imageSet(width: thumbnailWidth, height: thumbnailWidth, language: language)
results.require(imageSet: thumbnail)
let largeImage = image.imageSet(width: largeImageWidth, height: largeImageWidth, language: language)
results.require(imageSet: largeImage)
results.require(header: .routeJs)
let id = imageId.replacingOccurrences(of: ".", with: "-")
let views = RouteViews(
localization: language == .english ? .english : .german,
chartTitle: arguments[.chartTitle],
chartId: "chart-" + id,
components: components,
mapTitle: arguments[.mapTitle],
mapId: "map-" + id,
filePath: file.absoluteUrl,
imageId: "image-" + id,
thumbnail: thumbnail,
largeImage: largeImage,
caption: arguments[.caption])
results.require(footer: views.script)
return views.content
}
}

View File

@ -19,6 +19,9 @@ enum KnownHeaderElement {
case swiperJs
/// The Javascript to compute and animate route statistics
case routeJs
case style(String)
func header(content: Content) -> HeaderElement? {
@ -55,6 +58,10 @@ enum KnownHeaderElement {
if let swiperJs = content.settings.posts.swiperJsFile {
return .js(file: swiperJs, defer: true)
}
case .routeJs:
if let routeJs = content.settings.pages.routeJsFile {
return .js(file: routeJs, defer: false)
}
case .style(let code):
return .style(code)
}
@ -96,6 +103,8 @@ extension KnownHeaderElement: CustomStringConvertible {
return "swiper-css"
case .swiperJs:
return "swiper-js"
case .routeJs:
return "route-js"
case .style(let style):
return "style: " + style
}