1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-27 11:07:44 +00:00

docs: create SUMMARY.md automatically

This commit is contained in:
Terts Diepraam 2022-01-22 11:39:07 +01:00
parent b2c7177106
commit a3ca29b612
5 changed files with 66 additions and 161 deletions

1
docs/.gitignore vendored
View file

@ -1,2 +1,3 @@
book
src/utils
src/SUMMARY.md

View file

@ -1,12 +0,0 @@
# Simple script to create the correct SUMMARY.md and other files
# for the mdbook documentation.
# Note: This will overwrite the existing files!
import os
with open('src/SUMMARY.md', 'w') as summary:
summary.write("# Summary\n\n")
summary.write("[Introduction](index.md)\n")
summary.write("* [Contributing](contributing.md)\n")
for d in sorted(os.listdir('../src/uu')):
summary.write(f"* [{d}](utils/{d}.md)\n")

View file

@ -1,108 +0,0 @@
# Summary
[Introduction](index.md)
* [Installation](installation.md)
* [Contributing](contributing.md)
# Reference
* [Multi-call binary](multicall.md)
* [arch](utils/arch.md)
* [base32](utils/base32.md)
* [base64](utils/base64.md)
* [basename](utils/basename.md)
* [basenc](utils/basenc.md)
* [cat](utils/cat.md)
* [chcon](utils/chcon.md)
* [chgrp](utils/chgrp.md)
* [chmod](utils/chmod.md)
* [chown](utils/chown.md)
* [chroot](utils/chroot.md)
* [cksum](utils/cksum.md)
* [comm](utils/comm.md)
* [cp](utils/cp.md)
* [csplit](utils/csplit.md)
* [cut](utils/cut.md)
* [date](utils/date.md)
* [dd](utils/dd.md)
* [df](utils/df.md)
* [dircolors](utils/dircolors.md)
* [dirname](utils/dirname.md)
* [du](utils/du.md)
* [echo](utils/echo.md)
* [env](utils/env.md)
* [expand](utils/expand.md)
* [expr](utils/expr.md)
* [factor](utils/factor.md)
* [false](utils/false.md)
* [fmt](utils/fmt.md)
* [fold](utils/fold.md)
* [groups](utils/groups.md)
* [hashsum](utils/hashsum.md)
* [head](utils/head.md)
* [hostid](utils/hostid.md)
* [hostname](utils/hostname.md)
* [id](utils/id.md)
* [install](utils/install.md)
* [join](utils/join.md)
* [kill](utils/kill.md)
* [link](utils/link.md)
* [ln](utils/ln.md)
* [logname](utils/logname.md)
* [ls](utils/ls.md)
* [mkdir](utils/mkdir.md)
* [mkfifo](utils/mkfifo.md)
* [mknod](utils/mknod.md)
* [mktemp](utils/mktemp.md)
* [more](utils/more.md)
* [mv](utils/mv.md)
* [nice](utils/nice.md)
* [nl](utils/nl.md)
* [nohup](utils/nohup.md)
* [nproc](utils/nproc.md)
* [numfmt](utils/numfmt.md)
* [od](utils/od.md)
* [paste](utils/paste.md)
* [pathchk](utils/pathchk.md)
* [pinky](utils/pinky.md)
* [pr](utils/pr.md)
* [printenv](utils/printenv.md)
* [printf](utils/printf.md)
* [ptx](utils/ptx.md)
* [pwd](utils/pwd.md)
* [readlink](utils/readlink.md)
* [realpath](utils/realpath.md)
* [relpath](utils/relpath.md)
* [rm](utils/rm.md)
* [rmdir](utils/rmdir.md)
* [runcon](utils/runcon.md)
* [seq](utils/seq.md)
* [shred](utils/shred.md)
* [shuf](utils/shuf.md)
* [sleep](utils/sleep.md)
* [sort](utils/sort.md)
* [split](utils/split.md)
* [stat](utils/stat.md)
* [stdbuf](utils/stdbuf.md)
* [sum](utils/sum.md)
* [sync](utils/sync.md)
* [tac](utils/tac.md)
* [tail](utils/tail.md)
* [tee](utils/tee.md)
* [test](utils/test.md)
* [timeout](utils/timeout.md)
* [touch](utils/touch.md)
* [tr](utils/tr.md)
* [true](utils/true.md)
* [truncate](utils/truncate.md)
* [tsort](utils/tsort.md)
* [tty](utils/tty.md)
* [uname](utils/uname.md)
* [unexpand](utils/unexpand.md)
* [uniq](utils/uniq.md)
* [unlink](utils/unlink.md)
* [uptime](utils/uptime.md)
* [users](utils/users.md)
* [wc](utils/wc.md)
* [who](utils/who.md)
* [whoami](utils/whoami.md)
* [yes](utils/yes.md)

5
docs/theme/head.hbs vendored
View file

@ -10,4 +10,7 @@
top: 1em;
right: 0;
}
</style>
dd > p {
margin-top: 0.2em;
}
</style>

View file

