63 lines
1.7 KiB
Typst
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
|
|
}
|