
Theme.pudu
Pudu47 lines2.1 KB
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]] }141516export 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}1920212223export 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}444546export fn page(look: &Look, view: &Docgen.Meta) -> Str { Template.render(&look.layout, view, &look.partials) }47