'use strict' var fs = require('fs') var path = require('path') var highlighter = require('..') var colors = require('ansicolors') var diffFile = path.join(__dirname, 'git-diff.txt') var diff = fs.readFileSync(diffFile, 'utf-8') // @@ is not a valid js token, so when we see it, we can be sure that we are dealing with a git or svn diff var diffRegex = /^@@[^@]+@@$/m var diffIndRegex = /^(@@[^@]+@@)(.*)$/ var addRemRegex = /^[+-]/ var lines = diff.split('\n') function isDiff(lines) { return !!lines .filter(function(line) { return diffRegex.test(line) }) .length } diff = isDiff(lines) function tryHighlight(code) { // TODO: need to remove symbols added to get valid code // this should be done by getting the splits instead of the actual code from the highlighter // now we can remove first / last one after highlighting completed function tryAppending(appended, tryNext) { try { return highlighter.highlight(code + appended) } catch (e) { return tryNext(code) } } function tryRemoveLeadingComma(tryNext) { var success try { success = highlighter.highlight(code.replace(/^( +),(.+)$/, '$1 $2')) return success } catch (e) { return tryNext(code) } } function tryPlain() { try { return highlighter.highlight(code) } catch (e) { return tryCloseMustache() } } function tryCloseMustache() { return tryAppending('}', tryCloseParen) } function tryCloseParen() { return tryAppending('\\)', tryCloseMustacheParen) } function tryCloseMustacheParen() { return tryAppending('})', tryRemovingCommas) } function tryRemovingCommas() { return tryRemoveLeadingComma(giveUp) } function giveUp() { return code } return tryPlain() } function highlightDiffInd(line, matches) { var highlighted = colors.brightBlue(matches[1]) var code = matches[2] return code ? highlighted + tryHighlight(code) : highlighted } function colorsAddRemove(c) { return addRemRegex.test(c) ? colors.yellow(c) : c } function highlightDiff(line) { var diffIndMatches = diffIndRegex.exec(line) return diffIndMatches ? highlightDiffInd(line, diffIndMatches) : colorsAddRemove(line[0]) + tryHighlight(line.slice(1)) } var highlightFn = diff ? highlightDiff : tryHighlight var highlightedLines = lines.map(highlightFn) console.log(highlightedLines.join('\n'))