289 lines
9.3 KiB
Nix
289 lines
9.3 KiB
Nix
{ core, document, ... }:
|
|
let
|
|
inherit(core) debug list number set string time type;
|
|
|
|
adjustDate
|
|
= source:
|
|
date:
|
|
let
|
|
panic = debug.panic ( source ++ [ "adjustDate" ] );
|
|
date' = time.from date;
|
|
in
|
|
if date' != null
|
|
then
|
|
date'
|
|
else
|
|
panic "Invalid date: »${date}«";
|
|
|
|
adjustPages
|
|
= source:
|
|
pages:
|
|
let
|
|
panic = debug.panic ( source ++ [ "adjustPages" ] );
|
|
in
|
|
type.matchPrimitiveOrPanic pages
|
|
{
|
|
"int"
|
|
= {
|
|
from = pages;
|
|
till = pages;
|
|
};
|
|
"set"
|
|
= {
|
|
from = pages.from or ( panic "Pages need a from!" );
|
|
till = pages.till or ( panic "Pages need a till!" );
|
|
};
|
|
"string"
|
|
= let
|
|
pages' = string.match "([^-]+)--?([^-]+)" pages;
|
|
in
|
|
if pages' != null
|
|
then
|
|
{
|
|
from = list.get pages' 0;
|
|
till = list.get pages' 1;
|
|
}
|
|
else
|
|
let
|
|
page = number.toInteger' pages;
|
|
in
|
|
if page != null
|
|
then
|
|
{
|
|
from = page;
|
|
till = page;
|
|
}
|
|
else
|
|
let
|
|
page = string.match "!?(.*)" pages;
|
|
in
|
|
list.head page;
|
|
};
|
|
|
|
adjustWhitespace
|
|
= text:
|
|
string.concatMapped
|
|
(
|
|
item:
|
|
if string.isInstanceOf item
|
|
then
|
|
item
|
|
else
|
|
" "
|
|
)
|
|
( string.trim' text );
|
|
|
|
toChapterBook
|
|
= source:
|
|
let
|
|
source' = source ++ [ "toChapterBook" ];
|
|
in
|
|
{
|
|
date ? ( debug.panic source' "Need a date!" ),
|
|
isbn ? null,
|
|
publisher ? ( debug.panic source' "Needs a publisher!" ),
|
|
series ? null,
|
|
title ? ( debug.panic source' "Needs a title!" )
|
|
}:
|
|
{
|
|
date = adjustDate source' date;
|
|
title = adjustWhitespace title;
|
|
series
|
|
= if series != null
|
|
then
|
|
adjustWhitespace series
|
|
else
|
|
null;
|
|
inherit isbn publisher;
|
|
};
|
|
|
|
toConference
|
|
= source:
|
|
let
|
|
source' = source ++ [ "toConference" ];
|
|
in
|
|
{
|
|
date ? ( debug.panic source' "Need a date!" ),
|
|
publisher ? ( debug.panic source' "Needs a publisher!" ),
|
|
title ? ( debug.panic source' "Needs a title!" )
|
|
}:
|
|
{
|
|
date = adjustDate source' date;
|
|
title = adjustWhitespace title;
|
|
inherit publisher;
|
|
};
|
|
|
|
toIssue
|
|
= source:
|
|
let
|
|
source' = source ++ [ "toIssue" ];
|
|
in
|
|
{
|
|
date ? ( debug.panic source' "Need a date!" ),
|
|
journal ? ( debug.panic source' "Need a journal!" ),
|
|
number ? null,
|
|
volume ? null
|
|
}:
|
|
{
|
|
date = adjustDate source' date;
|
|
journal = toJournal source' journal;
|
|
inherit number volume;
|
|
};
|
|
|
|
toJournal
|
|
= source:
|
|
let
|
|
source' = source ++ [ "toJournal" ];
|
|
in
|
|
{
|
|
name ? ( debug.panic source' "Need a name!" ),
|
|
publisher ? ( debug.panic source' "Need a publisher!" ),
|
|
short ? ""
|
|
}:
|
|
{
|
|
name = adjustWhitespace name;
|
|
short = adjustWhitespace short;
|
|
publisher = toPublisher source' publisher;
|
|
};
|
|
|
|
toPublisher
|
|
= source:
|
|
let
|
|
source' = source ++ [ "toPublisher" ];
|
|
in
|
|
{
|
|
name ? ( debug.panic source' "Needs a name!" ),
|
|
...
|
|
} @ publisher:
|
|
publisher
|
|
// {
|
|
name = adjustWhitespace name;
|
|
};
|
|
in
|
|
{
|
|
Article
|
|
= {
|
|
authors ? ( debug.panic "Article" "Need some authors!" ),
|
|
doi ? null,
|
|
issue ? ( debug.panic "Article" "Need an issue!" ),
|
|
pages ? ( debug.panic "Article" "Need pages!" ),
|
|
title ? ( debug.panic "Article" "Need a title!" ),
|
|
url ? null,
|
|
...
|
|
} @ article:
|
|
article
|
|
// {
|
|
__type__ = "JournalArticle";
|
|
title = adjustWhitespace title;
|
|
inherit authors doi url;
|
|
|
|
pages = adjustPages [ "Article" ] pages;
|
|
issue = toIssue [ "Article" ] issue;
|
|
};
|
|
|
|
Book
|
|
= {
|
|
authors ? ( debug.panic "Book" "Need some authors!" ),
|
|
date ? ( debug.panic "Book" "Need a date!" ),
|
|
doi ? null,
|
|
isbn ? null,
|
|
publisher ? ( debug.panic "Book" "Need a publisher!" ),
|
|
series ? null,
|
|
title ? ( debug.panic "Book" "Need a title!" ),
|
|
url ? null,
|
|
...
|
|
} @ book:
|
|
book
|
|
// {
|
|
__type__ = "Book";
|
|
title = adjustWhitespace title;
|
|
inherit authors doi url;
|
|
|
|
date = adjustDate [ "Book" ] date;
|
|
inherit isbn publisher series;
|
|
};
|
|
|
|
Chapter
|
|
= {
|
|
authors ? ( debug.panic "Chapter" "Need some authors!" ),
|
|
book ? ( debug.panic "Chapter" "Need a book!" ),
|
|
doi ? null,
|
|
title ? ( debug.panic "Chapter" "Need a title!" ),
|
|
url ? null,
|
|
...
|
|
} @ chapter:
|
|
chapter
|
|
// {
|
|
__type__ = "BookChapter";
|
|
title = adjustWhitespace title;
|
|
inherit authors doi url;
|
|
|
|
book = toChapterBook [ "Chapter" ] book;
|
|
};
|
|
|
|
ConferenceArticle
|
|
= {
|
|
authors ? ( debug.panic "ConferenceArticle" "Need some authors!" ),
|
|
conference ? ( debug.panic "ConferenceArticle" "Need a conference!" ),
|
|
doi ? null,
|
|
title ? ( debug.panic "ConferenceArticle" "Need a title!" ),
|
|
pages ? ( debug.panic "ConferenceArticle" "Need pages!" ),
|
|
url ? null,
|
|
...
|
|
} @ paper:
|
|
paper
|
|
// {
|
|
__type__ = "ConferenceArticle";
|
|
title = adjustWhitespace title;
|
|
inherit authors doi url;
|
|
|
|
pages = adjustPages [ "ConferenceArticle" ] pages;
|
|
conference = toConference [ "ConferenceArticle" ] conference;
|
|
};
|
|
|
|
Patent
|
|
= {
|
|
authors ? ( debug.panic "Patent" "Need some authors!" ),
|
|
date ? ( debug.panic "Patent" "Need a date!" ),
|
|
doi ? null,
|
|
number ? ( debug.panic "Patent" "Need a Number!" ),
|
|
stage ? null,
|
|
title ? ( debug.panic "Patent" "Need a title!" ),
|
|
type ? ( debug.panic "Patent" "Need a type!" ),
|
|
url ? null,
|
|
...
|
|
} @ patent:
|
|
patent
|
|
// {
|
|
__type__ = "Patent";
|
|
title = adjustWhitespace title;
|
|
inherit authors doi url;
|
|
|
|
date = adjustDate [ "Patent" ] date;
|
|
inherit number stage type;
|
|
};
|
|
|
|
Review
|
|
= {
|
|
authors ? ( debug.panic "Review" "Need some authors!" ),
|
|
doi ? null,
|
|
issue ? ( debug.panic "Review" "Need an issue!" ),
|
|
pages ? ( debug.panic "Review" "Need pages!" ),
|
|
title ? ( debug.panic "Review" "Need a title!" ),
|
|
url ? null,
|
|
...
|
|
} @ review:
|
|
review
|
|
// {
|
|
__type__ = "ReviewArticle";
|
|
title = adjustWhitespace title;
|
|
inherit authors doi url;
|
|
|
|
pages = adjustPages [ "Review" ] pages;
|
|
issue = toIssue [ "Review" ] issue;
|
|
};
|
|
|
|
Journal = toJournal [ "Journal" ];
|
|
Publisher = toPublisher [ "Publisher" ];
|
|
}
|