40 lines
1 KiB
Nix
40 lines
1 KiB
Nix
let
|
|
keyvalue = key: value:
|
|
assert builtins.isString key;
|
|
if value == "" || value == [ ] || value == { } then
|
|
""
|
|
else
|
|
''${key}="${toString value}"'';
|
|
in rec {
|
|
toHTML = elem:
|
|
if builtins.typeOf elem == "string" then
|
|
elem
|
|
else if builtins.typeOf elem == "list" then
|
|
builtins.toString (map toHTML elem)
|
|
else
|
|
"<${elem.tag} ${writeAttrs elem.attrs}>${
|
|
toHTML elem.child
|
|
}</${elem.tag}>";
|
|
|
|
writeAttrs = attrs:
|
|
toString (builtins.filter (value: value != "") (builtins.attrValues
|
|
(builtins.mapAttrs (key: value:
|
|
if (builtins.isPath value) then
|
|
keyvalue key (baseNameOf value)
|
|
else if (builtins.substring 0 2 key) == "__" then
|
|
""
|
|
else
|
|
keyvalue key value) attrs)));
|
|
|
|
tag = tag: attrs: child: {
|
|
inherit tag attrs child;
|
|
__toString = toHTML;
|
|
};
|
|
|
|
addToHead = page: heads:
|
|
page // {
|
|
child = map
|
|
(e: if e.tag == "head" then e // { child = e.child ++ heads; } else e)
|
|
page.child;
|
|
};
|
|
}
|