111 lines
3.5 KiB
Nix
111 lines
3.5 KiB
Nix
{ bibliography, core, document, ... } @ libs:
|
||
let
|
||
inherit(core) debug list path set string type;
|
||
inherit(document) escapeEncode;
|
||
|
||
citeList
|
||
= self:
|
||
citations:
|
||
let
|
||
result
|
||
= list.fold
|
||
(
|
||
{ encode, range, previous, text, ... } @ state:
|
||
name:
|
||
if self.${name} or null != null
|
||
then
|
||
if self.${name} ? id
|
||
then
|
||
state
|
||
// {
|
||
range = previous != null && self.${name}.id == ( previous + 1 );
|
||
previous = self.${name}.id;
|
||
text
|
||
= if text == null
|
||
then
|
||
"${string self.${name}.id}"
|
||
else if previous != null
|
||
&& self.${name}.id == ( previous + 1 )
|
||
then
|
||
text
|
||
else if range
|
||
then
|
||
"${text}–${string self.${name}.id}"
|
||
else
|
||
"${text},${string self.${name}.id}";
|
||
}
|
||
else
|
||
{
|
||
encode = encode ++ [ name ];
|
||
}
|
||
else
|
||
debug.panic "citeList" "Unknown Reference »${name}«!"
|
||
)
|
||
{
|
||
range = false;
|
||
previous = null;
|
||
text = null;
|
||
encode = [ ];
|
||
}
|
||
citations;
|
||
text
|
||
= if result.text != null
|
||
then
|
||
result.text
|
||
else
|
||
"[???]";
|
||
in
|
||
if result.encode == []
|
||
then
|
||
"\\textsuperscript{[${text}]}"
|
||
else
|
||
escapeEncode "bibliography" result.encode;
|
||
|
||
citeString
|
||
= self:
|
||
name:
|
||
if self.${name} or null != null
|
||
then
|
||
if self.${name}.id or null != null
|
||
then
|
||
"\\textsuperscript{[${string self.${name}.id}]}"
|
||
else
|
||
escapeEncode "bibliography" [ name ]
|
||
else
|
||
debug.panic "citeString" "Unknown Reference »${name}«!";
|
||
|
||
prepare
|
||
= references:
|
||
type.matchPrimitiveOrPanic references
|
||
{
|
||
lambda = prepare ( references libs );
|
||
path = prepare ( path.import references );
|
||
set
|
||
= (
|
||
set.map
|
||
(
|
||
name:
|
||
value:
|
||
value
|
||
// {
|
||
inherit name;
|
||
__toString
|
||
= self:
|
||
"\\cite{${name}}";
|
||
}
|
||
)
|
||
references
|
||
)
|
||
// {
|
||
__functor
|
||
= self:
|
||
name:
|
||
type.matchPrimitiveOrPanic name
|
||
{
|
||
#list = citeList self name;
|
||
string = citeString self name;
|
||
};
|
||
};
|
||
};
|
||
in
|
||
prepare |