diff options
author | Alexander Brevig | 2022-09-19 13:38:20 +0000 |
---|---|---|
committer | GitHub | 2022-09-19 13:38:20 +0000 |
commit | 08b2ecc99a1ac1c461117bf6c79b77484eb433e4 (patch) | |
tree | d6510c5a5814918401118fdd8cc292051ac8cd68 /xtask/src/docgen.rs | |
parent | 5ea7855977aa281206c9c540aa88ce9384619b87 (diff) |
feat: xtask themelint (#3234)
* feat: cargo xtask themelint <theme>
* fix: add docs and print json error status
* fix: refactor paths -> path
* fix: remove unused function
* fix: only report one err per scope (ui.statusline is reported if none of ui.statusline.* is recognized)
* fix: save work for later
* fix: finally decided on a design
* fix: ready for discussion
* fix: better rules
* fix: lint precision
* fix: String -> &'static str
* fix: allowlist not denylist for file type
* fix: add missing and indication of what's needed
* fix: copy pasteable errors
* fix: use Loader:read_names
* Update xtask/src/helpers.rs
Co-authored-by: Ivan Tham <pickfire@riseup.net>
* fix: remove into and clone for str
* Update book/src/themes.md
Co-authored-by: Ivan Tham <pickfire@riseup.net>
* fix: better lint output
* fix: cleaner logic for lint reporting
* style: use explicit imports
* Pascal support (#3542)
* fix: add difference check for statusline normal,insert,select
* fix: fg for whitespace and early exit if and one is ok
* chore: cleaning up, no idea how these got here or how this will look
* chore: revert from older commit?
* refactor: use static fn to equalize api between difference and existance
* refactor: querycheck and clippy
* refactor: clippy fixes
* fix: query-check behaves as before
* fix: error with x of y message, not total count
* fix: consistent reporting and less mutable state
* fix: selection difference ref #3942 ref #1833
Co-authored-by: Ivan Tham <pickfire@riseup.net>
Co-authored-by: ath3 <45574139+ath3@users.noreply.github.com>
Diffstat (limited to 'xtask/src/docgen.rs')
-rw-r--r-- | xtask/src/docgen.rs | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/xtask/src/docgen.rs b/xtask/src/docgen.rs new file mode 100644 index 00000000..473882f3 --- /dev/null +++ b/xtask/src/docgen.rs @@ -0,0 +1,117 @@ +use crate::helpers; +use crate::path; +use crate::DynError; + +use helix_term::commands::TYPABLE_COMMAND_LIST; +use helix_term::health::TsFeature; +use std::fs; + +pub const TYPABLE_COMMANDS_MD_OUTPUT: &str = "typable-cmd.md"; +pub const LANG_SUPPORT_MD_OUTPUT: &str = "lang-support.md"; + +fn md_table_heading(cols: &[String]) -> String { + let mut header = String::new(); + header += &md_table_row(cols); + header += &md_table_row(&vec!["---".to_string(); cols.len()]); + header +} + +fn md_table_row(cols: &[String]) -> String { + format!("| {} |\n", cols.join(" | ")) +} + +fn md_mono(s: &str) -> String { + format!("`{}`", s) +} + +pub fn typable_commands() -> Result<String, DynError> { + let mut md = String::new(); + md.push_str(&md_table_heading(&[ + "Name".to_owned(), + "Description".to_owned(), + ])); + + let cmdify = |s: &str| format!("`:{}`", s); + + for cmd in TYPABLE_COMMAND_LIST { + let names = std::iter::once(&cmd.name) + .chain(cmd.aliases.iter()) + .map(|a| cmdify(a)) + .collect::<Vec<_>>() + .join(", "); + + let doc = cmd.doc.replace('\n', "<br>"); + + md.push_str(&md_table_row(&[names.to_owned(), doc.to_owned()])); + } + + Ok(md) +} + +pub fn lang_features() -> Result<String, DynError> { + let mut md = String::new(); + let ts_features = TsFeature::all(); + + let mut cols = vec!["Language".to_owned()]; + cols.append( + &mut ts_features + .iter() + .map(|t| t.long_title().to_string()) + .collect::<Vec<_>>(), + ); + cols.push("Default LSP".to_owned()); + + md.push_str(&md_table_heading(&cols)); + let config = helpers::lang_config(); + + let mut langs = config + .language + .iter() + .map(|l| l.language_id.clone()) + .collect::<Vec<_>>(); + langs.sort_unstable(); + + let mut ts_features_to_langs = Vec::new(); + for &feat in ts_features { + ts_features_to_langs.push((feat, helpers::ts_lang_support(feat))); + } + + let mut row = Vec::new(); + for lang in langs { + let lc = config + .language + .iter() + .find(|l| l.language_id == lang) + .unwrap(); // lang comes from config + row.push(lc.language_id.clone()); + + for (_feat, support_list) in &ts_features_to_langs { + row.push( + if support_list.contains(&lang) { + "✓" + } else { + "" + } + .to_owned(), + ); + } + row.push( + lc.language_server + .as_ref() + .map(|s| s.command.clone()) + .map(|c| md_mono(&c)) + .unwrap_or_default(), + ); + + md.push_str(&md_table_row(&row)); + row.clear(); + } + + Ok(md) +} + +pub fn write(filename: &str, data: &str) { + let error = format!("Could not write to {}", filename); + let path = path::book_gen().join(filename); + fs::write(path, data).expect(&error); +} |