all files / src/ addMarkers.js

95.83% Statements 46/48
90.91% Branches 20/22
100% Functions 7/7
95.83% Lines 46/48
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      13×                                   13×     12× 10× 10×                                              
'use strict'
 
var lineNumberify = function lineNumberify (ast) {
  var lineNumber = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1
 
  return ast.reduce(function (result, node) {
    if (node.type === 'text') {
      if (node.value.indexOf('\n') === -1) {
        node.lineNumber = lineNumber
        result.nodes.push(node)
        return result
      }
 
      var lines = node.value.split('\n')
      for (var i = 0; i < lines.length; i++) {
        result.nodes.push({
          type: 'text',
          value: lines[i],
          lineNumber: i === 0 ? lineNumber : ++lineNumber
        })
      }
 
      result.lineNumber = lineNumber
      return result
    }
 
    Eif (node.children) {
      node.lineNumber = lineNumber
      var 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})
}
 
var wrapLines = function wrapLines (ast, markers) {
  var i = 0
  var wrapped = markers.reduce(function (nodes, marker) {
    var line = marker.line
    var 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: 'div',
      properties: {className: [marker.className || 'hljs-marker']},
      children: children,
      lineNumber: line
    })
 
    return nodes
  }, [])
 
  for (; i < ast.length; i++) {
    wrapped.push(ast[i])
  }
 
  return wrapped
}
 
module.exports = function (ast, options) {
  var markers = options.markers.map(function (marker) {
    return marker.line ? marker : {line: marker}
  }).sort(function (nodeA, nodeB) {
    return nodeA.line - nodeB.line
  })
 
  var numbered = lineNumberify(ast).nodes
  var wrapped = wrapLines(numbered, markers)
  return wrapped
}