summaryrefslogtreecommitdiff
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
parent90b687b24ca7f64bd4087144a40c6a2f6e3c14a9 (diff)
add talks to publications, rename to research, split into tabbox
-rw-r--r--css/classless.nix44
-rw-r--r--default.nix3
-rw-r--r--html/experience/default.nix29
-rw-r--r--html/research/default.nix40
-rw-r--r--html/research/talks.nix81
-rw-r--r--html/research/writings.nix (renamed from html/publications/default.nix)20
-rw-r--r--html/sections.nix2
-rw-r--r--lib/html.nix75
8 files changed, 245 insertions, 49 deletions
diff --git a/css/classless.nix b/css/classless.nix
index 5df5266..e32e430 100644
--- a/css/classless.nix
+++ b/css/classless.nix
@@ -32,6 +32,7 @@ in
aside ? false,
inputs ? false,
printing ? false,
+ tabs ? false,
## Classes
grid ? false,
align ? false,
@@ -398,6 +399,49 @@ in
.row { flex-direction: row; }
}
''
+ # Tab boxes
+ + lib.optionalString tabs ''
+ .tabs {
+ display: flex;
+ flex-wrap: wrap;
+ background: linear-gradient(0deg, ${cbg} 1rem, var(--clight) 0%);
+ border: ${border}; border-radius: 5px;
+ padding-bottom: 0.5em;
+ }
+ .tabs label {
+ order: 1; /*Put the labels first*/
+ display: block;
+ cursor: pointer;
+ padding: .5rem .8rem;
+ margin: .5rem 0 -1px;
+ border-radius: 5px 5px 0 0;
+ color: ${clink};
+ background: ${clight};
+ }
+ .tabs label:first-of-type{ margin-left: 1rem; }
+ .tabs .tab {
+ order: 99; /*Put the tabs last*/
+ flex-grow: 1;
+ width: 100%;
+ display: none;
+ z-index: 10;
+ padding: 0 1rem;
+ background: ${cbg};
+ border-top: ${border};
+ }
+ .tabs input[type="radio"]:not(:checked) + label:hover { filter: brightness(90%); }
+ .tabs input[type="radio"] { display: none; }
+ .tabs input[type="radio"]:checked + label {
+ border: ${border}; border-bottom: 0px;
+ background: ${cbg}; z-index: 11;
+ }
+ .tabs input[type="radio"]:checked + label + .tab { display: block; }
+
+ @media (max-width: 45em) {
+ .tabs .tab, .tabs label { order: initial; }
+ .tabs label { width: 100%; margin: 0 0 -1px !important; }
+ }
+ @media print { .tabs label + .tab { display: block; } .tabs label { display: none; } }''
# Classes (Bootstrap-compatible) –––––––––––––––––––––
# Grid
+ lib.optionalString grid ''
diff --git a/default.nix b/default.nix
index a6e5645..1e2c4c6 100644
--- a/default.nix
+++ b/default.nix
@@ -27,7 +27,7 @@
${image}.${size}
'';
mkPushDir = dir: ''mkdir -p ${dir} && pushd "$_"'';
- nixEvalExpr = "${nix}/bin/nix --extra-experimental-features nix-command --extra-experimental-features flakes eval --impure --raw --expr";
+ nixEvalExpr = "${nix}/bin/nix --extra-experimental-features nix-command --extra-experimental-features flakes eval --impure --raw --show-trace --expr";
make = "import $src/make.nix {pkgs = import ${nixpkgsSrc} {}; dataSrc = $src/data;}";
in
stdenvNoCC.mkDerivation {
@@ -81,6 +81,7 @@ in
tables = false;
tooltip-citations = true;
printing = true;
+ tabs = true;
}
" > classless.css
${clean} $out/index.html --stylesheets file://$(pwd)/classless.css \
diff --git a/html/experience/default.nix b/html/experience/default.nix
index b7f258b..9fdc219 100644
--- a/html/experience/default.nix
+++ b/html/experience/default.nix
@@ -10,23 +10,26 @@ in {
priority = 20;
body = with html;
dl (for
- (sort.reverse.byFun (item: with item.date.start; day + 100 * month + 10000 * year)
- experience) (item:
+ (sort.reverse.byFun
+ (item: with item.date.start; day + 100 * month + 10000 * year)
+ experience)
+ (item:
with item; [
(dt [
(with institution; "${position} @ ${href url name}, ${location}")
br
- (small (lib.concatStringsSep " · "
- ([(with date; timerange start end)]
- ++ lib.optional (item ? supervisors) "supervised by ${
- lib.concatStringsSep " " (for supervisors
- (supervisor: with supervisor; href url name))
- }"
- ++ lib.optional (item ? assets) (lib.concatStringsSep " "
- (for assets (asset:
- with asset;
- href "#${type}#${id}"
- "${icon "las la-paperclip"} ${name}"))))))
+ (small (lib.concatStringsSep " · " (
+ [(with date; timerange start end)]
+ ++ lib.optional (item ? supervisors) "supervised by ${
+ lib.concatStringsSep " " (for supervisors
+ (supervisor: with supervisor; href url name))
+ }"
+ # ++ lib.optional (item ? assets) (lib.concatStringsSep " "
+ # (for assets (asset:
+ # with asset;
+ # href "#${type}#${id}"
+ # "${icon "las la-paperclip"} ${name}")))
+ )))
])
(dd description)
]));
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/publications/default.nix b/html/research/writings.nix
index fbcfcee..d34ea66 100644
--- a/html/publications/default.nix
+++ b/html/research/writings.nix
@@ -46,18 +46,17 @@
// lib.optionalAttrs (publication ? DOI) {
doi = "${small "DOI"}: ${href "https://doi.org/${DOI}" (code DOI)}";
};
- listPublications = collection: collectionTitle:
+ listPublications = collection:
with html;
- section {id = "Publications#${collectionTitle}";} [
- (h2 collectionTitle)
+ section [
(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})")
+ (dt {id = "Writings#${id}";}
+ "${href {target = "_blank";} url (em title)} (${year})")
(dd [
(concatStringsSuffix ". "
(attrValsOpt ["authors" "note" "published" "isbn" "issn" "doi"]
@@ -88,11 +87,8 @@
])))
];
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")
- ];
+ conferences = listPublications data.publications.conferences;
+ journals = listPublications data.publications.journals;
+ misc = listPublications data.publications.misc;
+ reports = listPublications data.publications.reports;
}
diff --git a/html/sections.nix b/html/sections.nix
index 3c4065f..78719f8 100644
--- a/html/sections.nix
+++ b/html/sections.nix
@@ -17,6 +17,6 @@ in
./education
./experience
# ./languages
- ./publications
+ ./research
./software
]
diff --git a/lib/html.nix b/lib/html.nix
index 105888e..a922e0e 100644
--- a/lib/html.nix
+++ b/lib/html.nix
@@ -202,35 +202,60 @@
icon =
tryOverride (attrs: id: tagsContainerFuns.i (attrs // {class = id;}) "");
mailto = tryOverride (attrs: address: href attrs "mailto:${address}" address);
+ makeDate = date: let
+ year = builtins.toString date.year;
+ month =
+ lib.optionalString (date.month < 10) "0"
+ + builtins.toString date.month;
+ day =
+ if date ? day
+ then lib.optionalString (date.day < 10) "0" + builtins.toString date.day
+ else "0";
+ monthPretty = builtins.head (lib.drop (date.month - 1) [
+ "jan"
+ "feb"
+ "mar"
+ "apr"
+ "may"
+ "jun"
+ "jul"
+ "aug"
+ "sep"
+ "oct"
+ "nov"
+ "dev"
+ ]);
+ in {
+ tag = tagsContainerFuns.time {date = "${year}-${month}-${day}";};
+ pretty = "${monthPretty}. " + lib.optionalString (day != "0") "${day}, " + year;
+ };
timerange = let
- print = date: let
- year = builtins.toString date.year;
- month =
- lib.optionalString (date.month < 10) "0"
- + builtins.toString date.month;
- monthPretty = builtins.head (lib.drop (date.month - 1) [
- "jan"
- "feb"
- "mar"
- "apr"
- "may"
- "jun"
- "jul"
- "aug"
- "sep"
- "oct"
- "nov"
- "dev"
- ]);
- day = builtins.toString date.day;
+ print = dateValue: let
+ datePretty = (makeDate (builtins.removeAttrs dateValue ["day"])).pretty;
in
- tagsContainerFuns.time {date = "${year}-${month}-${day}";}
- "${monthPretty}. ${year}";
+ (makeDate dateValue).tag datePretty;
in
start: end: "${print start} - ${print end}";
doctype = type: ''
<!DOCTYPE ${type}>
'';
+
+ tab = name: {
+ id,
+ checked ? false,
+ title,
+ content,
+ }:
+ lines [
+ (tagsEmptyFuns.inputWith ({
+ inherit id name;
+ type = "radio";
+ }
+ // lib.optionalAttrs checked {checked = "checked";}))
+ (tagsContainerFuns.label {for = id;} [(tagsContainerFuns.h4 title)])
+ (tagsContainerFuns.div {class = "tab";} content)
+ ];
+ tabbox = name: tabs: tagsContainerFuns.div {class = "tabs";} (builtins.map (tab name) tabs);
in
tagsContainerFuns
// tagsEmptyFuns
@@ -246,10 +271,16 @@ in
icon
lines
mailto
+ makeDate
timerange
+ tab
+ tabbox
;
}
// {
+ blockquote = tryOverride (attrs: content: tagsContainerFuns.blockquote attrs (builtins.replaceStrings ["\n"] ["<br>"] content));
+ }
+ // {
sort = let
lt = x: y: x < y;
gt = x: y: x > y;