#!/usr/bin/env run-cargo-script
extern crate xml5ever;
use std::io::{self};
use std::default::Default;
use std::string::String;
use xml5ever::tendril::{TendrilSink};
use xml5ever::driver::{parse_document};
use xml5ever::rcdom::{NodeData, RcDom, Handle};
fn walk(prefix: &str, handle: Handle) {
let node = handle;
print!("{}", prefix);
match node.data {
NodeData::Document
=> println!("#document"),
NodeData::Text { ref contents } => {
println!("#text {}", escape_default(&contents.borrow()))
},
NodeData::Element { ref name, .. } => {
println!("{}", name.local);
},
_ => {},
}
let new_indent = {
let mut temp = String::new();
temp.push_str(prefix);
temp.push_str(" ");
temp
};
for child in node.children.borrow().iter()
.filter(|child| match child.data {
NodeData::Text { .. } | NodeData::Element { .. } => true,
_ => false,
}
) {
walk(&new_indent, child.clone());
}
}
pub fn escape_default(s: &str) -> String {
s.chars().flat_map(|c| c.escape_default()).collect()
}
fn main() {
let stdin = io::stdin();
let dom: RcDom = parse_document(RcDom::default(), Default::default())
.from_utf8()
.read_from(&mut stdin.lock())
.unwrap();;
walk("", dom.document);
}