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