File tree Expand file tree Collapse file tree 7 files changed +33
-18
lines changed Expand file tree Collapse file tree 7 files changed +33
-18
lines changed Original file line number Diff line number Diff line change 2
2
3
3
## [ Unreleased]
4
4
5
+ ### Performance
6
+
7
+ - Use a simpler way for HTML tree traversal.
8
+
5
9
## [ 0.10.0] - 2023-06-16
6
10
7
11
### Added
Original file line number Diff line number Diff line change 2
2
3
3
## [ Unreleased]
4
4
5
+ ### Performance
6
+
7
+ - Use a simpler way for HTML tree traversal.
8
+
5
9
## [ 0.10.0] - 2023-06-16
6
10
7
11
### Added
Original file line number Diff line number Diff line change 2
2
3
3
## [ Unreleased]
4
4
5
+ ### Performance
6
+
7
+ - Use a simpler way for HTML tree traversal.
8
+
5
9
## 0.10.0 - 2023-06-17
6
10
7
11
- Initial public release
Original file line number Diff line number Diff line change 2
2
3
3
## [ Unreleased]
4
4
5
+ ### Performance
6
+
7
+ - Use a simpler way for HTML tree traversal.
8
+
5
9
## [ 0.10.0] - 2023-06-16
6
10
7
11
### Added
Original file line number Diff line number Diff line change @@ -61,6 +61,12 @@ impl Document {
61
61
}
62
62
}
63
63
64
+ #[ inline]
65
+ pub ( super ) fn next_node_id ( & self , node_id : NodeId ) -> Option < NodeId > {
66
+ node_id. next ( ) . filter ( |& next| next. get ( ) < self . nodes . len ( ) )
67
+ }
68
+
69
+ #[ inline]
64
70
pub ( super ) fn as_element ( & self , node_id : NodeId ) -> Option < Element < ' _ > > {
65
71
if let NodeData :: Element { element, .. } = & self [ node_id] . data {
66
72
Some ( Element :: new ( self , node_id, element) )
@@ -246,17 +252,6 @@ impl Document {
246
252
successors ( self [ node] . first_child , |& node| self [ node] . next_sibling )
247
253
}
248
254
249
- pub ( crate ) fn node_and_ancestors ( & self , node : NodeId ) -> impl Iterator < Item = NodeId > + ' _ {
250
- successors ( Some ( node) , move |& node| self [ node] . parent )
251
- }
252
-
253
- pub ( crate ) fn next_in_tree_order ( & self , node : NodeId ) -> Option < NodeId > {
254
- self [ node] . first_child . or_else ( || {
255
- self . node_and_ancestors ( node)
256
- . find_map ( |ancestor| self [ ancestor] . next_sibling )
257
- } )
258
- }
259
-
260
255
/// Serialize the document to HTML string.
261
256
pub ( crate ) fn serialize < W : Write > (
262
257
& self ,
Original file line number Diff line number Diff line change @@ -15,17 +15,17 @@ pub(crate) fn select<'a, 'b>(
15
15
Selectors :: compile ( selectors) . map ( |selectors| Select {
16
16
traverse : Traverse {
17
17
document,
18
- current : Some ( NodeId :: document_id ( ) ) ,
18
+ current : NodeId :: document_id ( ) ,
19
19
} ,
20
20
selectors,
21
21
} )
22
22
}
23
23
24
- /// An internal iterator that traverses a document in tree order .
24
+ /// An internal iterator that traverses a document.
25
25
struct Traverse < ' a > {
26
26
document : & ' a Document ,
27
27
// Current node being processed
28
- current : Option < NodeId > ,
28
+ current : NodeId ,
29
29
}
30
30
31
31
impl < ' a > Iterator for Traverse < ' a > {
@@ -34,11 +34,10 @@ impl<'a> Iterator for Traverse<'a> {
34
34
fn next ( & mut self ) -> Option < Self :: Item > {
35
35
// Loop until we either run out of nodes or find an element node
36
36
loop {
37
- if let Some ( current) = self . current {
38
- // Advance to the next node in tree order
39
- self . current = self . document . next_in_tree_order ( current) ;
37
+ if let Some ( next) = self . document . next_node_id ( self . current ) {
38
+ self . current = next;
40
39
// If the current node is an element node, return it, else continue with the loop
41
- if let Some ( element) = self . document . as_element ( current ) {
40
+ if let Some ( element) = self . document . as_element ( next ) {
42
41
return Some ( element) ;
43
42
}
44
43
} else {
Original file line number Diff line number Diff line change @@ -65,9 +65,14 @@ impl NodeId {
65
65
pub ( super ) fn document_id ( ) -> NodeId {
66
66
NodeId :: new ( 1 )
67
67
}
68
+ #[ inline]
68
69
pub ( super ) fn get ( self ) -> usize {
69
70
self . 0 . get ( )
70
71
}
72
+ #[ inline]
73
+ pub ( super ) fn next ( self ) -> Option < NodeId > {
74
+ self . get ( ) . checked_add ( 1 ) . map ( NodeId :: new)
75
+ }
71
76
}
72
77
73
78
/// Data associated with a `Node`.
You can’t perform that action at this time.
0 commit comments