Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-docgen

Documentation publishing for Pudu: articles, API references, navigation, search, and static websites

0.1.0Apache-2.01

InstallClose

Theme.pudu

Pudu47 lines2.1 KB

GitHub ↗
1/** @Docgen.Theme.Module — the default site look combined with template folder overrides */2module PuduLangDocgen.Theme34import Std.Map as Map5import PuduLangDocgen.Constants.Codes as Codes6import PuduLangDocgen as Docgen7import PuduLangDocgen.Template as Template8import PuduLangDocgen.Theme.Layout as Layout9import PuduLangDocgen.Theme.Script as Script10import PuduLangDocgen.Theme.Style as Style1112/** @Docgen.Theme.Look — parsed layout and partials ready to render pages */13export type Look = { layout: Array[Template.Node], partials: Map[Str, Array[Template.Node]] }1415/// The stylesheet and script every site publishes.16export fn assets() -> Array[Docgen.Artifact] {17  [Docgen.Artifact{path: "_assets/site.css", content: Style.stylesheet()}, Docgen.Artifact{path: "_assets/site.js", content: Script.script()}]18}1920/// The default templates with overrides applied. An override named `layout.html` replaces the21/// layout and `partials/<name>.html` replaces or adds a partial; other files are ignored.22/// Every template is parsed, and each one that does not parse is reported.23export fn load(overrides: &Array[(Str, Str)]) -> Result[Look, Array[Docgen.Diagnostic]] {24  var texts: Map[Str, Str] = mapOf(Layout.templates())25  for (path, text) in *overrides {26    if path.endsWith(".html") && (path == "layout.html" || path.startsWith("partials/")) {27      texts = Map.insert(&texts, path.take(path.length() - 5), text)28    }29  }30  var problems: Array[Docgen.Diagnostic] = []31  var layout: Array[Template.Node] = []32  var partials: Map[Str, Array[Template.Node]] = mapOf([])33  for (name, text) in Map.pairs(&texts) {34    match Template.parse(text) {35      case Ok(nodes) => {36        if name == "layout" { layout = nodes } else { partials = Map.insert(&partials, name.drop(9), nodes) }37      }38      case Err(reason) => { problems = problems.push(Docgen.error(Codes.TEMPLATE_INVALID, name + ".html", 1, reason)) }39    }40  }41  if !problems.isEmpty() { return Err(problems) }42  Ok(Look{layout: layout, partials: partials})43}4445/// A page rendered through the layout with its view metadata.46export fn page(look: &Look, view: &Docgen.Meta) -> Str { Template.render(&look.layout, view, &look.partials) }47