typst-lepizig-glossing/leipzig-gloss.typ

105 lines
2.9 KiB
Plaintext

#let gloss_count = counter("gloss_count")
#let gloss_lines(spacing_between_items, formatters, gloss_line_lists) = {
assert(gloss_line_lists.len() > 0, message: "Gloss line lists cannot be empty")
let len = gloss_line_lists.at(0).len()
for line in gloss_line_lists {
assert(line.len() == len)
}
assert(formatters.len() == gloss_line_lists.len(), message: "The number of formatters and the number of gloss line lists should be equal")
let make_item_box(..args) = {
box(stack(dir: ttb, spacing: 0.5em, ..args))
}
for item_index in range(0, len) {
let args = ()
for (line_idx, formatter) in formatters.enumerate() {
let formatter_fn = if formatter == none {
(x) => x
} else {
formatter
}
let item = gloss_line_lists.at(line_idx).at(item_index)
args.push(formatter_fn(item))
}
make_item_box(..args)
h(spacing_between_items)
}
}
#let gloss(
header_text: none,
source_text: (),
source_text_style: emph,
transliteration: none,
transliteration_style: none,
morphemes: (),
morphemes_style: none,
additional_gloss_lines: (), //List of list of content
translation: none,
spacing_between_items: 1em,
numbering: false,
) = {
assert(type(source_text) == "array", message: "source_text needs to be an array; perhaps you forgot to type `(` and `)`, or a trailing comma?")
assert(type(morphemes) == "array", message: "morphemes needs to be an array; perhaps you forgot to type `(` and `)`, or a trailing comma?")
assert(source_text.len() == morphemes.len(), message: "source_text and morphemes have different lengths")
if transliteration != none {
assert(transliteration.len() == source_text.len(), message: "source_text and transliteration have different lengths")
}
let gloss_items = {
if header_text != none {
header_text
linebreak()
}
let formatters = (source_text_style,)
let gloss_line_lists = (source_text,)
if transliteration != none {
formatters.push(transliteration_style)
gloss_line_lists.push(transliteration)
}
formatters.push(morphemes_style)
gloss_line_lists.push(morphemes)
for additional in additional_gloss_lines {
formatters.push(none) //TODO fix this
gloss_line_lists.push(additional)
}
gloss_lines(spacing_between_items, formatters, gloss_line_lists)
if translation != none {
linebreak()
["#translation"]
}
}
if numbering {
gloss_count.step()
}
let gloss_number = if numbering {
[(#gloss_count.display())]
} else {
none
}
[#gloss_number #pad(left: 1em)[#gloss_items]]
}
#let numbered_gloss = gloss.with(numbering: true)