render content via structured DOM representation

This commit is contained in:
Valentin Gagarin 2024-11-13 15:24:41 +01:00 committed by Valentin Gagarin
parent e531e861ce
commit 5bef87be1f
4 changed files with 42 additions and 37 deletions

View file

@ -6,6 +6,7 @@ in
menus.main = {
label = "Main";
items = [
{ page = pages.index // { title = "Start"; }; }
{
menu.label = "For you";
menu.items = map (page: { inherit page; })

View file

@ -5,6 +5,14 @@ let
types
;
templates = import ./templates.nix { inherit lib; };
render-html = document:
let
eval = lib.evalModules {
class = "DOM";
modules = [ document (import ./dom.nix { inherit lib; }).document ];
};
in
toString eval.config;
in
{
options.templates =
@ -38,30 +46,38 @@ in
in
{
nav = lib.mkDefault templates.nav;
page = lib.mkDefault (config: page: templates.html {
head = ''
<title>${page.title}</title>
<meta name="description" content="${page.description}" />
<link rel="canonical" href="${lib.head page.locations}" />
'';
body = ''
page = lib.mkDefault (config: page: render-html {
html = {
head = {
title.text = page.title;
meta.description = page.description;
link.canonical = lib.head page.locations;
};
body.content = ''
${config.menus.main.outputs.html page}
<h1>${page.title}</h1>
${builtins.readFile (commonmark page.name page.body)}
'';
};
});
article = lib.mkDefault (config: page: templates.html {
head = ''
<title>${page.title}</title>
<meta name="description" content="${page.description}" />
${with lib; join "\n" (map
(author: ''<meta name="author" content="${author}" />'')
(if isList page.author then page.author else [page.author]))
}
'';
body = ''
article = lib.mkDefault (config: page: render-html {
html = {
head = {
title.text = page.title;
meta.description = page.description;
meta.authors = if lib.isList page.author then page.author else [ page.author ];
link.canonical = lib.head page.locations;
};
body.content = ''
${config.menus.main.outputs.html page}
<h1>${page.title}</h1>
${builtins.readFile (commonmark page.name page.body)}
'';
};
});
};

View file

@ -1,19 +1,5 @@
{ lib }:
rec {
html = { head, body }: ''
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
${lib.indent " " head}
</head>
<body>
${lib.indent " " body}
<body>
</html>
'';
nav = menu: page:
let
render-item = item:

View file

@ -46,6 +46,8 @@ in
default = target: with lib; "${relativePath (head config.locations) (head target.locations)}.html";
};
outputs = mkOption {
# TODO: figure out how to make this overridable at any granularity.
# it should be possible with the DOM module now.
description = ''
Representations of the document in different formats
'';