Compare commits

..

3 commits

Author SHA1 Message Date
tristan 6509c8c827 insert elems into md 2024-02-11 08:25:09 +00:00
tristan 62f3749709 md to page callback 2024-02-11 08:12:00 +00:00
tristan 3c82f5f9bc md refactorm 2024-02-11 06:20:01 +00:00
2 changed files with 57 additions and 58 deletions

View file

@ -34,7 +34,7 @@
inherit (tix.packages.${system}) watch watchpipe results; inherit (tix.packages.${system}) watch watchpipe results;
test = tix.run [ test = tix.run [
# ./testing/md.test.nix ./testing/md.test.nix
./testing/html.test.nix ./testing/html.test.nix
./testing/elems.test.nix ./testing/elems.test.nix
./testing/builder.test.nix ./testing/builder.test.nix

View file

@ -1,19 +1,16 @@
let rec {
elems = import ./elems.nix; processMd = elems: md:
html = import ./html.nix;
in rec {
processMd = md:
if builtins.isPath md if builtins.isPath md
then processStr (builtins.readFile md) then processStr elems (builtins.readFile md)
else processStr md; else processStr elems md;
recReadMd = root: recReadMd = toPage: elems: root:
assert builtins.isPath root; assert builtins.isPath root;
builtins.mapAttrs (path: type: builtins.mapAttrs (path: type:
if type == "directory" if type == "directory"
then recReadMd (root + (/. + path)) then recReadMd (root + (/. + path))
else if type == "regular" else if type == "regular"
then mdToPage (root + (/. + path)) then toPage (processMd elems (root + (/. + path)))
else throw "Cannot read ${path}, file type ${type}") (builtins.readDir root); else throw "Cannot read ${path}, file type ${type}") (builtins.readDir root);
recFixAppendix = site: recFixAppendix = site:
@ -28,19 +25,13 @@ in rec {
fixAppendix = builtins.replaceStrings [".md"] [".html"]; fixAppendix = builtins.replaceStrings [".md"] [".html"];
readDir = root: recFixAppendix (recReadMd root); readDir = toPage: elems: root: recFixAppendix (recReadMd toPage elems root);
mdToPage = md: splitList = elems: block:
html.document { map listItem elems (builtins.filter (s: builtins.isString s && s != "")
head = [];
body = elems.main (elems.article (processMd md));
};
splitList = block:
map listItem (builtins.filter (s: builtins.isString s && s != "")
(builtins.split "\n" block)); (builtins.split "\n" block));
listItem = str: let listItem = elems: str: let
li = builtins.match "- (.*)" str; li = builtins.match "- (.*)" str;
checkbox = builtins.match "- \\[(.)] (.*)" str; checkbox = builtins.match "- \\[(.)] (.*)" str;
checked = builtins.elemAt checkbox 0; checked = builtins.elemAt checkbox 0;
@ -58,47 +49,48 @@ in rec {
]; ];
replace = regex: apply: block: replace = regex: apply: block:
assert builtins.isString block; (let if toString block == ""
m = builtins.match regex block; then ""
before = builtins.elemAt m 0; else
after = toString (builtins.elemAt m (matchCount - 1)); (let
matchCount = builtins.length m; match = builtins.match regex block;
in before = builtins.elemAt match 0;
if m == null matchCount = builtins.length match;
then block after = builtins.elemAt match (matchCount - 1);
else in
( if match == null
if before == null then block
then "" else
else replace regex apply before (
) replace regex apply before
+ (apply m) )
+ after); + (apply match)
+ after);
rule = matcher: apply: blocks: rule = matcher: apply: blocks:
map (block: if builtins.isString blocks
if builtins.isString block then replace matcher apply blocks
then replace matcher apply block else if builtins.isList blocks
else block) then map (replace matcher apply) blocks
blocks; else throw "replace rule should be applied to string or list of strings";
applyRules = i: rules: input: let applyRules = index: rules: input: let
group = group =
if builtins.isString input if builtins.isString input
then [input] then [input]
else input; else input;
len = builtins.length rules; len = builtins.length rules;
rule = builtins.elemAt rules i; rule = builtins.elemAt rules index;
next = i + 1; next = index + 1;
in in
assert i < len; assert index < len;
if next < len if next < len
then rule (applyRules next rules group) then rule (applyRules next rules group)
else rule group; else rule group;
basicRule = matcher: elem: rule matcher (m: elem (builtins.elemAt m 1)); basicRule = matcher: elem: rule matcher (m: elem (builtins.elemAt m 1));
processStr = applyRules 0 [ processStr = elems: applyRules 0 [
(basicRule (wrap "\\^") elems.sup) (basicRule (wrap "\\^") elems.sup)
(basicRule (wrap "~") elems.sub) (basicRule (wrap "~") elems.sub)
(basicRule (wrap "\\*") elems.em) (basicRule (wrap "\\*") elems.em)
@ -111,8 +103,8 @@ in rec {
(rule (contains "\\[(.*)]\\((.*)\\)") (m: let (rule (contains "\\[(.*)]\\((.*)\\)") (m: let
href = builtins.elemAt m 2; href = builtins.elemAt m 2;
text = builtins.elemAt m 1; text = builtins.elemAt m 1;
in (elems.a href text))) in (elems.a {inherit href;} text)))
list (list elems)
(basicRule "(.*\n\n)?(.+)\n(.*)?" elems.p) (basicRule "(.*\n\n)?(.+)\n(.*)?" elems.p)
(basicRule "(.*\n\n)?```(.*)```(.*)?" (elems.textarea {readonly = true;})) (basicRule "(.*\n\n)?```(.*)```(.*)?" (elems.textarea {readonly = true;}))
(basicRule (containsBreak "###### ([^\n]+)") (elems.h6)) (basicRule (containsBreak "###### ([^\n]+)") (elems.h6))
@ -121,18 +113,25 @@ in rec {
(basicRule (containsBreak "### ([^\n]+)") (elems.h3)) (basicRule (containsBreak "### ([^\n]+)") (elems.h3))
(basicRule (containsBreak "## ([^\n]+)") (elems.h2)) (basicRule (containsBreak "## ([^\n]+)") (elems.h2))
(basicRule (containsBreak "# ([^\n]+)") (elems.h1)) (basicRule (containsBreak "# ([^\n]+)") (elems.h1))
(basicRule (containsBreak "<(${linkmatcher})>") (m: elems.a m m)) (basicRule (containsBreak "<(${linkmatcher})>") (m: elems.a {href = m;} m))
]; ];
list = rule "((.*)(\n([^-\n][^\n]+)?\n))?((- [^\n]+\n)+)(.*)" ( list = elems: let
l: (elems.ul (basicRule "(.*\n)?- ([^\n]+)\n(.*)" (m: addCheckboxes = basicRule "()\\[(.)] (.*)" (check:
elems.li (basicRule "()\\[(.)] (.*)" (check: elems.input {
elems.input { type = "checkbox";
type = "checkbox"; checked = check != " ";
checked = check != " "; disabled = true;
disabled = true; });
}) [m])) [(builtins.elemAt l 4)]))
); listitems =
basicRule "(.*\n)?- ([^\n]+)\n(.*)" (contents:
elems.li (addCheckboxes contents));
in (rule "((.*)(\n([^-\n][^\n]+)?\n))?((- [^\n]+\n)+)(.*)" (
match: let
listString = builtins.elemAt match 4;
in (elems.ul (listitems listString))
));
linkmatcher = "[-[:alnum:].%?&#=:/]+"; linkmatcher = "[-[:alnum:].%?&#=:/]+";
contains = matcher: "(.*)?${matcher}(.*)"; contains = matcher: "(.*)?${matcher}(.*)";