#!/usr/bin/env run-cargo-script
extern crate markup5ever;
extern crate xml5ever;
use std::io;
use markup5ever::buffer_queue::BufferQueue;
use xml5ever::tendril::{ByteTendril, ReadExt};
use xml5ever::tokenizer::{Doctype, Pi, ProcessResult, Token, TokenSink, XmlTokenizer};
struct SimpleTokenPrinter;
impl TokenSink for SimpleTokenPrinter {
type Handle = ();
fn process_token(&self, token: Token) -> ProcessResult<()> {
match token {
Token::Characters(b) => {
println!("TEXT: {}", &*b);
},
Token::NullCharacter => print!("NULL"),
Token::Tag(tag) => {
println!("{:?} {} ", tag.kind, &*tag.name.local);
},
Token::ParseError(err) => {
println!("ERROR: {err}");
},
Token::ProcessingInstruction(Pi {
ref target,
ref data,
}) => {
println!("PI : <?{target} {data}?>");
},
Token::Comment(ref comment) => {
println!("<!--{comment:?}-->");
},
Token::EndOfFile => {
println!("EOF");
},
Token::Doctype(Doctype {
ref name,
ref public_id,
..
}) => {
println!("<!DOCTYPE {name:?} {public_id:?}>");
},
};
ProcessResult::Continue
}
}
fn main() {
let sink = SimpleTokenPrinter;
let mut input = ByteTendril::new();
io::stdin().read_to_tendril(&mut input).unwrap();
let input_buffer = BufferQueue::default();
input_buffer.push_back(input.try_reinterpret().unwrap());
let tok = XmlTokenizer::new(sink, Default::default());
let _ = tok.feed(&input_buffer);
tok.end();
}