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 93 | 1x 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 } |