// 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; use std::borrow::Cow; use std::collections::HashMap; use std::default::Default; use std::io; use html5ever::parse_document; use html5ever::tendril::*; use html5ever::tree_builder::{ElementFlags, NodeOrText, QuirksMode, TreeSink}; use html5ever::{Attribute, ExpandedName, QualName}; struct Sink { next_id: usize, names: HashMap, } impl Sink { fn get_id(&mut self) -> usize { let id = self.next_id; self.next_id += 2; id } } impl TreeSink for Sink { type Handle = usize; type Output = Self; fn finish(self) -> Self { self } fn get_document(&mut self) -> usize { 0 } fn get_template_contents(&mut self, target: &usize) -> usize { if let Some(expanded_name!(html "template")) = self.names.get(&target).map(|n| n.expanded()) { target + 1 } else { panic!("not a template element") } } fn same_node(&self, x: &usize, y: &usize) -> bool { x == y } fn elem_name(&self, target: &usize) -> ExpandedName { self.names.get(target).expect("not an element").expanded() } fn create_element(&mut self, name: QualName, _: Vec, _: ElementFlags) -> usize { let id = self.get_id(); self.names.insert(id, name); id } fn create_comment(&mut self, _text: StrTendril) -> usize { self.get_id() } #[allow(unused_variables)] fn create_pi(&mut self, target: StrTendril, value: StrTendril) -> usize { unimplemented!() } fn append_before_sibling(&mut self, _sibling: &usize, _new_node: NodeOrText) {} fn append_based_on_parent_node( &mut self, _element: &usize, _prev_element: &usize, _new_node: NodeOrText, ) { } fn parse_error(&mut self, _msg: Cow<'static, str>) {} fn set_quirks_mode(&mut self, _mode: QuirksMode) {} fn append(&mut self, _parent: &usize, _child: NodeOrText) {} fn append_doctype_to_document(&mut self, _: StrTendril, _: StrTendril, _: StrTendril) {} fn add_attrs_if_missing(&mut self, target: &usize, _attrs: Vec) { assert!(self.names.contains_key(&target), "not an element"); } fn remove_from_parent(&mut self, _target: &usize) {} fn reparent_children(&mut self, _node: &usize, _new_parent: &usize) {} fn mark_script_already_started(&mut self, _node: &usize) {} } fn main() { let sink = Sink { next_id: 1, names: HashMap::new(), }; let stdin = io::stdin(); parse_document(sink, Default::default()) .from_utf8() .read_from(&mut stdin.lock()) .unwrap(); }