Skip to main content

binocular/preview/rich_text/
types.rs

1use crate::preview::rich_text::TextBuffer;
2use ratatui::text::Line;
3
4pub struct RichTextDocument {
5    pub buffer: TextBuffer,
6    pub lines: Vec<Line<'static>>,
7    pub tree: Option<tree_sitter::Tree>,
8    /// When true, `lines` and `tree` are stale and need regeneration.
9    /// Used during insert mode to skip expensive syntax highlighting.
10    pub dirty: bool,
11}
12
13impl RichTextDocument {
14    pub fn content(&self) -> &str {
15        self.buffer.as_str()
16    }
17
18    pub fn raw_lines(&self) -> &[(usize, usize)] {
19        self.buffer.line_ranges()
20    }
21
22    pub fn line_range(&self, line_idx: usize) -> Option<(usize, usize)> {
23        self.buffer.line_range(line_idx)
24    }
25
26    pub fn line_slice(&self, line_idx: usize) -> Option<&str> {
27        self.buffer.line_slice(line_idx)
28    }
29
30    pub fn line_count(&self) -> usize {
31        self.buffer.line_count()
32    }
33
34    pub fn len_bytes(&self) -> usize {
35        self.buffer.len_bytes()
36    }
37
38    pub fn invalidate_caches(&mut self) {
39        self.dirty = true;
40        self.tree = None;
41    }
42}