92 lines
2.3 KiB
Typst
92 lines
2.3 KiB
Typst
#import "utils.typ": assert_in_dict, assert_in_arr, map_none, ok_or
|
|
|
|
#let lang_ids = (
|
|
cs: 0,
|
|
en: 1,
|
|
);
|
|
|
|
#let lang_id(lang_abbr) = {
|
|
assert_in_dict(lang_abbr, lang_ids, "language abbreviation");
|
|
return lang_ids.at(lang_abbr);
|
|
};
|
|
|
|
// Typst will usually cache this - so we don't have to re-read the file each time
|
|
#let fetch_lang_items() = {
|
|
return json("lang.json");
|
|
}
|
|
|
|
#let get_lang_item(lang_abbr, item_name) = {
|
|
assert_in_dict(lang_abbr, lang_ids, "language abbreviation");
|
|
let lang_items = fetch_lang_items();
|
|
return lang_items.at(lang_abbr).at(item_name);
|
|
}
|
|
|
|
#let replace_czech_gender(raw, gender) = {
|
|
let genders = (
|
|
feminine: 1,
|
|
masculine: 0,
|
|
we: 2,
|
|
);
|
|
assert_in_dict(gender, genders, "author gender");
|
|
raw.replace(regex("\{g:([^|]*)\|([^|]*)\|([^}]*)\}"), (match) => {
|
|
match.captures.at(genders.at(gender))
|
|
});
|
|
}
|
|
|
|
#let replace_english_pronounce(raw, pronounce) = {
|
|
let pronounce = ok_or(pronounce, "me");
|
|
let pronouns = (
|
|
me: 0,
|
|
we: 1,
|
|
);
|
|
assert_in_dict(pronounce, pronouns, "author gender");
|
|
raw.replace(regex("\{g:([^|]*)\|([^}]*)\}"), (match) => {
|
|
match.captures.at(pronouns.at(pronounce))
|
|
});
|
|
}
|
|
|
|
#let set_czech_nonbreakable_terms(content) = {
|
|
let space_after = (
|
|
"[kosuvzai]",
|
|
"(tj|tzv|tzn)\.",
|
|
);
|
|
show regex("\b((?i)(" + space_after.join("|") + ") )+\w+\b"): match => {
|
|
box(match);
|
|
}
|
|
|
|
let nonbreaking_abbreviations = (
|
|
"a. s",
|
|
"s. r. o",
|
|
"v. o. s",
|
|
"k. s",
|
|
"n. p",
|
|
"p. o",
|
|
"č. ([pe]|ev)",
|
|
"ev?. č",
|
|
);
|
|
show regex(
|
|
"(?i)\b(" + nonbreaking_abbreviations.map((v) => { v.replace(".", "\\.") }).join("|") + ")\."
|
|
): match => {
|
|
box(match);
|
|
}
|
|
|
|
content
|
|
}
|
|
|
|
#let disclaimer(language, document_type, author_pronouns) = {
|
|
let disclaimer = get_lang_item(language, "disclaimer_content");
|
|
let replacements = get_lang_item(language, "disclaimer_replace").at(document_type);
|
|
if language == "cs" {
|
|
disclaimer = replace_czech_gender(disclaimer, author_pronouns);
|
|
} else if language == "en" {
|
|
disclaimer = replace_english_pronounce(disclaimer, author_pronouns);
|
|
}
|
|
for (key, value) in replacements.pairs() {
|
|
disclaimer = disclaimer.replace("{" + key + "}", value);
|
|
}
|
|
if disclaimer.contains("{") or disclaimer.contains("}") {
|
|
panic("invalid language file");
|
|
}
|
|
disclaimer
|
|
}
|