#[derive(Debug, Clone, PartialEq)]
pub enum MarkdownBlock {
Heading1(String),
Heading2(String),
Heading3(String),
Paragraph(Vec<String>),
CodeBlock(String, String),
InlineCode(String),
ListItem(String, u8),
Blockquote(String),
HorizontalRule,
BlankLine,
Table {
headers: Vec<String>,
rows: Vec<Vec<String>>,
},
}
impl MarkdownBlock {
pub fn line_count(&self) -> usize {
match self {
MarkdownBlock::Heading1(_)
| MarkdownBlock::Heading2(_)
| MarkdownBlock::Heading3(_)
| MarkdownBlock::InlineCode(_)
| MarkdownBlock::HorizontalRule
| MarkdownBlock::BlankLine => 1,
MarkdownBlock::Paragraph(lines) => lines.len().max(1),
MarkdownBlock::CodeBlock(_, code) => code.lines().count().max(1) + 2,
MarkdownBlock::ListItem(_, _) => 1,
MarkdownBlock::Blockquote(text) => text.lines().count().max(1),
MarkdownBlock::Table { rows, .. } => {
let header_lines = 2;
let row_lines = rows.len() * 2 + 1;
header_lines + row_lines
}
}
}
}
#[derive(Debug)]
pub(crate) enum TextToken {
Word(String),
Space,
Newline,
}