1 // Copyright 2014-2017 The html5ever Project Developers. See the
2 // COPYRIGHT file at the top-level directory of this distribution.
4 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
5 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7 // option. This file may not be copied, modified, or distributed
8 // except according to those terms.
10 extern crate html5ever
;
12 use std
::default::Default
;
15 use html5ever
::tendril
::*;
16 use html5ever
::tokenizer
::BufferQueue
;
17 use html5ever
::tokenizer
::{CharacterTokens, EndTag, NullCharacterToken, StartTag, TagToken}
;
18 use html5ever
::tokenizer
::{
19 ParseError
, Token
, TokenSink
, TokenSinkResult
, Tokenizer
, TokenizerOpts
,
22 #[derive(Copy, Clone)]
28 fn is_char(&mut self, is_char
: bool
) {
29 match (self.in_char_run
, is_char
) {
30 (false, true) => print
!("CHAR : \""),
31 (true, false) => println
!("\""),
34 self.in_char_run
= is_char
;
37 fn do_char(&mut self, c
: char) {
39 print
!("{}", c
.escape_default().collect
::<String
>());
43 impl TokenSink
for TokenPrinter
{
46 fn process_token(&mut self, token
: Token
, _line_number
: u64) -> TokenSinkResult
<()> {
48 CharacterTokens(b
) => {
53 NullCharacterToken
=> self.do_char('
\0'
),
56 // This is not proper HTML serialization, of course.
58 StartTag
=> print
!("TAG : <\x1b[32m{}\x1b[0m", tag
.name
),
59 EndTag
=> print
!("TAG : <\x1b[31m/{}\x1b[0m", tag
.name
),
61 for attr
in tag
.attrs
.iter() {
63 " \x1b[36m{}\x1b[0m='\x1b[34m{}\x1b[0m'",
64 attr
.name
.local
, attr
.value
68 print
!(" \x1b[31m/\x1b[0m");
74 println
!("ERROR: {}", err
);
78 println
!("OTHER: {:?}", token
);
81 TokenSinkResult
::Continue
86 let mut sink
= TokenPrinter { in_char_run: false }
;
87 let mut chunk
= ByteTendril
::new();
88 io
::stdin().read_to_tendril(&mut chunk
).unwrap();
89 let mut input
= BufferQueue
::new();
90 input
.push_back(chunk
.try_reinterpret().unwrap());
92 let mut tok
= Tokenizer
::new(
99 let _
= tok
.feed(&mut input
);
100 assert
!(input
.is_empty());