一个 Saga 的渲染器,它使用 Swim 将 RenderingContext 转换为 String。
它自带一个名为 swim
的自由函数,该函数接受一个将 RenderingContext
转换为 Node
的函数,并将其转换为一个将 RenderingContext
转换为 String
的函数,然后可以将其插入到 Saga 的 writers 中——writers 接受签名 (RenderingContext) -> String
的函数。
最好的例子是 Saga 的 示例项目,尽管 此仓库中包含一个简化的示例应用程序。
要点总结 (TLDR);
Package.swift
// swift-tools-version:5.5
import PackageDescription
let package = Package(
name: "Example",
platforms: [
.macOS(.v12)
],
dependencies: [
.package(url: "https://github.com/loopwerk/Saga", from: "1.0.0"),
.package(url: "https://github.com/loopwerk/SagaParsleyMarkdownReader", from: "0.5.0"),
.package(url: "https://github.com/loopwerk/SagaSwimRenderer", from: "0.6.0")
],
targets: [
.target(
name: "Example",
dependencies: [
"Saga",
"SagaParsleyMarkdownReader",
"SagaSwimRenderer"
]
),
]
)
main.swift
import Saga
import SagaParsleyMarkdownReader
import SagaSwimRenderer
@main
struct Run {
static func main() async throws {
try await Saga(input: "content", output: "deploy")
.register(
metadata: EmptyMetadata.self,
readers: [.parsleyMarkdownReader()],
itemWriteMode: .keepAsFile,
writers: [
.itemWriter(swim(renderItem))
]
)
// Run the steps we registered above
.run()
// All the remaining files that were not parsed to markdown, so for example images, raw html files and css,
// are copied as-is to the output folder.
.staticFiles()
}
}
以及您的 renderItem
模板
func renderItem(context: ItemRenderingContext<EmptyMetadata, SiteMetadata>) -> Node {
html(lang: "en-US") {
body {
div(id: "item") {
h1 { context.item.title }
context.item.body
}
}
}
}