#![deny(missing_docs)]
use std::{cell::RefCell, io};
use comrak::{
arena_tree::Node,
nodes::{
Ast, NodeCode, NodeCodeBlock, NodeDescriptionItem, NodeFootnoteDefinition,
NodeFootnoteReference, NodeHeading, NodeHtmlBlock, NodeLink, NodeList, NodeMath,
NodeMultilineBlockQuote, NodeShortCode, NodeTable, NodeValue, NodeWikiLink,
},
};
#[allow(unused_variables)]
pub trait MarkdownWalker {
fn from_markdown(markdown: impl AsRef<str>) -> io::Result<Self>
where
Self: Default,
{
use comrak::{parse_document, Arena, ExtensionOptions, Options};
let arena = Arena::new();
let extension = ExtensionOptions::builder()
.autolink(true)
.description_lists(true)
.footnotes(true)
.math_code(true)
.math_dollars(true)
.multiline_block_quotes(true)
.shortcodes(true)
.spoiler(true)
.strikethrough(true)
.subscript(true)
.superscript(true)
.table(true)
.tagfilter(true)
.tasklist(true)
.underline(true)
.wikilinks_title_after_pipe(true)
.wikilinks_title_before_pipe(true)
.build();
let options = Options {
extension,
..Options::default()
};
let nodes = parse_document(&arena, markdown.as_ref(), &options);
let mut this = Self::default();
this.visit(nodes)?;
Ok(this)
}
fn visit<'arena>(&mut self, node: &'arena Node<'arena, RefCell<Ast>>) -> io::Result<()> {
use NodeValue::*;
match &node.data.borrow().value {
Document => self.visit_document(node)?,
Code(code) => self.visit_code(node, code)?,
CodeBlock(code_block) => self.visit_code_block(node, code_block)?,
EscapedTag(tag) => self.visit_escaped_tag(node, tag)?,
FrontMatter(frontmatter) => self.visit_front_matter(node, frontmatter)?,
FootnoteDefinition(footnote_definition) => {
self.visit_footnote_definition(node, footnote_definition)?
}
FootnoteReference(node_footnote_reference) => {
self.visit_footnote_reference(node, node_footnote_reference)?
}
Heading(heading) => self.visit_heading(node, heading)?,
HtmlBlock(html_block) => self.visit_html_block(node, html_block)?,
HtmlInline(inline) => self.visit_html_inline(node, inline)?,
Image(link) => self.visit_image(node, link)?,
Item(list) => self.visit_item(node, list)?,
Link(link) => self.visit_link(node, link)?,
List(list) => self.visit_list(node, list)?,
Math(math) => self.visit_math(node, math)?,
MultilineBlockQuote(multiline_block_quote) => {
self.visit_multiline_block_quote(node, multiline_block_quote)?
}
Raw(raw) => self.visit_raw(node, raw)?,
TaskItem(task_item) => self.visit_task_item(node, task_item)?,
Text(text) => self.visit_text(node, text)?,
ShortCode(short_code) => self.visit_short_code(node, short_code)?,
WikiLink(wiki_link) => self.visit_wiki_link(node, wiki_link)?,
DescriptionItem(description_item) => {
self.visit_description_item(node, description_item)?
}
DescriptionList => self.visit_description_list(node)?,
DescriptionTerm => self.visit_description_term(node)?,
DescriptionDetails => self.visit_description_details(node)?,
Table(table) => self.visit_table(node, table)?,
TableRow(table_row) => self.visit_table_row(node, table_row)?,
TableCell => self.visit_table_cell(node)?,
BlockQuote => self.visit_block_quote(node)?,
Emph => self.visit_emph(node)?,
Escaped => self.visit_escaped(node)?,
LineBreak => self.visit_line_break(node)?,
Paragraph => self.visit_paragraph(node)?,
SoftBreak => self.visit_soft_break(node)?,
SpoileredText => self.visit_spoilered_text(node)?,
Strikethrough => self.visit_strikethrough(node)?,
Strong => self.visit_strong(node)?,
Subscript => self.visit_subscript(node)?,
Superscript => self.visit_superscript(node)?,
ThematicBreak => self.visit_thematic_break(node)?,
Underline => self.visit_underline(node)?,
}
for child in node.children() {
self.visit(child)?;
}
Ok(())
}
fn visit_block_quote<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_code<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
code: &NodeCode,
) -> io::Result<()> {
Ok(())
}
fn visit_code_block<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
code_block: &NodeCodeBlock,
) -> io::Result<()> {
Ok(())
}
fn visit_description_item<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
description_item: &NodeDescriptionItem,
) -> io::Result<()> {
Ok(())
}
fn visit_description_list<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_description_term<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_description_details<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_document<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_escaped<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_escaped_tag<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
tag: &String,
) -> io::Result<()> {
Ok(())
}
fn visit_emph<'arena>(&mut self, node: &'arena Node<'arena, RefCell<Ast>>) -> io::Result<()> {
Ok(())
}
fn visit_footnote_definition<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
footnote_definition: &NodeFootnoteDefinition,
) -> io::Result<()> {
Ok(())
}
fn visit_footnote_reference<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
footnote_reference: &NodeFootnoteReference,
) -> io::Result<()> {
Ok(())
}
fn visit_front_matter<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
frontmatter: &String,
) -> io::Result<()> {
Ok(())
}
fn visit_heading<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
heading: &NodeHeading,
) -> io::Result<()> {
Ok(())
}
fn visit_html_block<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
html_block: &NodeHtmlBlock,
) -> io::Result<()> {
Ok(())
}
fn visit_html_inline<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
inline: &String,
) -> io::Result<()> {
Ok(())
}
fn visit_image<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
link: &NodeLink,
) -> io::Result<()> {
Ok(())
}
fn visit_item<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
list: &NodeList,
) -> io::Result<()> {
Ok(())
}
fn visit_link<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
link: &NodeLink,
) -> io::Result<()> {
Ok(())
}
fn visit_line_break<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_list<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
list: &NodeList,
) -> io::Result<()> {
Ok(())
}
fn visit_math<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
math: &NodeMath,
) -> io::Result<()> {
Ok(())
}
fn visit_multiline_block_quote<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
multiline_block_quote: &NodeMultilineBlockQuote,
) -> io::Result<()> {
Ok(())
}
fn visit_paragraph<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_raw<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
raw: &String,
) -> io::Result<()> {
Ok(())
}
fn visit_short_code<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
short_code: &NodeShortCode,
) -> io::Result<()> {
Ok(())
}
fn visit_soft_break<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_spoilered_text<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_strong<'arena>(&mut self, node: &'arena Node<'arena, RefCell<Ast>>) -> io::Result<()> {
Ok(())
}
fn visit_strikethrough<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_subscript<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_superscript<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_table<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
table: &NodeTable,
) -> io::Result<()> {
Ok(())
}
fn visit_table_cell<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_table_row<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
table_row: &bool,
) -> io::Result<()> {
Ok(())
}
fn visit_task_item<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
task_item: &Option<char>,
) -> io::Result<()> {
Ok(())
}
fn visit_text<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
text: &String,
) -> io::Result<()> {
Ok(())
}
fn visit_thematic_break<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_underline<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
) -> io::Result<()> {
Ok(())
}
fn visit_wiki_link<'arena>(
&mut self,
node: &'arena Node<'arena, RefCell<Ast>>,
wiki_link: &NodeWikiLink,
) -> io::Result<()> {
Ok(())
}
}