e7dcacbd7c
this simplifies the setup a lot, and avoids weird looking `./file.md` links showing up. it also does not show regular URLs any more. currently the command reference only has few of them, and not showing them in the offline documentation is hopefully not a big deal. instead of building more special-case solutions, clumsily preprocessing the input, or issuing verbal rules on dealing with URLs, should better be solved sustainably by not rendering relative links in `lowdown`: https://github.com/kristapsdz/lowdown/issues/105
98 lines
3.1 KiB
Nix
98 lines
3.1 KiB
Nix
{ command }:
|
|
|
|
with builtins;
|
|
with import ./utils.nix;
|
|
|
|
let
|
|
|
|
showCommand =
|
|
{ command, def, filename }:
|
|
''
|
|
**Warning**: This program is **experimental** and its interface is subject to change.
|
|
''
|
|
+ "# Name\n\n"
|
|
+ "`${command}` - ${def.description}\n\n"
|
|
+ "# Synopsis\n\n"
|
|
+ showSynopsis { inherit command; args = def.args; }
|
|
+ (if def.commands or {} != {}
|
|
then
|
|
let
|
|
categories = sort (x: y: x.id < y.id) (unique (map (cmd: cmd.category) (attrValues def.commands)));
|
|
listCommands = cmds:
|
|
concatStrings (map (name:
|
|
"* "
|
|
+ "[`${command} ${name}`](./${appendName filename name}.md)"
|
|
+ " - ${cmds.${name}.description}\n")
|
|
(attrNames cmds));
|
|
in
|
|
"where *subcommand* is one of the following:\n\n"
|
|
# FIXME: group by category
|
|
+ (if length categories > 1
|
|
then
|
|
concatStrings (map
|
|
(cat:
|
|
"**${toString cat.description}:**\n\n"
|
|
+ listCommands (filterAttrs (n: v: v.category == cat) def.commands)
|
|
+ "\n"
|
|
) categories)
|
|
+ "\n"
|
|
else
|
|
listCommands def.commands
|
|
+ "\n")
|
|
else "")
|
|
+ (if def ? doc
|
|
then def.doc + "\n\n"
|
|
else "")
|
|
+ (let s = showOptions def.flags; in
|
|
if s != ""
|
|
then "# Options\n\n${s}"
|
|
else "")
|
|
;
|
|
|
|
appendName = filename: name: (if filename == "nix" then "nix3" else filename) + "-" + name;
|
|
|
|
showOptions = flags:
|
|
let
|
|
categories = sort builtins.lessThan (unique (map (cmd: cmd.category) (attrValues flags)));
|
|
in
|
|
concatStrings (map
|
|
(cat:
|
|
(if cat != ""
|
|
then "**${cat}:**\n\n"
|
|
else "")
|
|
+ concatStrings
|
|
(map (longName:
|
|
let
|
|
flag = flags.${longName};
|
|
in
|
|
" - `--${longName}`"
|
|
+ (if flag ? shortName then " / `-${flag.shortName}`" else "")
|
|
+ (if flag ? labels then " " + (concatStringsSep " " (map (s: "*${s}*") flag.labels)) else "")
|
|
+ " \n"
|
|
+ " " + flag.description + "\n\n"
|
|
) (attrNames (filterAttrs (n: v: v.category == cat) flags))))
|
|
categories);
|
|
|
|
showSynopsis =
|
|
{ command, args }:
|
|
"`${command}` [*option*...] ${concatStringsSep " "
|
|
(map (arg: "*${arg.label}*" + (if arg ? arity then "" else "...")) args)}\n\n";
|
|
|
|
processCommand = { command, def, filename }:
|
|
[ { name = filename + ".md"; value = showCommand { inherit command def filename; }; inherit command; } ]
|
|
++ concatMap
|
|
(name: processCommand {
|
|
filename = appendName filename name;
|
|
command = command + " " + name;
|
|
def = def.commands.${name};
|
|
})
|
|
(attrNames def.commands or {});
|
|
|
|
in
|
|
|
|
let
|
|
manpages = processCommand { filename = "nix"; command = "nix"; def = builtins.fromJSON command; };
|
|
summary = concatStrings (map (manpage: " - [${manpage.command}](command-ref/new-cli/${manpage.name})\n") manpages);
|
|
in
|
|
(listToAttrs manpages) // { "SUMMARY.md" = summary; }
|