refactor: remove regex crates

This commit is contained in:
PoiScript 2019-01-19 23:22:35 +08:00
parent ad9f29bcb9
commit 390b7abb33
5 changed files with 56 additions and 45 deletions

View file

@ -5,5 +5,3 @@ authors = ["PoiScript <poiscript@gmail.com>"]
[dependencies] [dependencies]
jetscii = "0.4.3" jetscii = "0.4.3"
lazy_static = "1.2.0"
regex = "1"

View file

@ -1,5 +1,3 @@
use regex::Regex;
#[cfg_attr(test, derive(PartialEq))] #[cfg_attr(test, derive(PartialEq))]
#[derive(Debug)] #[derive(Debug)]
pub struct Block; pub struct Block;
@ -14,11 +12,18 @@ impl Block {
let args = eol!(src); let args = eol!(src);
let name = until_while!(src, 8, |c| c == b' ' || c == b'\n', |c: u8| c let name = until_while!(src, 8, |c| c == b' ' || c == b'\n', |c: u8| c
.is_ascii_alphabetic())?; .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(( 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
}
}) {
if src[pos..line_end].trim().eq_ignore_ascii_case(&end) {
return Some((
&src[8..name], &src[8..name],
if name == args { if name == args {
None None
@ -26,14 +31,14 @@ impl Block {
Some(&src[name..args]) Some(&src[name..args])
}, },
args, args,
content, pos,
// including the eol character line_end,
if end < src.len() && src.as_bytes()[end] == b'\n' { ));
end + 1 }
} else { pos = line_end;
end }
},
)) None
} }
} }

View file

@ -12,21 +12,32 @@ impl DynBlock {
let args = eol!(src); let args = eol!(src);
let name = until_while!(src, 9, |c| c == b' ' || c == b'\n', |c: u8| c let name = until_while!(src, 9, |c| c == b' ' || c == b'\n', |c: u8| c
.is_ascii_alphabetic())?; .is_ascii_alphabetic())?;
// TODO: ignore case matching
let content = src.find("\n#+END:")?;
let end = eol!(src, content + 1);
Some(( let mut pos = 0;
&src[9..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
}
}) {
if src[pos..line_end].trim().eq_ignore_ascii_case("#+END:") {
return Some((
&src[8..name].trim(),
if name == args { if name == args {
None None
} else { } else {
Some(&src[name..args].trim()) Some(&src[name..args].trim())
}, },
args, args,
content + 1, pos,
end + 1, line_end,
)) ));
}
pos = line_end;
}
None
} }
} }

View file

@ -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))] #[cfg_attr(test, derive(PartialEq))]
#[derive(Debug)] #[derive(Debug)]
pub struct Rule; pub struct Rule;
impl Rule { impl Rule {
pub fn parse(src: &str) -> usize { 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
}
} }
} }

View file

@ -1,8 +1,5 @@
#[macro_use] #[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate jetscii; extern crate jetscii;
extern crate regex;
#[macro_use] #[macro_use]
mod utils; mod utils;