feat: use bytecount for bytes counting
This commit is contained in:
parent
c5a6d82aa8
commit
1c3300ca61
18 changed files with 135 additions and 137 deletions
|
|
@ -32,20 +32,20 @@ mod tests {
|
|||
use super::parse;
|
||||
use super::Cookie::*;
|
||||
|
||||
assert_eq!(parse("[1/10]").unwrap(), (Slash("1", "10"), "[1/10]".len()));
|
||||
assert_eq!(parse("[1/10]"), Some((Slash("1", "10"), "[1/10]".len())));
|
||||
assert_eq!(
|
||||
parse("[1/1000]").unwrap(),
|
||||
(Slash("1", "1000"), "[1/1000]".len())
|
||||
parse("[1/1000]"),
|
||||
Some((Slash("1", "1000"), "[1/1000]".len()))
|
||||
);
|
||||
assert_eq!(parse("[10%]").unwrap(), (Percent("10"), "[10%]".len()));
|
||||
assert_eq!(parse("[%]").unwrap(), (Percent(""), "[%]".len()));
|
||||
assert_eq!(parse("[/]").unwrap(), (Slash("", ""), "[/]".len()));
|
||||
assert_eq!(parse("[100/]").unwrap(), (Slash("100", ""), "[100/]".len()));
|
||||
assert_eq!(parse("[/100]").unwrap(), (Slash("", "100"), "[/100]".len()));
|
||||
assert_eq!(parse("[10%]"), Some((Percent("10"), "[10%]".len())));
|
||||
assert_eq!(parse("[%]"), Some((Percent(""), "[%]".len())));
|
||||
assert_eq!(parse("[/]"), Some((Slash("", ""), "[/]".len())));
|
||||
assert_eq!(parse("[100/]"), Some((Slash("100", ""), "[100/]".len())));
|
||||
assert_eq!(parse("[/100]"), Some((Slash("", "100"), "[/100]".len())));
|
||||
|
||||
assert!(parse("[10% ]").is_none(),);
|
||||
assert!(parse("[1//100]").is_none(),);
|
||||
assert!(parse("[1\\100]").is_none(),);
|
||||
assert!(parse("[10%%]").is_none(),);
|
||||
assert_eq!(parse("[10% ]"), None);
|
||||
assert_eq!(parse("[1//100]"), None);
|
||||
assert_eq!(parse("[1\\100]"), None);
|
||||
assert_eq!(parse("[10%%]"), None);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
use bytecount::count;
|
||||
use memchr::memchr;
|
||||
|
||||
#[inline]
|
||||
|
|
@ -13,14 +14,13 @@ pub fn parse(src: &str, marker: u8) -> Option<usize> {
|
|||
|
||||
let end = memchr(marker, &bytes[1..])
|
||||
.map(|i| i + 1)
|
||||
.filter(|&i| bytes[1..i].iter().filter(|&&c| c == b'\n').count() < 2)?;
|
||||
.filter(|&i| count(&bytes[1..i], b'\n') < 2)?;
|
||||
|
||||
if bytes[end - 1].is_ascii_whitespace() {
|
||||
return None;
|
||||
}
|
||||
|
||||
if end < src.len() - 1 {
|
||||
let post = bytes[end + 1];
|
||||
if let Some(&post) = bytes.get(end + 1) {
|
||||
if post == b' '
|
||||
|| post == b'-'
|
||||
|| post == b'.'
|
||||
|
|
@ -48,12 +48,12 @@ mod tests {
|
|||
fn parse() {
|
||||
use super::parse;
|
||||
|
||||
assert_eq!(parse("*bold*", b'*').unwrap(), "*bold".len());
|
||||
assert_eq!(parse("*bo\nld*", b'*').unwrap(), "*bo\nld".len());
|
||||
assert!(parse("*bold*a", b'*').is_none());
|
||||
assert!(parse("*bold*", b'/').is_none());
|
||||
assert!(parse("*bold *", b'*').is_none());
|
||||
assert!(parse("* bold*", b'*').is_none());
|
||||
assert!(parse("*b\nol\nd*", b'*').is_none());
|
||||
assert_eq!(parse("*bold*", b'*'), Some("*bold".len()));
|
||||
assert_eq!(parse("*bo\nld*", b'*'), Some("*bo\nld".len()));
|
||||
assert_eq!(parse("*bold*a", b'*'), None);
|
||||
assert_eq!(parse("*bold*", b'/'), None);
|
||||
assert_eq!(parse("*bold *", b'*'), None);
|
||||
assert_eq!(parse("* bold*", b'*'), None);
|
||||
assert_eq!(parse("*b\nol\nd*", b'*'), None);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,19 +55,16 @@ mod tests {
|
|||
fn parse() {
|
||||
use super::parse;
|
||||
|
||||
assert_eq!(parse("[fn:1]").unwrap(), (Some("1"), None, "[fn:1]".len()));
|
||||
assert_eq!(parse("[fn:1]"), Some((Some("1"), None, "[fn:1]".len())));
|
||||
assert_eq!(
|
||||
parse("[fn:1:2]").unwrap(),
|
||||
(Some("1"), Some("2"), "[fn:1:2]".len())
|
||||
parse("[fn:1:2]"),
|
||||
Some((Some("1"), Some("2"), "[fn:1:2]".len()))
|
||||
);
|
||||
assert_eq!(parse("[fn::2]"), Some((None, Some("2"), "[fn::2]".len())));
|
||||
assert_eq!(
|
||||
parse("[fn::2]").unwrap(),
|
||||
(None, Some("2"), "[fn::2]".len())
|
||||
parse("[fn::[]]"),
|
||||
Some((None, Some("[]"), "[fn::[]]".len()))
|
||||
);
|
||||
assert_eq!(
|
||||
parse("[fn::[]]").unwrap(),
|
||||
(None, Some("[]"), "[fn::[]]".len())
|
||||
);
|
||||
assert!(parse("[fn::[]").is_none());
|
||||
assert_eq!(parse("[fn::[]"), None);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,38 +51,38 @@ mod tests {
|
|||
use super::parse;
|
||||
|
||||
assert_eq!(
|
||||
parse("call_square(4)").unwrap(),
|
||||
("square", "4", None, None, "call_square(4)".len())
|
||||
parse("call_square(4)"),
|
||||
Some(("square", "4", None, None, "call_square(4)".len()))
|
||||
);
|
||||
assert_eq!(
|
||||
parse("call_square[:results output](4)").unwrap(),
|
||||
(
|
||||
parse("call_square[:results output](4)"),
|
||||
Some((
|
||||
"square",
|
||||
"4",
|
||||
Some(":results output"),
|
||||
None,
|
||||
"call_square[:results output](4)".len()
|
||||
)
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
parse("call_square(4)[:results html]").unwrap(),
|
||||
(
|
||||
parse("call_square(4)[:results html]"),
|
||||
Some((
|
||||
"square",
|
||||
"4",
|
||||
None,
|
||||
Some(":results html"),
|
||||
"call_square(4)[:results html]".len()
|
||||
)
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
parse("call_square[:results output](4)[:results html]").unwrap(),
|
||||
(
|
||||
parse("call_square[:results output](4)[:results html]"),
|
||||
Some((
|
||||
"square",
|
||||
"4",
|
||||
Some(":results output"),
|
||||
Some(":results html"),
|
||||
"call_square[:results output](4)[:results html]".len()
|
||||
)
|
||||
))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,20 +35,20 @@ mod tests {
|
|||
use super::parse;
|
||||
|
||||
assert_eq!(
|
||||
parse("src_C{int a = 0;}").unwrap(),
|
||||
("C", None, "int a = 0;", "src_C{int a = 0;}".len())
|
||||
parse("src_C{int a = 0;}"),
|
||||
Some(("C", None, "int a = 0;", "src_C{int a = 0;}".len()))
|
||||
);
|
||||
assert_eq!(
|
||||
parse("src_xml[:exports code]{<tag>text</tag>}").unwrap(),
|
||||
(
|
||||
parse("src_xml[:exports code]{<tag>text</tag>}"),
|
||||
Some((
|
||||
"xml",
|
||||
Some(":exports code"),
|
||||
"<tag>text</tag>",
|
||||
"src_xml[:exports code]{<tag>text</tag>}".len()
|
||||
)
|
||||
))
|
||||
);
|
||||
assert!(parse("src_xml[:exports code]{<tag>text</tag>").is_none());
|
||||
assert!(parse("src_[:exports code]{<tag>text</tag>}").is_none());
|
||||
assert!(parse("src_xml[:exports code]").is_none());
|
||||
assert_eq!(parse("src_xml[:exports code]{<tag>text</tag>"), None);
|
||||
assert_eq!(parse("src_[:exports code]{<tag>text</tag>}"), None);
|
||||
assert_eq!(parse("src_xml[:exports code]"), None);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,11 +32,11 @@ mod tests {
|
|||
fn parse() {
|
||||
use super::parse;
|
||||
|
||||
assert_eq!(parse("[[#id]]").unwrap(), ("#id", None, "[[#id]]".len()));
|
||||
assert_eq!(parse("[[#id]]"), Some(("#id", None, "[[#id]]".len())));
|
||||
assert_eq!(
|
||||
parse("[[#id][desc]]").unwrap(),
|
||||
("#id", Some("desc"), "[[#id][desc]]".len())
|
||||
parse("[[#id][desc]]"),
|
||||
Some(("#id", Some("desc"), "[[#id][desc]]".len()))
|
||||
);
|
||||
assert!(parse("[[#id][desc]").is_none());
|
||||
assert_eq!(parse("[[#id][desc]"), None);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,20 +68,25 @@ pub enum Object<'a> {
|
|||
Text(&'a str),
|
||||
}
|
||||
|
||||
pub fn parse<'a>(src: &'a str) -> (Object<'a>, usize, Option<(Object<'a>, usize)>) {
|
||||
pub fn parse(src: &str) -> (Object<'_>, usize, Option<(Object<'_>, usize)>) {
|
||||
let bytes = src.as_bytes();
|
||||
|
||||
if src.len() <= 2 {
|
||||
return (Object::Text(src), src.len(), None);
|
||||
}
|
||||
|
||||
let bs = bytes!(b'@', b' ', b'"', b'(', b'\n', b'{', b'<', b'[');
|
||||
|
||||
let mut pos = 0;
|
||||
loop {
|
||||
while let Some(off) = if pos == 0 {
|
||||
Some(0)
|
||||
} else {
|
||||
bs.find(&bytes[pos..])
|
||||
} {
|
||||
pos += off;
|
||||
|
||||
if src.len() - pos < 3 {
|
||||
return (Object::Text(src), src.len(), None);
|
||||
}
|
||||
|
||||
macro_rules! brk {
|
||||
($obj:expr, $off:expr, $pos:expr) => {
|
||||
break if $pos == 0 {
|
||||
return if $pos == 0 {
|
||||
($obj, $off, None)
|
||||
} else {
|
||||
(Object::Text(&src[0..$pos]), $pos, Some(($obj, $off)))
|
||||
|
|
@ -141,19 +146,13 @@ pub fn parse<'a>(src: &'a str) -> (Object<'a>, usize, Option<(Object<'a>, usize)
|
|||
}
|
||||
}
|
||||
|
||||
if let Some(off) = bs
|
||||
.find(&bytes[pos + 1..])
|
||||
.map(|i| i + pos + 1)
|
||||
.filter(|&i| i < src.len() - 3)
|
||||
{
|
||||
pos = off;
|
||||
} else {
|
||||
break (Object::Text(src), src.len(), None);
|
||||
}
|
||||
pos += 1;
|
||||
}
|
||||
|
||||
(Object::Text(src), src.len(), None)
|
||||
}
|
||||
|
||||
fn parse_text_markup<'a>(src: &'a str) -> Option<(Object<'a>, usize)> {
|
||||
fn parse_text_markup(src: &str) -> Option<(Object<'_>, usize)> {
|
||||
match src.as_bytes()[0] {
|
||||
b'*' => emphasis::parse(src, b'*').map(|end| (Object::Bold { end }, 1)),
|
||||
b'+' => emphasis::parse(src, b'+').map(|end| (Object::Strike { end }, 1)),
|
||||
|
|
|
|||
|
|
@ -7,13 +7,14 @@ pub fn parse(src: &str) -> Option<(&str, usize)> {
|
|||
|
||||
expect!(src, 3, |c| c != b' ')?;
|
||||
|
||||
let bytes = src.as_bytes();
|
||||
let end = Substring::new(">>>").find(src).filter(|&i| {
|
||||
src.as_bytes()[3..i]
|
||||
bytes[3..i]
|
||||
.iter()
|
||||
.all(|&c| c != b'<' && c != b'\n' && c != b'>')
|
||||
})?;
|
||||
|
||||
if src.as_bytes()[end - 1] == b' ' {
|
||||
if bytes[end - 1] == b' ' {
|
||||
return None;
|
||||
}
|
||||
|
||||
|
|
@ -27,12 +28,12 @@ mod tests {
|
|||
use super::parse;
|
||||
|
||||
assert_eq!(
|
||||
parse("<<<target>>>").unwrap(),
|
||||
("target", "<<<target>>>".len())
|
||||
parse("<<<target>>>"),
|
||||
Some(("target", "<<<target>>>".len()))
|
||||
);
|
||||
assert_eq!(
|
||||
parse("<<<tar get>>>").unwrap(),
|
||||
("tar get", "<<<tar get>>>".len())
|
||||
parse("<<<tar get>>>"),
|
||||
Some(("tar get", "<<<tar get>>>".len()))
|
||||
);
|
||||
assert_eq!(parse("<<<target >>>"), None);
|
||||
assert_eq!(parse("<<< target>>>"), None);
|
||||
|
|
|
|||
|
|
@ -27,20 +27,20 @@ mod tests {
|
|||
use super::parse;
|
||||
|
||||
assert_eq!(
|
||||
parse("@@html:<b>@@").unwrap(),
|
||||
("html", "<b>", "@@html:<b>@@".len())
|
||||
parse("@@html:<b>@@"),
|
||||
Some(("html", "<b>", "@@html:<b>@@".len()))
|
||||
);
|
||||
assert_eq!(
|
||||
parse("@@latex:any arbitrary LaTeX code@@").unwrap(),
|
||||
(
|
||||
parse("@@latex:any arbitrary LaTeX code@@"),
|
||||
Some((
|
||||
"latex",
|
||||
"any arbitrary LaTeX code",
|
||||
"@@latex:any arbitrary LaTeX code@@".len()
|
||||
)
|
||||
))
|
||||
);
|
||||
assert_eq!(parse("@@html:@@").unwrap(), ("html", "", "@@html:@@".len()));
|
||||
assert!(parse("@@html:<b>@").is_none());
|
||||
assert!(parse("@@html<b>@@").is_none());
|
||||
assert!(parse("@@:<b>@@").is_none());
|
||||
assert_eq!(parse("@@html:@@"), Some(("html", "", "@@html:@@".len())));
|
||||
assert_eq!(parse("@@html:<b>@"), None);
|
||||
assert_eq!(parse("@@html<b>@@"), None);
|
||||
assert_eq!(parse("@@:<b>@@"), None);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,11 +25,8 @@ mod tests {
|
|||
fn parse() {
|
||||
use super::parse;
|
||||
|
||||
assert_eq!(parse("<<target>>").unwrap(), ("target", "<<target>>".len()));
|
||||
assert_eq!(
|
||||
parse("<<tar get>>").unwrap(),
|
||||
("tar get", "<<tar get>>".len())
|
||||
);
|
||||
assert_eq!(parse("<<target>>"), Some(("target", "<<target>>".len())));
|
||||
assert_eq!(parse("<<tar get>>"), Some(("tar get", "<<tar get>>".len())));
|
||||
assert_eq!(parse("<<target >>"), None);
|
||||
assert_eq!(parse("<< target>>"), None);
|
||||
assert_eq!(parse("<<ta<get>>"), None);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue