sable-markdown/src/parser/inline/reference_link.rs@main
raw
1use nom::{IResult, Parser, branch::alt, bytes::complete::tag, sequence::terminated};
2
3use crate::{
4 ast::{Inline, LinkReference},
5 parser::link_util::link_label,
6};
7
8pub(super) fn reference_link<'a>() -> impl FnMut(&'a str) -> IResult<&'a str, Inline> {
9 move |input: &'a str| {
10 alt((
11 reference_link_full(),
12 reference_link_collapsed(),
13 reference_link_shortcut(),
14 ))
15 .parse(input)
16 }
17}
18
19pub(super) fn reference_link_full<'a>() -> impl FnMut(&'a str) -> IResult<&'a str, Inline> {
20 move |input: &'a str| {
21 let (input, (text, label)) = (link_label(), link_label()).parse(input)?;
22 let link_reference = LinkReference { label, text };
23 Ok((input, Inline::LinkReference(link_reference)))
24 }
25}
26
27pub(super) fn reference_link_collapsed<'a>() -> impl FnMut(&'a str) -> IResult<&'a str, Inline> {
28 move |input: &'a str| {
29 let (input, text) = terminated(link_label(), tag("[]")).parse(input)?;
30 let link_reference = LinkReference {
31 label: text.clone(),
32 text,
33 };
34 Ok((input, Inline::LinkReference(link_reference)))
35 }
36}
37
38pub(super) fn reference_link_shortcut<'a>() -> impl FnMut(&'a str) -> IResult<&'a str, Inline> {
39 move |input: &'a str| {
40 let (input, text) = link_label().parse(input)?;
41 let link_reference = LinkReference {
42 label: text.clone(),
43 text,
44 };
45 Ok((input, Inline::LinkReference(link_reference)))
46 }
47}
48