11.stylix/docs/default.nix
Daniel Thwaites 2b2f260a69
doc: collapse platforms and modules
Collapsing is only possible for pages, not headings, so I had to
combine platforms and modules into a single section and nest them
under draft pages.

Later, we could migrate some content from the configuration page to
these draft pages to make the flow of the book more natural.
2025-02-23 15:20:12 +00:00

171 lines
4.5 KiB
Nix

{
pkgs,
lib,
inputs,
...
}:
let
nixosConfiguration = lib.nixosSystem {
inherit (pkgs) system;
modules = [
inputs.home-manager.nixosModules.home-manager
inputs.self.nixosModules.stylix
./settings.nix
];
};
homeManagerConfiguration = inputs.home-manager.lib.homeManagerConfiguration {
inherit pkgs;
modules = [
inputs.self.homeManagerModules.stylix
./settings.nix
{
home = {
homeDirectory = "/home/book";
stateVersion = "22.11";
username = "book";
};
}
];
};
# TODO: Include Nix Darwin options
makeOptionsDoc =
{ configuration, pathFilter }:
(pkgs.nixosOptionsDoc {
inherit (configuration) options;
transformOptions =
option:
option
// {
visible = option.visible && lib.any pathFilter option.declarations;
};
}).optionsCommonMark;
# The documentation for options which aren't linked to a specific module
makePlatformsOptionsDoc =
configuration:
makeOptionsDoc {
inherit configuration;
pathFilter =
path:
lib.hasPrefix "${inputs.self}/" path
&& !lib.hasPrefix "${inputs.self}/modules/" path;
};
# Returns an attribute set of module names and their corresponding option
# documentation.
makeModuleOptionsDoc =
configuration:
lib.mapAttrs (
module: _:
makeOptionsDoc {
inherit configuration;
pathFilter = lib.hasPrefix "${inputs.self}/modules/${module}/";
}
) (builtins.readDir "${inputs.self}/modules");
nixosModuleOptionsDoc = makeModuleOptionsDoc nixosConfiguration;
homeManagerModuleOptionsDoc = makeModuleOptionsDoc homeManagerConfiguration;
modulePageScript = lib.pipe "${inputs.self}/modules" [
builtins.readDir
(lib.mapAttrsToList (
module: _: ''
writeModulePage \
${module} \
${homeManagerModuleOptionsDoc.${module}} \
${nixosModuleOptionsDoc.${module}}
''
))
lib.concatStrings
];
in
pkgs.stdenvNoCC.mkDerivation {
name = "stylix-book";
src = ./.;
buildInputs = with pkgs; [
mdbook
mdbook-alerts
];
patchPhase = ''
# The generated documentation has headings at level 2, but we want level 3
# so they can be nested under the sections for each module system.
REDUCE_HEADINGS='s/^## /### /'
# The "declared by" links point to a file which only exists when the docs
# are built locally. This removes the links.
REMOVE_DECLARED_BY='/*Declared by:*/,/^$/d'
function writeOptions() {
platformName="$1"
optionsFile="$2"
outputFile="$3"
printf '\n## %s options\n' "$platformName" >>"$outputFile"
if [[ -s "$optionsFile" ]]; then
sed \
--expression "$REDUCE_HEADINGS" \
--expression "$REMOVE_DECLARED_BY" \
<"$optionsFile" \
>>"$outputFile"
else
printf '*%s*\n' "None provided." >>"$outputFile"
fi
}
function writeModulePage() {
moduleName="$1"
homeManagerOptionsFile="$2"
nixosOptionsFile="$3"
readmeFile="${inputs.self}/modules/$moduleName/README.md"
page="options/modules/$moduleName.md"
outputFile="src/$page"
if [[ -f $outputFile ]]; then
printf \
'%s should not be used. Move it to %s\n' \
"docs/src/options/modules/$moduleName.md" \
"modules/$moduleName/README.md" \
>&2
exit 1
elif [[ -f $readmeFile ]]; then
cp --no-preserve=mode,ownership "$readmeFile" "$outputFile"
else
printf \
'%s\n' \
"# $moduleName" \
'> [!NOTE]' \
"> This module doesn't include any additional documentation." \
'> You can browse the options it provides below.' \
>>"$outputFile"
fi
writeOptions 'Home Manager' "$homeManagerOptionsFile" "$outputFile"
writeOptions 'NixOS' "$nixosOptionsFile" "$outputFile"
printf ' - [%s](%s)\n' "$moduleName" "$page" >>src/SUMMARY.md
}
cp ${../README.md} src/README.md
cp ${../gnome.png} src/gnome.png
cp ${../kde.png} src/kde.png
mkdir --parents src/options/platforms
writeOptions 'Home Manager' ${(makePlatformsOptionsDoc homeManagerConfiguration)} src/options/platforms/home_manager.md
writeOptions 'NixOS' ${(makePlatformsOptionsDoc nixosConfiguration)} src/options/platforms/nixos.md
mkdir --parents src/options/modules
${modulePageScript}
'';
buildPhase = "mdbook build --dest-dir $out";
}