{ config, options, lib, pkgs, ... }: let inherit (lib) mkOption types ; in { options.templates = mkOption { description = '' Collection of named functions to convert page contents to files Each template function takes the complete site `config` and the page data structure. ''; type = with types; attrsOf (functionTo (functionTo options.files.type)); }; config.templates = let commonmark = name: markdown: pkgs.runCommand "${name}.html" { buildInputs = [ pkgs.cmark ]; } '' cmark ${builtins.toFile "${name}.md" markdown} > $out ''; in { page = lib.mkDefault (config: page: { # TODO: create static redirects from `tail page.locations` # TODO: reconsider using `page.outPath` and what to put into `locations`. # maybe we can avoid having ".html" suffixes there. # since templates can output multiple files, `html` is merely one of many things we *could* produce. ${page.outPath} = builtins.toFile "${page.name}.html" ''