in zeppelin-web/src/app/notebook/revisions-comparator/revisions-comparator.component.js [41:137]
$scope.compareRevisions = function() {
if ($scope.firstNoteRevisionForCompare && $scope.secondNoteRevisionForCompare) {
let paragraphs1 = $scope.firstNoteRevisionForCompare.note.paragraphs;
let paragraphs2 = $scope.secondNoteRevisionForCompare.note.paragraphs;
let added = 'added';
let deleted = 'deleted';
let compared = 'compared';
let merge = [];
for (let p1 of paragraphs1) {
let p2 = null;
for (let p of paragraphs2) {
if (p1.id === p.id) {
p2 = p;
break;
}
}
if (p2 === null) {
merge.push({paragraph: p1, firstString: (p1.text || '').split('\n')[0], type: deleted});
} else {
let colorClass = '';
let span = null;
let text1 = p1.text || '';
let text2 = p2.text || '';
let diff = window.JsDiff.diffLines(text1, text2);
let diffHtml = document.createDocumentFragment();
let identical = true;
let identicalClass = 'color-black';
diff.forEach(function(part) {
colorClass = part.added ? 'color-green-row' : part.removed ? 'color-red-row' : identicalClass;
span = document.createElement('span');
span.className = colorClass;
if (identical && colorClass !== identicalClass) {
identical = false;
}
let str = part.value;
if (str[str.length - 1] !== '\n') {
str = str + '\n';
}
span.appendChild(document.createTextNode(str));
diffHtml.appendChild(span);
});
let pre = document.createElement('pre');
pre.appendChild(diffHtml);
merge.push(
{
paragraph: p1,
diff: pre.innerHTML,
identical: identical,
firstString: (p1.text || '').split('\n')[0],
type: compared,
});
}
}
for (let p2 of paragraphs2) {
let p1 = null;
for (let p of paragraphs1) {
if (p2.id === p.id) {
p1 = p;
break;
}
}
if (p1 === null) {
merge.push({paragraph: p2, firstString: (p2.text || '').split('\n')[0], type: added});
}
}
merge.sort(function(a, b) {
if (a.type === added) {
return -1;
}
if (a.type === compared) {
return 1;
}
if (a.type === deleted) {
if (b.type === compared) {
return -1;
} else {
return 1;
}
}
});
$scope.mergeNoteRevisionsForCompare = merge;
if ($scope.currentParagraphDiffDisplay !== null) {
$scope.changeCurrentParagraphDiffDisplay($scope.currentParagraphDiffDisplay.paragraph.id);
}
}
};