diff options
| author | sigoden <sigoden@gmail.com> | 2023-03-07 11:38:44 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-07 11:38:44 +0800 |
| commit | 1640456049cda9999bb27501af30e05e46b0360d (patch) | |
| tree | 8cc1ad88bd233a5898bff0520fd933db41f1e0da /src/render.rs | |
| parent | c12ae0275108acbbb124a41ff936b441723ae625 (diff) | |
| download | aichat-1640456049cda9999bb27501af30e05e46b0360d.tar.gz | |
refactor: use syntect for highlight, abandon mdcat (#26)
* refactor: use syntect for highlight, abandon mdcat
* split src/render.rs to sub modules. embed a default theme
* simulate typing effect.
* fix format
Diffstat (limited to 'src/render.rs')
| -rw-r--r-- | src/render.rs | 91 |
1 files changed, 0 insertions, 91 deletions
diff --git a/src/render.rs b/src/render.rs deleted file mode 100644 index 57633a6..0000000 --- a/src/render.rs +++ /dev/null @@ -1,91 +0,0 @@ -use crate::{repl::ReplyStreamEvent, utils::dump}; -use anyhow::Result; -use crossbeam::channel::Receiver; -use mdcat::{ - push_tty, - terminal::{TerminalProgram, TerminalSize}, - Environment, ResourceAccess, Settings, -}; -use pulldown_cmark::Parser; -use std::sync::{ - atomic::{AtomicBool, Ordering}, - Arc, -}; -use syntect::parsing::SyntaxSet; - -pub fn render_stream( - rx: Receiver<ReplyStreamEvent>, - ctrlc: Arc<AtomicBool>, - markdown_render: Arc<MarkdownRender>, -) -> Result<()> { - let mut buffer = String::new(); - let mut line_index = 0; - loop { - if ctrlc.load(Ordering::SeqCst) { - return Ok(()); - } - if let Ok(evt) = rx.try_recv() { - match evt { - ReplyStreamEvent::Text(text) => { - buffer.push_str(&text); - if text.contains('\n') { - let markdown = markdown_render.render(&buffer)?; - let lines: Vec<&str> = markdown.lines().collect(); - let (_, print_lines) = lines.split_at(line_index); - let mut print_lines = print_lines.to_vec(); - print_lines.pop(); - if !print_lines.is_empty() { - line_index += print_lines.len(); - dump(print_lines.join("\n").to_string(), 1); - } - } - } - ReplyStreamEvent::Done => { - let markdown = markdown_render.render(&buffer)?; - let tail = markdown - .lines() - .skip(line_index) - .collect::<Vec<&str>>() - .join("\n"); - dump(tail, 2); - break; - } - } - } - } - - Ok(()) -} - -pub struct MarkdownRender { - env: Environment, - settings: Settings, -} - -impl MarkdownRender { - pub fn init() -> Result<Self> { - let terminal = TerminalProgram::detect(); - let env = - Environment::for_local_directory(&std::env::current_dir().expect("Working directory"))?; - let settings = Settings { - resource_access: ResourceAccess::LocalOnly, - syntax_set: SyntaxSet::load_defaults_newlines(), - terminal_capabilities: terminal.capabilities(), - terminal_size: TerminalSize::default(), - }; - Ok(Self { env, settings }) - } - - pub fn print(&self, input: &str) -> Result<()> { - let markdown = self.render(input)?; - dump(markdown, 0); - Ok(()) - } - - pub fn render(&self, input: &str) -> Result<String> { - let source = Parser::new(input); - let mut sink = Vec::new(); - push_tty(&self.settings, &self.env, &mut sink, source)?; - Ok(String::from_utf8_lossy(&sink).into()) - } -} |
