|
|
- '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'))
|