fix: fix some edge case errors

This commit is contained in:
PoiScript 2019-02-12 22:07:18 +08:00
parent 4d56633c43
commit c5a6d82aa8
4 changed files with 17 additions and 7 deletions

View file

@ -6,7 +6,7 @@ use memchr::memchr2;
pub fn parse(src: &str) -> Option<(&str, Option<&str>, usize, usize, usize)> { pub fn parse(src: &str) -> Option<(&str, Option<&str>, usize, usize, usize)> {
debug_assert!(src.starts_with("#+")); debug_assert!(src.starts_with("#+"));
if src[2..8].to_uppercase() != "BEGIN_" { if src.len() <= 8 || src[2..8].to_uppercase() != "BEGIN_" {
return None; return None;
} }

View file

@ -6,7 +6,7 @@ use memchr::memchr2;
pub fn parse(src: &str) -> Option<(&str, Option<&str>, usize, usize, usize)> { pub fn parse(src: &str) -> Option<(&str, Option<&str>, usize, usize, usize)> {
debug_assert!(src.starts_with("#+")); debug_assert!(src.starts_with("#+"));
if !src[2..9].eq_ignore_ascii_case("BEGIN: ") { if src.len() <= 9 || !src[2..9].eq_ignore_ascii_case("BEGIN: ") {
return None; return None;
} }

View file

@ -96,8 +96,8 @@ pub fn parse<'a>(src: &'a str) -> (Option<Element<'a>>, usize, Option<(Element<'
macro_rules! brk { macro_rules! brk {
($ele:expr, $off:expr) => { ($ele:expr, $off:expr) => {
break if line_beg == 0 || pos == start { break if line_beg == start || pos == start {
(Some($ele), start + $off, None) (Some($ele), pos + $off, None)
} else { } else {
( (
Some(Element::Paragraph { Some(Element::Paragraph {
@ -272,8 +272,7 @@ pub fn parse<'a>(src: &'a str) -> (Option<Element<'a>>, usize, Option<(Element<'
mod tests { mod tests {
#[test] #[test]
fn parse() { fn parse() {
use super::parse; use super::{Element::*, *};
use super::Element::*;
assert_eq!(parse("\n\n\n"), (None, 3, None)); assert_eq!(parse("\n\n\n"), (None, 3, None));
@ -388,6 +387,17 @@ mod tests {
)) ))
) )
); );
assert_eq!(
parse("\n #+ATTR_HTML: :width 200px"),
(
Some(Keyword {
key: keyword::Key::Attr { backend: "HTML" },
value: ":width 200px"
}),
"\n #+ATTR_HTML: :width 200px".len(),
None
)
);
// TODO: more tests // TODO: more tests
} }
} }

View file

@ -144,7 +144,7 @@ pub fn parse<'a>(src: &'a str) -> (Object<'a>, usize, Option<(Object<'a>, usize)
if let Some(off) = bs if let Some(off) = bs
.find(&bytes[pos + 1..]) .find(&bytes[pos + 1..])
.map(|i| i + pos + 1) .map(|i| i + pos + 1)
.filter(|&i| i < src.len() - 2) .filter(|&i| i < src.len() - 3)
{ {
pos = off; pos = off;
} else { } else {