-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNodeFilter.java
58 lines (54 loc) · 2.36 KB
/
NodeFilter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package org.jsoup.select;
import org.jsoup.nodes.Node;
/**
* Node filter interface. Provide an implementing class to {@link NodeTraversor} to iterate through nodes.
* <p>
* This interface provides two methods, {@code head} and {@code tail}. The head method is called when the node is first
* seen, and the tail method when all of the node's children have been visited. As an example, head can be used to
* create a start tag for a node, and tail to create the end tag.
* </p>
* <p>
* For every node, the filter has to decide whether to
* <ul>
* <li>continue ({@link FilterResult#CONTINUE}),</li>
* <li>skip all children ({@link FilterResult#SKIP_CHILDREN}),</li>
* <li>skip node entirely ({@link FilterResult#SKIP_ENTIRELY}),</li>
* <li>remove the subtree ({@link FilterResult#REMOVE}),</li>
* <li>interrupt the iteration and return ({@link FilterResult#STOP}).</li>
* </ul>
* The difference between {@link FilterResult#SKIP_CHILDREN} and {@link FilterResult#SKIP_ENTIRELY} is that the first
* will invoke {@link NodeFilter#tail(Node, int)} on the node, while the latter will not.
* Within {@link NodeFilter#tail(Node, int)}, both are equivalent to {@link FilterResult#CONTINUE}.
* </p>
*/
public interface NodeFilter {
/**
* Filter decision.
*/
enum FilterResult {
/** Continue processing the tree */
CONTINUE,
/** Skip the child nodes, but do call {@link NodeFilter#tail(Node, int)} next. */
SKIP_CHILDREN,
/** Skip the subtree, and do not call {@link NodeFilter#tail(Node, int)}. */
SKIP_ENTIRELY,
/** Remove the node and its children */
REMOVE,
/** Stop processing */
STOP
}
/**
* Callback for when a node is first visited.
* @param node the node being visited.
* @param depth the depth of the node, relative to the root node. E.g., the root node has depth 0, and a child node of that will have depth 1.
* @return Filter decision
*/
FilterResult head(Node node, int depth);
/**
* Callback for when a node is last visited, after all of its descendants have been visited.
* @param node the node being visited.
* @param depth the depth of the node, relative to the root node. E.g., the root node has depth 0, and a child node of that will have depth 1.
* @return Filter decision
*/
FilterResult tail(Node node, int depth);
}