From d47c7fa12b84e7bd0300d849f05f024d7b79d70a Mon Sep 17 00:00:00 2001 From: sterni Date: Wed, 25 Dec 2024 00:53:08 +0100 Subject: [PATCH] feat(sterni/nix/html): make also emit doctype MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes the awkward withDoctype utility obsolete which is much nicer. Technically, this is a BREAKING CHANGE since it was possible to create valid documents without an tag before: withDoctype (lib.concatStrings [ ( { } …) ( { } …) ]) I don't think this usecase is worth preserving since this can just be written as { } [ ( { } …) ( { } …) ] and omitting the tag is not recommended since it should be used to set the language of the document (which we didn't in the example above). Change-Id: Idc5104ce88fe8bee965c076229b79387915c3605 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12907 Autosubmit: sterni Reviewed-by: sterni Tested-by: BuildkiteCI Reviewed-by: tazjin --- .../machines/ingeborg/http/sterni.lv.nix | 5 ++-- users/sterni/nix/html/README.md | 6 ++--- users/sterni/nix/html/default.nix | 23 +++++++++---------- users/sterni/nix/html/tests/default.nix | 5 ++-- users/tazjin/cursed/responder.nix | 5 ++-- 5 files changed, 20 insertions(+), 24 deletions(-) diff --git a/users/sterni/machines/ingeborg/http/sterni.lv.nix b/users/sterni/machines/ingeborg/http/sterni.lv.nix index 50c1bac29..cba56ce4f 100644 --- a/users/sterni/machines/ingeborg/http/sterni.lv.nix +++ b/users/sterni/machines/ingeborg/http/sterni.lv.nix @@ -3,7 +3,6 @@ let inherit (depot.users.sterni.nix.html) __findFile - withDoctype ; in @@ -19,13 +18,13 @@ in root = pkgs.writeTextFile { name = "sterni.lv-http-root"; destination = "/index.html"; - text = withDoctype ( { } [ + text = { } [ ( { } [ ( { charset = "utf-8"; } null) ( { } "no thoughts") ]) (<body> { } "🦩") - ]); + ]; }; # TODO(sterni): tmp.sterni.lv locations."/tmp/".root = toString /srv/http; diff --git a/users/sterni/nix/html/README.md b/users/sterni/nix/html/README.md index 0349e466a..d636244c9 100644 --- a/users/sterni/nix/html/README.md +++ b/users/sterni/nix/html/README.md @@ -11,10 +11,10 @@ let htmlNix = import ./path/to/html.nix { }; # make the magic work - inherit (htmlNix) __findFile esc withDoctype; + inherit (htmlNix) __findFile esc; in -pkgs.writeText "example.html" (withDoctype (<html> {} [ +pkgs.writeText "example.html" (<html> {} [ (<head> {} [ (<meta> { charset = "utf-8"; } null) (<title> {} (esc "hello world")) @@ -35,7 +35,7 @@ pkgs.writeText "example.html" (withDoctype (<html> {} [ ]) ]) ]) -])) +]) ``` Convince yourself it works: diff --git a/users/sterni/nix/html/default.nix b/users/sterni/nix/html/default.nix index 360fa7c47..9ffecc1d4 100644 --- a/users/sterni/nix/html/default.nix +++ b/users/sterni/nix/html/default.nix @@ -1,4 +1,4 @@ -# Copyright © 2021 sterni +# SPDX-FileCopyrightText: Copyright © 2021, 2024 sterni # SPDX-License-Identifier: MIT # # This file provides a cursed HTML DSL for nix which works by overloading @@ -58,6 +58,9 @@ let calls, we can't escape it automatically. Instead this must be done manually using `esc`. + If the tag is "html", e.g. in case of `<html> { } …`, "<!DOCTYPE html> will + be prepended to the normal rendering of the text. + Type: string -> attrs<string> -> (list<string> | string | null) -> string Example: @@ -98,20 +101,16 @@ let then builtins.concatStringsSep "" (flatten content) else content; in - if content == null + (if tag == "html" then "<!DOCTYPE html>" else "") + + (if content == null then "<${tag}${attrs'}/>" - else "<${tag}${attrs'}>${content'}</${tag}>"; + else "<${tag}${attrs'}>${content'}</${tag}>"); - /* Prepend "<!DOCTYPE html>" to a string. - - Type: string -> string - - Example: - - withDoctype (<body> {} (esc "hello")) - => "<!DOCTYPE html><body>hello</body>" + /* Deprecated, does nothing. */ - withDoctype = doc: "<!DOCTYPE html>" + doc; + withDoctype = doc: builtins.trace + "WARN: withDoctype no longer does anything, `<html> { } [ … ]` takes care of rendering <!DOCTYPE html>" + doc; /* Taken from <nixpkgs/lib/lists.nix>. */ flatten = x: diff --git a/users/sterni/nix/html/tests/default.nix b/users/sterni/nix/html/tests/default.nix index 17662f363..4c386f874 100644 --- a/users/sterni/nix/html/tests/default.nix +++ b/users/sterni/nix/html/tests/default.nix @@ -4,10 +4,9 @@ let inherit (depot.users.sterni.nix.html) __findFile esc - withDoctype ; - exampleDocument = withDoctype (<html> { lang = "en"; } [ + exampleDocument = <html> { lang = "en"; } [ (<head> { } [ (<meta> { charset = "utf-8"; } null) (<title> { } "html.nix example document") @@ -78,7 +77,7 @@ let ]) ]) ]) - ]); + ]; in pkgs.runCommand "html.nix.html" diff --git a/users/tazjin/cursed/responder.nix b/users/tazjin/cursed/responder.nix index 9aa6a2d55..9c1e29a20 100644 --- a/users/tazjin/cursed/responder.nix +++ b/users/tazjin/cursed/responder.nix @@ -4,7 +4,6 @@ let inherit (depot.users.sterni.nix.html) __findFile esc - withDoctype ; # CGI envvars: https://www.instanet.com/cgi/env.html @@ -24,7 +23,7 @@ let default = let { hasQuery = if builtins.length (builtins.attrNames query) > 0 then "?" else ""; - body = (withDoctype (<html> { lang = "en"; } [ + body = <html> { lang = "en"; } [ (<head> { } [ (<title> { } "some cursed nix") ]) @@ -33,7 +32,7 @@ let (<p> { } [ method " " path hasQuery rawQuery ]) (<p> { } (builtins.toJSON query)) ]) - ])); + ]; }; greeter = withDoctype (<html> { lang = "en"; } [