process markdown files

This commit is contained in:
tristan 2024-01-01 17:31:04 +00:00
parent 496d3667de
commit c29ff7b22e
7 changed files with 213 additions and 80 deletions

View file

@ -4,9 +4,11 @@ let
H = n:
let
v = if n < 1 then
builtins.trace "attempted to make heading size ${toString n} (min is 1)" 1
builtins.trace "attempted to make heading size ${toString n} (min is 1)"
1
else if n > 6 then
builtins.trace "attempted to make heading size ${toString n} (max is 6)" 6
builtins.trace "attempted to make heading size ${toString n} (max is 6)"
6
else
n;
in html.tag "h${toString v}" { };
@ -49,29 +51,81 @@ in rec {
h = heading block;
c = code block;
ul = list block;
in (if h.matched then h.block else
if c.matched then c.block else
if ul.matched then ul.block else
elems.p block));
in (if h.matched then
h.block
else if c.matched then
c.block
else if ul.matched then
ul.block
else
elems.p (processStr block)));
heading = block: matchThen "(#+) (.*)" block (m:
let
l = builtins.stringLength (builtins.elemAt m 0);
in H l (builtins.elemAt m 1));
heading = block:
matchThen "(#+) (.*)" block (m:
let l = builtins.stringLength (builtins.elemAt m 0);
in H l (builtins.elemAt m 1));
code = block: matchThen "(```)(.*)(```)" block (m:
elems.code (builtins.elemAt m 1));
code = block:
matchThen "(```)(.*)(```)" block (m: elems.code (builtins.elemAt m 1));
list = block: matchThen (let item = "- .+"; in "(${item}\n)*(${item}\n?)") block (m:
elems.List (builtins.filter ( s: builtins.isString s && s!="" ) (builtins.split "[:blank:]*- " block)));
list = block:
matchThen (let item = "- .+";
in ''
(${item}
)*(${item}
?)'') block (m:
elems.List (builtins.filter (s: builtins.isString s && s != "")
(builtins.split "[:blank:]*- " block)));
replace = matcher: apply: block:
(let
m = builtins.match matcher block;
before = let v = builtins.elemAt m 0; in if v == null then "" else v;
inner = builtins.elemAt m 1;
after = builtins.elemAt m 2;
in if m == null then
block
else
(replace matcher apply before) + (apply inner) + after);
rule = matcher: apply: blocks:
map (b: if builtins.isString b then replace matcher apply b else b) blocks;
applyRules = i: rules: input:
let
group = if builtins.isString input then [ input ] else input;
len = builtins.length rules;
rule = builtins.elemAt rules i;
next = i + 1;
in assert i < len;
if next < len then rule (applyRules next rules group) else rule group;
processStr = applyRules 0 [
(rule (wrap "\\^") elems.sup)
(rule (wrap "~") elems.sub)
(rule (wrap "\\*") elems.em)
(rule (wrap "`") elems.code)
(rule (wrap "==") elems.mark)
(rule (wrap "~~") elems.del)
(rule (wrap "\\*\\*") elems.strong)
(rule (contains "<([-[:alnum:].%?&#=:/]+)>") (m: elems.a m m))
];
contains = matcher: "(.* )?${matcher}(.*)";
wrap = matcher: contains "${matcher}(.+)${matcher}";
matchThen = matcher: block: func:
let
m = builtins.match matcher block;
in
if m == null then dontMatch block
else { matched = true; block = func m; };
dontMatch = block: { matched = false; inherit block; };
let m = builtins.match matcher block;
in if m == null then
dontMatch block
else {
matched = true;
block = func m;
};
dontMatch = block: {
matched = false;
inherit block;
};
}