blob: 6f77f31cf9f28abe4c4569c32c24823a1965372c [file] [log] [blame]
use pulldown_cmark::{Event, Options, Parser, Tag};
fn main() {
let markdown_input = concat!(
"# My Heading\n",
"\n",
"My paragraph.\n",
"\n",
"* a\n",
"* b\n",
"* c\n",
"\n",
"1. d\n",
"2. e\n",
"3. f\n",
"\n",
"> my block quote\n",
"\n",
"```\n",
"my code block\n",
"```\n",
"\n",
"*emphasis*\n",
"**strong**\n",
"~~strikethrough~~\n",
"[My Link](http://example.com)\n",
"![My Image](http://example.com/image.jpg)\n",
"\n",
"| a | b |\n",
"| - | - |\n",
"| c | d |\n",
"\n",
"hello[^1]\n",
"[^1]: my footnote\n",
);
println!(
"\nParsing the following markdown string:\n{}\n",
markdown_input
);
// Set up the parser. We can treat is as any other iterator.
// For each event, we print its details, such as the tag or string.
// This filter simply returns the same event without any changes;
// you can compare the `event-filter` example which alters the output.
let parser = Parser::new_ext(markdown_input, Options::all()).map(|event| {
match &event {
Event::Start(tag) => match tag {
Tag::HtmlBlock => println!("HtmlBlock"),
Tag::Heading {
level,
id,
classes,
attrs,
} => println!(
"Heading heading_level: {} fragment identifier: {:?} classes: {:?} attrs: {:?}",
level, id, classes, attrs
),
Tag::Paragraph => println!("Paragraph"),
Tag::List(ordered_list_first_item_number) => println!(
"List ordered_list_first_item_number: {:?}",
ordered_list_first_item_number
),
Tag::Item => println!("Item (this is a list item)"),
Tag::Emphasis => println!("Emphasis (this is a span tag)"),
Tag::Strong => println!("Strong (this is a span tag)"),
Tag::Strikethrough => println!("Strikethrough (this is a span tag)"),
Tag::BlockQuote => println!("BlockQuote"),
Tag::CodeBlock(code_block_kind) => {
println!("CodeBlock code_block_kind: {:?}", code_block_kind)
}
Tag::Link {
link_type,
dest_url,
title,
id,
} => println!(
"Link link_type: {:?} url: {} title: {} id: {}",
link_type, dest_url, title, id
),
Tag::Image {
link_type,
dest_url,
title,
id,
} => println!(
"Image link_type: {:?} url: {} title: {} id: {}",
link_type, dest_url, title, id
),
Tag::Table(column_text_alignment_list) => println!(
"Table column_text_alignment_list: {:?}",
column_text_alignment_list
),
Tag::TableHead => println!("TableHead (contains TableRow tags"),
Tag::TableRow => println!("TableRow (contains TableCell tags)"),
Tag::TableCell => println!("TableCell (contains inline tags)"),
Tag::FootnoteDefinition(label) => println!("FootnoteDefinition label: {}", label),
Tag::MetadataBlock(kind) => println!("MetadataBlock: {:?}", kind),
},
_ => (),
};
event
});
let mut html_output = String::new();
pulldown_cmark::html::push_html(&mut html_output, parser);
println!("\nHTML output:\n{}\n", &html_output);
}