wayver's git archive


an obsidian renderer
git clone https://git.wayver.dev/sable

sable-markdown/src/parser/inline/reference_link.rs@337ba67f65eaa17b44e371af7c0f0c761d6aa914

raw
Date Commit Message Author Files + -
2026-02-23 01:55 initial mvp wayverd 139 17808 0
...

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