Contents

loopwerk/sagastencilrenderer

A renderer for [Saga](https://github.com/loopwerk/Saga) that uses [Stencil](https://github.com/stencilproject/Stencil) to turn a RenderingContext into a String.

Example

Package.swift

// swift-tools-version:6.0

import PackageDescription

let package = Package(
  name: "Example",
  platforms: [
    .macOS(.v14)
  ],
  dependencies: [
    .package(url: "https://github.com/loopwerk/SagaParsleyMarkdownReader", from: "1.0.0"),
    .package(url: "https://github.com/loopwerk/SagaStencilRenderer", from: "1.0.0")
  ],
  targets: [
    .target(
      name: "Example",
      dependencies: [
        "SagaParsleyMarkdownReader",
        "SagaStencilRenderer"
      ]
    ),
  ]
)

main.swift:

import Foundation
import Saga
import SagaPathKit
import SagaParsleyMarkdownReader
import SagaStencilRenderer
import Stencil

let saga = try Saga(input: "content", output: "deploy")
defaultStencilEnvironment = Environment(loader: FileSystemLoader(paths: [Path(saga.rootPath.string) + "templates"]))

try await saga
  // All the Markdown files will be parsed to html.
  .register(
    readers: [.parsleyMarkdownReader],
    writers: [
      .itemWriter(stencil("page.html"))
    ]
  )

  // Run the steps we registered above
  .run()

Please check out the Example app to play around.

Extending the Stencil Environment

You can extend the Environment with your own tags and filters, see the official Stencil docs.

For example:

func getEnvironment(root: Path) -> Environment {
  let ext = Extension()
  
  ext.registerFilter("url") { (value: Any?) in
    guard let item = value as? AnyItem else {
      return ""
    }
    var url = "/" + item.relativeDestination.string
    if url.hasSuffix("/index.html") {
      url.removeLast(10)
    }
    return url
  }

  return Environment(loader: FileSystemLoader(paths: [root + "templates"]), extensions: [ext])
}

Package Metadata

Repository: loopwerk/sagastencilrenderer

Default branch: main

README: README.md