{
html,
data,
lib,
...
}: let
attrValsOpt = attrs: attrSet:
lib.attrVals (builtins.filter (attr: lib.hasAttr attr attrSet) attrs)
attrSet;
concatStringsPrefix = prefix: strings:
lib.concatStrings (builtins.map (string: prefix + string) strings);
concatStringsSuffix = suffix: strings:
lib.concatStrings (builtins.map (string: string + suffix) strings);
format = publication:
with html;
with publication;
{
inherit id title url year abstract cite;
}
// (let
authorsOther =
lib.remove "${data.basics.name.first} ${data.basics.name.last}"
(builtins.map (author: "${author.given} ${author.family}") author);
in
lib.optionalAttrs (authorsOther != []) {
authors = "With ${lib.concatStringsSep ", " authorsOther}";
})
// lib.optionalAttrs (publication ? note) {
note = publication.note;
}
// lib.optionalAttrs (publication ? container-title) {
published =
"In ${em container-title}"
+ concatStringsPrefix ", "
(attrValsOpt ["volume" "issue" "publisher"] publication);
}
// lib.optionalAttrs (publication ? event-title) {
published = "At ${em event-title}";
}
// lib.optionalAttrs (publication ? ISBN) {
isbn = "${small "ISBN"}: ${ISBN}";
}
// lib.optionalAttrs (publication ? ISSN) {
issn = "${small "ISSN"}: ${ISSN}";
}
// lib.optionalAttrs (publication ? DOI) {
doi = "${small "DOI"}: ${href "https://doi.org/${DOI}" (code DOI)}";
};
listPublications = collection: collectionTitle:
with html;
section {id = "Publications#${collectionTitle}";} [
(h2 collectionTitle)
(dl (for (sort.reverse.byPath ["issued" "date-parts"] collection)
(publication: let
formatted = format publication;
in
with formatted;
lines [
(dt {id = "Publications#${id}";}
"${href {target = "_blank";} url title} (${year})")
(dd [
(concatStringsSuffix ". "
(attrValsOpt ["authors" "note" "published" "isbn" "issn" "doi"]
formatted))
(details [
(summary "More")
(dl [
(dt "Abstract.")
(dd (blockquote abstract))
(dt "Cite.")
(let
citeWith = title: attr:
details [
(summary title)
(pre (code (lib.getAttr attr cite)))
];
in
dd [
(citeWith "BibLaTeX" "biblatex")
(citeWith "BibTeX" "bibtex")
(citeWith "CSL JSON" "csljson")
])
])
])
])
])))
];
in {
title = "Publications";
priority = 10;
body = with html;
lines [
(listPublications data.publications.selected "Selected works")
(listPublications (with data.publications; lib.subtractLists selected all) "Other works")
];
}