markly 0.3.0

Native Rust library for parsing Markdown and (outputting HTML)
Documentation
use parser::span::parse_spans;
use parser::Block;
use parser::Block::Header;
use regex::Regex;

pub fn parse_atx_header(lines: &[&str]) -> Option<(Block, usize)> {
    lazy_static! {
        static ref ATX_HEADER_RE: Regex =
            Regex::new(r"^(?P<level>#{1,6})\s(?P<text>.*?)(?:\s#*)?$").unwrap();
    }

    if ATX_HEADER_RE.is_match(lines[0]) {
        let caps = ATX_HEADER_RE.captures(lines[0]).unwrap();
        return Some((
            Header(
                parse_spans(caps.name("text").unwrap().as_str()),
                caps.name("level").unwrap().as_str().len(),
            ),
            1,
        ));
    }
    None
}

#[cfg(test)]
mod test {
    use super::parse_atx_header;
    use parser::Block::Header;
    use parser::Span::Text;

    #[test]
    fn finds_atx_header() {
        assert_eq!(
            parse_atx_header(&vec!["### Test", "testtest"]).unwrap(),
            (Header(vec![Text("Test".to_owned())], 3), 1)
        );

        assert_eq!(
            parse_atx_header(&vec!["# Test", "testtest"]).unwrap(),
            (Header(vec![Text("Test".to_owned())], 1), 1)
        );

        assert_eq!(
            parse_atx_header(&vec!["###### Test", "testtest"]).unwrap(),
            (Header(vec![Text("Test".to_owned())], 6), 1)
        );

        assert_eq!(
            parse_atx_header(&vec!["### Test and a pretty long sentence", "testtest"]).unwrap(),
            (
                Header(vec![Text("Test and a pretty long sentence".to_owned())], 3),
                1
            )
        );
    }

    #[test]
    fn ignores_closing_hashes() {
        assert_eq!(
            parse_atx_header(&vec!["### Test ###", "testtest"]).unwrap(),
            (Header(vec![Text("Test".to_owned())], 3), 1)
        );

        assert_eq!(
            parse_atx_header(&vec!["# Test #", "testtest"]).unwrap(),
            (Header(vec![Text("Test".to_owned())], 1), 1)
        );

        assert_eq!(
            parse_atx_header(&vec!["###### Test ##", "testtest"]).unwrap(),
            (Header(vec![Text("Test".to_owned())], 6), 1)
        );

        assert_eq!(
            parse_atx_header(&vec![
                "### Test and a pretty long sentence #########",
                "testtest"
            ])
            .unwrap(),
            (
                Header(vec![Text("Test and a pretty long sentence".to_owned())], 3),
                1
            )
        );
    }

    #[test]
    fn no_false_positives() {
        assert_eq!(parse_atx_header(&vec!["####### Test", "testtest"]), None);
        assert_eq!(parse_atx_header(&vec!["Test #", "testtest"]), None);
        assert_eq!(parse_atx_header(&vec!["T ### est #", "testtest"]), None);
    }
}