summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorquentin@aristote.fr <quentin@aristote.fr>2023-08-21 11:36:24 +0200
committerquentin@aristote.fr <quentin@aristote.fr>2023-08-21 17:44:49 +0200
commit731a43a83e2e2b61d11c5ac33fe96f92cef41bb5 (patch)
treeea32a6c6ae5c036cab7b390543f9cb71e9444095 /lib
initial commit
Diffstat (limited to 'lib')
-rw-r--r--lib/default.nix5
-rw-r--r--lib/latex.nix133
2 files changed, 138 insertions, 0 deletions
diff --git a/lib/default.nix b/lib/default.nix
new file mode 100644
index 0000000..57653ad
--- /dev/null
+++ b/lib/default.nix
@@ -0,0 +1,5 @@
+{ lib }:
+
+{
+ pp.latex = import ./latex.nix { inherit lib; };
+}
diff --git a/lib/latex.nix b/lib/latex.nix
new file mode 100644
index 0000000..99cd783
--- /dev/null
+++ b/lib/latex.nix
@@ -0,0 +1,133 @@
+{ lib, ... }:
+
+let
+ lines = content:
+ if lib.isList content then
+ (if content == [ ] then
+ ""
+ else
+ lines (builtins.head content) + "\n" + lines (builtins.tail content))
+ else
+ content;
+ sortByFun = cmp: f: lib.sort (x: y: cmp (f x) (f y));
+ sortByPath = cmp: keys: sortByFun cmp (lib.getAttrFromPath keys);
+ sortByKey = cmp: key: sortByPath cmp [ key ];
+ for = iterable: f:
+ if lib.isList iterable then
+ builtins.map f iterable
+ else
+ lib.mapAttrsToList f iterable;
+
+ tryOverride = f: arg:
+ if lib.isAttrs arg then
+ tryOverride (attrs: content: f (arg // attrs) content)
+ else
+ f { } arg;
+
+ setOptionalArg = name: value: "${name}=${value}";
+ expandArgsPrefixed = numArgs: prefix:
+ if numArgs <= 0 then
+ prefix
+ else
+ arg:
+ let
+ appendToPrefix = if lib.isAttrs arg then
+ "[" + lib.concatStringsSep "," (lib.mapAttrsToList setOptionalArg arg)
+ + "]"
+ else
+ "{${arg}}";
+ newNumArgs = if lib.isAttrs arg then numArgs else numArgs - 1;
+ in expandArgsPrefixed newNumArgs (prefix + appendToPrefix);
+ macroWithOpts = name: numArgs: expandArgsPrefixed numArgs "\\${name}";
+ macro = name: content:
+ let
+ contentExpanded = if lib.isList content then
+ lib.concatStringsSep "}{" content
+ else
+ content;
+ in "\\${name}{${contentExpanded}}";
+ sectionMacro = type: name: content: ''
+ \${type}{${name}}
+
+ ${lines content}
+ '';
+ environment = name: content: ''
+ \begin{${name}}
+ ${lines content}
+ \end{${name}}
+ '';
+
+ latex = {
+ inherit macro environment;
+
+ comment = content: "% ${content}";
+ document = environment "document";
+ section = sectionMacro "section";
+
+ title = macroWithOpts "title" 1;
+
+ url = macroWithOpts "url" 1;
+ href = macroWithOpts "href" 2;
+ bold = macroWithOpts "textbf" 1;
+
+ cite = macroWithOpts "cite" 1;
+ moderncv = {
+ name = macroWithOpts "name" 2;
+ email = macroWithOpts "email" 1;
+ extrainfo = macroWithOpts "extrainfo" 1;
+ photo = macroWithOpts "photo" 1;
+ makecvtitle = macro "makecvtitle" [ ];
+ cventry = macroWithOpts "cventry" 6;
+ cvlistitem = macroWithOpts "cvlistitem" 1;
+ cvline = macroWithOpts "cvline" 2;
+ cvitemwithcomment = macroWithOpts "cvitemwithcomment" 3;
+ cvdoubleitem = macroWithOpts "cvdoubleitem" 4;
+ };
+ };
+
+ file = path: "files/${path}";
+ href = latex.href;
+ timerange = startdate: enddate:
+ let
+ print = builtins.mapAttrs (name: x: builtins.toString x);
+ # let str = builtins.toString x;
+ # in if name == "year" then
+ # builtins.substring 2 4 str
+ # else
+ # (if name == "month" && x < 10 then "0${str}" else str));
+ start = print startdate;
+ end = print enddate;
+ months = {
+ "1" = "jan";
+ "2" = "feb";
+ "3" = "mar";
+ "4" = "apr";
+ "5" = "may";
+ "6" = "jun";
+ "7" = "jul";
+ "8" = "aug";
+ "9" = "sep";
+ "10" = "oct";
+ "11" = "nov";
+ "12" = "dec";
+ };
+ in "${months."${start.month}"}."
+ + lib.optionalString (start.year != end.year) " ${start.year}"
+ + " -- ${months."${end.month}"}. ${end.year}";
+in latex // {
+ inherit for file href lines timerange;
+ code = x: x;
+ sort = let
+ lt = x: y: x < y;
+ gt = x: y: x > y;
+ in {
+ byKey = sortByKey lt;
+ byPath = sortByPath lt;
+ byFun = sortByFun lt;
+ reverse = {
+ byKey = sortByKey gt;
+ byPath = sortByPath gt;
+ byFun = sortByFun gt;
+ };
+ };
+}