diff --git a/src/elements/block.rs b/src/elements/block.rs index a737518..6e98395 100644 --- a/src/elements/block.rs +++ b/src/elements/block.rs @@ -6,7 +6,7 @@ use memchr::memchr2; pub fn parse(src: &str) -> Option<(&str, Option<&str>, usize, usize, usize)> { debug_assert!(src.starts_with("#+")); - if src[2..8].to_uppercase() != "BEGIN_" { + if src.len() <= 8 || src[2..8].to_uppercase() != "BEGIN_" { return None; } diff --git a/src/elements/dyn_block.rs b/src/elements/dyn_block.rs index 452dbe7..5d82461 100644 --- a/src/elements/dyn_block.rs +++ b/src/elements/dyn_block.rs @@ -6,7 +6,7 @@ use memchr::memchr2; pub fn parse(src: &str) -> Option<(&str, Option<&str>, usize, usize, usize)> { 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; } diff --git a/src/elements/mod.rs b/src/elements/mod.rs index 1146648..94e778a 100644 --- a/src/elements/mod.rs +++ b/src/elements/mod.rs @@ -96,8 +96,8 @@ pub fn parse<'a>(src: &'a str) -> (Option>, usize, Option<(Element<' macro_rules! brk { ($ele:expr, $off:expr) => { - break if line_beg == 0 || pos == start { - (Some($ele), start + $off, None) + break if line_beg == start || pos == start { + (Some($ele), pos + $off, None) } else { ( Some(Element::Paragraph { @@ -272,8 +272,7 @@ pub fn parse<'a>(src: &'a str) -> (Option>, usize, Option<(Element<' mod tests { #[test] fn parse() { - use super::parse; - use super::Element::*; + use super::{Element::*, *}; 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 } } diff --git a/src/objects/mod.rs b/src/objects/mod.rs index 72d878d..9eb0a6e 100644 --- a/src/objects/mod.rs +++ b/src/objects/mod.rs @@ -144,7 +144,7 @@ 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() - 2) + .filter(|&i| i < src.len() - 3) { pos = off; } else {