diff options
Diffstat (limited to 'assets/node_modules/unist-util-visit-parents/index.js')
-rw-r--r-- | assets/node_modules/unist-util-visit-parents/index.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/assets/node_modules/unist-util-visit-parents/index.js b/assets/node_modules/unist-util-visit-parents/index.js new file mode 100644 index 0000000..c726359 --- /dev/null +++ b/assets/node_modules/unist-util-visit-parents/index.js @@ -0,0 +1,78 @@ +'use strict' + +module.exports = visitParents + +var convert = require('unist-util-is/convert') + +var CONTINUE = true +var SKIP = 'skip' +var EXIT = false + +visitParents.CONTINUE = CONTINUE +visitParents.SKIP = SKIP +visitParents.EXIT = EXIT + +function visitParents(tree, test, visitor, reverse) { + var is + + if (typeof test === 'function' && typeof visitor !== 'function') { + reverse = visitor + visitor = test + test = null + } + + is = convert(test) + + one(tree, null, []) + + // Visit a single node. + function one(node, index, parents) { + var result = [] + var subresult + + if (!test || is(node, index, parents[parents.length - 1] || null)) { + result = toResult(visitor(node, parents)) + + if (result[0] === EXIT) { + return result + } + } + + if (node.children && result[0] !== SKIP) { + subresult = toResult(all(node.children, parents.concat(node))) + return subresult[0] === EXIT ? subresult : result + } + + return result + } + + // Visit children in `parent`. + function all(children, parents) { + var min = -1 + var step = reverse ? -1 : 1 + var index = (reverse ? children.length : min) + step + var result + + while (index > min && index < children.length) { + result = one(children[index], index, parents) + + if (result[0] === EXIT) { + return result + } + + index = typeof result[1] === 'number' ? result[1] : index + step + } + } +} + +function toResult(value) { + if (value !== null && typeof value === 'object' && 'length' in value) { + return value + } + + if (typeof value === 'number') { + return [CONTINUE, value] + } + + return [value] +} |