Skip to content

Commit

Permalink
Adding coloring to help examples (nushell#1754)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jonathan Turner committed May 11, 2020
1 parent 2275575 commit c5ea4a3
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 25 deletions.
14 changes: 10 additions & 4 deletions crates/nu-cli/src/commands/alias.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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: "alias l [x] { ls $x }",
}]
&[
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 }",
},
]
}
}

Expand Down
9 changes: 7 additions & 2 deletions crates/nu-cli/src/commands/help.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))),
));
Expand Down
41 changes: 22 additions & 19 deletions crates/nu-cli/src/shell/helper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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>,
}
Expand All @@ -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(),
Expand Down

0 comments on commit c5ea4a3

Please sign in to comment.