diff2html/src/printer-utils.js

141 lines
3.7 KiB
JavaScript
Raw Normal View History

2015-04-11 23:34:33 +00:00
/*
*
* PrinterUtils (printer-utils.js)
* Author: rtfpessoa
*
*/
(function(ctx, undefined) {
2015-04-12 01:59:54 +00:00
var jsDiff = require('diff');
var utils = require('./utils.js').Utils;
var Rematch = require('./rematch.js').Rematch;
2015-04-12 01:59:54 +00:00
function PrinterUtils() {
2015-04-11 23:34:33 +00:00
}
PrinterUtils.prototype.getHtmlId = function(file) {
var hashCode = function(text) {
var hash = 0, i, chr, len;
if (text.length == 0) return hash;
for (i = 0, len = text.length; i < len; i++) {
chr = text.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0; // Convert to 32bit integer
}
return hash;
};
return "d2h-" + hashCode(this.getDiffName(file)).toString().slice(-6);
};
PrinterUtils.prototype.getDiffName = function(file) {
2015-04-19 23:24:19 +00:00
var oldFilename = file.oldName;
var newFilename = file.newName;
if (oldFilename && newFilename
&& oldFilename !== newFilename
&& !isDeletedName(newFilename)) {
return oldFilename + ' -> ' + newFilename;
2015-04-19 23:24:19 +00:00
} else if (newFilename && !isDeletedName(newFilename)) {
2015-04-12 01:59:54 +00:00
return newFilename;
} else if (oldFilename) {
return oldFilename;
} else {
return 'Unknown filename';
2015-04-12 01:59:54 +00:00
}
};
PrinterUtils.prototype.diffHighlight = function(diffLine1, diffLine2, config) {
2015-04-12 01:59:54 +00:00
var lineStart1, lineStart2;
var prefixSize = 1;
2015-04-11 23:34:33 +00:00
if (config.isCombined) {
prefixSize = 2;
}
2015-04-11 23:34:33 +00:00
2015-04-12 01:59:54 +00:00
lineStart1 = diffLine1.substr(0, prefixSize);
lineStart2 = diffLine2.substr(0, prefixSize);
2015-04-11 23:34:33 +00:00
2015-04-12 01:59:54 +00:00
diffLine1 = diffLine1.substr(prefixSize);
diffLine2 = diffLine2.substr(prefixSize);
2015-04-11 23:34:33 +00:00
var diff;
if (config.charByChar) {
diff = jsDiff.diffChars(diffLine1, diffLine2);
} else {
diff = jsDiff.diffWordsWithSpace(diffLine1, diffLine2);
}
var highlightedLine = '';
2015-04-11 23:34:33 +00:00
var changedWords = [];
2015-12-09 22:17:26 +00:00
if (!config.charByChar && config.matching === 'words') {
var treshold = 0.25;
if (typeof(config.matchWordsThreshold) !== "undefined") {
treshold = config.matchWordsThreshold;
}
var matcher = Rematch.rematch(function(a, b) {
var amod = a.value,
bmod = b.value,
result = Rematch.distance(amod, bmod);
return result;
});
var removed = diff.filter(function isRemoved(element){
return element.removed;
});
var added = diff.filter(function isAdded(element){
return element.added;
});
var chunks = matcher(added, removed);
chunks = chunks.forEach(function(chunk){
if(chunk[0].length === 1 && chunk[1].length === 1) {
var dist = Rematch.distance(chunk[0][0].value, chunk[1][0].value)
if (dist < treshold) {
changedWords.push(chunk[0][0]);
changedWords.push(chunk[1][0]);
}
}
});
}
diff.forEach(function(part) {
var addClass = changedWords.indexOf(part) > -1 ? ' class="d2h-change"' : '';
2015-04-12 01:59:54 +00:00
var elemType = part.added ? 'ins' : part.removed ? 'del' : null;
2015-06-21 21:49:05 +00:00
var escapedValue = utils.escape(part.value);
2015-04-11 23:34:33 +00:00
if (elemType !== null) {
highlightedLine += '<' + elemType + addClass + '>' + escapedValue + '</' + elemType + '>';
} else {
highlightedLine += escapedValue;
}
2015-04-12 01:59:54 +00:00
});
2015-04-11 23:34:33 +00:00
2015-04-12 01:59:54 +00:00
return {
2015-05-31 22:07:23 +00:00
first: {
prefix: lineStart1,
line: removeIns(highlightedLine)
},
second: {
prefix: lineStart2,
line: removeDel(highlightedLine)
}
2015-04-12 01:59:54 +00:00
}
};
2015-04-11 23:34:33 +00:00
2015-04-19 23:24:19 +00:00
function isDeletedName(name) {
return name === 'dev/null';
2015-04-19 23:24:19 +00:00
}
2015-04-12 01:59:54 +00:00
function removeIns(line) {
return line.replace(/(<ins[^>]*>((.|\n)*?)<\/ins>)/g, '');
2015-04-11 23:34:33 +00:00
}
2015-04-12 01:59:54 +00:00
function removeDel(line) {
return line.replace(/(<del[^>]*>((.|\n)*?)<\/del>)/g, '');
2015-04-12 01:59:54 +00:00
}
module.exports['PrinterUtils'] = new PrinterUtils();
2015-04-11 23:34:33 +00:00
2015-04-12 01:59:54 +00:00
})(this);