From 78a8e69fa4f33eced3015f13ce2a331e4d208d62 Mon Sep 17 00:00:00 2001 From: Greg Kempe Date: Wed, 12 Feb 2025 21:03:10 +0200 Subject: [PATCH 1/3] improve diff navigation --- .../javascript/indigo/views/diff_navigator.js | 30 +++++++++++++++++-- .../indigo/views/document_revisions.js | 2 -- indigo_app/static/stylesheets/_diffs.scss | 8 +++++ .../indigo_api/document/_revisions.html | 2 +- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/indigo_app/static/javascript/indigo/views/diff_navigator.js b/indigo_app/static/javascript/indigo/views/diff_navigator.js index 392237a54..1d3a990d0 100644 --- a/indigo_app/static/javascript/indigo/views/diff_navigator.js +++ b/indigo_app/static/javascript/indigo/views/diff_navigator.js @@ -14,12 +14,26 @@ }, initialize: function (options) { + this.counterEl = this.el.querySelector('.diff-counter'); this.refresh(); }, refresh: function() { - this.changedElements = $(this.el.getAttribute('data-bs-target')).find('ins, del, .ins, .del'); + const target = document.querySelector(this.el.getAttribute('data-bs-target')); + const changedElements = target.querySelectorAll('.diff-pair, ins, del, .ins, .del'); + + this.changedElements = []; + + for (let i = 0; i < changedElements.length; i++) { + const el = changedElements[i]; + // don't go inside diff-pairs + if (!el.parentElement.classList.contains('diff-pair')) { + this.changedElements.push(el); + } + } + this.currentElementIndex = -1; + this.updateCounter(); }, prevChange: function (e) { @@ -30,11 +44,23 @@ this.currentElementIndex--; } if (this.currentElementIndex > -1) this.changedElements[this.currentElementIndex].scrollIntoView(); + this.updateCounter(); }, nextChange: function (e) { this.currentElementIndex = (this.currentElementIndex + 1) % this.changedElements.length; if (this.currentElementIndex > -1) this.changedElements[this.currentElementIndex].scrollIntoView(); - } + this.updateCounter(); + }, + + updateCounter: function () { + if (this.counterEl) { + if (this.changedElements.length === 0) { + this.counterEl.textContent = '0'; + } else { + this.counterEl.textContent = (this.currentElementIndex + 1) + ' / ' + this.changedElements.length; + } + } + }, }); })(window); diff --git a/indigo_app/static/javascript/indigo/views/document_revisions.js b/indigo_app/static/javascript/indigo/views/document_revisions.js index 2481d75a1..9b3b86fd8 100644 --- a/indigo_app/static/javascript/indigo/views/document_revisions.js +++ b/indigo_app/static/javascript/indigo/views/document_revisions.js @@ -99,8 +99,6 @@ $.get(revision.url() + '/diff') .then(function(response) { var $akn = self.$el.find('.revision-preview la-akoma-ntoso').html(response.content); - self.$el.find('.change-count').text( - response.n_changes + ' change' + (response.n_changes != 1 ? 's' : '')); self.diffNavigator.refresh(); }); }, diff --git a/indigo_app/static/stylesheets/_diffs.scss b/indigo_app/static/stylesheets/_diffs.scss index 1cb7a0356..3368517c3 100644 --- a/indigo_app/static/stylesheets/_diffs.scss +++ b/indigo_app/static/stylesheets/_diffs.scss @@ -30,6 +30,14 @@ } .diffset { + .diff-pair, + .ins, + ins, + .del, + del { + scroll-margin-top: 3em; + } + ins, .ins, .ins > .akn-num { diff --git a/indigo_app/templates/indigo_api/document/_revisions.html b/indigo_app/templates/indigo_api/document/_revisions.html index 97dd8cc9b..81b944a0f 100644 --- a/indigo_app/templates/indigo_api/document/_revisions.html +++ b/indigo_app/templates/indigo_api/document/_revisions.html @@ -4,7 +4,7 @@
- +
From 10c5a9e442f5fab32d9a43e9672c4d1abd86a1ae Mon Sep 17 00:00:00 2001 From: Greg Kempe Date: Wed, 12 Feb 2025 21:26:17 +0200 Subject: [PATCH 2/3] handle adjacent diffs --- indigo_app/static/javascript/indigo/views/diff_navigator.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/indigo_app/static/javascript/indigo/views/diff_navigator.js b/indigo_app/static/javascript/indigo/views/diff_navigator.js index 1d3a990d0..0ff7e6b61 100644 --- a/indigo_app/static/javascript/indigo/views/diff_navigator.js +++ b/indigo_app/static/javascript/indigo/views/diff_navigator.js @@ -26,8 +26,9 @@ for (let i = 0; i < changedElements.length; i++) { const el = changedElements[i]; - // don't go inside diff-pairs - if (!el.parentElement.classList.contains('diff-pair')) { + // don't go inside diff-pairs, and ignore adjacent diffs + if (!el.parentElement.classList.contains('diff-pair') && ( + this.changedElements.length === 0 || this.changedElements[this.changedElements.length - 1] !== el.previousElementSibling)) { this.changedElements.push(el); } } From e05313d9515aef4ec0d469d97dba6576d1e50c8e Mon Sep 17 00:00:00 2001 From: Greg Kempe Date: Wed, 12 Feb 2025 21:37:18 +0200 Subject: [PATCH 3/3] a .del and an adjacent can still be a diff pair this makes the common case of "(a)" being turned into a link "(a)" work better as a diff pair --- indigo/analysis/differ.py | 2 +- indigo/tests/test_differ.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indigo/analysis/differ.py b/indigo/analysis/differ.py index 1220ec070..c8a96a93e 100644 --- a/indigo/analysis/differ.py +++ b/indigo/analysis/differ.py @@ -209,7 +209,7 @@ def repl(match): return '\xA0' * (b - a) del_.text = ws_re.sub(repl, del_.text) - if ins is None or ins.tag != 'ins' or del_.tail: + if del_.tail or ins is None or (ins.tag != 'ins' and not (ins.get('class') or '').startswith('ins ')): ins = del_.makeelement('ins') # non-breaking space ins.text = '\xA0' diff --git a/indigo/tests/test_differ.py b/indigo/tests/test_differ.py index f125ec3ee..0623a3b4f 100644 --- a/indigo/tests/test_differ.py +++ b/indigo/tests/test_differ.py @@ -71,7 +71,7 @@ def test_inline_tag_added(self): ) self.assertEqual( - '

Some text bold text and a tail. bold text and a tail.

', + '

Some text bold text and a tail.bold text and a tail.

', diff, )