Implement link extractor
This commit is contained in:
parent
fb2934a96d
commit
70f12dbef7
1 changed files with 75 additions and 3 deletions
|
@ -1,8 +1,80 @@
|
|||
use result::Result;
|
||||
|
||||
pub type Link = String;
|
||||
use hoedown::renderer::Render;
|
||||
use hoedown::Buffer;
|
||||
use hoedown::Markdown;
|
||||
|
||||
pub struct Link {
|
||||
pub title: String,
|
||||
pub link: String,
|
||||
}
|
||||
|
||||
struct LinkExtractor {
|
||||
links: Vec<Link>,
|
||||
}
|
||||
|
||||
impl LinkExtractor {
|
||||
|
||||
pub fn new() -> LinkExtractor {
|
||||
LinkExtractor { links: vec![] }
|
||||
}
|
||||
|
||||
pub fn links(self) -> Vec<Link> {
|
||||
self.links
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
impl Render for LinkExtractor {
|
||||
|
||||
fn link(&mut self,
|
||||
_: &mut Buffer,
|
||||
content: Option<&Buffer>,
|
||||
link: Option<&Buffer>,
|
||||
_: Option<&Buffer>)
|
||||
-> bool
|
||||
{
|
||||
let link = link.and_then(|l| l.to_str().ok()).map(String::from);
|
||||
let content = content.and_then(|l| l.to_str().ok()).map(String::from);
|
||||
|
||||
match (link, content) {
|
||||
(Some(link), Some(content)) => {
|
||||
self.links.push(Link { link: link, title: content });
|
||||
false
|
||||
},
|
||||
|
||||
(_, _) => {
|
||||
false
|
||||
},
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn extract_links(buf: &str) -> Vec<Link> {
|
||||
let mut le = LinkExtractor::new();
|
||||
le.render(&Markdown::new(buf));
|
||||
le.links()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::{Link, extract_links};
|
||||
|
||||
#[test]
|
||||
fn test_one_link() {
|
||||
let testtext = "Some [example text](http://example.com).";
|
||||
|
||||
let exp = Link {
|
||||
title: String::from("example text"),
|
||||
link: String::from("http://example.com"),
|
||||
};
|
||||
|
||||
let mut links = extract_links(testtext);
|
||||
assert_eq!(1, links.len());
|
||||
assert_eq!(exp, links.pop().unwrap())
|
||||
}
|
||||
|
||||
pub fn extract_links(buf: &str) -> Result<Vec<Link>> {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue