fix(list): fix parse_item

This commit is contained in:
PoiScript 2019-01-20 01:52:50 +08:00
parent 390b7abb33
commit cc3d915877

View file

@ -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)
);
} }