#!/usr/bin/env run-cargo-script
extern crate rbatis_xml_parser;
use std::io::{self, Read};
use std::default::Default;
use std::string::String;
use std::iter;
use rbatis_xml_parser::tendril::{ByteTendril, ReadExt};
use rbatis_xml_parser::{parse};
use rbatis_xml_parser::rcdom::{Document, Text, Element, RcDom, Handle};
fn walk(prefix: &str, handle: Handle) {
let node = handle.borrow();
print!("{}", prefix);
match node.node {
Document
=> println!("#document"),
Text(ref text) => {
println!("#text {}", escape_default(text))
},
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.iter()
.filter(|child| match child.borrow().node {
Text(_) | 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 mut input = ByteTendril::new();
io::stdin().read_to_tendril(&mut input).unwrap();
let input = input.try_reinterpret().unwrap();
let dom: RcDom = parse(iter::once(input), Default::default());
walk("", dom.document);
}