@@ -22,16 +22,18 @@ use self::states::{Rawtext, Rcdata, ScriptData, ScriptDataEscaped};
22
22
use self :: char_ref:: { CharRef , CharRefTokenizer } ;
23
23
24
24
use crate :: util:: str:: lower_ascii_letter;
25
-
26
25
use log:: { debug, trace} ;
27
26
use 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
+ } ;
29
31
use std:: borrow:: Cow :: { self , Borrowed } ;
30
32
use std:: cell:: { Cell , RefCell , RefMut } ;
31
33
use std:: collections:: BTreeMap ;
32
- use std:: mem;
34
+ use std:: { iter , mem} ;
33
35
34
- pub use crate :: buffer_queue:: { BufferQueue , FromSet , NotFromSet , SetResult } ;
36
+ pub use crate :: buffer_queue:: { FromSet , NotFromSet , SetResult } ;
35
37
use crate :: tendril:: StrTendril ;
36
38
use crate :: { Attribute , LocalName , QualName , SmallCharSet } ;
37
39
@@ -43,6 +45,8 @@ pub enum ProcessResult<Handle> {
43
45
Continue ,
44
46
Suspend ,
45
47
Script ( Handle ) ,
48
+ #[ cfg( feature = "encoding" ) ]
49
+ MaybeChangeEncodingAndStartOver ( & ' static encoding_rs:: Encoding ) ,
46
50
}
47
51
48
52
fn option_push ( opt_str : & mut Option < StrTendril > , c : char ) {
@@ -357,6 +361,10 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
357
361
ProcessResult :: Continue => ( ) ,
358
362
ProcessResult :: Suspend => break ,
359
363
ProcessResult :: Script ( node) => return TokenizerResult :: Script ( node) ,
364
+ #[ cfg( feature = "encoding" ) ]
365
+ ProcessResult :: MaybeChangeEncodingAndStartOver ( encoding) => {
366
+ return TokenizerResult :: MaybeChangeEncodingAndStartOver ( encoding)
367
+ } ,
360
368
}
361
369
}
362
370
} else {
@@ -365,6 +373,10 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
365
373
ProcessResult :: Continue => ( ) ,
366
374
ProcessResult :: Suspend => break ,
367
375
ProcessResult :: Script ( node) => return TokenizerResult :: Script ( node) ,
376
+ #[ cfg( feature = "encoding" ) ]
377
+ ProcessResult :: MaybeChangeEncodingAndStartOver ( encoding) => {
378
+ return TokenizerResult :: MaybeChangeEncodingAndStartOver ( encoding)
379
+ } ,
368
380
}
369
381
}
370
382
}
@@ -456,6 +468,10 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
456
468
self . state . set ( states:: RawData ( kind) ) ;
457
469
ProcessResult :: Continue
458
470
} ,
471
+ #[ cfg( feature = "encoding" ) ]
472
+ TokenSinkResult :: MaybeChangeEncodingAndStartOver ( encoding) => {
473
+ ProcessResult :: MaybeChangeEncodingAndStartOver ( encoding)
474
+ } ,
459
475
}
460
476
}
461
477
@@ -1680,6 +1696,8 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
1680
1696
ProcessResult :: Continue => ( ) ,
1681
1697
ProcessResult :: Suspend => break ,
1682
1698
ProcessResult :: Script ( _) => unreachable ! ( ) ,
1699
+ #[ cfg( feature = "encoding" ) ]
1700
+ ProcessResult :: MaybeChangeEncodingAndStartOver ( _) => unreachable ! ( ) ,
1683
1701
}
1684
1702
}
1685
1703
@@ -1841,13 +1859,27 @@ impl<Sink: TokenSink> Tokenizer<Sink> {
1841
1859
}
1842
1860
}
1843
1861
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
+
1844
1876
#[ cfg( test) ]
1845
1877
#[ allow( non_snake_case) ]
1846
1878
mod test {
1847
1879
use super :: option_push; // private items
1848
- use crate :: tendril:: { SliceExt , StrTendril } ;
1849
-
1850
1880
use super :: { TokenSink , TokenSinkResult , Tokenizer , TokenizerOpts } ;
1881
+ use crate :: tendril:: { SliceExt , StrTendril } ;
1882
+ use crate :: LocalName ;
1851
1883
1852
1884
use super :: interface:: { CharacterTokens , EOFToken , NullCharacterToken , ParseError } ;
1853
1885
use super :: interface:: { EndTag , StartTag , Tag , TagKind } ;
@@ -1856,8 +1888,6 @@ mod test {
1856
1888
use markup5ever:: buffer_queue:: BufferQueue ;
1857
1889
use std:: cell:: RefCell ;
1858
1890
1859
- use crate :: LocalName ;
1860
-
1861
1891
// LinesMatch implements the TokenSink trait. It is used for testing to see
1862
1892
// if current_line is being updated when process_token is called. The lines
1863
1893
// vector is a collection of the line numbers that each token is on.
0 commit comments