Skip to content

Commit f13a4e6

Browse files
committed
Upgrade ego-tree to 0.11.0 and html5ever to 0.37.1
- Bump ego-tree from 0.10.0 to 0.11.0 - Bump html5ever from 0.36.0 to 0.37.1 - Bump tendril from 0.4.3 to 0.5.0 (required by html5ever 0.37.1) - Add clone_subtree() method to TreeSink implementation
1 parent a2cfbe4 commit f13a4e6

3 files changed

Lines changed: 48 additions & 33 deletions

File tree

Cargo.lock

Lines changed: 11 additions & 29 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scraper/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ readme = "README.md"
1414

1515
[dependencies]
1616
cssparser = "0.36.0"
17-
ego-tree = "0.10.0"
18-
html5ever = "0.36.0"
17+
ego-tree = "0.11.0"
18+
html5ever = "0.37.1"
1919
indexmap = { version = "2.13.0", optional = true }
2020
precomputed-hash = "0.1.1"
2121
selectors = "0.35.0"
2222
serde = { version = "1.0.228", optional = true }
23-
tendril = "0.4.3"
23+
tendril = "0.5.0"
2424

2525
[dependencies.getopts]
2626
version = "0.2.24"

scraper/src/html/tree_sink.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::Html;
22
use crate::node::{Comment, Doctype, Element, Node, ProcessingInstruction, Text};
33
use crate::tendril_util::make as make_tendril;
4-
use ego_tree::NodeId;
4+
use ego_tree::{NodeId, Tree};
55
use html5ever::tendril::StrTendril;
66
use html5ever::tree_builder::{ElementFlags, NodeOrText, QuirksMode, TreeSink};
77
use html5ever::Attribute;
@@ -294,4 +294,37 @@ impl TreeSink for HtmlTreeSink {
294294
self.append(prev_element, child)
295295
}
296296
}
297+
298+
// Clone the subtree rooted at the given node.
299+
fn clone_subtree(&self, target: &Self::Handle) -> Self::Handle {
300+
let this = self.0.borrow();
301+
302+
fn clone_node_recursive(
303+
tree: &Tree<Node>,
304+
node_id: NodeId,
305+
new_tree: &mut Tree<Node>,
306+
parent_id: Option<NodeId>,
307+
) -> NodeId {
308+
let node = tree.get(node_id).unwrap();
309+
let cloned_value = node.value().clone();
310+
311+
let new_node_id = if let Some(parent) = parent_id {
312+
let mut parent_node = new_tree.get_mut(parent).unwrap();
313+
parent_node.append(cloned_value);
314+
parent_node.last_child().unwrap().id()
315+
} else {
316+
new_tree.orphan(cloned_value).id()
317+
};
318+
319+
for child in node.children() {
320+
clone_node_recursive(tree, child.id(), new_tree, Some(new_node_id));
321+
}
322+
323+
new_node_id
324+
}
325+
326+
drop(this);
327+
let mut this = self.0.borrow_mut();
328+
clone_node_recursive(&this.tree.clone(), *target, &mut this.tree, None)
329+
}
297330
}

0 commit comments

Comments
 (0)