diff --git a/flake.lock b/flake.lock index a512f17..37e142c 100644 --- a/flake.lock +++ b/flake.lock @@ -37,11 +37,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1704267472, - "narHash": "sha256-2QfrGFhkXEXRFVL6Lp14rOxNOH17fnZlY/NEqXUp26s=", + "lastModified": 1704284214, + "narHash": "sha256-YOKyHDSf6XUYJgdy8CrTGN+kPk9JGePksGENxn/gXPI=", "ref": "refs/heads/master", - "rev": "6f4955581b37d2ae079941104df486fd390abd95", - "revCount": 15, + "rev": "cc834eda99ecaff5466bc826ac5b99f36b69c537", + "revCount": 19, "type": "git", "url": "https://git.tristans.cloud/tristan/tix" }, diff --git a/flake.nix b/flake.nix index 45ed842..38aed45 100644 --- a/flake.nix +++ b/flake.nix @@ -14,6 +14,7 @@ in nixite // { + formatter.${system} = pkgs.alejandra; packages.${system} = { raw = nixite.mkSite (let readme = { @@ -60,6 +61,10 @@ ./testing/style.test.nix ]; + watch = tix.packages.${system}.watch; + watchpipe = tix.packages.${system}.watchpipe; + results = tix.packages.${system}.results; + dev = tix.watch { cmd = "nix run .# --show-trace"; stop = "pkill caddy"; diff --git a/nixite/html.nix b/nixite/html.nix index 521a188..ca6948e 100644 --- a/nixite/html.nix +++ b/nixite/html.nix @@ -64,15 +64,24 @@ in rec { || builtins.isList tag || (tag ? __toString && builtins.isFunction tag.__toString)); - addToHead = page: heads: - page + addToHead = doc: heads: + doc // { - child = - map - (e: - if e.tag == "head" - then e // {child = e.child ++ heads;} - else e) - page.child; + head = doc.head ++ heads; }; + + document = { + head ? [], + body ? [], + attrs ? {}, + }: { + inherit head body attrs; + __toString = self: '' + + ${(tag "html" [ + (tag "head" self.head) + (tag "body" self.body) + ])} + ''; + }; } diff --git a/nixite/site.nix b/nixite/site.nix index 5145f51..50e95fb 100644 --- a/nixite/site.nix +++ b/nixite/site.nix @@ -27,11 +27,11 @@ in rec { then flatten page else page) (builtins.attrValues site); - applyStyle = style: site: ((linkStyle site) // {"style.css" = style;}); + applyStyle = style: site: ((linkStyle "/style.css" site) // {"style.css" = style;}); - linkStyle = site: + linkStyle = path: site: eachPage site - (content: html.addToHead content [(elems.Stylesheet "/style.css")]); + (content: html.addToHead content [(elems.Stylesheet path)]); eachPage = site: callback: (builtins.mapAttrs (name: content: if builtins.isAttrs content && content ? "__toString" diff --git a/testing/elems.test.nix b/testing/elems.test.nix index 951da4d..445b345 100644 --- a/testing/elems.test.nix +++ b/testing/elems.test.nix @@ -6,86 +6,89 @@ elems = import ../nixite/elems.nix; html = import ../nixite/html.nix; in - with elems; - describe "html tag" [ - (it "makes a p tag" { - expected = html.tag "p" {} "foobar"; - actual = p {} "foobar"; - asString = true; - }) - (it "makes a div tag" { - expected = html.tag "div" {} "foobar"; - actual = div {} "foobar"; - asString = true; - }) - (it "makes a section tag" { - expected = html.tag "section" {} "foobar"; - actual = section {} "foobar"; - asString = true; - }) - (it "makes a span tag" { - expected = html.tag "span" {} "foobar"; - actual = span {} "foobar"; - asString = true; - }) - (it "makes a main tag" { - expected = html.tag "main" {} ["yeet"]; - actual = main {} ["yeet"]; - asString = true; - }) - (it "makes a title tag" { - expected = html.tag "title" {} "foobar"; - actual = title {} "foobar"; - asString = true; - }) + with elems; [ + ( + describe "html tag" [ + (it "makes a p tag" { + expected = html.tag "p" {} "foobar"; + actual = p {} "foobar"; + asString = true; + }) + (it "makes a div tag" { + expected = html.tag "div" {} "foobar"; + actual = div {} "foobar"; + asString = true; + }) + (it "makes a section tag" { + expected = html.tag "section" {} "foobar"; + actual = section {} "foobar"; + asString = true; + }) + (it "makes a span tag" { + expected = html.tag "span" {} "foobar"; + actual = span {} "foobar"; + asString = true; + }) + (it "makes a main tag" { + expected = html.tag "main" {} ["yeet"]; + actual = main {} ["yeet"]; + asString = true; + }) + (it "makes a title tag" { + expected = html.tag "title" {} "foobar"; + actual = title {} "foobar"; + asString = true; + }) - (it "makes an a tag" { - expected = html.tag "a" {href = "https://example.com";} "example"; - actual = a {href = "https://example.com";} "example"; - asString = true; - }) + (it "makes an a tag" { + expected = html.tag "a" {href = "https://example.com";} "example"; + actual = a {href = "https://example.com";} "example"; + asString = true; + }) - (it "lets the a tag drop the props" { - expected = html.tag "a" {href = "https://example.com";} "example"; - actual = a "https://example.com" "example"; - asString = true; - }) + (it "lets the a tag drop the props" { + expected = html.tag "a" {href = "https://example.com";} "example"; + actual = a "https://example.com" "example"; + asString = true; + }) - (it "lets you extend the a tag" (let - extA = a {class = ["linky"];}; - in { - expected = ["linky"]; - actual = - (extA "https://example.com" "example") - .attrs - .class; - asString = true; - })) + (it "lets you extend the a tag" (let + extA = a {class = ["linky"];}; + in { + expected = ["linky"]; + actual = + (extA "https://example.com" "example") + .attrs + .class; + asString = true; + })) - (it "makes a stylesheet link" { - expected = html.tag "link" { - href = "/style"; - rel = "stylesheet"; - } ""; - actual = Stylesheet {href = "/style";}; - asString = true; - }) - (it "makes a list" { - expected = html.tag "ul" {__ = "";} [ - (html.tag "li" {} "foo") - (html.tag "li" {} "bar") - (html.tag "li" {} "baz") - ]; - actual = List {} ["foo" "bar" "baz"]; - asString = true; - }) - (it "makes an html doc" { - expected = html.tag "html" { - __child = ""; - class = []; - lang = "en"; - } [(html.tag "head" {} ["foo"]) (html.tag "body" {} "bar")]; - actual = Doc {} [["foo"] "bar"]; - asString = true; - }) - ] + (it "makes a stylesheet link" { + expected = html.tag "link" { + href = "/style"; + rel = "stylesheet"; + } ""; + actual = Stylesheet {href = "/style";}; + asString = true; + }) + (it "makes a list" { + expected = html.tag "ul" {__ = "";} [ + (html.tag "li" {} "foo") + (html.tag "li" {} "bar") + (html.tag "li" {} "baz") + ]; + actual = List {} ["foo" "bar" "baz"]; + asString = true; + }) + (it "makes an html doc" { + expected = html.tag "html" { + __child = ""; + class = []; + lang = "en"; + } [(html.tag "head" {} ["foo"]) (html.tag "body" {} "bar")]; + actual = Doc {} [["foo"] "bar"]; + asString = true; + }) + ] + ) + ] diff --git a/testing/html.test.nix b/testing/html.test.nix index 5bdfc54..a31648b 100644 --- a/testing/html.test.nix +++ b/testing/html.test.nix @@ -5,151 +5,190 @@ }: let html = import ../nixite/html.nix; in - with html; - describe "tag" [ - (it "keeps info in the tag" (let - p = tag "p"; - in { - actual = p.tag; - expected = "p"; - })) + with html; [ + ( + describe "tag" [ + (it "keeps info in the tag" (let + p = tag "p"; + in { + actual = p.tag; + expected = "p"; + })) - (it "keeps attr info in the tag" (let - p = tag "p" {class = "";}; - in { - actual = p.attrs; - expected = {class = "";}; - })) + (it "keeps attr info in the tag" (let + p = tag "p" {class = "";}; + in { + actual = p.attrs; + expected = {class = "";}; + })) - (it "keeps tag after setting attrs" (let - p = tag "p" {class = "";}; - in { - actual = p.tag; - expected = "p"; - })) + (it "keeps tag after setting attrs" (let + p = tag "p" {class = "";}; + in { + actual = p.tag; + expected = "p"; + })) - (it "makes a p tag" { - actual = tag "p" {} "Hello"; - expected = { - tag = "p"; - attrs = {}; - child = "Hello"; - }; - removeDunders = true; - }) + (it "makes a p tag" { + actual = tag "p" {} "Hello"; + expected = { + tag = "p"; + attrs = {}; + child = "Hello"; + }; + removeDunders = true; + }) - (it "makes element" (let - para = tag "p" {}; - in { - expected = "p"; - actual = para.tag; - })) + (it "makes element" (let + para = tag "p" {}; + in { + expected = "p"; + actual = para.tag; + })) - (it "keeps attrs on element" (let - attrs = {style = {foo = "bar";};}; - para = tag "p" attrs; - in { - expected = attrs; - actual = para.attrs; - })) + (it "keeps attrs on element" (let + attrs = {style = {foo = "bar";};}; + para = tag "p" attrs; + in { + expected = attrs; + actual = para.attrs; + })) - (it "makes renderable element" (let - attrs = {style = {foo = "bar";};}; - para = tag "p" attrs; - in { - expected = "
"; - actual = toString (para ""); - })) + (it "makes renderable element" (let + attrs = {style = {foo = "bar";};}; + para = tag "p" attrs; + in { + expected = ""; + actual = toString (para ""); + })) - (it "keeps tag" (let - attrs = {style = {foo = "bar";};}; - para = tag "p" attrs; - in { - expected = "p"; - actual = (para "").tag; - })) + (it "keeps tag" (let + attrs = {style = {foo = "bar";};}; + para = tag "p" attrs; + in { + expected = "p"; + actual = (para "").tag; + })) - (it "keeps style" (let - attrs = {style = {foo = "bar";};}; - para = tag "p" attrs; - in { - expected = {foo = "bar";}; - actual = (para "").attrs.style; - })) + (it "keeps style" (let + attrs = {style = {foo = "bar";};}; + para = tag "p" attrs; + in { + expected = {foo = "bar";}; + actual = (para "").attrs.style; + })) - (it "needs no args to make string" (let - p = tag "p"; - in { - actual = toString p; - expected = ""; - })) + (it "needs no args to make string" (let + p = tag "p"; + in { + actual = toString p; + expected = ""; + })) - (it "needs no content to make string" (let - p = tag "p"; - in { - actual = toString (p {class = "foobar";}); - expected = ''''; - })) + (it "needs no content to make string" (let + p = tag "p"; + in { + actual = toString (p {class = "foobar";}); + expected = ''''; + })) - (it "can take many sets of props" (let - p = tag "p"; - in { - actual = toString (p {class = "foobar";} {style = "a style";}); - expected = ''''; - })) + (it "can take many sets of props" (let + p = tag "p"; + in { + actual = toString (p {class = "foobar";} {style = "a style";}); + expected = ''''; + })) - (it "works recursively" (let - attrs = {style = {foo = "bar";};}; - para = tag "p" attrs; - a = tag "a" {}; - in { - expected = ""; - actual = toString (para (a "hello")); - })) + (it "works recursively" (let + attrs = {style = {foo = "bar";};}; + para = tag "p" attrs; + a = tag "a" {}; + in { + expected = ""; + actual = toString (para (a "hello")); + })) - (it "throws with function child" { - actual = toString (tag "p" (i: "")); - throws = true; - }) + (it "throws with function child" { + actual = toString (tag "p" (i: "")); + throws = true; + }) - (it "throws with a number" { - actual = toString (tag "p" 5); - throws = true; - }) + (it "throws with a number" { + actual = toString (tag "p" 5); + throws = true; + }) - (it "throws with a bool" { - actual = toString (tag "p" true); - throws = true; - }) + (it "throws with a bool" { + actual = toString (tag "p" true); + throws = true; + }) - (it "throws with a null" { - actual = toString (tag "p" null); - throws = true; - }) + (it "throws with a null" { + actual = toString (tag "p" null); + throws = true; + }) - (it "concatinates classes" { - actual = toString (tag "p" {class = ["class1" "class2"];} "Hello"); - expected = ''Hello
''; - }) + (it "concatinates classes" { + actual = toString (tag "p" {class = ["class1" "class2"];} "Hello"); + expected = ''Hello
''; + }) - (it "renders on / off attrs" { - actual = toString (tag "p" { - on = true; - off = false; - }); - expected = ""; - }) - ] - ++ describe "addToHead" [ - (it "applies style" (let - page = tag "html" {} [(tag "head" {} ["foo"])]; - in { - actual = addToHead page ["bar"]; - expected = { - tag = "html"; - attrs = {}; - child = [(tag "head" {} ["foo" "bar"])]; - }; - removeDunders = true; - })) - ] + (it "renders on / off attrs" { + actual = toString (tag "p" { + on = true; + off = false; + }); + expected = ""; + }) + ] + ) + ( + describe "addToHead" [ + (it "adds a string to the head" (let + page = html.document { + head = ["foo"]; + }; + in { + actual = addToHead page ["bar"]; + expected = html.document { + head = ["foo" "bar"]; + }; + asJSON = true; + })) + ] + ) + ( + describe "document" [ + (it "has a head and body" { + actual = + (document { + head = []; + }) + .head; + expected = []; + }) + (it "has a head and body" { + actual = + (document { + body = []; + }) + .body; + expected = []; + }) + (it "produces a valid html document" { + actual = document { + head = []; + body = []; + }; + expected = '' + + ${(tag "html" [ + (tag "head" []) + (tag "body" []) + ])} + ''; + asString = true; + }) + ] + ) + ] diff --git a/testing/md.test.nix b/testing/md.test.nix index 0acf173..22637e4 100644 --- a/testing/md.test.nix +++ b/testing/md.test.nix @@ -6,145 +6,160 @@ md = import ../nixite/md.nix; elems = import ../nixite/elems.nix; in - with md; - describe "list" [ - (it "matches a list of one element" { - actual = list [ - '' - - something - '' - ]; - expected = [(elems.List ["something"])]; - }) + with md; [ + ( + describe "list" [ + (it "matches a list of one element" { + actual = list [ + '' + - something + '' + ]; + expected = [(elems.List ["something"])]; + }) - (it "makes a list of many elements" { - actual = list [ - '' - - something - - something else - '' - ]; - expected = [(elems.List ["something" "something else"])]; - }) + (it "makes a list of many elements" { + actual = list [ + '' + - something + - something else + '' + ]; + expected = [(elems.List ["something" "something else"])]; + }) - (it "makes a list of many checkboxes" { - actual = list [ - '' - - [ ] something - - [X] something else - '' - ]; - expected = [ - (elems.List [ - [ - (elems.input { - type = "checkbox"; - disabled = true; - checked = false; - } "") - "something" - ] - [ - (elems.input { - type = "checkbox"; - disabled = true; - checked = true; - } "") - "something else" - ] - ]) - ]; - }) + (it "makes a list of many checkboxes" { + actual = list [ + '' + - [ ] something + - [X] something else + '' + ]; + expected = [ + (elems.List [ + [ + (elems.input { + type = "checkbox"; + disabled = true; + checked = false; + } "") + "something" + ] + [ + (elems.input { + type = "checkbox"; + disabled = true; + checked = true; + } "") + "something else" + ] + ]) + ]; + }) - (it "matches a list with no whitespace around" { - actual = list [ - '' - - something - - something else'' - ]; - expected = [(elems.List ["something" "something else"])]; - }) + (it "matches a list with no whitespace around" { + actual = list [ + '' + - something + - something else'' + ]; + expected = [(elems.List ["something" "something else"])]; + }) - (it "doesnt match not a list" (let - str = "blah blah"; - in { - actual = list [str]; - expected = [str]; - })) - ] - ++ describe "process string" [ - (it "processes whole string with all rules" { - actual = processStr '' - this text **may** *or may not* contain **bold** words *inside* it. - ''; - expected = elems.p [ - "this text" - (elems.strong "may") - (elems.em "or may not") - "contain" - (elems.strong "bold") - "words" - (elems.em "inside") - "it." - ]; - asString = true; - }) + (it "doesnt match not a list" (let + str = "blah blah"; + in { + actual = list [str]; + expected = [str]; + })) + ] + ) + ( + describe "process string" [ + (it "processes whole string with all rules" { + actual = processStr '' + this text **may** *or may not* contain **bold** words *inside* it. + ''; + expected = elems.p [ + "this text" + (elems.strong "may") + (elems.em "or may not") + "contain" + (elems.strong "bold") + "words" + (elems.em "inside") + "it." + ]; + asString = true; + }) - (it "makes paragraphs" { - actual = processStr '' - lorem ipsum - dolor sit + (it "makes paragraphs" { + actual = processStr '' + lorem ipsum + dolor sit - foo bar - ''; - expected = '' -lorem ipsum - dolor sit -
foo bar
''; - asString = true; - }) - ] - ++ describe "fix appendix" [ - (it "can fix file appendixes" { - actual = fixAppendix "index.md"; - expected = "index.html"; - }) - ] - ++ describe "mdToPage" [ - (it "converts markdown to a page" { - actual = toString (mdToPage ./blog/index.md) + "\n\n"; # inflation - expected = builtins.readFile ./out/index.html; - asString = true; - }) - ] - ++ describe "recReadMd" [ - (it "recursively reads dir" { - actual = recReadMd ./blog; - expected = { - "index.md" = mdToPage ./blog/index.md; - "dir" = {"index.md" = mdToPage ./blog/dir/index.md;}; - }; - asJSON = true; - }) - ] - ++ describe "recFixAppendix" [ - (it "recursively fixes filename" { - actual = recFixAppendix { - "index.md" = "something"; - dir = {"index.md" = "something else";}; - }; - expected = { - "index.html" = "something"; - dir = {"index.html" = "something else";}; - }; - }) - ] - ++ describe "readDir" [ - (it "recursively translates md to html" { - actual = builtins.toJSON (readDir ./blog); - expected = builtins.toJSON { - "index.html" = mdToPage ./blog/index.md; - "dir" = {"index.html" = mdToPage ./blog/dir/index.md;}; - }; - }) - ] + foo bar + ''; + expected = '' +lorem ipsum + dolor sit +
foo bar
''; + asString = true; + }) + ] + ) + ( + describe "fix appendix" [ + (it "can fix file appendixes" { + actual = fixAppendix "index.md"; + expected = "index.html"; + }) + ] + ) + ( + describe "mdToPage" [ + (it "converts markdown to a page" { + actual = toString (mdToPage ./blog/index.md) + "\n\n"; # inflation + expected = builtins.readFile ./out/index.html; + asString = true; + }) + ] + ) + ( + describe "recReadMd" [ + (it "recursively reads dir" { + actual = recReadMd ./blog; + expected = { + "index.md" = mdToPage ./blog/index.md; + "dir" = {"index.md" = mdToPage ./blog/dir/index.md;}; + }; + asJSON = true; + }) + ] + ) + ( + describe "recFixAppendix" [ + (it "recursively fixes filename" { + actual = recFixAppendix { + "index.md" = "something"; + dir = {"index.md" = "something else";}; + }; + expected = { + "index.html" = "something"; + dir = {"index.html" = "something else";}; + }; + }) + ] + ) + ( + describe "readDir" [ + (it "recursively translates md to html" { + actual = builtins.toJSON (readDir ./blog); + expected = builtins.toJSON { + "index.html" = mdToPage ./blog/index.md; + "dir" = {"index.html" = mdToPage ./blog/dir/index.md;}; + }; + }) + ] + ) + ] diff --git a/testing/site.test.nix b/testing/site.test.nix index abc04ee..e7dca66 100644 --- a/testing/site.test.nix +++ b/testing/site.test.nix @@ -7,160 +7,163 @@ elems = import ../nixite/elems.nix; site = import ../nixite/site.nix; style = import ../nixite/style.nix; + my-site = { + "index.html" = html.document { + head = [(elems.title {} "foobar")]; + body = [(elems.main {} "something")]; + }; + blog = { + "index.html" = html.document { + head = [(elems.title {} "foobar")]; + body = elems.main {} "blogy blog"; + }; + }; + }; in - with site; - describe "applyStyle" [ - (it "applies a style" { - expected = { - "index.html" = html.tag "html" {} [ - (html.tag "head" {} [ - (elems.title {} "foobar") - (elems.Stylesheet "/style.css") - ]) - (elems.main {} "something") - ]; - blog = { - "index.html" = html.tag "html" {} [ - (html.tag "head" {} [ - (elems.title {} "foobar") - (elems.Stylesheet "/style.css") - ]) - (elems.main {} "blogy blog") - ]; - }; - "style.css" = '' - this is a stylesheet - ''; - }; - actual = - applyStyle '' - this is a stylesheet - '' { - "index.html" = html.tag "html" {} [ - (html.tag "head" {} [(elems.title {} "foobar")]) - (elems.main {} "something") - ]; + with site; [ + ( + describe "linkStyle" [ + (it "links a stylesheet" { + actual = linkStyle "my-styles.css" my-site; + expected = { + "index.html" = html.addToHead my-site."index.html" [(elems.Stylesheet "my-styles.css")]; blog = { - "index.html" = html.tag "html" {} [ - (html.tag "head" {} [(elems.title {} "foobar")]) - (elems.main {} "blogy blog") - ]; + "index.html" = html.addToHead my-site.blog."index.html" [(elems.Stylesheet "my-styles.css")]; }; }; - asJSON = true; - }) - ] - ++ describe "applyFavicon" [ - (it "applies a favicon" { - expected = { - "index.html" = elems.html {} [ - (elems.head {} [ - (elems.title {} "foobar") - (elems.link { - rel = "shortcut icon"; - href = ./src/favicon.png; - }) - ]) - (elems.main {} "something") - ]; - blog = { - "index.html" = elems.html {} [ - (elems.head {} [ - (elems.title {} "foobar") - (elems.link { - rel = "shortcut icon"; - href = ./src/favicon.png; - }) - ]) - (elems.main {} "something") + asJSON = true; + }) + ] + ) + ( + describe "applyStyle" [ + (it "applies a style" { + expected = { + "index.html" = html.addToHead my-site."index.html" [(elems.Stylesheet "/style.css")]; + blog = { + "index.html" = html.addToHead my-site.blog."index.html" [(elems.Stylesheet "/style.css")]; + }; + "style.css" = '' + this is a stylesheet + ''; + }; + actual = + applyStyle '' + this is a stylesheet + '' + my-site; + asJSON = true; + }) + ] + ) + ( + describe "applyFavicon" [ + (it "applies a favicon" ( + let + href = "my-favicon.ico"; + favicon-link = elems.link { + rel = "shortcut icon"; + inherit href; + }; + in { + expected = { + "index.html" = + my-site."index.html" + // { + head = my-site."index.html".head ++ [favicon-link]; + }; + blog = { + "index.html" = + my-site.blog."index.html" + // { + head = my-site.blog."index.html".head ++ [favicon-link]; + }; + }; + }; + actual = + applyFavicon href my-site; + } + )) + ] + ) + ( + describe "getStyles" [ + (it "gets all styles" { + expected = { + "p" = {}; + "div" = {}; + "p.class" = {color = "blue";}; + "div.class2" = {color = "green";}; + }; + actual = getStyles (let + p = style.component elems.p "class" {style = {color = "blue";};}; + g = style.component elems.div "class2" {style = {color = "green";};}; + in { + "index.html" = p ""; + blog = {"index.html" = g "";}; + }); + removeDunders = true; + }) + ] + ) + ( + describe "getPaths" [ + (it "gets top level paths" { + actual = getPaths { + something = ""; + src = ./src/index.md; + }; + expected = {"index.md" = ./src/index.md;}; + }) + (it "gets lower level paths" { + actual = getPaths { + something = "yes"; + a-list = [ + {thingy = ./src/index.md;} + [(html.tag "img" {src = ./src/favicon.png;} "")] ]; }; - }; - actual = applyFavicon ./src/favicon.png { - "index.html" = elems.html {} [ - (elems.head {} [(elems.title {} "foobar")]) - (elems.main {} "something") - ]; - blog = { - "index.html" = elems.html {} [ - (elems.head {} [(elems.title {} "foobar")]) - (elems.main {} "something") - ]; + expected = { + "index.md" = ./src/index.md; + "favicon.png" = ./src/favicon.png; }; - }; - asJSON = true; - }) - ] - ++ describe "getStyles" [ - (it "gets all styles" { - expected = { - "p" = {}; - "div" = {}; - "p.class" = {color = "blue";}; - "div.class2" = {color = "green";}; - }; - actual = getStyles (let - p = style.component elems.p "class" {style = {color = "blue";};}; - g = style.component elems.div "class2" {style = {color = "green";};}; - in { - "index.html" = p ""; - blog = {"index.html" = g "";}; - }); - removeDunders = true; - }) - ] - ++ describe "getPaths" [ - (it "gets top level paths" { - actual = getPaths { - something = ""; - src = ./src/index.md; - }; - expected = {"index.md" = ./src/index.md;}; - }) - (it "gets 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; - }; - }) - ] - ++ describe "switchPaths" [ - (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";}]; - }; - }) - ] - ++ describe "extractPaths" [ - (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;}; - }; - }) - ] - ++ describe "switchLinks" [ + }) + ] + ) + ( + describe "switchPaths" [ + (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";}]; + }; + }) + ] + ) + ( + describe "extractPaths" [ + (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;}; + }; + }) + ] + ) + (describe "switchLinks" [ (it "switches links" (let coolPage = { type = "link"; @@ -179,8 +182,8 @@ in a-list = [{thingy = "/static/cool-page";}]; }; })) - ] - ++ describe "getLinks" [ + ]) + (describe "getLinks" [ (it "gets links" (let coolPage = { type = "link"; @@ -202,8 +205,8 @@ in "page2" = "stuff"; }; })) - ] - ++ describe "extractLinks" [ + ]) + (describe "extractLinks" [ (it "extracts links" (let coolPage = { type = "link"; @@ -231,8 +234,8 @@ in }; }; })) - ] - ++ describe "copyTo" [ + ]) + (describe "copyTo" [ (it "copies all the files" { actual = copyTo "." { page = "this is a page"; @@ -269,60 +272,37 @@ in actual = copyTo "." {page = 5;}; throws = true; }) - ] - ++ describe "prepare" [ + ]) + (describe "prepare" [ (it "prepares the site" { - actual = prepare {favicon = ./src/favicon.png;} { - "index.html" = elems.html {} [ - (elems.head {} [(elems.title {} "foobar")]) - (elems.main {} [ - (elems.a { - href = { - type = "link"; - name = "a-page"; - content = "this is another page"; - }; - } "A Page") - ]) - ]; - blog = { - "index.html" = elems.html {} [ - (elems.head {} [(elems.title {} "foobar")]) - (elems.main {} "something") - ]; + actual = prepare {favicon = ./src/favicon.png;} my-site; + expected = let + my-favicon-link = elems.link { + rel = "shortcut icon"; + href = "/static/favicon.png"; + }; + my-style = elems.Stylesheet "/style.css"; + in { + "index.html" = html.document { + head = + my-site."index.html".head + ++ [my-favicon-link my-style]; + body = my-site."index.html".body; }; - }; - expected = { - "index.html" = elems.html {} [ - (elems.head {} [ - (elems.title {} "foobar") - (elems.link { - rel = "shortcut icon"; - href = "/static/favicon.png"; - }) - (elems.Stylesheet "/style.css") - ]) - (elems.main {} [(elems.a {href = "/static/a-page";} "A Page")]) - ]; blog = { - "index.html" = elems.html {} [ - (elems.head {} [ - (elems.title {} "foobar") - (elems.link { - rel = "shortcut icon"; - href = "/static/favicon.png"; - }) - (elems.Stylesheet "/style.css") - ]) - (elems.main {} "something") - ]; + "index.html" = html.document { + body = my-site.blog."index.html".body; + head = + my-site.blog."index.html".head + ++ [my-favicon-link my-style]; + }; }; static = { "favicon.png" = ./src/favicon.png; - "a-page" = "this is another page"; }; "style.css" = ""; }; asJSON = true; }) - ] + ]) + ] diff --git a/testing/style.test.nix b/testing/style.test.nix index b804924..9ae372b 100644 --- a/testing/style.test.nix +++ b/testing/style.test.nix @@ -5,149 +5,158 @@ }: let style = import ../nixite/style.nix; elems = import ../nixite/elems.nix; -in - describe "getStyle" [ - (it "fetches empty style" (let - para = style.component elems.p "para" {}; - in { - expected = { - "p" = {}; - "p.para" = {}; - }; - actual = style.getStyle (para ""); - })) +in [ + ( + describe "getStyle" [ + (it "fetches empty style" (let + para = style.component elems.p "para" {}; + in { + expected = { + "p" = {}; + "p.para" = {}; + }; + actual = style.getStyle (para ""); + })) - (it "fetches style" (let - attrs = {style = {foo = "bar";};}; - para = style.component elems.p "para" attrs; - in { - expected = { - "p" = {}; - "p.para" = attrs.style; - }; - actual = style.getStyle (para ""); - })) + (it "fetches style" (let + attrs = {style = {foo = "bar";};}; + para = style.component elems.p "para" attrs; + in { + expected = { + "p" = {}; + "p.para" = attrs.style; + }; + actual = style.getStyle (para ""); + })) - (it "fetches style for class" (let - s = {foo = "bar";}; - para = style.component elems.p "para" {style = s;}; - in { - expected = { - "p" = {}; - "p.para" = s; - }; - actual = style.getStyle (para ""); - })) - ] - ++ describe "component" [ - (it "applies class" (let - attrs = {style = {foo = "bar";};}; - para = style.component elems.p "para" attrs; - in { - expected = ["para"]; - actual = (para "").attrs.class; - })) + (it "fetches style for class" (let + s = {foo = "bar";}; + para = style.component elems.p "para" {style = s;}; + in { + expected = { + "p" = {}; + "p.para" = s; + }; + actual = style.getStyle (para ""); + })) + ] + ) + ( + describe "component" [ + (it "applies class" (let + attrs = {style = {foo = "bar";};}; + para = style.component elems.p "para" attrs; + in { + expected = ["para"]; + actual = (para "").attrs.class; + })) - (it "applies classes from props" (let - attrs = { - style = {foo = "bar";}; - class = ["other" "class"]; - }; - para = style.component elems.p "para" attrs; - in { - expected = ["para" "other" "class"]; - actual = (para "").attrs.class; - })) + (it "applies classes from props" (let + attrs = { + style = {foo = "bar";}; + class = ["other" "class"]; + }; + para = style.component elems.p "para" attrs; + in { + expected = ["para" "other" "class"]; + actual = (para "").attrs.class; + })) - (it "extends styled tags classes" (let - s = { - "p" = {}; - "div" = {}; - "p.para" = {foo = "bar";}; - "p.para.oof" = {oof = "yes";}; - }; - para = style.component elems.p "para" {style = s."p.para";}; - para2 = style.component para "oof" {style = s."p.para.oof";}; - in { - expected = ["para" "oof"]; - actual = (para2 "").attrs.class; - })) - ] - ++ describe "getStyles" [ - (it "fetches style recursively" (let - s = { - "p" = {}; - "div" = {}; - "p.para" = {foo = "bar";}; - "div.link" = {this = "that";}; - }; - para = style.component elems.p "para" {style = s."p.para";}; - div = style.component elems.div "link" {style = s."div.link";}; - in { - expected = s; - actual = style.getStyles (para (div "hello")); - removeDunders = true; - })) + (it "extends styled tags classes" (let + s = { + "p" = {}; + "div" = {}; + "p.para" = {foo = "bar";}; + "p.para.oof" = {oof = "yes";}; + }; + para = style.component elems.p "para" {style = s."p.para";}; + para2 = style.component para "oof" {style = s."p.para.oof";}; + in { + expected = ["para" "oof"]; + actual = (para2 "").attrs.class; + })) + ] + ) + ( + describe "getStyles" [ + (it "fetches style recursively" (let + s = { + "p" = {}; + "div" = {}; + "p.para" = {foo = "bar";}; + "div.link" = {this = "that";}; + }; + para = style.component elems.p "para" {style = s."p.para";}; + div = style.component elems.div "link" {style = s."div.link";}; + in { + expected = s; + actual = style.getStyles (para (div "hello")); + removeDunders = true; + })) - (it "fetches style recursively through lists" (let - s = { - "p" = {}; - "div" = {}; - "p.para" = {foo = "bar";}; - "div.link" = {this = "that";}; - }; - para = style.component elems.p "para" {style = s."p.para";}; - a = style.component elems.div "link" {style = s."div.link";}; - in { - expected = s; - actual = style.getStyles (para [(a "hello")]); - removeDunders = true; - })) + (it "fetches style recursively through lists" (let + s = { + "p" = {}; + "div" = {}; + "p.para" = {foo = "bar";}; + "div.link" = {this = "that";}; + }; + para = style.component elems.p "para" {style = s."p.para";}; + a = style.component elems.div "link" {style = s."div.link";}; + in { + expected = s; + actual = style.getStyles (para [(a "hello")]); + removeDunders = true; + })) - (it "fetches style recursively with repeats" (let - s = { - "p" = {}; - "div" = {}; - "p.para" = {foo = "bar";}; - "div.link" = {this = "that";}; - }; - para = style.component elems.p "para" {style = s."p.para";}; - a = style.component elems.div "link" {style = s."div.link";}; - in { - expected = s; - actual = style.getStyles (para [(a "hello") (a "hello")]); - removeDunders = true; - })) + (it "fetches style recursively with repeats" (let + s = { + "p" = {}; + "div" = {}; + "p.para" = {foo = "bar";}; + "div.link" = {this = "that";}; + }; + para = style.component elems.p "para" {style = s."p.para";}; + a = style.component elems.div "link" {style = s."div.link";}; + in { + expected = s; + actual = style.getStyles (para [(a "hello") (a "hello")]); + removeDunders = true; + })) - (it "extends styled tags" (let - s = { - "p.para" = {foo = "bar";}; - "p.oof" = {oof = "yes";}; - }; - para = style.component elems.p "para" {style = s."p.para";}; - para2 = style.component para "oof" {style = s."p.oof";}; - in { - expected = s; - actual = style.getStyles (para2 ""); - removeDunders = true; - })) - ] - ++ describe "stylesToString" [ - (it "converts styles to string" (let - s = { - "p" = {}; - "p.para" = {foo = "bar";}; - "a.link" = {this = "that";}; - }; - in { - expected = '' - a.link { - this: that; - } - p.para { - foo: bar; - } - ''; - actual = style.stylesToString s; - })) - ] + (it "extends styled tags" (let + s = { + "p.para" = {foo = "bar";}; + "p.oof" = {oof = "yes";}; + }; + para = style.component elems.p "para" {style = s."p.para";}; + para2 = style.component para "oof" {style = s."p.oof";}; + in { + expected = s; + actual = style.getStyles (para2 ""); + removeDunders = true; + })) + ] + ) + ( + describe "stylesToString" [ + (it "converts styles to string" (let + s = { + "p" = {}; + "p.para" = {foo = "bar";}; + "a.link" = {this = "that";}; + }; + in { + expected = '' + a.link { + this: that; + } + p.para { + foo: bar; + } + ''; + actual = style.stylesToString s; + })) + ] + ) +]