fix(list): fix parse_item
This commit is contained in:
parent
390b7abb33
commit
cc3d915877
|
@ -1,5 +1,14 @@
|
||||||
pub struct List;
|
pub struct List;
|
||||||
|
|
||||||
|
macro_rules! ident {
|
||||||
|
($src:expr) => {
|
||||||
|
$src.as_bytes()
|
||||||
|
.iter()
|
||||||
|
.position(|&c| c != b' ' && c != b'\t')
|
||||||
|
.unwrap_or(0)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
impl List {
|
impl List {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_item(src: &str) -> bool {
|
fn is_item(src: &str) -> bool {
|
||||||
|
@ -43,29 +52,29 @@ impl List {
|
||||||
// returns (contents_begin, contents_end)
|
// returns (contents_begin, contents_end)
|
||||||
// TODO: handle nested list
|
// TODO: handle nested list
|
||||||
pub fn parse_item(src: &str, ident: usize) -> (usize, usize) {
|
pub fn parse_item(src: &str, ident: usize) -> (usize, usize) {
|
||||||
(
|
let beg = src[ident..].find(' ').map(|i| ident + i + 1).unwrap();
|
||||||
src[ident..].find(' ').map(|i| ident + i + 1).unwrap(),
|
let mut pos = match src.find('\n') {
|
||||||
if ident > 0 {
|
Some(i) => i + 1,
|
||||||
src.find(&format!("\n{:1$}", " ", ident))
|
None => return (beg, src.len()),
|
||||||
.map(|i| i + 1)
|
};
|
||||||
.unwrap_or_else(|| src.len())
|
while let Some(line_end) = src[pos..].find('\n').map(|i| i + pos + 1).or_else(|| {
|
||||||
|
if pos < src.len() {
|
||||||
|
Some(src.len())
|
||||||
} else {
|
} else {
|
||||||
src.find('\n').map(|i| i + 1).unwrap_or_else(|| src.len())
|
None
|
||||||
},
|
}
|
||||||
)
|
}) {
|
||||||
|
if ident!(src[pos..]) == ident {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pos = line_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
(beg, pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
// return (ident, is_ordered, end)
|
// return (ident, is_ordered, end)
|
||||||
pub fn parse(src: &str) -> Option<(usize, bool, usize)> {
|
pub fn parse(src: &str) -> Option<(usize, bool, usize)> {
|
||||||
macro_rules! ident {
|
|
||||||
($src:expr) => {
|
|
||||||
$src.as_bytes()
|
|
||||||
.iter()
|
|
||||||
.position(|&c| c != b' ' && c != b'\t')
|
|
||||||
.unwrap_or(0)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
let bytes = src.as_bytes();
|
let bytes = src.as_bytes();
|
||||||
let starting_ident = ident!(src);
|
let starting_ident = ident!(src);
|
||||||
|
|
||||||
|
@ -206,6 +215,7 @@ fn is_item() {
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_item() {
|
fn parse_item() {
|
||||||
assert_eq!(List::parse_item("+ Item1\n+ Item2", 0), (2, 8));
|
assert_eq!(List::parse_item("+ Item1\n+ Item2", 0), (2, 8));
|
||||||
|
assert_eq!(List::parse_item("+ Item1\n\n+ Item2", 0), (2, 8));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
List::parse_item(
|
List::parse_item(
|
||||||
r"+ item1
|
r"+ item1
|
||||||
|
@ -213,7 +223,7 @@ fn parse_item() {
|
||||||
+ item2",
|
+ item2",
|
||||||
0
|
0
|
||||||
),
|
),
|
||||||
(2, 8)
|
(2, 25)
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
List::parse_item(
|
List::parse_item(
|
||||||
|
@ -223,4 +233,25 @@ fn parse_item() {
|
||||||
),
|
),
|
||||||
(5, 11)
|
(5, 11)
|
||||||
);
|
);
|
||||||
|
assert_eq!(
|
||||||
|
List::parse_item(
|
||||||
|
r"+ It
|
||||||
|
em1
|
||||||
|
+ Item2",
|
||||||
|
0
|
||||||
|
),
|
||||||
|
(2, 11)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
List::parse_item(
|
||||||
|
r#"1) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sit amet
|
||||||
|
ullamcorper ante, nec pellentesque nisi.
|
||||||
|
2) Sed pulvinar ut arcu id aliquam.Curabitur quis justo eu magna maximus sodales.
|
||||||
|
Curabitur nisl nisi, ornare in enim id, sagittis facilisis magna.
|
||||||
|
3) Curabitur venenatis molestie eros sit amet congue. Nunc at molestie leo, vitae
|
||||||
|
malesuada nisi."#,
|
||||||
|
0
|
||||||
|
),
|
||||||
|
(3, 119)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue