Rewrite markdown parsing, so we can extract links and quotes (and maybe more)

This commit is contained in:
Matthias Beyer 2015-12-06 11:01:45 +01:00
parent c35cd7ef15
commit 7b99aee552

View file

@ -1,25 +1,60 @@
mod markdown {
pub fn extract_links(s: &String) -> Vec<String> {
use pulldown_cmark::Parser; use pulldown_cmark::Parser;
use pulldown_cmark::Event; use pulldown_cmark::Event;
use pulldown_cmark::Tag; use pulldown_cmark::Tag;
Parser::new(&s[..]) pub struct MarkdownParser<'a> {
.filter_map(|e| { text: &'a String
match e { }
Event::Start(t) => Some(t),
Event::End(t) => Some(t),
_ => None
}
})
.filter_map(|tag| {
match tag {
Tag::Link(url, text) => Some((url, text)),
_ => None
}
})
.map(|(url, text)| {
text.into_owned()
}).collect::<Vec<String>>()
}
impl<'a> MarkdownParser<'a> {
pub fn new(s: &'a String) -> MarkdownParser {
MarkdownParser {
text: s
}
}
pub fn links(&self) -> Vec<String> {
Parser::new(&self.text[..])
.filter_map(|e| {
match e {
Event::Start(t) => Some(t),
Event::End(t) => Some(t),
_ => None
}
})
.filter_map(|tag| {
match tag {
Tag::Link(url, text) => Some((url, text)),
_ => None
}
})
.map(|(url, text)| {
text.into_owned()
}).collect::<Vec<String>>()
}
pub fn codeblocks(&self) -> Vec<String> {
Parser::new(&self.text[..])
.filter_map(|e| {
match e {
Event::Start(t) => Some(t),
Event::End(t) => Some(t),
_ => None
}
})
.filter_map(|tag| {
match tag {
Tag::CodeBlock(text) => Some(text),
_ => None
}
})
.map(|text| {
text.into_owned()
}).collect::<Vec<String>>()
}
}
}