aboutsummaryrefslogtreecommitdiff
path: root/www/framework/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'www/framework/default.nix')
-rw-r--r--www/framework/default.nix140
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
+ '';
+ };
+ };
+ };
+}