Files
test/.template/lib/domain/references.typ
T
2026-10-09 04:24:38 +00:00

63 lines
1.7 KiB
Typst

// ==========================================
// DOMAIN: БИБЛИОГРАФИЧЕСКИЕ СЕКЦИИ
// ==========================================
#import "document.typ": fail
#let bibliography-section(
id,
sources,
title: auto,
style: "gost-r-705-2008-numeric",
target: auto,
group: auto,
full: false,
page_break: true,
) = {
if type(id) != str or id.trim() == "" {
fail("bibliography.id", "нужна непустая строка")
}
let normalized-sources = if type(sources) == array { sources } else { (sources,) }
if normalized-sources.len() == 0 {
fail("bibliography.sources", "нужен хотя бы один источник")
}
for source in normalized-sources {
if type(source) not in (str, path, bytes) {
fail("bibliography.sources", "ожидались str, path или bytes")
}
}
if type(full) != bool {
fail("bibliography.full", "ожидался bool")
}
if type(page_break) != bool {
fail("bibliography.page-break", "ожидался bool")
}
(
kind: "bibliography-section",
id: id,
sources: normalized-sources,
title: title,
style: style,
target: target,
group: group,
full: full,
page-break: page_break,
)
}
#let validate-bibliographies(sections) = {
if type(sections) != array {
fail("bibliographies", "ожидался array")
}
let seen = ()
for section in sections {
if type(section) != dictionary or section.at("kind", default: none) != "bibliography-section" {
fail("bibliographies", "каждый элемент должен быть bibliography-section")
}
if section.id in seen {
fail("bibliographies", "повторяющийся id " + repr(section.id))
}
seen.push(section.id)
}
sections
}