From dce6877f5de297803a737387fef7f672593904cf Mon Sep 17 00:00:00 2001 From: sigoden Date: Thu, 2 Nov 2023 21:38:01 +0800 Subject: refactor: optimize render (#202) --- src/render/cmd.rs | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) (limited to 'src/render/cmd.rs') diff --git a/src/render/cmd.rs b/src/render/cmd.rs index 75768b9..e942025 100644 --- a/src/render/cmd.rs +++ b/src/render/cmd.rs @@ -1,6 +1,6 @@ use super::{MarkdownRender, ReplyEvent}; -use crate::utils::{spaces, split_line_sematic, split_line_tail, AbortSignal}; +use crate::utils::{split_line_sematic, split_line_tail, AbortSignal}; use anyhow::Result; use crossbeam::channel::Receiver; @@ -12,7 +12,7 @@ pub fn cmd_render_stream( abort: &AbortSignal, ) -> Result<()> { let mut buffer = String::new(); - let mut col = 0; + let mut indent = 0; loop { if abort.aborted() { return Ok(()); @@ -24,10 +24,9 @@ pub fn cmd_render_stream( let text = format!("{buffer}{text}"); let (head, tail) = split_line_tail(&text); buffer = tail.to_string(); - let input = format!("{}{head}", spaces(col)); - let output = render.render(&input); - println!("{}", &output[col..]); - col = 0; + let output = render.render_with_indent(head, indent); + println!("{}", output); + indent = 0; } else { buffer = format!("{buffer}{text}"); if !(render.is_code() @@ -38,16 +37,15 @@ pub fn cmd_render_stream( { if let Some((head, remain)) = split_line_sematic(&buffer) { buffer = remain; - let input = format!("{}{head}", spaces(col)); - let output = render.render(&input); - let output = &output[col..]; - let (_, tail) = split_line_tail(output); - if render.wrap_width().is_some() { + let output = render.render_with_indent(&head, indent); + let (_, tail) = split_line_tail(&output); + if let Some(width) = render.wrap_width() { if output.contains('\n') { - col = display_width(tail); + indent = display_width(tail); } else { - col += display_width(output); + indent += display_width(&output); } + indent %= width as usize; } print!("{}", output); } @@ -55,9 +53,7 @@ pub fn cmd_render_stream( } } ReplyEvent::Done => { - let input = format!("{}{buffer}", spaces(col)); - let output = render.render(&input); - let output = &output[col..]; + let output = render.render_with_indent(&buffer, indent); println!("{}", output); break; } -- cgit v1.2.3