#!/usr/bin/env run-cargo-script
extern crate xml5ever;
use std::io;
use std::default::Default;
use xml5ever::tendril::{ByteTendril, ReadExt};
use xml5ever::tokenizer::{TokenSink, Token, XmlTokenizer, ParseError};
use xml5ever::tokenizer::{CharacterTokens, NullCharacterToken, TagToken};
use xml5ever::tokenizer::{PIToken, Pi, CommentToken};
use xml5ever::tokenizer::{EOFToken, DoctypeToken, Doctype};
struct SimpleTokenPrinter;
impl TokenSink for SimpleTokenPrinter {
fn process_token(&mut self, token: Token) {
match token {
CharacterTokens(b) => {
println!("TEXT: {}", &*b);
},
NullCharacterToken => print!("NULL"),
TagToken(tag) => {
println!("{:?} {} ", tag.kind, &*tag.name.local);
},
ParseError(err) => {
println!("ERROR: {}", err);
},
PIToken(Pi{ref target, ref data}) => {
println!("PI : <?{} {}?>", &*target, &*data);
},
CommentToken(ref comment) => {
println!("<!--{:?}-->", &*comment);
},
EOFToken => {
println!("EOF");
},
DoctypeToken(Doctype{ref name, ref public_id, ..}) => {
println!("<!DOCTYPE {:?} {:?}>", &*name, &*public_id);
}
}
}
}
fn main() {
let sink = SimpleTokenPrinter;
let mut input = ByteTendril::new();
io::stdin().read_to_tendril(&mut input).unwrap();
let input = input.try_reinterpret().unwrap();
let mut tok = XmlTokenizer::new(sink, Default::default());
tok.feed(input);
tok.end();
}