StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.5 KiB
95 lines
2.5 KiB
/*jshint asi:true */
|
|
'use strict';
|
|
|
|
var fs = require('fs')
|
|
, path = require('path')
|
|
, utl = require('../utl')
|
|
, highlighter = require('..')
|
|
, colors = require('ansicolors')
|
|
, diffFile = path.join(__dirname, 'fixtures', 'git-diff.txt')
|
|
, 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;
|
|
}
|
|
|
|
var 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])
|
|
, 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'));
|
|
|
|
|