1use crate::*;
4
5#[must_use]
11pub fn get_nodes_between(start: &web_sys::Node, end: &web_sys::Node) -> Vec<web_sys::Node> {
12 let parent = start.parent_node().unwrap();
13 debug_assert_eq!(
14 parent,
15 end.parent_node().unwrap(),
16 "parents of `start` and `end` do not match"
17 );
18
19 let mut nodes = Vec::new();
20
21 let mut next = start.next_sibling();
22 while let Some(current) = next {
23 let tmp = current.next_sibling();
24 if ¤t == end {
25 break;
26 } else {
27 nodes.push(current);
28 }
29 next = tmp;
30 }
31
32 nodes
33}
34
35pub fn wrap_in_document_fragment(view: View) -> View {
43 let fragment = web_sys::window()
44 .unwrap()
45 .document()
46 .unwrap()
47 .create_document_fragment();
48
49 for node in view.as_web_sys() {
50 fragment.append_child(&node).unwrap();
51 }
52
53 View::from_node(HtmlNode::from_web_sys(fragment.into()))
54}
55
56pub fn unwrap_from_document_fragment(view: View) -> View {
60 if view.nodes.len() != 1 {
61 return view;
62 }
63 let node = view.nodes[0].as_web_sys();
64 if node.node_type() != web_sys::Node::DOCUMENT_FRAGMENT_NODE {
65 return view;
66 }
67
68 let fragment = node.unchecked_ref::<web_sys::DocumentFragment>();
69
70 let mut nodes = Vec::new();
71 let mut next = fragment.first_child();
72 while let Some(current) = next {
73 next = current.next_sibling();
74 nodes.push(current);
75 }
76
77 View::from_nodes(nodes.into_iter().map(HtmlNode::from_web_sys).collect())
78}
79
80pub fn clone_nodes_via_web_sys(view: &View) -> View {
83 let nodes = view
84 .as_web_sys()
85 .into_iter()
86 .map(HtmlNode::from_web_sys)
87 .collect();
88 View::from_nodes(nodes)
89}