summaryrefslogtreecommitdiff
path: root/html/research
diff options
context:
space:
mode:
authoraristote <quentin.aristote@irif.fr>2025-07-27 17:47:32 +0200
committeraristote <quentin.aristote@irif.fr>2025-07-27 17:47:32 +0200
commit8622e40e675c72b9402625189517f99891a046c9 (patch)
treee1384995b609e7154f38725a29183f2f442d2c75 /html/research
parent90b687b24ca7f64bd4087144a40c6a2f6e3c14a9 (diff)
add talks to publications, rename to research, split into tabbox
Diffstat (limited to 'html/research')
-rw-r--r--html/research/default.nix40
-rw-r--r--html/research/talks.nix81
-rw-r--r--html/research/writings.nix94
3 files changed, 215 insertions, 0 deletions
diff --git a/html/research/default.nix b/html/research/default.nix
new file mode 100644
index 0000000..21152e2
--- /dev/null
+++ b/html/research/default.nix
@@ -0,0 +1,40 @@
+{
+ make,
+ html,
+ ...
+}: let
+ writings = make ./writings.nix {};
+ talks = make ./talks.nix {};
+in {
+ title = "Research";
+ priority = 10;
+ body = with html;
+ tabbox "research" [
+ {
+ id = "conferences";
+ checked = true;
+ title = "Conference papers";
+ content = writings.conferences;
+ }
+ {
+ id = "journals";
+ title = "Journal papers";
+ content = writings.journals;
+ }
+ {
+ id = "misc";
+ title = "Non-peer-reviewed";
+ content = writings.misc;
+ }
+ {
+ id = "reports";
+ title = "Reports";
+ content = writings.reports;
+ }
+ {
+ id = "talks";
+ title = "Talks";
+ content = talks;
+ }
+ ];
+}
diff --git a/html/research/talks.nix b/html/research/talks.nix
new file mode 100644
index 0000000..9e1fd56
--- /dev/null
+++ b/html/research/talks.nix
@@ -0,0 +1,81 @@
+{
+ html,
+ data,
+ lib,
+ ...
+}: let
+ matchFirst = regexp: str: let
+ results = builtins.match regexp str;
+ in
+ if results == null
+ then null
+ else builtins.head results;
+ join = url: name: with html; lib.optionalString (url != null) " ยท ${href url "${icon "las la-paperclip"} ${name}"}";
+ talks = data.publications.talks;
+in
+ with html;
+ dl (for (sort.reverse.byPath ["issued" "date-parts"] talks) (item:
+ with item; let
+ date-parts = builtins.head issued.date-parts;
+ date = {
+ year = builtins.elemAt date-parts 0;
+ month = builtins.elemAt date-parts 1;
+ day = builtins.elemAt date-parts 2;
+ };
+ extra =
+ if item ? note
+ then note
+ else "";
+ abstractURL = matchFirst ".*abstract: ([^\n ]*).*" extra;
+ slidesURL = matchFirst ".*slides: ([^\n ]*).*" extra;
+ # broken because of tabs
+ # paperURL = let
+ # paperId = matchFirst "([A-z0-9]*[0-9]{4})[a-z]" id;
+ # in
+ # if paperId == null
+ # then null
+ # else "#Writings#${paperId}";
+ in [
+ (dt [
+ ((
+ if abstractURL == null
+ then (x: x)
+ else href abstractURL
+ ) (em title))
+ ])
+ (dd [
+ (with (makeDate date); tag pretty)
+ "@ ${href url event-title}, ${publisher-place}"
+ (join slidesURL "slides")
+ # broken because of tabs
+ # (join paperURL "paper")
+ (details [
+ (summary "More")
+ (
+ dl (
+ lib.optionals (item ? abstract) [
+ (dt "Abstract.")
+ (dd (blockquote abstract))
+ ]
+ ++ [
+ (dt "Cite.")
+ (let
+ citeWith = title: type:
+ details [
+ (summary title)
+ (pre (code (
+ lib.readFile "${data.publications.files}/${type}/${id}"
+ )))
+ ];
+ in
+ dd [
+ (citeWith "BibLaTeX" "biblatex")
+ (citeWith "BibTeX" "bibtex")
+ (citeWith "CSL JSON" "csljson")
+ ])
+ ]
+ )
+ )
+ ])
+ ])
+ ]))
diff --git a/html/research/writings.nix b/html/research/writings.nix
new file mode 100644
index 0000000..d34ea66
--- /dev/null
+++ b/html/research/writings.nix
@@ -0,0 +1,94 @@
+{
+ 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:
+ with html;
+ section [
+ (dl (for (sort.reverse.byPath ["issued" "date-parts"] collection)
+ (publication: let
+ formatted = format publication;
+ in
+ with formatted;
+ lines [
+ (dt {id = "Writings#${id}";}
+ "${href {target = "_blank";} url (em 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: type:
+ details [
+ (summary title)
+ (pre (code (
+ lib.readFile "${data.publications.files}/${type}/${id}"
+ )))
+ ];
+ in
+ dd [
+ (citeWith "BibLaTeX" "biblatex")
+ (citeWith "BibTeX" "bibtex")
+ (citeWith "CSL JSON" "csljson")
+ ])
+ ])
+ ])
+ ])
+ ])))
+ ];
+in {
+ conferences = listPublications data.publications.conferences;
+ journals = listPublications data.publications.journals;
+ misc = listPublications data.publications.misc;
+ reports = listPublications data.publications.reports;
+}