|
|
@@ -4,6 +4,7 @@
|
|
|
*/
|
|
|
|
|
|
var hljs = require('highlight.js');
|
|
|
+var jsdiff = require('diff');
|
|
|
var marked = require('marked');
|
|
|
var Crowi = {};
|
|
|
|
|
|
@@ -608,6 +609,77 @@ $(function() {
|
|
|
$seenUserList.append(CreateUserLinkWithPicture(user));
|
|
|
});
|
|
|
}
|
|
|
+
|
|
|
+ // History Diff
|
|
|
+ var allRevisionIds = [];
|
|
|
+ $.each($('.diff-view'), function() {
|
|
|
+ allRevisionIds.push($(this).data('revisionId'));
|
|
|
+ });
|
|
|
+
|
|
|
+ $('.diff-view').on('click', function(e) {
|
|
|
+ e.preventDefault();
|
|
|
+
|
|
|
+ var getBeforeRevisionId = function(revisionId) {
|
|
|
+ var currentPos = $.inArray(revisionId, allRevisionIds);
|
|
|
+ if (currentPos < 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ var beforeRevisionId = allRevisionIds[currentPos + 1];
|
|
|
+ if (typeof beforeRevisionId === 'undefined') {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return beforeRevisionId;
|
|
|
+ };
|
|
|
+
|
|
|
+ var revisionId = $(this).data('revisionId');
|
|
|
+ var beforeRevisionId = getBeforeRevisionId(revisionId);
|
|
|
+ var $diffDisplay = $('#diff-display-' + revisionId);
|
|
|
+ var $diffIcon = $('#diff-icon-' + revisionId);
|
|
|
+
|
|
|
+ if ($diffIcon.hasClass('fa-arrow-circle-right')) {
|
|
|
+ $diffIcon.removeClass('fa-arrow-circle-right');
|
|
|
+ $diffIcon.addClass('fa-arrow-circle-down');
|
|
|
+ } else {
|
|
|
+ $diffIcon.removeClass('fa-arrow-circle-down');
|
|
|
+ $diffIcon.addClass('fa-arrow-circle-right');
|
|
|
+ }
|
|
|
+
|
|
|
+ if (beforeRevisionId === false) {
|
|
|
+ $diffDisplay.text('差分はありません');
|
|
|
+ $diffDisplay.slideToggle();
|
|
|
+ } else {
|
|
|
+ var revisionIds = revisionId + ',' + beforeRevisionId;
|
|
|
+
|
|
|
+ $.ajax({
|
|
|
+ type: 'GET',
|
|
|
+ url: '/_api/revisions.list?revision_ids=' + revisionIds,
|
|
|
+ dataType: 'json'
|
|
|
+ }).done(function(res) {
|
|
|
+ var currentText = res[0].body;
|
|
|
+ var previousText = res[1].body;
|
|
|
+
|
|
|
+ $diffDisplay.text('');
|
|
|
+
|
|
|
+ var diff = jsdiff.diffLines(previousText, currentText);
|
|
|
+ diff.forEach(function(part) {
|
|
|
+ var color = part.added ? 'green' : part.removed ? 'red' : 'grey';
|
|
|
+ var $span = $('<span>');
|
|
|
+ $span.css('color', color);
|
|
|
+ $span.text(part.value);
|
|
|
+ $diffDisplay.append($span);
|
|
|
+ });
|
|
|
+
|
|
|
+ $diffDisplay.slideToggle();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // default open
|
|
|
+ var diffViews = $('.diff-view');
|
|
|
+ if (diffViews.length > 0) for (var i = 0; i < 2; i++) {
|
|
|
+ diffViews[i].click();
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
-
|