process markdown files
This commit is contained in:
parent
496d3667de
commit
c29ff7b22e
7 changed files with 213 additions and 80 deletions
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue