diff --git a/flake.nix b/flake.nix index 9f0e471..202cbc8 100644 --- a/flake.nix +++ b/flake.nix @@ -20,14 +20,16 @@ style = nixite.style; packages.${system} = { - default = nixite.mkSite (nixite.site.applyStyle ./testing/src/style.css { + default = nixite.mkSite ( + nixite.site.applyStyle ./testing/src/style.css + (nixite.site.extractPaths { "index.html" = with nixite.elems; (doc [ [ (title "Nixite") ] (main [ - (nixite.md.readMd ./testing/src/index.md) (link "/blog" "blog") + (nixite.html.tag "img" {src = ./testing/src/favicon.png;} "") (list [ "item 1" "item 2" @@ -48,7 +50,7 @@ ]) ]); }; - }); + })); serve = self.serve self.packages.${system}.default; diff --git a/nixite/site.nix b/nixite/site.nix index 3b21173..59f2fc0 100644 --- a/nixite/site.nix +++ b/nixite/site.nix @@ -14,6 +14,38 @@ in rec { ) site); + extractPaths = content: + switchPaths content // {static = getPaths content;}; + + switchPaths = content: ( + if builtins.isAttrs content + then + builtins.mapAttrs (key: value: + if builtins.isPath value + then ("/static/" + baseNameOf value) + else switchPaths value) + content + else if builtins.isList content + then (map switchPaths content) + else content + ); + + getPaths = content: (builtins.listToAttrs (getPathsKV content)); + + getPathsKV = path: + (if builtins.isPath path + then [ + { + name = baseNameOf path; + value = path; + } + ] + else if builtins.isAttrs path + then builtins.concatLists (map getPathsKV ( builtins.attrValues path )) + else if builtins.isList path + then builtins.concatLists (map getPathsKV path) + else []); + copyTo = prefix: site: builtins.toString ( builtins.attrValues ( diff --git a/testing/site.test.nix b/testing/site.test.nix index 1a905d3..f3b9fe4 100644 --- a/testing/site.test.nix +++ b/testing/site.test.nix @@ -37,4 +37,71 @@ in }; }; }) + (it "extracts top level paths" { + actual = getPaths { + something = ""; + src = ./src/index.md; + }; + expected = { + "index.md" = ./src/index.md; + }; + }) + (it "extracts lower level paths" { + actual = getPaths { + something = "yes"; + a-list = [ + {thingy = ./src/index.md;} + [(html.tag "img" {src = ./src/favicon.png;} "")] + ]; + }; + expected = { + "index.md" = ./src/index.md; + "favicon.png" = ./src/favicon.png; + }; + }) + (it "switches paths" { + actual = switchPaths { + something = ""; + a-thing = { + src = ./src/index.md; + }; + a-list = [ + {thingy = ./src/index.md;} + ]; + }; + expected = { + something = ""; + a-thing = { + src = "/static/index.md"; + }; + a-list = [ + {thingy = "/static/index.md";} + ]; + }; + }) + + (it "extracts paths" { + actual = extractPaths { + something = ""; + a-thing = { + src = ./src/index.md; + }; + a-list = [ + {thingy = ./src/index.md;} + ]; + }; + expected = { + something = ""; + a-thing = { + src = "/static/index.md"; + }; + a-list = [ + {thingy = "/static/index.md";} + ]; + static = { + "index.md" = ./src/index.md; + }; + }; + }) + ] diff --git a/testing/src/favicon.png b/testing/src/favicon.png new file mode 100644 index 0000000..1ed2b5f Binary files /dev/null and b/testing/src/favicon.png differ