1use pulldown_cmark::{Event, Tag};
2
3pub fn md<'a, I>(events: I) -> String where
4 I: Iterator<Item = Event<'a>>,
5{
6 let mut res = String::new();
7
8 for event in events {
9 match event {
10 Event::Text(t) => {
11 res.push_str(&t);
12 }
13 Event::SoftBreak => {
14 res.push_str("\n");
15 }
16
17 Event::Start(Tag::Code) |
18 Event::End(Tag::Code) => {
19 res.push_str("`");
20 }
21
22 Event::Start(Tag::Emphasis) |
23 Event::End(Tag::Emphasis) => {
24 res.push_str("*");
25 }
26
27 Event::Start(Tag::Strong) |
28 Event::End(Tag::Strong) => {
29 res.push_str("**");
30 }
31
32 Event::End(Tag::Paragraph) => {
33 res.push_str("\n\n");
34 }
35
36 Event::Start(Tag::Header(n)) => {
37 res.push_str("\n");
38 res.extend(::std::iter::repeat("#").take(n as usize));
39 res.push_str(" ");
40 }
41 Event::End(Tag::Header(_)) => {
42 res.push_str("\n\n");
43 }
44
45 Event::Start(Tag::Item) => {
46 res.push_str("- ");
47 }
48 Event::End(Tag::Item) |
49 Event::End(Tag::List(_)) => {
50 res.push_str("\n");
51 }
52
53 Event::Start(Tag::CodeBlock(info)) => {
54 res.push_str("```");
55 res.push_str(&info);
56 res.push_str("\n");
57 }
58 Event::End(Tag::CodeBlock(_)) => {
59 res.push_str("```\n");
60 }
61
62 _ => {}
63 }
64 }
65
66 res.trim_right().into()
67}