From 0a02268b163db620c9e3d2b4f22da6d4bb67adf2 Mon Sep 17 00:00:00 2001
From: Martin Fischer <martin@push-f.com>
Date: Sun, 13 Aug 2023 21:40:46 +0200
Subject: refactor: proxy essential Emitter methods through Tokenizer

---
 src/machine.rs   | 68 ++++++++++++++++++++++++++++----------------------------
 src/tokenizer.rs | 25 +++++++++++++++++++++
 2 files changed, 59 insertions(+), 34 deletions(-)

(limited to 'src')

diff --git a/src/machine.rs b/src/machine.rs
index aa07900..e6f439b 100644
--- a/src/machine.rs
+++ b/src/machine.rs
@@ -124,7 +124,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
                 Ok(ControlToken::Continue)
             }
             Some(x) if x.is_ascii_alphabetic() => {
-                slf.emitter.init_start_tag(&slf.reader);
+                slf.init_start_tag();
                 slf.state = State::TagName;
                 slf.unread_char(Some(x));
                 Ok(ControlToken::Continue)
@@ -151,7 +151,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
         },
         State::EndTagOpen => match slf.read_char()? {
             Some(x) if x.is_ascii_alphabetic() => {
-                slf.emitter.init_end_tag(&slf.reader);
+                slf.init_end_tag();
                 slf.state = State::TagName;
                 slf.unread_char(Some(x));
                 Ok(ControlToken::Continue)
@@ -185,16 +185,16 @@ pub fn consume<R: Reader, E: Emitter<R>>(
             }
             Some('>') => {
                 slf.state = State::Data;
-                slf.emitter.emit_current_tag();
+                slf.emit_current_tag();
                 Ok(ControlToken::Continue)
             }
             Some('\0') => {
                 slf.emit_error(Error::UnexpectedNullCharacter);
-                slf.emitter.push_tag_name("\u{fffd}");
+                slf.push_tag_name("\u{fffd}");
                 Ok(ControlToken::Continue)
             }
             Some(x) => {
-                slf.emitter.push_tag_name(ctostr!(x.to_ascii_lowercase()));
+                slf.push_tag_name(ctostr!(x.to_ascii_lowercase()));
                 Ok(ControlToken::Continue)
             }
             None => {
@@ -217,7 +217,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
         },
         State::RcDataEndTagOpen => match slf.read_char()? {
             Some(x) if x.is_ascii_alphabetic() => {
-                slf.emitter.init_end_tag(&slf.reader);
+                slf.init_end_tag();
                 slf.state = State::RcDataEndTagName;
                 slf.unread_char(Some(x));
                 Ok(ControlToken::Continue)
@@ -230,21 +230,21 @@ pub fn consume<R: Reader, E: Emitter<R>>(
             }
         },
         State::RcDataEndTagName => match slf.read_char()? {
-            Some(whitespace_pat!()) if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some(whitespace_pat!()) if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::BeforeAttributeName;
                 Ok(ControlToken::Continue)
             }
-            Some('/') if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some('/') if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::SelfClosingStartTag;
                 Ok(ControlToken::Continue)
             }
-            Some('>') if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some('>') if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::Data;
-                slf.emitter.emit_current_tag();
+                slf.emit_current_tag();
                 Ok(ControlToken::Continue)
             }
             Some(x) if x.is_ascii_alphabetic() => {
-                slf.emitter.push_tag_name(ctostr!(x.to_ascii_lowercase()));
+                slf.push_tag_name(ctostr!(x.to_ascii_lowercase()));
                 slf.temporary_buffer.push(x);
                 Ok(ControlToken::Continue)
             }
@@ -272,7 +272,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
         },
         State::RawTextEndTagOpen => match slf.read_char()? {
             Some(x) if x.is_ascii_alphabetic() => {
-                slf.emitter.init_end_tag(&slf.reader);
+                slf.init_end_tag();
                 slf.state = State::RawTextEndTagName;
                 slf.unread_char(Some(x));
                 Ok(ControlToken::Continue)
@@ -285,21 +285,21 @@ pub fn consume<R: Reader, E: Emitter<R>>(
             }
         },
         State::RawTextEndTagName => match slf.read_char()? {
-            Some(whitespace_pat!()) if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some(whitespace_pat!()) if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::BeforeAttributeName;
                 Ok(ControlToken::Continue)
             }
-            Some('/') if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some('/') if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::SelfClosingStartTag;
                 Ok(ControlToken::Continue)
             }
-            Some('>') if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some('>') if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::Data;
-                slf.emitter.emit_current_tag();
+                slf.emit_current_tag();
                 Ok(ControlToken::Continue)
             }
             Some(x) if x.is_ascii_alphabetic() => {
-                slf.emitter.push_tag_name(ctostr!(x.to_ascii_lowercase()));
+                slf.push_tag_name(ctostr!(x.to_ascii_lowercase()));
                 slf.temporary_buffer.push(x);
                 Ok(ControlToken::Continue)
             }
