forked from Fediversity/fediversity.eu
split content types into module
This commit is contained in:
parent
ea0319c60e
commit
6991bc9c0e
|
@ -5,6 +5,8 @@ in
|
|||
{
|
||||
imports = with lib.fileset; toList (difference (fileFilter ({ hasExt, ... }: hasExt "nix") ./.) ./default.nix);
|
||||
|
||||
collections.news.type = config.content-types.article;
|
||||
|
||||
pages.index = {
|
||||
title = "Fediversity";
|
||||
locations = [
|
||||
|
|
97
structure/content-types.nix
Normal file
97
structure/content-types.nix
Normal 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;
|
||||
};
|
||||
};
|
||||
}
|
|
@ -5,101 +5,15 @@ let
|
|||
types
|
||||
;
|
||||
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
|
||||
{
|
||||
# TODO: split out:
|
||||
# - 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;
|
||||
imports = [ ./content-types.nix ];
|
||||
|
||||
options.pages = mkOption {
|
||||
description = ''
|
||||
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
|
||||
|
@ -222,7 +136,6 @@ in
|
|||
in
|
||||
pages // collections;
|
||||
|
||||
|
||||
options.build = mkOption {
|
||||
description = ''
|
||||
The final output of the web site
|
||||
|
|
Reference in a new issue