split content types into module

This commit is contained in:
Valentin Gagarin 2024-10-12 11:38:03 +02:00
parent 2d1fa43c67
commit 61709abeb5
3 changed files with 101 additions and 89 deletions

View file

@ -5,6 +5,8 @@ in
{ {
imports = with lib.fileset; toList (difference (fileFilter ({ hasExt, ... }: hasExt "nix") ./.) ./default.nix); imports = with lib.fileset; toList (difference (fileFilter ({ hasExt, ... }: hasExt "nix") ./.) ./default.nix);
collections.news.type = config.content-types.article;
pages.index = { pages.index = {
title = "Fediversity"; title = "Fediversity";
locations = [ locations = [

View file

@ -0,0 +1,97 @@
{ config, lib, options, ... }:
let
inherit (lib)
mkOption
types
;
cfg = config;
in
{
options = {
content-types = mkOption {
description = "Content types";
type = with types; attrsOf deferredModule;
};
};
config.content-types = {
page = { name, config, ... }: {
options = {
name = mkOption {
description = "Symbolic name for the page, used as a human-readable identifier";
type = types.str;
default = name;
};
title = mkOption {
description = "Page title";
type = types.str;
default = name;
};
locations = mkOption {
description = ''
List of historic output locations for the resulting file
The first element is the canonical location.
All other elements are used to create redirects to the canonical location.
'';
type = with types; nonEmptyListOf str;
};
link = mkOption {
description = "Helper function for transparent linking to other pages";
type = with types; functionTo str;
default = target: "TODO: compute the relative path based on `locations`";
};
outPath = mkOption {
description = ''
Location of the page, used for transparently creating links
'';
type = types.str;
default = lib.head config.locations;
};
description = mkOption {
description = ''
One-sentence description of page contents
'';
type = types.str;
};
summary = mkOption {
description = ''
One-paragraph summary of page contents
'';
type = types.str;
};
body = mkOption {
description = ''
Page contents in CommonMark
'';
type = types.str;
};
template = mkOption {
description = ''
Function that converts the page contents to files
'';
type = with types; functionTo (functionTo options.files.type);
default = cfg.templates.page;
};
};
};
article = { config, collectionName, ... }: {
imports = [ cfg.content-types.page ];
options = {
date = mkOption {
description = "Publication date";
type = with types; nullOr str;
default = null;
};
author = mkOption {
description = "Page author";
type = with types; nullOr (either str (listOf str));
default = null;
};
};
config.name = lib.slug config.title;
config.outPath = "${collectionName}/${lib.head config.locations}";
config.template = cfg.templates.article;
};
};
}

View file

@ -5,101 +5,15 @@ let
types types
; ;
cfg = config; cfg = config;
types' = {
article = { config, collectionName, ... }: {
imports = [ types'.page ];
options = {
date = mkOption {
description = "Publication date";
type = with types; nullOr str;
default = null;
};
author = mkOption {
description = "Page author";
type = with types; nullOr (either str (listOf str));
default = null;
};
};
config.name = lib.slug config.title;
config.outPath = "${collectionName}/${lib.head config.locations}";
config.template = cfg.templates.article;
};
page = { name, config, ... }: {
options = {
name = mkOption {
description = "Symbolic name for the page, used as a human-readable identifier";
type = types.str;
default = name;
};
title = mkOption {
description = "Page title";
type = types.str;
default = name;
};
locations = mkOption {
description = ''
List of historic output locations for the resulting file
The first element is the canonical location.
All other elements are used to create redirects to the canonical location.
'';
type = with types; nonEmptyListOf str;
};
link = mkOption {
description = "Helper function for transparent linking to other pages";
type = with types; functionTo str;
default = target: "TODO: compute the relative path based on `locations`";
};
outPath = mkOption {
description = ''
Location of the page, used for transparently creating links
'';
type = types.str;
default = lib.head config.locations;
};
description = mkOption {
description = ''
One-sentence description of page contents
'';
type = types.str;
};
summary = mkOption {
description = ''
One-paragraph summary of page contents
'';
type = types.str;
};
body = mkOption {
description = ''
Page contents in CommonMark
'';
type = types.str;
};
template = mkOption
{
description = ''
Function that converts the page contents to files
'';
type = with types; functionTo (functionTo options.files.type);
default = cfg.templates.page;
};
};
};
};
in in
{ {
# TODO: split out: imports = [ ./content-types.nix ];
# - extra module system types into lib'
# - page and article types into their own module values under structure/${page,article}.nix
# yes, actually. those types should probably be configurable
config.collections.news.type = types'.article;
options.pages = mkOption { options.pages = mkOption {
description = '' description = ''
Collection of pages on the site Collection of pages on the site
''; '';
type = with types; attrsOf (submodule types'.page); type = with types; attrsOf (submodule config.content-types.page);
}; };
options.collections = mkOption options.collections = mkOption
@ -222,7 +136,6 @@ in
in in
pages // collections; pages // collections;
options.build = mkOption { options.build = mkOption {
description = '' description = ''
The final output of the web site The final output of the web site