Files
nix-flake/modules/docs.nix
T

98 lines
2.6 KiB
Nix

{ inputs, self, ... }: let
mkDocsDerivation = { pkgs, doBuild ? true }: let
inherit (pkgs) lib stdenv mkdocs python314Packages;
mkOptionsDocFromModule = commandName: module: let
eval = lib.evalModules {
modules = [ module ];
args = { inherit pkgs; };
};
optionsDoc = pkgs.nixosOptionsDoc {
inherit (eval) options;
};
in pkgs.runCommand commandName {} ''
cat ${optionsDoc.optionsCommonMark} >> $out
'';
indexMd = let
rawText = ''
## Welcome!
This site is rebuilt with every generation, and holds a complete record of all options declared within this flake.
Visit [NixOS](nixos-options.md) or [Home Manager](home-options.md) to see the available options.
'';
in pkgs.runCommand "index.md" {} ''
echo "${rawText}" >> $out
'';
nixosOptionsMd = mkOptionsDocFromModule "nixos-options.md" self.nixosModules.options;
homeOptionsMd = mkOptionsDocFromModule "home-options.md" self.homeModules.options;
mkDocsConfig = ''
site_name: flake options
nav:
- Home: 'index.md'
- Options:
- NixOS: 'nixos-options.md'
- Home Manager: 'home-options.md'
theme:
name: material
palette:
scheme: slate
'';
mkDocsYml = pkgs.runCommand "mkdocs.yml" {} ''
echo "${mkDocsConfig}" >> $out
'';
in stdenv.mkDerivation {
src = self;
name = if doBuild then "docs" else "docs-md";
buildInput = [
mkDocsYml
indexMd
nixosOptionsMd
homeOptionsMd
];
nativeBuildInputs = [
mkdocs
python314Packages.mkdocs-material
python314Packages.pygments
];
buildPhase = ''
mkdir docs-build
cd docs-build
ln -s ${mkDocsYml} "./mkdocs.yml"
mkdir docs
ln -s ${indexMd} "./docs/index.md"
ln -s ${nixosOptionsMd} "./docs/nixos-options.md"
ln -s ${homeOptionsMd} "./docs/home-options.md"
# generate the site
${if doBuild then "mkdocs build" else ""}
'';
installPhase = if doBuild then ''
mv site $out
'' else ''
cp -r . $out
'';
};
in {
perSystem = { pkgs, ... }: {
packages.docs = mkDocsDerivation { inherit pkgs; };
packages.docs-md = mkDocsDerivation { inherit pkgs; doBuild = false; };
};
flake.homeModules.graphics = { pkgs, ... }: {
services.podman = {
enable = true;
containers.flake-docs-nginx = {
image = "docker.io/library/nginx:latest";
volumes = [
"${mkDocsDerivation { inherit pkgs; }}:/usr/share/nginx/html"
];
ports = [
"8080:80"
];
};
};
};
}