@@ -332,7 +332,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
         },
         State::ScriptDataEndTagOpen => match slf.read_char()? {
             Some(x) if x.is_ascii_alphabetic() => {
-                slf.emitter.init_end_tag(&slf.reader);
+                slf.init_end_tag();
                 slf.state = State::ScriptDataEndTagName;
                 slf.unread_char(Some(x));
                 Ok(ControlToken::Continue)
@@ -345,21 +345,21 @@ pub fn consume<R: Reader, E: Emitter<R>>(
             }
         },
         State::ScriptDataEndTagName => match slf.read_char()? {
-            Some(whitespace_pat!()) if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some(whitespace_pat!()) if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::BeforeAttributeName;
                 Ok(ControlToken::Continue)
             }
-            Some('/') if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some('/') if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::SelfClosingStartTag;
                 Ok(ControlToken::Continue)
             }
-            Some('>') if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some('>') if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::Data;
-                slf.emitter.emit_current_tag();
+                slf.emit_current_tag();
                 Ok(ControlToken::Continue)
             }
             Some(x) if x.is_ascii_alphabetic() => {
-                slf.emitter.push_tag_name(ctostr!(x.to_ascii_lowercase()));
+                slf.push_tag_name(ctostr!(x.to_ascii_lowercase()));
                 slf.temporary_buffer.push(x.to_ascii_lowercase());
                 Ok(ControlToken::Continue)
             }
@@ -497,7 +497,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
         },
         State::ScriptDataEscapedEndTagOpen => match slf.read_char()? {
             Some(x) if x.is_ascii_alphabetic() => {
-                slf.emitter.init_end_tag(&slf.reader);
+                slf.init_end_tag();
                 slf.state = State::ScriptDataEscapedEndTagName;
                 slf.unread_char(Some(x));
                 Ok(ControlToken::Continue)
@@ -510,21 +510,21 @@ pub fn consume<R: Reader, E: Emitter<R>>(
             }
         },
         State::ScriptDataEscapedEndTagName => match slf.read_char()? {
-            Some(whitespace_pat!()) if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some(whitespace_pat!()) if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::BeforeAttributeName;
                 Ok(ControlToken::Continue)
             }
-            Some('/') if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some('/') if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::SelfClosingStartTag;
                 Ok(ControlToken::Continue)
             }
-            Some('>') if slf.emitter.current_is_appropriate_end_tag_token() => {
+            Some('>') if slf.current_end_tag_is_appropriate() => {
                 slf.state = State::Data;
-                slf.emitter.emit_current_tag();
+                slf.emit_current_tag();
                 Ok(ControlToken::Continue)
             }
             Some(x) if x.is_ascii_alphabetic() => {
-                slf.emitter.push_tag_name(ctostr!(x.to_ascii_lowercase()));
+                slf.push_tag_name(ctostr!(x.to_ascii_lowercase()));
                 slf.temporary_buffer.push(x);
                 Ok(ControlToken::Continue)
             }
@@ -735,7 +735,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
             }
             Some('>') => {
                 slf.state = State::Data;
-                slf.emitter.emit_current_tag();
+                slf.emit_current_tag();
                 Ok(ControlToken::Continue)
             }
             None => {
@@ -764,7 +764,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
             Some('>') => {
                 slf.emit_error(Error::MissingAttributeValue);
                 slf.state = State::Data;
-                slf.emitter.emit_current_tag();
+                slf.emit_current_tag();
                 Ok(ControlToken::Continue)
             }
             c => {
@@ -834,7 +834,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
             }
             Some('>') => {
                 slf.state = State::Data;
-                slf.emitter.emit_current_tag();
+                slf.emit_current_tag();
                 Ok(ControlToken::Continue)
             }
             Some('\0') => {
@@ -867,7 +867,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
             }
             Some('>') => {
                 slf.state = State::Data;
-                slf.emitter.emit_current_tag();
+                slf.emit_current_tag();
                 Ok(ControlToken::Continue)
             }
             None => {
@@ -885,7 +885,7 @@ pub fn consume<R: Reader, E: Emitter<R>>(
             Some('>') => {
                 slf.emitter.set_self_closing(&slf.reader);
                 slf.state = State::Data;
-                slf.emitter.emit_current_tag();
+                slf.emit_current_tag();
                 Ok(ControlToken::Continue)
             }
             None => {
diff --git a/src/tokenizer.rs b/src/tokenizer.rs
index 62cc6a4..78d4fc4 100644
--- a/src/tokenizer.rs
+++ b/src/tokenizer.rs
@@ -115,6 +115,31 @@ impl<R: Reader, E: Emitter<R>> Tokenizer<R, E> {
         self.emitter.emit_error(error, &self.reader);
     }
 
+    #[inline]
+    pub(crate) fn current_end_tag_is_appropriate(&mut self) -> bool {
+        self.emitter.current_is_appropriate_end_tag_token()
+    }
+
+    #[inline]
+    pub(crate) fn init_start_tag(&mut self) {
+        self.emitter.init_start_tag(&self.reader);
+    }
+
+    #[inline]
+    pub(crate) fn init_end_tag(&mut self) {
+        self.emitter.init_end_tag(&self.reader);
+    }
+
+    #[inline]
+    pub(crate) fn push_tag_name(&mut self, s: &str) {
+        self.emitter.push_tag_name(s);
+    }
+
+    #[inline]
+    pub(crate) fn emit_current_tag(&mut self) {
+        self.emitter.emit_current_tag();
+    }
+
     #[inline]
     pub(crate) fn unread_char(&mut self, c: Option<char>) {
         self.to_reconsume.push(c);
-- 
cgit v1.2.3