1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use super::Element;

impl<'a> From<roxmltree::Document<'a>> for crate::BasicElement<web_sys::SvgsvgElement> {
	fn from(doc: roxmltree::Document) -> Self {
		let node = doc.root_element();
		let element = crate::create::svg();

		for attribute in node.attributes() {
			element.set_attribute(attribute.name(), attribute.value()).expect("can't set attribute on an svg element");
		}

		let children = node
			.children()
			.filter_map(|child| -> Option<Box<dyn crate::Element>> {
				match child.node_type() {
					roxmltree::NodeType::Element => Some(Box::new(crate::BasicElement::<web_sys::SvgElement>::from(child))),
					_ => None,
				}
			})
			.collect::<Vec<_>>();

		let me = Self { children, element, event_handlers: crate::EventHandlers::default(), classes: Default::default() };
		for child in me.children.iter() {
			me.element.append_child(&child.element()).expect("can't append child");
		}
		me
	}
}

impl<'a, 'b> From<roxmltree::Node<'a, 'b>> for crate::BasicElement<web_sys::SvgElement> {
	fn from(node: roxmltree::Node) -> Self {
		let element: web_sys::SvgElement = wasm_bindgen::JsCast::unchecked_into(crate::dom().create_element_ns(Some(wasm_bindgen::intern("http://www.w3.org/2000/svg")), node.tag_name().name()).expect("can't create svg element"));

		for attribute in node.attributes() {
			element.set_attribute(attribute.name(), attribute.value()).expect("can't set attribute on an svg element");
		}

		let children = node
			.children()
			.filter_map(|child| -> Option<Box<dyn crate::Element>> {
				match child.node_type() {
					roxmltree::NodeType::Element => Some(Box::new(Self::from(child))),
					_ => None,
				}
			})
			.collect::<Vec<_>>();

		let me = Self { children, element, event_handlers: crate::EventHandlers::default(), classes: Default::default() };
		for child in me.children.iter() {
			me.element.append_child(&child.element()).expect("can't append child");
		}
		me
	}
}