diff options
| author | Valentin <valentin@fricklerhandwerk.de> | 2025-12-20 18:22:27 +0100 |
|---|---|---|
| committer | Valentin <valentin@fricklerhandwerk.de> | 2025-12-20 18:22:27 +0100 |
| commit | 8b0a011c7c37d882a2e12ea8de38acaa9e782d38 (patch) | |
| tree | 2daea25b800a0733baa6f45fd71afcadf02a9ffc /www/framework/default.nix | |
| parent | 9a5020deaed97df8ab1307068f34a382b2e24b31 (diff) | |
| parent | 0efd609dd832b11c4e4e20c008edc1cc52dbfbd9 (diff) | |
Merge branch 'nix-html'
HTML werden ab jetzt aus Nix-modulen generiert.
Diffstat (limited to 'www/framework/default.nix')
| -rw-r--r-- | www/framework/default.nix | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/www/framework/default.nix b/www/framework/default.nix new file mode 100644 index 0000000..0cc9049 --- /dev/null +++ b/www/framework/default.nix @@ -0,0 +1,140 @@ +{ + config, + pkgs, + lib, + ... +}: +let + inherit (lib) mkOption types; +in +{ + imports = + with lib.fileset; + toList (difference (fileFilter (file: file.hasExt "nix") ./.) ./default.nix); + + options = { + types = mkOption { + description = "Datentypen für Website-Inhalte"; + type = with types; lazyAttrsOf deferredModule; + default = { }; + }; + + title = mkOption { + description = "Titel, der bei allen Seiten vorangestellt wird"; + type = types.singleLineStr; + readOnly = true; + }; + + files = mkOption { + description = '' + Dateien, aus denen die Website besteht, als Abbildung vom Dateipfad zum Inhalt + ''; + type = with types; attrsOf (either path (submodule config.types.file)); + }; + + redirects.raw = mkOption { + description = '' + Weiterleitungen aller historischen Dateipfade auf Kanonische Pfade + ''; + type = with types; lazyAttrsOf str; + readOnly = true; + default = + with lib; + listToAttrs ( + concatMap ( + name: + if config.files.${name} ? locations then + map (loc: { + name = "/" + loc; + value = "/" + name; + }) (tail config.files.${name}.locations) + else + [ ] + ) (attrNames config.files) + ); + }; + + redirects.caddy = mkOption { + description = '' + Weiterleitungen im Caddyfile-Format + ''; + type = types.str; + readOnly = true; + default = + with lib; + let + lines = mapAttrsToList (name: value: ''redir "${name}" ${value} permanent'') config.redirects.raw; + in + concatStringsSep "\n" lines; + }; + + result = mkOption { + description = '' + Fertige Website als Verzeichnis + ''; + type = types.package; + readOnly = true; + default = + let + script = '' + mkdir $out + '' + + lib.concatStringsSep "\n" copy; + copy = lib.mapAttrsToList ( + path: file: + let + content = if file ? path then file.path else file; + in + '' + mkdir -p $out/$(dirname '${toString path}') + ${ + "" # `--no-preserve-mode` ist erforderlich da Nix store paths read-only sind, und man andernfalls `cp -r` nicht durchführen kann. + }cp -r --no-preserve=mode ${content} $out/'${toString path}' + '' + ) config.files; + in + pkgs.runCommand "source" { } script; + }; + }; + + config.types.document = + { lib, ... }: + let + inherit (lib) mkOption types; + in + { + options = { + locations = mkOption { + description = '' + Frühere Pfade dieses Dokuments + + Einträge sind relative Pfade. + Der erste Eintrag ist der kanonische Pfad. + Alle anderen Elemente werden für Weiterleitungen zum kanonischen Pfad benutzt. + ''; + type = with types; nonEmptyListOf str; + example = [ + "about/overview" + "index" + ]; + }; + }; + }; + + config.types.file = + { lib, ... }: + let + inherit (lib) mkOption types; + in + { + imports = [ config.types.document ]; + options = { + path = mkOption { + type = types.path; + description = '' + Datei mit manuell gesteuertem Pfad + ''; + }; + }; + }; +} |
