smoldown/parser/block/
link_reference.rs

1use crate::parser::Block;
2use crate::parser::Block::LinkReference;
3
4pub fn parse_link_reference(lines: &[&str]) -> Option<(Block, usize)> {
5    if let Some(caps) = crate::regex!("^\\s*\\[(?P<id>[^\\[\\]]+)\\]:\\s*(?P<url>\\S+)(?:\\s+(?:'(?P<title1>.*)'|\"(?P<title2>.*)\"|\\((?P<title3>.*?)\\)))?\n?").captures(lines[0]) {
6        return Some((
7            LinkReference(
8                caps.name("id").unwrap().as_str().to_lowercase(),
9                caps.name("url").unwrap().as_str().to_owned(),
10                caps.name("title1")
11                    .or_else(|| caps.name("title2"))
12                    .or_else(|| caps.name("title3"))
13                    .map(|s| s.as_str().to_owned()),
14            ),
15            1,
16        ));
17    }
18
19    if let Some(caps1) = crate::regex!("^\\s*\\[(?P<id>[^\\[\\]]+)\\]:").captures(lines[0]) {
20        if let Some(caps2) = crate::regex!("\\s*(?P<url>\\S+)(?:\\s+(?:'(?P<title1>.*)'|\"(?P<title2>.*)\"|\\((?P<title3>.*?)\\)))?\n?").captures(lines[1]) {
21        return Some((
22            LinkReference(
23                caps1.name("id").unwrap().as_str().to_lowercase(),
24                caps2.name("url").unwrap().as_str().to_owned(),
25                caps2
26                    .name("title1")
27                    .or_else(|| caps2.name("title2"))
28                    .or_else(|| caps2.name("title3"))
29                    .map(|s| s.as_str().to_owned()),
30            ),
31            2,
32        ));
33    }
34    }
35
36    None
37}
38
39#[cfg(test)]
40mod test {
41    use super::parse_link_reference;
42    use crate::parser::Block::LinkReference;
43
44    #[test]
45    fn finds_link_reference() {
46        assert_eq!(
47            parse_link_reference(&vec!["[Test]: https://example.com"]).unwrap(),
48            (
49                LinkReference("test".to_owned(), "https://example.com".to_owned(), None),
50                1
51            )
52        );
53
54        assert_eq!(
55            parse_link_reference(&vec!["[Test]: https://example.com \"example\""]).unwrap(),
56            (
57                LinkReference(
58                    "test".to_owned(),
59                    "https://example.com".to_owned(),
60                    Some("example".to_owned())
61                ),
62                1
63            )
64        );
65
66        assert_eq!(
67            parse_link_reference(&vec!["[Test]: https://example.com (example)"]).unwrap(),
68            (
69                LinkReference(
70                    "test".to_owned(),
71                    "https://example.com".to_owned(),
72                    Some("example".to_owned())
73                ),
74                1
75            )
76        );
77
78        assert_eq!(
79            parse_link_reference(&vec!["[Test]: https://example.com 'example'"]).unwrap(),
80            (
81                LinkReference(
82                    "test".to_owned(),
83                    "https://example.com".to_owned(),
84                    Some("example".to_owned())
85                ),
86                1
87            )
88        );
89
90        assert_eq!(
91            parse_link_reference(&vec!["[Test]:     https://example.com        'example'"])
92                .unwrap(),
93            (
94                LinkReference(
95                    "test".to_owned(),
96                    "https://example.com".to_owned(),
97                    Some("example".to_owned())
98                ),
99                1
100            )
101        );
102
103        assert_eq!(
104            parse_link_reference(&vec!["[Test]:", "https://example.com \"example\""]).unwrap(),
105            (
106                LinkReference(
107                    "test".to_owned(),
108                    "https://example.com".to_owned(),
109                    Some("example".to_owned())
110                ),
111                2
112            )
113        );
114    }
115}