smoldown/parser/block/
link_reference.rs1use 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}