From cd71372ea9aee2b90147ac1ebdbbc6e0fb6c858f Mon Sep 17 00:00:00 2001 From: Stefan Holderbach Date: Tue, 12 Mar 2024 23:13:32 +0100 Subject: [PATCH] Minor refactor in `to html` (#12172) Extract the generation of the theme overview into its own function and elide an else block with early return --- .../nu-cmd-extra/src/extra/formats/to/html.rs | 237 +++++++++--------- 1 file changed, 119 insertions(+), 118 deletions(-) diff --git a/crates/nu-cmd-extra/src/extra/formats/to/html.rs b/crates/nu-cmd-extra/src/extra/formats/to/html.rs index 200ab89215..38e1380304 100644 --- a/crates/nu-cmd-extra/src/extra/formats/to/html.rs +++ b/crates/nu-cmd-extra/src/extra/formats/to/html.rs @@ -5,7 +5,7 @@ use nu_protocol::ast::Call; use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::{ record, Category, Config, DataSource, Example, IntoPipelineData, PipelineData, - PipelineMetadata, ShellError, Signature, Spanned, SyntaxShape, Type, Value, + PipelineMetadata, ShellError, Signature, Span, Spanned, SyntaxShape, Type, Value, }; use nu_utils::IgnoreCaseExt; use rust_embed::RustEmbed; @@ -255,128 +255,129 @@ fn to_html( let mut output_string = String::new(); let mut regex_hm: HashMap = HashMap::with_capacity(17); - // Being essentially a 'help' option, this can afford to be relatively unoptimised if list { - // If asset doesn't work, make sure to return the default theme - let html_themes = get_html_themes("228_themes.json").unwrap_or_default(); - - let result: Vec = html_themes - .themes - .into_iter() - .map(|n| { - Value::record( - record! { - "name" => Value::string(n.name, head), - "black" => Value::string(n.black, head), - "red" => Value::string(n.red, head), - "green" => Value::string(n.green, head), - "yellow" => Value::string(n.yellow, head), - "blue" => Value::string(n.blue, head), - "purple" => Value::string(n.purple, head), - "cyan" => Value::string(n.cyan, head), - "white" => Value::string(n.white, head), - "brightBlack" => Value::string(n.brightBlack, head), - "brightRed" => Value::string(n.brightRed, head), - "brightGreen" => Value::string(n.brightGreen, head), - "brightYellow" => Value::string(n.brightYellow, head), - "brightBlue" => Value::string(n.brightBlue, head), - "brightPurple" => Value::string(n.brightPurple, head), - "brightCyan" => Value::string(n.brightCyan, head), - "brightWhite" => Value::string(n.brightWhite, head), - "background" => Value::string(n.background, head), - "foreground" => Value::string(n.foreground, head), - }, - head, - ) - }) - .collect(); - return Ok( - Value::list(result, head).into_pipeline_data_with_metadata(PipelineMetadata { - data_source: DataSource::HtmlThemes, - }), - ); - } else { - let theme_span = match &theme { - Some(v) => v.span, - None => head, - }; - - let color_hm = get_theme_from_asset_file(dark, theme.as_ref()); - let color_hm = match color_hm { - Ok(c) => c, - _ => { - return Err(ShellError::GenericError { - error: "Error finding theme name".into(), - msg: "Error finding theme name".into(), - span: Some(theme_span), - help: None, - inner: vec![], - }) - } - }; - - // change the color of the page - if !partial { - write!( - &mut output_string, - r"", - color_hm - .get("background") - .expect("Error getting background color"), - color_hm - .get("foreground") - .expect("Error getting foreground color") - ) - .unwrap(); - } else { - write!( - &mut output_string, - "
", - color_hm - .get("background") - .expect("Error getting background color"), - color_hm - .get("foreground") - .expect("Error getting foreground color") - ) - .unwrap(); - } - - let inner_value = match vec_of_values.len() { - 0 => String::default(), - 1 => match headers { - Some(headers) => html_table(vec_of_values, headers, config), - None => { - let value = &vec_of_values[0]; - html_value(value.clone(), config) - } - }, - _ => match headers { - Some(headers) => html_table(vec_of_values, headers, config), - None => html_list(vec_of_values, config), - }, - }; - - output_string.push_str(&inner_value); - - if !partial { - output_string.push_str(""); - } else { - output_string.push_str("
") - } - - // Check to see if we want to remove all color or change ansi to html colors - if html_color { - setup_html_color_regexes(&mut regex_hm, &color_hm); - output_string = run_regexes(®ex_hm, &output_string); - } else if no_color { - setup_no_color_regexes(&mut regex_hm); - output_string = run_regexes(®ex_hm, &output_string); - } + // Being essentially a 'help' option, this can afford to be relatively unoptimised + return Ok(theme_demo(head)); } + let theme_span = match &theme { + Some(v) => v.span, + None => head, + }; + + let color_hm = get_theme_from_asset_file(dark, theme.as_ref()); + let color_hm = match color_hm { + Ok(c) => c, + _ => { + return Err(ShellError::GenericError { + error: "Error finding theme name".into(), + msg: "Error finding theme name".into(), + span: Some(theme_span), + help: None, + inner: vec![], + }) + } + }; + + // change the color of the page + if !partial { + write!( + &mut output_string, + r"", + color_hm + .get("background") + .expect("Error getting background color"), + color_hm + .get("foreground") + .expect("Error getting foreground color") + ) + .unwrap(); + } else { + write!( + &mut output_string, + "
", + color_hm + .get("background") + .expect("Error getting background color"), + color_hm + .get("foreground") + .expect("Error getting foreground color") + ) + .unwrap(); + } + + let inner_value = match vec_of_values.len() { + 0 => String::default(), + 1 => match headers { + Some(headers) => html_table(vec_of_values, headers, config), + None => { + let value = &vec_of_values[0]; + html_value(value.clone(), config) + } + }, + _ => match headers { + Some(headers) => html_table(vec_of_values, headers, config), + None => html_list(vec_of_values, config), + }, + }; + + output_string.push_str(&inner_value); + + if !partial { + output_string.push_str(""); + } else { + output_string.push_str("
") + } + + // Check to see if we want to remove all color or change ansi to html colors + if html_color { + setup_html_color_regexes(&mut regex_hm, &color_hm); + output_string = run_regexes(®ex_hm, &output_string); + } else if no_color { + setup_no_color_regexes(&mut regex_hm); + output_string = run_regexes(®ex_hm, &output_string); + } + Ok(Value::string(output_string, head).into_pipeline_data()) } +fn theme_demo(span: Span) -> PipelineData { + // If asset doesn't work, make sure to return the default theme + let html_themes = get_html_themes("228_themes.json").unwrap_or_default(); + let result: Vec = html_themes + .themes + .into_iter() + .map(|n| { + Value::record( + record! { + "name" => Value::string(n.name, span), + "black" => Value::string(n.black, span), + "red" => Value::string(n.red, span), + "green" => Value::string(n.green, span), + "yellow" => Value::string(n.yellow, span), + "blue" => Value::string(n.blue, span), + "purple" => Value::string(n.purple, span), + "cyan" => Value::string(n.cyan, span), + "white" => Value::string(n.white, span), + "brightBlack" => Value::string(n.brightBlack, span), + "brightRed" => Value::string(n.brightRed, span), + "brightGreen" => Value::string(n.brightGreen, span), + "brightYellow" => Value::string(n.brightYellow, span), + "brightBlue" => Value::string(n.brightBlue, span), + "brightPurple" => Value::string(n.brightPurple, span), + "brightCyan" => Value::string(n.brightCyan, span), + "brightWhite" => Value::string(n.brightWhite, span), + "background" => Value::string(n.background, span), + "foreground" => Value::string(n.foreground, span), + }, + span, + ) + }) + .collect(); + Value::list(result, span).into_pipeline_data_with_metadata(PipelineMetadata { + data_source: DataSource::HtmlThemes, + }) +} + fn html_list(list: Vec, config: &Config) -> String { let mut output_string = String::new(); output_string.push_str("
    ");