Skip to main content

md_tui/nodes/
word.rs

1use ratatui::style::Color;
2
3use crate::parser::MdParseEnum;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum MetaData {
7    UList,
8    OList,
9    PLanguage,
10    Other,
11    ColumnsCount,
12    Important,
13    Note,
14    Tip,
15    Warning,
16    Caution,
17    LineLength(u16),
18    HeadingLevel(u8),
19}
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22pub enum WordType {
23    Bold,
24    BoldItalic,
25    Code,
26    CodeBlock(Color),
27    Footnote,
28    FootnoteData,
29    FootnoteInline,
30    Italic,
31    Link,
32    LinkData,
33    ListMarker,
34    MetaInfo(MetaData),
35    Normal,
36    Selected,
37    Strikethrough,
38    White,
39}
40
41impl From<MdParseEnum> for WordType {
42    fn from(value: MdParseEnum) -> Self {
43        match value {
44            MdParseEnum::PLanguage
45            | MdParseEnum::BlockSeparator
46            | MdParseEnum::TaskOpen
47            | MdParseEnum::TaskClosed
48            | MdParseEnum::Indent
49            | MdParseEnum::HorizontalSeparator => WordType::MetaInfo(MetaData::Other),
50            MdParseEnum::FootnoteRef => WordType::FootnoteInline,
51            MdParseEnum::Code => WordType::Code,
52            MdParseEnum::Bold => WordType::Bold,
53            MdParseEnum::Italic => WordType::Italic,
54            MdParseEnum::Strikethrough => WordType::Strikethrough,
55            MdParseEnum::Link | MdParseEnum::WikiLink | MdParseEnum::InlineLink => WordType::Link,
56            MdParseEnum::BoldItalic => WordType::BoldItalic,
57            MdParseEnum::Digit => WordType::ListMarker,
58            MdParseEnum::Paragraph
59            | MdParseEnum::AltText
60            | MdParseEnum::Quote
61            | MdParseEnum::Sentence
62            | MdParseEnum::Word => WordType::Normal,
63            MdParseEnum::LinkData => WordType::LinkData,
64            MdParseEnum::Imortant => WordType::MetaInfo(MetaData::Important),
65            MdParseEnum::Note => WordType::MetaInfo(MetaData::Note),
66            MdParseEnum::Tip => WordType::MetaInfo(MetaData::Tip),
67            MdParseEnum::Warning => WordType::MetaInfo(MetaData::Warning),
68            MdParseEnum::Caution => WordType::MetaInfo(MetaData::Caution),
69            MdParseEnum::Heading
70            | MdParseEnum::BoldItalicStr
71            | MdParseEnum::BoldStr
72            | MdParseEnum::CodeBlock
73            | MdParseEnum::CodeStr
74            | MdParseEnum::Details
75            | MdParseEnum::DetailsBody
76            | MdParseEnum::DetailsOpenAttr
77            | MdParseEnum::DetailsSummary
78            | MdParseEnum::Image
79            | MdParseEnum::ItalicStr
80            | MdParseEnum::ListContainer
81            | MdParseEnum::OrderedList
82            | MdParseEnum::StrikethroughStr
83            | MdParseEnum::Footnote
84            | MdParseEnum::Table
85            | MdParseEnum::TableCell
86            | MdParseEnum::Task
87            | MdParseEnum::UnorderedList
88            | MdParseEnum::TableSeparator => {
89                unreachable!("Edit this or pest file to fix for value: {:?}", value)
90            }
91            MdParseEnum::CodeBlockStr | MdParseEnum::CodeBlockStrSpaceIndented => {
92                WordType::CodeBlock(Color::Reset)
93            } // MdParseEnum::FootnoteRef => todo!(),
94        }
95    }
96}
97
98#[derive(Debug, Clone, PartialEq, Eq)]
99pub struct Word {
100    content: String,
101    word_type: WordType,
102    previous_type: Option<WordType>,
103}
104
105impl Word {
106    #[must_use]
107    pub fn new(content: String, word_type: WordType) -> Self {
108        Self {
109            word_type,
110            previous_type: None,
111            content,
112        }
113    }
114
115    #[must_use]
116    pub fn previous_type(&self) -> WordType {
117        self.previous_type.unwrap_or(self.word_type)
118    }
119
120    #[must_use]
121    pub fn content(&self) -> &str {
122        &self.content
123    }
124
125    pub fn content_mut(&mut self) -> &mut String {
126        &mut self.content
127    }
128
129    pub fn set_content(&mut self, content: impl Into<String>) {
130        self.content = content.into();
131    }
132
133    #[must_use]
134    pub fn kind(&self) -> WordType {
135        self.word_type
136    }
137
138    pub fn set_kind(&mut self, kind: WordType) {
139        self.previous_type = Some(self.word_type);
140        self.word_type = kind;
141    }
142
143    pub fn clear_kind(&mut self) {
144        self.word_type = self.previous_type.unwrap_or(self.word_type);
145        self.previous_type = None;
146    }
147
148    #[must_use]
149    pub fn is_renderable(&self) -> bool {
150        !matches!(
151            self.kind(),
152            WordType::MetaInfo(_) | WordType::LinkData | WordType::FootnoteData
153        )
154    }
155
156    pub fn split_off(&mut self, at: usize) -> Word {
157        Word {
158            content: self.content.split_off(at),
159            word_type: self.word_type,
160            previous_type: self.previous_type,
161        }
162    }
163}