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 } }
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}