SagaSwimRenderer

一个 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
      }
    }
  }
}