Search in sources :

Example 1 with TailFilterDecision

use of com.fsck.k9.helper.jsoup.NodeFilter.TailFilterDecision in project k-9 by k9mail.

the class AdvancedNodeTraversor method filter.

/**
 * Start a depth-first filtering of the root and all of its descendants.
 *
 * @param root
 *         the root node point to traverse.
 *
 * @return The result of the filter operation.
 */
public FilterResult filter(Node root) {
    Node node = root;
    int depth = 0;
    while (node != null) {
        HeadFilterDecision headResult = filter.head(node, depth);
        if (headResult == HeadFilterDecision.STOP) {
            return FilterResult.STOPPED;
        }
        if (headResult == HeadFilterDecision.CONTINUE && node.childNodeSize() > 0) {
            node = node.childNode(0);
            ++depth;
            continue;
        }
        TailFilterDecision tailResult = TailFilterDecision.CONTINUE;
        while (node.nextSibling() == null && depth > 0) {
            if (headResult == HeadFilterDecision.CONTINUE || headResult == HeadFilterDecision.SKIP_CHILDREN) {
                tailResult = filter.tail(node, depth);
                if (tailResult == TailFilterDecision.STOP) {
                    return FilterResult.STOPPED;
                }
            }
            Node prev = node;
            node = node.parentNode();
            depth--;
            if (headResult == HeadFilterDecision.REMOVE || tailResult == TailFilterDecision.REMOVE) {
                prev.remove();
            }
            headResult = HeadFilterDecision.CONTINUE;
        }
        if (headResult == HeadFilterDecision.CONTINUE || headResult == HeadFilterDecision.SKIP_CHILDREN) {
            tailResult = filter.tail(node, depth);
            if (tailResult == TailFilterDecision.STOP) {
                return FilterResult.STOPPED;
            }
        }
        Node prev = node;
        node = node.nextSibling();
        if (headResult == HeadFilterDecision.REMOVE) {
            prev.remove();
        }
        if (prev == root) {
            return headResult == HeadFilterDecision.REMOVE ? FilterResult.ROOT_REMOVED : FilterResult.ENDED;
        }
    }
    return FilterResult.ENDED;
}
Also used : HeadFilterDecision(com.fsck.k9.helper.jsoup.NodeFilter.HeadFilterDecision) Node(org.jsoup.nodes.Node) TailFilterDecision(com.fsck.k9.helper.jsoup.NodeFilter.TailFilterDecision)

Aggregations

HeadFilterDecision (com.fsck.k9.helper.jsoup.NodeFilter.HeadFilterDecision)1 TailFilterDecision (com.fsck.k9.helper.jsoup.NodeFilter.TailFilterDecision)1 Node (org.jsoup.nodes.Node)1