Adding coloring to help examples (#1754)

This commit is contained in:
Jonathan Turner 2020-05-12 11:06:40 +12:00 committed by GitHub
parent 2275575575
commit c5ea4a31bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 39 additions and 25 deletions

View File

@ -43,10 +43,16 @@ impl WholeStreamCommand for Alias {
}
fn examples(&self) -> &[Example] {
&[Example {
description: "Some people prefer to write one letter instead of two",
&[
Example {
description: "An alias without parameters",
example: "alias say-hi [] { echo 'Hello!' }",
},
Example {
description: "An alias with a single parameter",
example: "alias l [x] { ls $x }",
}]
},
]
}
}

View File

@ -272,14 +272,19 @@ pub(crate) fn get_help(
let examples = cmd.examples();
if !examples.is_empty() {
long_desc.push_str("\nExamples:\n");
long_desc.push_str("\nExamples:");
}
for example in examples {
long_desc.push_str("\n");
long_desc.push_str(" ");
long_desc.push_str(example.description);
long_desc.push_str(&format!("\n > {}\n", example.example));
let colored_example =
crate::shell::helper::Painter::paint_string(example.example, registry);
long_desc.push_str(&format!("\n > {}\n", colored_example));
}
long_desc.push_str("\n");
help.push_back(ReturnSuccess::value(
UntaggedValue::string(long_desc).into_value(Tag::from((0, cmd_name.len(), None))),
));

View File

@ -61,24 +61,7 @@ impl Highlighter for Helper {
}
fn highlight<'l>(&self, line: &'l str, _pos: usize) -> Cow<'l, str> {
let lite_block = nu_parser::lite_parse(line, 0);
match lite_block {
Err(_) => Cow::Borrowed(line),
Ok(lb) => {
let classified =
nu_parser::classify_block(&lb, &self.context.registry().clone_box());
let shapes = nu_parser::shapes(&classified.block);
let mut painter = Painter::new(line);
for shape in shapes {
painter.paint_shape(&shape);
}
Cow::Owned(painter.into_string())
}
}
Painter::paint_string(line, &self.context.registry().clone_box())
}
fn highlight_char(&self, _line: &str, _pos: usize) -> bool {
@ -98,7 +81,7 @@ fn vec_tag<T>(input: Vec<Tagged<T>>) -> Option<Tag> {
})
}
struct Painter {
pub struct Painter {
original: Vec<u8>,
styles: Vec<Style>,
}
@ -113,6 +96,26 @@ impl Painter {
}
}
pub fn paint_string<'l>(line: &'l str, registry: &dyn SignatureRegistry) -> Cow<'l, str> {
let lite_block = nu_parser::lite_parse(line, 0);
match lite_block {
Err(_) => Cow::Borrowed(line),
Ok(lb) => {
let classified = nu_parser::classify_block(&lb, registry);
let shapes = nu_parser::shapes(&classified.block);
let mut painter = Painter::new(line);
for shape in shapes {
painter.paint_shape(&shape);
}
Cow::Owned(painter.into_string())
}
}
}
fn paint_shape(&mut self, shape: &Spanned<FlatShape>) {
let style = match &shape.item {
FlatShape::OpenDelimiter(_) => Color::White.normal(),