parser
This commit is contained in:
parent
2fef529f57
commit
a85efe2056
22 changed files with 1776 additions and 7 deletions
68
src/objects/link.rs
Normal file
68
src/objects/link.rs
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
#[cfg_attr(test, derive(PartialEq, Debug))]
|
||||
pub struct Link<'a> {
|
||||
pub path: &'a str,
|
||||
pub desc: Option<&'a str>,
|
||||
}
|
||||
|
||||
impl<'a> Link<'a> {
|
||||
pub fn parse(src: &'a str) -> Option<(Link<'a>, usize)> {
|
||||
starts_with!(src, "[[");
|
||||
|
||||
let path = until_while!(src, 2, b']', |c| c != b']'
|
||||
&& c != b'<'
|
||||
&& c != b'>'
|
||||
&& c != b'\n');
|
||||
|
||||
if cond_eq!(src, path + 1, b']') {
|
||||
Some((
|
||||
Link {
|
||||
path: &src[2..path],
|
||||
desc: None,
|
||||
},
|
||||
path + 2,
|
||||
))
|
||||
} else if src.as_bytes()[path + 1] == b'[' {
|
||||
let desc = until_while!(src, path + 2, b']', |c| c != b']'
|
||||
&& c != b'['
|
||||
&& c != b'\n');
|
||||
|
||||
expect!(src, desc + 1, b']');
|
||||
|
||||
Some((
|
||||
Link {
|
||||
path: &src[2..path],
|
||||
desc: Some(&src[path + 2..desc]),
|
||||
},
|
||||
desc + 2,
|
||||
))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse() {
|
||||
assert_eq!(
|
||||
Link::parse("[[#id]]").unwrap(),
|
||||
(
|
||||
Link {
|
||||
path: "#id",
|
||||
desc: None,
|
||||
},
|
||||
"[[#id]]".len()
|
||||
)
|
||||
);
|
||||
assert_eq!(
|
||||
Link::parse("[[#id][desc]]").unwrap(),
|
||||
(
|
||||
Link {
|
||||
path: "#id",
|
||||
desc: Some("desc"),
|
||||
},
|
||||
"[[#id][desc]]".len()
|
||||
)
|
||||
);
|
||||
assert!(Link::parse("[[#id][desc]").is_none());
|
||||
assert!(Link::parse("[#id][desc]]").is_none());
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue