diff options
author | Martin Fischer <martin@push-f.com> | 2021-04-08 08:42:01 +0200 |
---|---|---|
committer | Martin Fischer <martin@push-f.com> | 2021-04-08 15:40:37 +0200 |
commit | 57e7eefcbe6fb8c3dc4b01c707be9de4c34963a7 (patch) | |
tree | 6a9d296389bf3023396592c8514ed6712e011c7f /examples/noop-tree-builder.rs |
import https://github.com/servo/html5ever
commit d1206daa740305f55a5fa159e43eb33afc359cb4
Diffstat (limited to 'examples/noop-tree-builder.rs')
-rw-r--r-- | examples/noop-tree-builder.rs | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/examples/noop-tree-builder.rs b/examples/noop-tree-builder.rs new file mode 100644 index 0000000..0775449 --- /dev/null +++ b/examples/noop-tree-builder.rs @@ -0,0 +1,112 @@ +// 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 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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<usize, QualName>, +} + +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<Attribute>, _: 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<usize>) {} + + fn append_based_on_parent_node( + &mut self, + _element: &usize, + _prev_element: &usize, + _new_node: NodeOrText<usize>, + ) { + } + + 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<usize>) {} + + fn append_doctype_to_document(&mut self, _: StrTendril, _: StrTendril, _: StrTendril) {} + fn add_attrs_if_missing(&mut self, target: &usize, _attrs: Vec<Attribute>) { + 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(); +} |