feat(users/sterni/nix): cursed nix html DSL
Couldn't sleep, so I made a surprisingly neat way to render HTML
documents in Nix using our favorite feature __findFile:
let
inherit (depot.users.sterni.nix.html) __findFile esc;
in
<html> {} [
(<head> {} [
(<meta> { charset = "utf-8"; } null)
(<title> {} (esc "hello"))
])
(<body> {} [
(<h1> {} (esc "hello world"))
])
]
=> "<html><head><meta charset=\"utf-8\"/><title>hello</title></head><body><h1>hello world</h1></body></html>"
Change-Id: Id36808a56ae3da3b5263c06f29342fc22d105c21
Reviewed-on: https://cl.tvl.fyi/c/depot/+/3410
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
This commit is contained in:
parent
17d78867bb
commit
9ed439bfbd
3 changed files with 351 additions and 0 deletions
84
users/sterni/nix/html/tests/default.nix
Normal file
84
users/sterni/nix/html/tests/default.nix
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
{ depot, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (depot.users.sterni.nix.html)
|
||||
__findFile
|
||||
esc
|
||||
withDoctype
|
||||
;
|
||||
|
||||
exampleDocument = withDoctype (<html> { lang = "en"; } [
|
||||
(<head> {} [
|
||||
(<meta> { charset = "utf-8"; } null)
|
||||
(<title> {} "html.nix example document")
|
||||
(<link> {
|
||||
rel = "license";
|
||||
href = "https://code.tvl.fyi/about/LICENSE";
|
||||
type = "text/html";
|
||||
} null)
|
||||
(<style> {} (esc ''
|
||||
hgroup h2 {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin: 0;
|
||||
}
|
||||
''))
|
||||
])
|
||||
(<body> {} [
|
||||
(<main> {} [
|
||||
(<hgroup> {} [
|
||||
(<h1> {} (esc "html.nix"))
|
||||
(<h2> {} [
|
||||
(<em> {} "the")
|
||||
(esc " most cursed HTML DSL ever!")
|
||||
])
|
||||
])
|
||||
(<dl> {} [
|
||||
(<dt> {} [
|
||||
(esc "Q: Wait, it's all ")
|
||||
(<a> {
|
||||
href = "https://cl.tvl.fyi/q/hashtag:cursed";
|
||||
} (esc "cursed"))
|
||||
(esc " nix hacks?")
|
||||
])
|
||||
(<dd> {} (esc "A: Always has been. 🔫"))
|
||||
(<dt> {} (esc "Q: Why does this work?"))
|
||||
(<dd> {} [
|
||||
(esc "Because nix ")
|
||||
(<a> {
|
||||
href = "https://github.com/NixOS/nix/blob/293220bed5a75efc963e33c183787e87e55e28d9/src/libexpr/parser.y#L410-L416";
|
||||
} (esc "translates "))
|
||||
(<a> {
|
||||
href = "https://github.com/NixOS/nix/blob/293220bed5a75efc963e33c183787e87e55e28d9/src/libexpr/lexer.l#L100";
|
||||
} (esc "SPATH tokens"))
|
||||
(esc " like ")
|
||||
(<code> {} (esc "<nixpkgs>"))
|
||||
(esc " into calls to ")
|
||||
(<code> {} (esc "__findFile"))
|
||||
(esc " in the ")
|
||||
(<em> {} (esc "current"))
|
||||
(esc " scope.")
|
||||
])
|
||||
])
|
||||
])
|
||||
])
|
||||
]);
|
||||
in
|
||||
|
||||
pkgs.runCommandNoCC "html.nix.html" {
|
||||
passAsFile = [ "exampleDocument" ];
|
||||
inherit exampleDocument;
|
||||
nativeBuildInputs = [ pkgs.html5validator ];
|
||||
} ''
|
||||
set -x
|
||||
test "${esc "<> && \" \'"}" = "<> && " '"
|
||||
|
||||
# slow as hell unfortunately
|
||||
html5validator "$exampleDocumentPath"
|
||||
|
||||
mv "$exampleDocumentPath" "$out"
|
||||
|
||||
set +x
|
||||
''
|
||||
Loading…
Add table
Add a link
Reference in a new issue