$scope.compareRevisions = function()

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);
      }
    }
  };