All files addMarkers.js

95.83% Statements 46/48
88% Branches 22/25
100% Functions 7/7
95.83% Lines 46/48

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 931x 8x 8x   20x 13x 9x 9x 9x     4x 4x 8x             4x 4x     7x 7x 7x 7x 7x 7x 7x                   1x 1x 1x 2x 2x 2x 15x 2x 2x     13x 11x 11x     2x 2x       2x               2x     1x 4x     1x     1x 1x   2x     1x     1x 1x 1x    
const lineNumberify = function lineNumberify(ast, lineNum = 1) {
  let lineNumber = lineNum
  return ast.reduce(
    (result, node) => {
      if (node.type === 'text') {
        if (node.value.indexOf('\n') === -1) {
          node.lineNumber = lineNumber
          result.nodes.push(node)
          return result
        }
 
        const lines = node.value.split('\n')
        for (let i = 0; i < lines.length; i++) {
          result.nodes.push({
            type: 'text',
            value: i === lines.length - 1 ? lines[i] : `${lines[i]}\n`,
            lineNumber: i === 0 ? lineNumber : ++lineNumber
          })
        }
 
        result.lineNumber = lineNumber
        return result
      }
 
      Eif (node.children) {
        node.lineNumber = lineNumber
        const processed = lineNumberify(node.children, lineNumber)
        node.children = processed.nodes
        result.lineNumber = processed.lineNumber
        result.nodes.push(node)
        return result
      }
 
      result.nodes.push(node)
      return result
    },
    {nodes: [], lineNumber: lineNumber}
  )
}
 
const wrapLines = function wrapLines(ast, markers, options) {
  let i = 0
  const wrapped = markers.reduce((nodes, marker) => {
    const line = marker.line
    const children = []
    for (; i < ast.length; i++) {
      if (ast[i].lineNumber < line) {
        nodes.push(ast[i])
        continue
      }
 
      if (ast[i].lineNumber === line) {
        children.push(ast[i])
        continue
      }
 
      Eif (ast[i].lineNumber > line) {
        break
      }
    }
 
    nodes.push({
      type: 'element',
      tagName: marker.component || 'div',
      properties: marker.component ? options : {className: marker.className || 'refractor-marker'},
      children: children,
      lineNumber: line
    })
 
    return nodes
  }, [])
 
  for (; i < ast.length; i++) {
    wrapped.push(ast[i])
  }
 
  return wrapped
}
 
module.exports = function(ast, options) {
  const markers = options.markers
    .map(marker => {
      return marker.line ? marker : {line: marker}
    })
    .sort((nodeA, nodeB) => {
      return nodeA.line - nodeB.line
    })
 
  const numbered = lineNumberify(ast).nodes
  const wrapped = wrapLines(numbered, markers, options)
  return wrapped
}