hexer
Version:
Hex Dumper (streaming, sync, and cli)
81 lines (65 loc) • 1.93 kB
JavaScript
;
var color = require('ansi-color').set;
var extend = require('xtend');
var extendInto = require('xtend/mutable');
var render = require('./render');
var hex = require('./index');
module.exports = diff;
// TODO: provide a stream for this
function diff(a, b, opts) {
var defaults = {
emptyHuman: ' '
};
var aopts = extend(opts.hexOpts, defaults);
var bopts = extend(opts.hexOpts, defaults);
if (opts.colored) {
extendInto(aopts, render.coloredOptions);
extendInto(bopts, render.coloredOptions);
opts.decorateDivide = coloredDivide;
opts.decorateDiffA = coloredDiffA;
opts.decorateDiffB = coloredDiffB;
}
if (opts.decorateDiffA) {
aopts.decorateHexen = highlightA;
aopts.decorateHuman = highlightA;
}
if (opts.decorateDiffB) {
bopts.decorateHexen = highlightB;
bopts.decorateHuman = highlightB;
}
var adump = hex(a, aopts).split('\n');
var bdump = hex(b, bopts).split('\n');
return adump.map(function each(aline, i) {
var bline = bdump[i];
var differs = aline !== bline;
var sep = differs ? '|' : ' ';
if (opts.decorateDivide) {
sep = opts.decorateDivide(sep, differs);
}
return aline + ' ' + sep + ' ' + bline;
}).join('\n');
function highlightA(i, j, str) {
if (a[i] !== b[i]) {
str = opts.decorateDiffA(render.stripColor(str));
}
return str;
}
function highlightB(i, j, str) {
if (a[i] !== b[i]) {
str = opts.decorateDiffB(render.stripColor(str));
}
return str;
}
}
function coloredDivide(str, differs) {
if (differs) {
str = color(str, 'blue+bold');
}
return str;
}
function coloredDiffA(str) {
return color(str, 'red+bold');
}
function coloredDiffB(str) {
return color(str, 'green+bold');
}