1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#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"))
|