#let lang = sys.inputs.at("lang", default: "en") #set par(justify: true) #set page("a4") #set text(lang: lang.split("_").at(0), size: 15pt, font: "FreeSans") #show list: set text(font: "Gluten", fill: rgb(46, 73, 0), size: 20pt) #show heading.where(level: 2): set text(font: "Great Vibes", size: 40pt) #let document_flags = ("image_attribution",) #let load_locale(name) = { read("locale/" + name + ".ini") .split("\n") .filter(l => l != "[hurrycurry]") .filter(l => l != "") .map(l => l.split("=")) .map(((x, y)) => (x.trim(), y.trim().replace("%n", "\n"))) } #let translations = { let d = (a: 1) for (k, v) in load_locale("en") { d.insert(k, v) } for (k, v) in load_locale(lang) { d.insert(k, v) } d } #let tr(s) = translations.at(s, default: text(fill: red)[TRANSLATION: #s]) #let msgstr(o) = if "translation" in o { tr(o.translation.id) } else { o.text } #let element(elem) = if elem.t == "document" [ #for e in elem.es [ #element(e) ] ] else if elem.t == "page" [ #page(background: if "background" in elem { image( "assets/" + elem.background + ".jpeg", fit: "cover", height: 100%, width: 100%, ) } else { none }, [ #for e in elem.es [ #element(e) ] ]) ] else if elem.t == "text" [ #text( font: elem.font, size: elem.size * 1pt, fill: rgb(elem.color), weight: if "bold" in elem { "bold" } else { "regular" }, msgstr(elem.s), ) ] else if elem.t == "list" [ #list(..elem.es.map(element)) ] else if elem.t == "par" [ #par[#for x in elem.es.map(element) [#x]] ] else if elem.t == "table" [ #table(columns: elem.es.at(0).len(), ..elem.es.flatten().map(element)) ] else if elem.t == "conditional" [ #if (elem.cond in document_flags) == elem.value [ #element(elem.e) ] ] else if elem.t == "ref" [ #link(label(elem.id), element(elem.e)) ] else if elem.t == "label" [ #element(elem.e) #label(elem.id) ] else if elem.t == "align" [ #h(1fr) #align(if elem.dir == "flow_end" { right } else { bottom }, element(elem.e)) ] else if elem.t == "container" [ #for e in elem.es [ #element(e) ] ] else [ #elem ] #element(json("book.json"))