[][src]Function parse_hyperlinks::parser::take_hyperlink

pub fn take_hyperlink(
    i: &str
) -> IResult<&str, (Cow<'_, str>, Cow<'_, str>, Cow<'_, str>)>

Consumes the input until it finds a Markdown, RestructuredText, Asciidoc or HTML hyperlink. Returns Ok(remaining_input, (link_name, link_destination, link_title). The parser finds stand alone links and link references.

Limitations:

Reference names are never resolved into link names. This limitation only concerns this function and the function first_hyperlink(). All other parsers are not affected.

Very often this limitation has no effect at all. This is the case, when the link name and the link reference name are identical:

abc [link and reference name] abc
[link and reference name]: /url "title"

But in general, the link name and the link reference name can be different:

abc [link name][reference name] abc
[reference name]: /url "title"

When a link reference is found, the parser outputs it's link reference name as link name, which is strictly speaking only correct when both are identical. Beyond that, the same applies to RestructuredText's link references too.

Another limitation is that ReStructuredText's anonymous links are not supported.

Basic usage

use parse_hyperlinks::parser::take_hyperlink;
use std::borrow::Cow;

let i = r#"[a]: b 'c'
           .. _d: e
           ---[f](g 'h')---`i <j>`_---
           ---<a href="l" title="m">k</a>"#;

let (i, r) = take_hyperlink(i).unwrap();
assert_eq!(r, (Cow::from("a"), Cow::from("b"), Cow::from("c")));
let (i, r) = take_hyperlink(i).unwrap();
assert_eq!(r, (Cow::from("d"), Cow::from("e"), Cow::from("")));
let (i, r) = take_hyperlink(i).unwrap();
assert_eq!(r, (Cow::from("f"), Cow::from("g"), Cow::from("h")));
let (i, r) = take_hyperlink(i).unwrap();
assert_eq!(r, (Cow::from("i"), Cow::from("j"), Cow::from("")));
let (i, r) = take_hyperlink(i).unwrap();
assert_eq!(r, (Cow::from("k"), Cow::from("l"), Cow::from("m")));

The parser might silently consume some additional bytes after the actual finding: This happens, when directly after a finding a md_link_ref or rst_link_ref appears. These must be ignored, as they are only allowed at the beginning of a line. The skip has to happen at this moment, as the next parser does not know if the first byte it gets, is it at the beginning of a line or not.