forked from Fediversity/Fediversity
split content types into module
This commit is contained in:
parent
30249d2821
commit
ea77a44d1a
|
@ -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 = [
|
||||||
|
|
97
website/structure/content-types.nix
Normal file
97
website/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
|
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
|
||||||
|
|
Loading…
Reference in a new issue