rainbow_core/renderer/from_html/
mod.rs1use html_parser::{Dom, Node};
2
3use crate::Result;
4
5use crate::{Element, RainbowError, RenderNode};
6
7impl TryFrom<Dom> for RenderNode {
8 type Error = RainbowError;
9
10 fn try_from(dom: Dom) -> Result<Self> {
11 if !dom.errors.is_empty() {
12 return Err(RainbowError::syntax_error(dom.errors[0].to_string()));
13 }
14 let mut root = vec![];
15 for node in dom.children {
16 root.push(RenderNode::try_from(node)?)
17 }
18 Ok(RenderNode::Root(root))
19 }
20}
21
22impl TryFrom<Node> for RenderNode {
23 type Error = RainbowError;
24
25 fn try_from(node: Node) -> Result<Self> {
26 match node {
27 Node::Text(v) => Ok(RenderNode::Text(v)),
28 Node::Element(v) => Ok(RenderNode::Element(Element::try_from(v)?)),
29 Node::Comment(_) => Ok(RenderNode::Text(String::new())),
30 }
31 }
32}
33
34impl TryFrom<html_parser::Element> for Element {
35 type Error = RainbowError;
36
37 fn try_from(element: html_parser::Element) -> Result<Self> {
38 Ok(Element {
39 name: element.name.split(".").map(|s| s.to_string()).collect(),
40 attributes: Default::default(),
41 children: vec![],
42 })
43 }
44}