aboutsummaryrefslogtreecommitdiffstats
path: root/src/tokenizer.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/tokenizer.rs19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/tokenizer.rs b/src/tokenizer.rs
index cba1752..5d03c92 100644
--- a/src/tokenizer.rs
+++ b/src/tokenizer.rs
@@ -13,6 +13,7 @@
use crate::parser::ParseState;
use crate::token::{Token, VOID_TOKENS};
+use crate::util::edit_map::EditMap;
/// Embedded content type.
#[derive(Debug, Clone, Copy, PartialEq)]
@@ -91,7 +92,7 @@ pub type StateFnResult = (State, Option<Vec<Code>>);
/// Resolvers are supposed to change the list of events, because parsing is
/// sometimes messy, and they help expose a cleaner interface of events to
/// the compiler and other users.
-pub type Resolver = dyn FnOnce(&mut Tokenizer);
+pub type Resolver = dyn FnOnce(&mut Tokenizer, &mut EditMap) -> bool;
/// The result of a state.
pub enum State {
@@ -624,10 +625,24 @@ impl<'a> Tokenizer<'a> {
result = flush_impl(self, func);
self.drained = true;
+ let mut map = EditMap::new();
+ let mut consumed = false;
while !self.resolvers.is_empty() {
let resolver = self.resolvers.remove(0);
- resolver(self);
+ let consume = resolver(self, &mut map);
+
+ if consume {
+ map.consume(&mut self.events);
+ consumed = true;
+ map = EditMap::new();
+ } else {
+ consumed = false;
+ }
+ }
+
+ if !consumed {
+ map.consume(&mut self.events);
}
}