use crate::*;
#[must_use]
pub fn get_nodes_between(start: &web_sys::Node, end: &web_sys::Node) -> Vec<web_sys::Node> {
let parent = start.parent_node().unwrap();
debug_assert_eq!(
parent,
end.parent_node().unwrap(),
"parents of `start` and `end` do not match"
);
let mut nodes = Vec::new();
let mut next = start.next_sibling();
while let Some(current) = next {
let tmp = current.next_sibling();
if ¤t == end {
break;
} else {
nodes.push(current);
}
next = tmp;
}
nodes
}
pub fn wrap_in_document_fragment(view: View) -> View {
let fragment = web_sys::window()
.unwrap()
.document()
.unwrap()
.create_document_fragment();
for node in view.as_web_sys() {
fragment.append_child(&node).unwrap();
}
View::from_node(HtmlNode::from_web_sys(fragment.into()))
}
pub fn unwrap_from_document_fragment(view: View) -> View {
if view.nodes.len() != 1 {
return view;
}
let node = view.nodes[0].as_web_sys();
if node.node_type() != web_sys::Node::DOCUMENT_FRAGMENT_NODE {
return view;
}
let fragment = node.unchecked_ref::<web_sys::DocumentFragment>();
let mut nodes = Vec::new();
let mut next = fragment.first_child();
while let Some(current) = next {
next = current.next_sibling();
nodes.push(current);
}
View::from_nodes(nodes.into_iter().map(HtmlNode::from_web_sys).collect())
}
pub fn clone_nodes_via_web_sys(view: &View) -> View {
let nodes = view
.as_web_sys()
.into_iter()
.map(HtmlNode::from_web_sys)
.collect();
View::from_nodes(nodes)
}