forked from dequelabs/axe-core
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathis-node-in-context.js
More file actions
38 lines (36 loc) · 1.13 KB
/
is-node-in-context.js
File metadata and controls
38 lines (36 loc) · 1.13 KB
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
import contains from './contains';
/**
* Determines if a node is included or excluded in a given context
* @private
* @param {Node} node The node to test
* @param {Object} context "Resolved" context object, @see resolveContext
* @return {Boolean} [description]
*/
export default function isNodeInContext(node, { include = [], exclude = [] }) {
const filterInclude = include.filter(candidate => contains(candidate, node));
if (filterInclude.length === 0) {
return false;
}
const filterExcluded = exclude.filter(candidate => contains(candidate, node));
if (filterExcluded.length === 0) {
return true;
}
const deepestInclude = getDeepest(filterInclude);
const deepestExclude = getDeepest(filterExcluded);
return contains(deepestExclude, deepestInclude);
}
/**
* Get the deepest node in a given collection
* @private
* @param {Array} collection Array of nodes to test
* @return {Node} The deepest node
*/
function getDeepest(collection) {
let deepest;
for (const node of collection) {
if (!deepest || !contains(node, deepest)) {
deepest = node;
}
}
return deepest;
}