use ox_content_allocator::Vec;
use crate::Span;
#[derive(Debug)]
pub struct Document<'a> {
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub enum Node<'a> {
Paragraph(Paragraph<'a>),
Heading(Heading<'a>),
ThematicBreak(ThematicBreak),
BlockQuote(BlockQuote<'a>),
List(List<'a>),
ListItem(ListItem<'a>),
CodeBlock(CodeBlock<'a>),
Html(Html<'a>),
Table(Table<'a>),
Text(Text<'a>),
Emphasis(Emphasis<'a>),
Strong(Strong<'a>),
InlineCode(InlineCode<'a>),
Break(Break),
Link(Link<'a>),
Image(Image<'a>),
Delete(Delete<'a>),
FootnoteReference(FootnoteReference<'a>),
Definition(Definition<'a>),
FootnoteDefinition(FootnoteDefinition<'a>),
}
#[derive(Debug)]
pub struct Paragraph<'a> {
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct Heading<'a> {
pub depth: u8,
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct ThematicBreak {
pub span: Span,
}
#[derive(Debug)]
pub struct BlockQuote<'a> {
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct List<'a> {
pub ordered: bool,
pub start: Option<u32>,
pub spread: bool,
pub children: Vec<'a, ListItem<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct ListItem<'a> {
pub spread: bool,
pub checked: Option<bool>,
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct CodeBlock<'a> {
pub lang: Option<&'a str>,
pub meta: Option<&'a str>,
pub value: &'a str,
pub span: Span,
}
#[derive(Debug)]
pub struct Html<'a> {
pub value: &'a str,
pub span: Span,
}
#[derive(Debug)]
pub struct Table<'a> {
pub align: Vec<'a, AlignKind>,
pub children: Vec<'a, TableRow<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct TableRow<'a> {
pub children: Vec<'a, TableCell<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct TableCell<'a> {
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AlignKind {
None,
Left,
Center,
Right,
}
#[derive(Debug)]
pub struct Text<'a> {
pub value: &'a str,
pub span: Span,
}
#[derive(Debug)]
pub struct Emphasis<'a> {
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct Strong<'a> {
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct InlineCode<'a> {
pub value: &'a str,
pub span: Span,
}
#[derive(Debug)]
pub struct Break {
pub span: Span,
}
#[derive(Debug)]
pub struct Link<'a> {
pub url: &'a str,
pub title: Option<&'a str>,
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct Image<'a> {
pub url: &'a str,
pub alt: &'a str,
pub title: Option<&'a str>,
pub span: Span,
}
#[derive(Debug)]
pub struct Delete<'a> {
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
#[derive(Debug)]
pub struct FootnoteReference<'a> {
pub identifier: &'a str,
pub label: Option<&'a str>,
pub span: Span,
}
#[derive(Debug)]
pub struct Definition<'a> {
pub identifier: &'a str,
pub label: Option<&'a str>,
pub url: &'a str,
pub title: Option<&'a str>,
pub span: Span,
}
#[derive(Debug)]
pub struct FootnoteDefinition<'a> {
pub identifier: &'a str,
pub label: Option<&'a str>,
pub children: Vec<'a, Node<'a>>,
pub span: Span,
}
impl<'a> Node<'a> {
#[must_use]
pub fn span(&self) -> Span {
match self {
Self::Paragraph(n) => n.span,
Self::Heading(n) => n.span,
Self::ThematicBreak(n) => n.span,
Self::BlockQuote(n) => n.span,
Self::List(n) => n.span,
Self::ListItem(n) => n.span,
Self::CodeBlock(n) => n.span,
Self::Html(n) => n.span,
Self::Table(n) => n.span,
Self::Text(n) => n.span,
Self::Emphasis(n) => n.span,
Self::Strong(n) => n.span,
Self::InlineCode(n) => n.span,
Self::Break(n) => n.span,
Self::Link(n) => n.span,
Self::Image(n) => n.span,
Self::Delete(n) => n.span,
Self::FootnoteReference(n) => n.span,
Self::Definition(n) => n.span,
Self::FootnoteDefinition(n) => n.span,
}
}
}