77 lines
2.1 KiB
JavaScript
77 lines
2.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var _ = require('lodash'),
|
||
|
temp = require('temp'),
|
||
|
fs = require('fs'),
|
||
|
exec = require('child_process').exec;
|
||
|
|
||
|
// Automatically track and cleanup files at exit
|
||
|
temp.track();
|
||
|
|
||
|
// Perform a comparison between a and b
|
||
|
// the callback should have parameters (err, result)
|
||
|
module.exports = function(a, b, asMarkdown, callback) {
|
||
|
|
||
|
//!!! this nested file-open is not a good pattern
|
||
|
// better would be to use promises and write the two files asynchronously
|
||
|
|
||
|
// open the first file
|
||
|
temp.open('wdiffa-', function(err, filea) {
|
||
|
//handle errors
|
||
|
if (err)
|
||
|
return callback(err);
|
||
|
|
||
|
//write the string to the file
|
||
|
fs.write(filea.fd, a);
|
||
|
|
||
|
//close the file
|
||
|
fs.close(filea.fd, function(err) {
|
||
|
if (err)
|
||
|
return callback(err);
|
||
|
|
||
|
//open the second file
|
||
|
temp.open('wdiffa-', function(err, fileb) {
|
||
|
if (err)
|
||
|
return callback(err);
|
||
|
|
||
|
//write the string to the file
|
||
|
fs.write(fileb.fd, b);
|
||
|
|
||
|
//close the file
|
||
|
fs.close(fileb.fd, function(err) {
|
||
|
if (err)
|
||
|
return callback(err);
|
||
|
|
||
|
var cmd = "./bin/wdiff " + filea.path + " " +fileb.path;
|
||
|
exec(cmd, function(err, stdout) {
|
||
|
|
||
|
if (err && err.code!=1 && err.code!=0) {
|
||
|
return callback(err);
|
||
|
}
|
||
|
|
||
|
//if no difference was found by wdiff, err.code will be 0
|
||
|
var wdiffSame;
|
||
|
wdiffSame = (err && err.code == 0) ? true:false;
|
||
|
|
||
|
|
||
|
var resData = {wdiff:stdout, same: wdiffSame};
|
||
|
if (asMarkdown) {
|
||
|
|
||
|
//!!! this needs more sophisticated parsing
|
||
|
//sub del and ins for the wdiff tags
|
||
|
var markdown = stdout;
|
||
|
markdown = markdown.replace(/\[-/g, '<del>');
|
||
|
markdown = markdown.replace(/-\]/g, '</del>');
|
||
|
markdown = markdown.replace(/{\+/g, '<ins>');
|
||
|
markdown = markdown.replace(/\+}/g, '</ins>');
|
||
|
resData.wdiff=markdown;
|
||
|
}
|
||
|
|
||
|
return callback(null, resData);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
}
|