diff --git a/Cargo.toml b/Cargo.toml index 7769294..149608e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,5 +5,3 @@ authors = ["PoiScript "] [dependencies] jetscii = "0.4.3" -lazy_static = "1.2.0" -regex = "1" diff --git a/src/elements/block.rs b/src/elements/block.rs index 06f3e55..48cb961 100644 --- a/src/elements/block.rs +++ b/src/elements/block.rs @@ -1,5 +1,3 @@ -use regex::Regex; - #[cfg_attr(test, derive(PartialEq))] #[derive(Debug)] pub struct Block; @@ -14,26 +12,33 @@ impl Block { let args = eol!(src); let name = until_while!(src, 8, |c| c == b' ' || c == b'\n', |c: u8| c .is_ascii_alphabetic())?; - let end_re = format!(r"(?im)^[ \t]*#\+END_{}[ \t]*$", &src[8..name]); - let end_re = Regex::new(&end_re).unwrap(); - let (content, end) = end_re.find(src).map(|m| (m.start(), m.end()))?; - Some(( - &src[8..name], - if name == args { + let mut pos = 0; + let end = format!(r"#+END_{}", &src[8..name]); + while let Some(line_end) = src[pos..].find('\n').map(|i| i + pos + 1).or_else(|| { + if pos < src.len() { + Some(src.len()) + } else { None - } else { - Some(&src[name..args]) - }, - args, - content, - // including the eol character - if end < src.len() && src.as_bytes()[end] == b'\n' { - end + 1 - } else { - end - }, - )) + } + }) { + if src[pos..line_end].trim().eq_ignore_ascii_case(&end) { + return Some(( + &src[8..name], + if name == args { + None + } else { + Some(&src[name..args]) + }, + args, + pos, + line_end, + )); + } + pos = line_end; + } + + None } } diff --git a/src/elements/dyn_block.rs b/src/elements/dyn_block.rs index e8ac9b8..763f242 100644 --- a/src/elements/dyn_block.rs +++ b/src/elements/dyn_block.rs @@ -12,21 +12,32 @@ impl DynBlock { let args = eol!(src); let name = until_while!(src, 9, |c| c == b' ' || c == b'\n', |c: u8| c .is_ascii_alphabetic())?; - // TODO: ignore case matching - let content = src.find("\n#+END:")?; - let end = eol!(src, content + 1); - Some(( - &src[9..name], - if name == args { - None + let mut pos = 0; + while let Some(line_end) = src[pos..].find('\n').map(|i| i + pos + 1).or_else(|| { + if pos < src.len() { + Some(src.len()) } else { - Some(&src[name..args].trim()) - }, - args, - content + 1, - end + 1, - )) + None + } + }) { + if src[pos..line_end].trim().eq_ignore_ascii_case("#+END:") { + return Some(( + &src[8..name].trim(), + if name == args { + None + } else { + Some(&src[name..args].trim()) + }, + args, + pos, + line_end, + )); + } + pos = line_end; + } + + None } } diff --git a/src/elements/rule.rs b/src/elements/rule.rs index 5b11bcf..bb6aabf 100644 --- a/src/elements/rule.rs +++ b/src/elements/rule.rs @@ -1,16 +1,16 @@ -use regex::Regex; - -lazy_static! { - static ref RULE_REGEX: Regex = Regex::new(r"^[ \t]*-{5,}[ \t]*\n?$").unwrap(); -} - #[cfg_attr(test, derive(PartialEq))] #[derive(Debug)] pub struct Rule; impl Rule { pub fn parse(src: &str) -> usize { - RULE_REGEX.find(src).map(|m| m.end()).unwrap_or(0) + let end = src.find('\n').map(|i| i + 1).unwrap_or_else(|| src.len()); + let rules = &src[0..end].trim(); + if rules.len() >= 5 && rules.chars().all(|c| c == '-') { + end + } else { + 0 + } } } diff --git a/src/lib.rs b/src/lib.rs index 443c8a0..4440456 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,5 @@ #[macro_use] -extern crate lazy_static; -#[macro_use] extern crate jetscii; -extern crate regex; #[macro_use] mod utils;