Sha256: ed7f9a40c9b92ca41a9bf69b71fb8b3ab49e16a6370d870a47597ffde9f78d9d

Contents?: true

Size: 1.59 KB

Versions: 23

Compression:

Stored size: 1.59 KB

Contents

'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]
}

Version data entries

23 entries across 23 versions & 1 rubygems

Version Path
trusty-cms-5.0.7 node_modules/unist-util-visit-parents/index.js
trusty-cms-5.0.6 node_modules/unist-util-visit-parents/index.js
trusty-cms-5.0.5 node_modules/unist-util-visit-parents/index.js
trusty-cms-5.0.4 node_modules/unist-util-visit-parents/index.js
trusty-cms-5.0.3 node_modules/unist-util-visit-parents/index.js
trusty-cms-5.0.2 node_modules/unist-util-visit-parents/index.js
trusty-cms-5.0.1 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.3.5 node_modules/unist-util-visit-parents/index.js
trusty-cms-5.0.0 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.3.4 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.3.3 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.3.2 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.3.1 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.3 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.2.3 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.2.2 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.2.1 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.2 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.1.9 node_modules/unist-util-visit-parents/index.js
trusty-cms-4.1.8 node_modules/unist-util-visit-parents/index.js