{ 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)); }; published = mkOption { description = '' Datum der Veröffentlichung Wird benutzt, um Termine in zukünftig und vergangen zu trennen. ''; type = types.str; }; events = mkOption { description = '' Termine ''; type = with types; attrsOf (submodule config.types.event); default = { }; }; 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 ''; }; }; }; }