diff options
author | Noah Too <41364823+krivahtoo@users.noreply.github.com> | 2021-11-18 18:40:19 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-18 10:40:19 -0500 |
commit | a3cf8fed94c0401f93aa983376c882130a2c6d02 (patch) | |
tree | 0088ad7cea7d8a872203160dfe5b48ff9e99636f | |
parent | 7a7600c7a5f423d0b0a887db80c221009a9d4990 (diff) |
Add syntax highlighting to file previews (#106)
-rw-r--r-- | Cargo.lock | 10 | ||||
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | src/ui/widgets/tui_file_preview.rs | 10 |
3 files changed, 16 insertions, 5 deletions
@@ -18,6 +18,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20e59b2ccb4c1ffbbf45af6f493e16ac65a66981c85664f1587816c0b08cd698" [[package]] +name = "ansi-to-tui" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3fb5747c9d1b444cb6c9f96c84d09a3f7ae9e1eb77f52ec45c8bf30a6e6bdf" +dependencies = [ + "tui", +] + +[[package]] name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -289,6 +298,7 @@ name = "joshuto" version = "0.9.1" dependencies = [ "alphanumeric-sort", + "ansi-to-tui", "chrono", "colors-transform", "dirs-next", @@ -35,6 +35,7 @@ xdg = "^2" phf = { version = "^0", features = ["macros"], optional = true } trash = { version = "^1", optional = true } unicode-segmentation = "^1" +ansi-to-tui = "0.4.1" [features] devicons = [ "phf" ] diff --git a/src/ui/widgets/tui_file_preview.rs b/src/ui/widgets/tui_file_preview.rs index 769b28f..0a784cc 100644 --- a/src/ui/widgets/tui_file_preview.rs +++ b/src/ui/widgets/tui_file_preview.rs @@ -1,6 +1,7 @@ +use ansi_to_tui::ansi_to_text; use tui::buffer::Buffer; use tui::layout::Rect; -use tui::style::Style; +use tui::text::Text; use tui::widgets::Widget; use crate::fs::JoshutoDirEntry; @@ -19,10 +20,9 @@ impl<'a> TuiFilePreview<'a> { impl<'a> Widget for TuiFilePreview<'a> { fn render(self, area: Rect, buf: &mut Buffer) { - let style = Style::default(); - let area_width = area.width as usize; - for (y, s) in (area.y..area.y + area.height).zip(self.preview.output.as_str().split('\n')) { - buf.set_stringn(area.x, y, s, area_width, style); + let text: Text = ansi_to_text(self.preview.output.as_str().as_bytes().to_vec()).unwrap(); + for (y, line) in (area.y..area.y + area.height).zip(text.lines) { + buf.set_spans(area.x, y, &line, area.width); } } } |