@@ -22,16 +22,18 @@ use self::states::{Rawtext, Rcdata, ScriptData, ScriptDataEscaped};
2222use self :: char_ref:: { CharRef , CharRefTokenizer } ;
2323
2424use crate :: util:: str:: lower_ascii_letter;
25-
2625use log:: { debug, trace} ;
2726use mac:: format_if;
28- use markup5ever:: { ns, small_char_set, TokenizerResult } ;
27+ use markup5ever:: {
28+ buffer_queue:: BufferQueue , namespace_url, ns, small_char_set, InputSink , InputSinkResult ,
29+ TokenizerResult ,
30+ } ;
2931use std:: borrow:: Cow :: { self , Borrowed } ;
3032use std:: cell:: { Cell , RefCell , RefMut } ;
3133use std:: collections:: BTreeMap ;
32- use std:: mem;
34+ use std:: { iter , mem} ;
3335
34- pub use crate :: buffer_queue:: { BufferQueue , FromSet , NotFromSet , SetResult } ;
36+ pub use crate :: buffer_queue:: { FromSet , NotFromSet , SetResult } ;
3537use crate :: tendril:: StrTendril ;
3638use crate :: { Attribute , LocalName , QualName , SmallCharSet } ;
3739
@@ -43,6 +45,8 @@ pub enum ProcessResult<Handle> {
4345 Continue ,
4446 Suspend ,
4547 Script ( Handle ) ,
48+ #[ cfg( feature = "encoding" ) ]
49+ MaybeChangeEncodingAndStartOver ( & ' static encoding_rs:: Encoding ) ,
4650}
4751
4852fn option_push ( opt_str : & mut Option < StrTendril > , c : char ) {
@@ -357,6 +361,10 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
357361 ProcessResult :: Continue => ( ) ,
358362 ProcessResult :: Suspend => break ,
359363 ProcessResult :: Script ( node) => return TokenizerResult :: Script ( node) ,
364+ #[ cfg( feature = "encoding" ) ]
365+ ProcessResult :: MaybeChangeEncodingAndStartOver ( encoding) => {
366+ return TokenizerResult :: MaybeChangeEncodingAndStartOver ( encoding)
367+ } ,
360368 }
361369 }
362370 } else {
@@ -365,6 +373,10 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
365373 ProcessResult :: Continue => ( ) ,
366374 ProcessResult :: Suspend => break ,
367375 ProcessResult :: Script ( node) => return TokenizerResult :: Script ( node) ,
376+ #[ cfg( feature = "encoding" ) ]
377+ ProcessResult :: MaybeChangeEncodingAndStartOver ( encoding) => {
378+ return TokenizerResult :: MaybeChangeEncodingAndStartOver ( encoding)
379+ } ,
368380 }
369381 }
370382 }
@@ -456,6 +468,10 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
456468 self . state . set ( states:: RawData ( kind) ) ;
457469 ProcessResult :: Continue
458470 } ,
471+ #[ cfg( feature = "encoding" ) ]
472+ TokenSinkResult :: MaybeChangeEncodingAndStartOver ( encoding) => {
473+ ProcessResult :: MaybeChangeEncodingAndStartOver ( encoding)
474+ } ,
459475 }
460476 }
461477
@@ -1680,6 +1696,8 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
16801696 ProcessResult :: Continue => ( ) ,
16811697 ProcessResult :: Suspend => break ,
16821698 ProcessResult :: Script ( _) => unreachable ! ( ) ,
1699+ #[ cfg( feature = "encoding" ) ]
1700+ ProcessResult :: MaybeChangeEncodingAndStartOver ( _) => unreachable ! ( ) ,
16831701 }
16841702 }
16851703
@@ -1841,13 +1859,27 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
18411859 }
18421860}
18431861
1862+ impl < Sink > InputSink for Tokenizer < Sink >
1863+ where
1864+ Sink : TokenSink ,
1865+ {
1866+ type Handle = Sink :: Handle ;
1867+
1868+ fn feed < ' a > (
1869+ & ' a self ,
1870+ input : & ' a BufferQueue ,
1871+ ) -> impl Iterator < Item = InputSinkResult < Self :: Handle > > + ' a {
1872+ iter:: from_fn ( || self . feed ( input) . into ( ) )
1873+ }
1874+ }
1875+
18441876#[ cfg( test) ]
18451877#[ allow( non_snake_case) ]
18461878mod test {
18471879 use super :: option_push; // private items
1848- use crate :: tendril:: { SliceExt , StrTendril } ;
1849-
18501880 use super :: { TokenSink , TokenSinkResult , Tokenizer , TokenizerOpts } ;
1881+ use crate :: tendril:: { SliceExt , StrTendril } ;
1882+ use crate :: LocalName ;
18511883
18521884 use super :: interface:: { CharacterTokens , EOFToken , NullCharacterToken , ParseError } ;
18531885 use super :: interface:: { EndTag , StartTag , Tag , TagKind } ;
@@ -1856,8 +1888,6 @@ mod test {
18561888 use markup5ever:: buffer_queue:: BufferQueue ;
18571889 use std:: cell:: RefCell ;
18581890
1859- use crate :: LocalName ;
1860-
18611891 // LinesMatch implements the TokenSink trait. It is used for testing to see
18621892 // if current_line is being updated when process_token is called. The lines
18631893 // vector is a collection of the line numbers that each token is on.
0 commit comments