@ -1,7 +1,5 @@
// This file is part of the uutils coreutils package.
//
// (c) Michael Gehring <mg@ebfe.org>
//
// For the full copyright and license information, please view the LICENSE
// file that was distributed with this source code.
@ -9,74 +7,97 @@ use clap::App;
use std::collections::hash_map::HashMap;
use std::ffi::OsString;
use std::fs::File;
use std::io::Write;
use std::io::{self, Write};
include!(concat!(env!("OUT_DIR"), "/uutils_map.rs"));
fn main() -> std::io::Result<()> {
fn main() -> io::Result<()> {
let utils = util_map::<Box<dyn Iterator<Item = OsString>>>();
match std::fs::create_dir("docs/src/utils/") {
Err(e) if e.kind() == std::io::ErrorKind::AlreadyExists => Ok(()),
x => x,
}?;
for (name, (_, app)) in utils {
let mut summary = File::create("docs/src/SUMMARY.md")?;
let _ = write!(
summary,
"# Summary\n\
\n\
[Introduction](index.md)\n\
* [Installation](installation.md)\n\
* [Contributing](contributing.md)\n\
\n\
# Reference\n\
* [Multi-call binary](multicall.md)\n",
);
let mut utils = utils.iter().collect::<Vec<_>>();
utils.sort();
for (&name, (_, app)) in utils {
if name == "[" {
continue;
}
let p = format!("docs/src/utils/{}.md", name);
if let Ok(f) = File::create(&p) {
write_markdown(f, &mut app(), name);
write_markdown(f, &mut app(), name)?;
println!("Wrote to '{}'", p);
} else {
println!("Error writing to {}", p);
}
write!(summary, "* [{0}](utils/{0}.md)\n", name)?
}
Ok(())
}
fn write_markdown(mut w: impl Write, app: &mut App, name: &str) {
let _ = write!(w, "# {}\n\n", name);
write_version(&mut w, app);
write_usage(&mut w, app, name);
write_summary(&mut w, app);
write_options(&mut w, app);
fn write_markdown(mut w: impl Write, app: &mut App, name: &str) -> io::Result<()> {
write!(w, "# {}\n\n", name)?;
write_version(&mut w, app)?;
write_usage(&mut w, app, name)?;
write_description(&mut w, app)?;
write_options(&mut w, app)
}
fn write_version(w: &mut impl Write, app: &App) {
let _ = writeln!(
fn write_version(w: &mut impl Write, app: &App) -> io::Result<()> {
writeln!(
w,
"<div class=\"version\">version: {}</div>",
app.render_version().split_once(' ').unwrap().1
);
)
}
fn write_usage(w: &mut impl Write, app: &mut App, name: &str) {
let _ = writeln!(w, "\n```");
fn write_usage(w: &mut impl Write, app: &mut App, name: &str) -> io::Result<()> {
writeln!(w, "\n```")?;
let mut usage: String = app.render_usage().lines().nth(1).unwrap().trim().into();
usage = usage.replace(app.get_name(), name);
let _ = writeln!(w, "{}", usage);
let _ = writeln!(w, "```");
writeln!(w, "{}", usage)?;
writeln!(w, "```")
}
fn write_summary(w: &mut impl Write, app: &App) {
fn write_description(w: &mut impl Write, app: &App) -> io::Result<()> {
if let Some(about) = app.get_long_about().or_else(|| app.get_about()) {
let _ = writeln!(w, "{}", about);
writeln!(w, "{}", about)
} else {
Ok(())
}
}
fn write_options(w: &mut impl Write, app: &App) {
let _ = writeln!(w, "<h2>Options</h2>");
let _ = write!(w, "<dl>");
fn write_options(w: &mut impl Write, app: &App) -> io::Result<()> {
writeln!(w, "<h2>Options</h2>")?;
write!(w, "<dl>")?;
for arg in app.get_arguments() {
let _ = write!(w, "<dt>");
write!(w, "<dt>")?;
let mut first = true;
for l in arg.get_long_and_visible_aliases().unwrap_or_default() {
if !first {
let _ = write!(w, ", ");
write!(w, ", ")?;
} else {
first = false;
}
let _ = write!(w, "<code>");
let _ = write!(w, "--{}", l);
write!(w, "<code>")?;
write!(w, "--{}", l)?;
if let Some(names) = arg.get_value_names() {
let _ = write!(
write!(
w,
"={}",
names
@ -84,20 +105,20 @@ fn write_options(w: &mut impl Write, app: &App) {
.map(|x| format!("&lt;{}&gt;", x))
.collect::<Vec<_>>()
.join(" ")
);
)?;
}
let _ = write!(w, "</code>");
write!(w, "</code>")?;
}
for s in arg.get_short_and_visible_aliases().unwrap_or_default() {
if !first {
let _ = write!(w, ", ");
write!(w, ", ")?;
} else {
first = false;
}
let _ = write!(w, "<code>");
let _ = write!(w, "-{}", s);
write!(w, "<code>")?;
write!(w, "-{}", s)?;
if let Some(names) = arg.get_value_names() {
let _ = write!(
write!(
w,
" {}",
names
@ -105,12 +126,12 @@ fn write_options(w: &mut impl Write, app: &App) {
.map(|x| format!("&lt;{}&gt;", x))
.collect::<Vec<_>>()
.join(" ")
);
)?;
}
let _ = write!(w, "</code>");
write!(w, "</code>")?;
}
let _ = writeln!(w, "</dt>");
let _ = writeln!(w, "<dd>{}</dd>", arg.get_help().unwrap_or_default());
writeln!(w, "</dt>")?;
writeln!(w, "<dd>\n\n{}\n\n</dd>", arg.get_help().unwrap_or_default())?;
}
let _ = writeln!(w, "</dl>");
writeln!(w, "</dl>")
}