diff options
author | Nora Widdecke <nora@sequoia-pgp.org> | 2021-01-22 10:12:11 +0100 |
---|---|---|
committer | Nora Widdecke <nora@sequoia-pgp.org> | 2021-01-22 10:12:11 +0100 |
commit | 96750d742189045bd5c9291dd5c8ac2803ae9896 (patch) | |
tree | fb2851a2881d4f0127ffb9f883abab2db15e9d9c | |
parent | 08c6a53ac0612b5337475a6fb11bf03a494a0270 (diff) |
improve see_allnora/sq_manpage
-rw-r--r-- | sq-manpage/src/main.rs | 58 |
1 files changed, 48 insertions, 10 deletions
diff --git a/sq-manpage/src/main.rs b/sq-manpage/src/main.rs index fe05c8ea..6f93d6ec 100644 --- a/sq-manpage/src/main.rs +++ b/sq-manpage/src/main.rs @@ -9,22 +9,60 @@ mod sq_cli; fn main() -> std::io::Result<()> { let app = sq_cli::build(); - let mut manpages = Vec::new(); create_manpage(app.clone(), None, &mut manpages); - let mut related = manpages.iter().rev() - .map(|man| [&man.name.replace(" ", "-"), "(1)"].join("")) + let manpage_names = manpages + .iter() + .map(|man| man.name.clone()) .collect::<Vec<String>>(); - related.sort_unstable(); - let related = related.join(", "); + let related = manpage_names + .clone() + .iter() + .cloned() + .map(|man| find_related(&man, manpage_names.clone())) + .collect::<Vec<Vec<String>>>(); + let man_plus_related = manpages.into_iter().zip(related); + + fn find_related(name: &str, mut candidates: Vec<String>) -> Vec<String> { + //reconstruct structure + let top_level = + candidates.iter().position(|name| name == "sq").unwrap(); + let top_level = candidates.remove(top_level); + let (second_level, third_level): (Vec<String>, Vec<String>) = + candidates.iter().cloned().partition(|name| { + name.split(' ').collect::<Vec<&str>>().len() == 2 + }); + + //Always include first and second level commands + let mut output = second_level.clone(); + output.push(top_level); + + let subcommand: Option<String> = + second_level.iter().cloned().find(|sl| name.contains(sl)); + if let Some(sc) = subcommand { + let mut tl = third_level + .into_iter() + .filter(|tl| tl.contains(&sc)) + .collect::<Vec<String>>(); + output.append(&mut tl); + } + output.sort_unstable(); + output.dedup(); + output + } - let see_also = Section::new("See also") - .paragraph("For the full documentation see <https://docs.sequoia-pgp.org/sq/>.") - // don't justify and don't hyphenate - .paragraph(&[".ad l\n.nh\n", &related].join("")); + for (mut manpage, related) in man_plus_related { + let related = related + .iter() + .map(|related| [&related.replace(" ", "-"), "(1)"].join("")) + .collect::<Vec<String>>() + .join(", "); + let see_also = Section::new("See also") + .paragraph("For the full documentation see <https://docs.sequoia-pgp.org/sq/>.") + // don't justify and don't hyphenate + .paragraph(&[".ad l\n.nh\n", &related].join("")); - for mut manpage in manpages { manpage = manpage.custom(see_also.clone()); write_manpage(manpage)?; } |