diff options
| author | sigoden <sigoden@gmail.com> | 2023-11-03 18:36:17 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-03 18:36:17 +0800 |
| commit | 887bf0a744646c6d9cfb361ba0c929d4a4342337 (patch) | |
| tree | 3e3144e000f4f738fd495d8f5261d1f67f4dc3a0 | |
| parent | 811e605fbfd5b4973cbff9439db14c76c76b140f (diff) | |
| download | aichat-887bf0a744646c6d9cfb361ba0c929d4a4342337.tar.gz | |
fix: fix rendering markdown in REPL (#207)
| -rw-r--r-- | src/config/mod.rs | 4 | ||||
| -rw-r--r-- | src/render/markdown.rs | 4 | ||||
| -rw-r--r-- | src/render/repl.rs | 9 |
3 files changed, 14 insertions, 3 deletions
diff --git a/src/config/mod.rs b/src/config/mod.rs index 00a0b67..4749c2a 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -824,10 +824,12 @@ fn set_bool(target: &mut bool, value: &str) { #[cfg(debug_assertions)] fn setup_logger() -> Result<()> { - use simplelog::WriteLogger; + use simplelog::{LevelFilter, WriteLogger}; let file = std::fs::File::create(Config::local_path("debug.log")?)?; let config = simplelog::ConfigBuilder::new() .add_filter_allow_str("aichat") + .set_thread_level(LevelFilter::Off) + .set_time_level(LevelFilter::Off) .build(); WriteLogger::init(log::LevelFilter::Debug, config, file)?; Ok(()) diff --git a/src/render/markdown.rs b/src/render/markdown.rs index f491fc1..f300854 100644 --- a/src/render/markdown.rs +++ b/src/render/markdown.rs @@ -205,7 +205,9 @@ impl MarkdownRender { fn wrap(text: &str, width: usize) -> String { let indent: usize = text.chars().take_while(|c| *c == ' ').count(); - let wrap_options = textwrap::Options::new(width).initial_indent(&text[0..indent]); + let wrap_options = textwrap::Options::new(width) + .wrap_algorithm(textwrap::WrapAlgorithm::FirstFit) + .initial_indent(&text[0..indent]); textwrap::wrap(&text[indent..], wrap_options).join("\n") } diff --git a/src/render/repl.rs b/src/render/repl.rs index 31c597e..34212c3 100644 --- a/src/render/repl.rs +++ b/src/render/repl.rs @@ -70,7 +70,9 @@ fn repl_render_stream_inner( cursor::MoveTo(0, 0), )?; } - queue!(writer, terminal::Clear(terminal::ClearType::UntilNewLine))?; + + // No guarantee that text returned by render will not be re-layouted, so it is better to clear it. + queue!(writer, terminal::Clear(terminal::ClearType::FromCursorDown))?; if text.contains('\n') { let text = format!("{buffer}{text}"); @@ -79,6 +81,9 @@ fn repl_render_stream_inner( let output = render.render(head); print_block(writer, &output, columns)?; queue!(writer, style::Print(&buffer),)?; + + // No guarantee the buffer width of the buffer will not exceed the number of columns. + // So we calcuate the number of rows needed, rather than setting it directly to 1. buffer_rows = need_rows(&buffer, columns); } else { buffer = format!("{buffer}{text}"); @@ -87,6 +92,8 @@ fn repl_render_stream_inner( let (head, tail) = split_line_tail(&output); buffer_rows = print_block(writer, head, columns)?; queue!(writer, style::Print(&tail),)?; + + // Same as above. buffer_rows += need_rows(tail, columns); } else { queue!(writer, style::Print(&output))?; |
