disparity
Version:
Colorized string diff ideal for text/code that spans through multiple lines
87 lines (73 loc) • 2.15 kB
JavaScript
;
var disparity = require('./disparity');
// decided to not use an external lib because we have very few options
// and very basic logic
exports.parse = function(argv) {
var args = {
help: argv.indexOf('--help') !== -1 || argv.indexOf('-h') !== -1 || !argv.length,
version: argv.indexOf('--version') !== -1 || argv.indexOf('-v') !== -1,
unified: argv.indexOf('-u') !== -1 || argv.indexOf('--unified') !== -1,
unifiedNoColor: argv.indexOf('-x') !== -1 || argv.indexOf('--unified-no-color') !== -1,
paths: argv.slice(-2).filter(nonArgs),
errors: []
};
// default mode is "--chars"
args.chars = !args.unified;
var len = args.paths.length;
if (!args.help && !args.version && len !== 2) {
args.errors.push('Error: you should provide 2 file paths, found "' + len + '".');
}
return args;
};
function nonArgs(val) {
// arguments starts with "-" so we ignore those
return val.indexOf('-') !== 0;
}
exports.run = function(args, out, err) {
out = out || process.stdout;
err = err || process.stderr;
if (args.help) {
showHelp(out);
return 0;
}
if (args.version) {
out.write('disparity v' + require('./package.json').version + '\n');
return 0;
}
if (args.errors && args.errors.length) {
args.errors.forEach(function(e) {
err.write(e + '\n');
});
err.write('\n');
showHelp(out);
return 1;
}
var fs = require('fs');
var f1 = fs.readFileSync(args.paths[0]).toString();
var f2 = fs.readFileSync(args.paths[1]).toString();
var method = 'chars';
if (args.unified) {
method = 'unified';
}
if (args.unifiedNoColor) {
method = 'unifiedNoColor';
}
// defaul to char diff
out.write(disparity[method](f1, f2, {
paths: args.paths
}));
return 0;
};
function showHelp(out) {
out.write([
'disparity [OPTIONS] <file_1> <file_2>',
'Colorized string diff.',
'',
'Options:',
' -u, --unified Output unified diff.',
' -c, --chars Output char diff (default mode).',
' -v, --version Display current version.',
' -h, --help Display this help.',
''
].join('\n'));
}