added ansi_parse trait so things are more ergonomic

This commit is contained in:
David Bittner
2019-05-06 17:01:17 -04:00
parent 8dd86b6da3
commit d9872e03e6
4 changed files with 123 additions and 71 deletions

View File

@@ -205,7 +205,7 @@ named!(
);
named!(
parse_escape<&str, Output>,
pub parse_escape<&str, Output>,
do_parse!(
tag_s!("\u{1b}[") >>
seq: combined >>
@@ -213,62 +213,3 @@ named!(
)
);
pub struct ParserIterator<'a> {
dat: &'a str,
}
impl<'a> Iterator for ParserIterator<'a> {
type Item = Output<'a>;
fn next(&mut self) -> Option<Self::Item> {
if self.dat == "" {
return None;
}
let pos = self.dat.find('\u{1b}');
if let Some(loc) = pos {
if loc == 0 {
let res = parse_escape(&self.dat[loc..]);
if let Ok(ret) = res {
self.dat = &ret.0;
Some(ret.1)
}else{
let pos = self.dat[(loc+1)..].find('\u{1b}');
if let Some(loc) = pos {
//Added to because it's based one character ahead
let loc = loc+1;
let temp = &self.dat[..loc];
self.dat = &self.dat[loc..];
Some(Output::TextBlock(temp))
}else{
let temp = self.dat;
self.dat = "";
Some(Output::TextBlock(temp))
}
}
}else {
let temp = &self.dat[..loc];
self.dat = &self.dat[loc..];
Some(Output::TextBlock(&temp))
}
}else{
let temp = self.dat;
self.dat = "";
Some(Output::TextBlock(temp))
}
}
}
impl<'a> ParserIterator<'a> {
pub fn new(string: &'a str) -> ParserIterator<'a> {
ParserIterator {
dat: string,
}
}
}