1
0
Fork 0
mirror of https://github.com/nix-community/nixvim.git synced 2025-11-09 03:56:05 +01:00
nixvim/docs/lib/default.nix
Matt Sturgeon 4414d8aa14 docs/modules: init
Modules to represent pages in the docs
2025-09-30 16:21:23 +00:00

152 lines
4 KiB
Nix

# Generates the documentation for library functions using nixdoc.
# See https://github.com/nix-community/nixdoc
{
lib,
runCommand,
writers,
nixdoc,
nixvim,
pageSpecs ? ./pages.nix,
}:
let
pageConfiguration = lib.evalModules {
modules = [
pageSpecs
{
freeformType = lib.types.attrsOf (
lib.types.submoduleWith {
modules = [ ../modules/page.nix ];
}
);
}
];
};
pages = pageConfiguration.config;
# Collect all page nodes into a list of page entries
collectPages =
pages:
builtins.concatMap (
node:
let
children = builtins.removeAttrs node [ "_page" ];
in
lib.optional (node ? _page) node._page ++ lib.optionals (children != { }) (collectPages children)
) (builtins.attrValues pages);
# Normalised page specs
pageList = collectPages pages;
pagesToRender = builtins.filter (page: page.hasContent) pageList;
result =
runCommand "nixvim-lib-docs"
{
nativeBuildInputs = [
nixdoc
];
locations = writers.writeJSON "locations.json" (
import ./function-locations.nix {
inherit lib;
rootPath = nixvim;
functionSet = lib.extend nixvim.lib.overlay;
pathsToScan = lib.pipe pageList [
(map (x: x.functions))
(builtins.filter (x: x.file != null))
(map (x: x.loc))
];
revision = nixvim.rev or "main";
}
);
passthru.config = pageConfiguration;
passthru.menu = import ./menu.nix {
inherit lib pages;
};
passthru.pages = map (page: "${result}/${page.target}") pagesToRender;
}
''
function docgen {
md_file="$1"
in_file="$2"
name="$3"
out_file="$out/$4"
title="$5"
if [[ -z "$in_file" ]]; then
if [[ -z "$md_file" ]]; then
>&2 echo "No markdown or nix file for $name"
exit 1
fi
elif [[ -f "$in_file/default.nix" ]]; then
in_file+="/default.nix"
elif [[ ! -f "$in_file" ]]; then
>&2 echo "File not found: $in_file"
exit 1
fi
if [[ -n "$in_file" ]]; then
nixdoc \
--file "$in_file" \
--locs "$locations" \
--category "$name" \
--description "REMOVED BY TAIL" \
--prefix "lib" \
--anchor-prefix "" \
| tail --lines +2 \
> functions.md
fi
default_heading="# $name"
if [[ -n "$title" ]]; then
default_heading+=": $title"
fi
print_heading=true
if [[ -f "$md_file" ]] && [[ "$(head --lines 1 "$md_file")" == '# '* ]]; then
>&2 echo "NOTE: markdown file for $name starts with a <h1> heading. Skipping default heading \"$default_heading\"."
>&2 echo " Found \"$(head --lines 1 "$md_file")\" in: $md_file"
print_heading=false
fi
mkdir -p $(dirname "$out_file")
(
if [[ "$print_heading" = true ]]; then
echo "$default_heading"
echo
fi
if [[ -f "$md_file" ]]; then
cat "$md_file"
echo
fi
if [[ -f functions.md ]]; then
cat functions.md
fi
) > "$out_file"
}
mkdir -p "$out"
${lib.concatMapStringsSep "\n" (
{
functions,
source,
target,
title ? "",
...
}:
lib.escapeShellArgs [
"docgen"
"${lib.optionalString (source != null) source}" # md_file
"${lib.optionalString (functions.file != null) functions.file}" # in_file
(lib.showAttrPath functions.loc) # name
target # out_file
title # title
]
) pagesToRender}
'';
in
result