// Copyright 2014-2017 The html5ever Project Developers. See the // COPYRIGHT file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. #[macro_use] extern crate html5ever; extern crate markup5ever_rcdom as rcdom; use std::io; use html5ever::parse_document; use html5ever::tendril::TendrilSink; use rcdom::{Handle, NodeData, RcDom}; // This is not proper HTML serialization, of course. fn walk(indent: usize, handle: &Handle) { let node = handle; for _ in 0..indent { print!(" "); } match node.data { NodeData::Document => println!("#Document"), NodeData::Doctype { ref name, ref public_id, ref system_id, } => println!("", name, public_id, system_id), NodeData::Text { ref contents } => { println!("#text: {}", contents.borrow().escape_default()) }, NodeData::Comment { ref contents } => println!("", contents.escape_default()), NodeData::Element { ref name, ref attrs, .. } => { assert!(name.ns == ns!(html)); print!("<{}", name.local); for attr in attrs.borrow().iter() { assert!(attr.name.ns == ns!()); print!(" {}=\"{}\"", attr.name.local, attr.value); } println!(">"); }, NodeData::ProcessingInstruction { .. } => unreachable!(), } for child in node.children.borrow().iter() { walk(indent + 4, child); } } fn main() { let stdin = io::stdin(); let dom = parse_document(RcDom::default(), Default::default()) .from_utf8() .read_from(&mut stdin.lock()) .unwrap(); walk(0, &dom.document); if !dom.errors.borrow().is_empty() { println!("\nParse errors:"); for err in dom.errors.borrow().iter() { println!(" {}", err); } } }