## page was renamed from FeatureRequests/PreviousNextRevisionInDiffAcion
This patch adds prev/next revision buttons to old and new revision sides, thus fully enabling revision navigation in diff action.
{{{#!diff
diff -r 2c025e231b5f MoinMoin/action/diff.py
--- a/MoinMoin/action/diff.py Sat Jan 16 07:01:45 2010 +0300
+++ b/MoinMoin/action/diff.py Sat Jan 16 07:42:37 2010 +0300
@@ -11,6 +11,7 @@
from MoinMoin import wikiutil
from MoinMoin.logfile import editlog
from MoinMoin.Page import Page
+from bisect import bisect_right, bisect_left
def execute(pagename, request):
""" Handle "action=diff"
@@ -113,23 +114,20 @@
request.theme.send_closing_html()
return
+ # Assuming that revision list is sorted and reversed
+ # (as currently done by Page.getRevList()),
+ # we need to reverse it again for bisect functions working correctly.
+ revlist.reverse()
+
title = _('Differences between revisions %d and %d') % (oldrev, newrev)
if edit_count > 1:
title += ' ' + _('(spanning %d versions)') % (edit_count, )
title = f.text(title)
- # Revision list starts from 2...
- if oldrev <= min(revlist):
- disable_prev = u' disabled="disabled"'
- else:
- disable_prev = u''
+ page_url = wikiutil.escape(currentpage.url(request), True)
- if newrev >= max(revlist):
- disable_next = u' disabled="disabled"'
- else:
- disable_next = u''
-
- page_url = wikiutil.escape(currentpage.url(request), True)
+ def enabled(val):
+ return not val and u' disabled="disabled"' or u''
revert_html = ""
if request.user.may.revert(pagename):
@@ -143,13 +141,10 @@
- """ % (page_url, rev2, _("Revert to this revision"), disable_next)
+ """ % (page_url, rev2, _("Revert to this revision"), enabled(newrev < revlist[-1]))
- navigation_html = """
-
-
-
- |
+ other_diff_button_html = """
+ |
|
- %s
-
-
- |
+"""
+
+ navigation_html = """
+
+
+
+ %(button)s
+ %%s
+ %(button)s
-""" % (title,
- page_url, oldrev - 1, oldrev, _("Previous change"), disable_prev,
+""" % {'button': other_diff_button_html}
+
+ prev_oldrev = revlist[bisect_left(revlist, oldrev) - 1]
+ next_oldrev = (oldrev < revlist[-1]) and revlist[bisect_right(revlist, oldrev)] or revlist[-1]
+ prev_newrev = revlist[bisect_left(revlist, newrev) - 1]
+ next_newrev = (newrev < revlist[-1]) and revlist[bisect_right(revlist, newrev)] or revlist[-1]
+
+ navigation_html = navigation_html % (title,
+ page_url, prev_oldrev, oldrev, _("Previous change"), enabled(oldrev > revlist[0]),
revert_html,
- page_url, newrev, newrev + 1, _("Next change"), disable_next, )
+ page_url, newrev, next_newrev, _("Next change"), enabled(newrev < revlist[-1]), )
request.write(f.rawHTML(navigation_html))
oldlog = oldpage.editlog_entry()
newlog = newpage.editlog_entry()
+ page = Page(request, pagename)
+
+ def rev_nav_link(enabled, old_rev, new_rev, caption, css_classes, enabled_title, disabled_title):
+ if enabled:
+ return page.link_to(request, on=1, querystr={
+ 'action': 'diff',
+ 'rev1': old_rev,
+ 'rev2': new_rev,
+ }, css_class="diff-nav-link %(css_classes)s" % {
+ 'css_classes': css_classes,
+ }, title=enabled_title) + request.formatter.text(caption) + page.link_to(request, on=0)
+ else:
+ return '%(caption)s' % {
+ 'css_classes': css_classes,
+ 'disabled_title': disabled_title,
+ 'caption': caption,
+ }
+
rev_info_html = """
-
+
%(rev_size_caption)s: %%(rev_size)d
%(rev_author_caption)s: %%(rev_author)s
@@ -196,6 +214,8 @@
}
rev_info_old_html = rev_info_html % {
+ 'rev_prev_link': rev_nav_link(oldrev > revlist[0], prev_oldrev, newrev, '<', 'diff-prev-link diff-old-rev', _('Diff with previous old revision'), _("No previous revision available for diff")),
+ 'rev_next_link': rev_nav_link((oldrev < revlist[-1]) and (revlist[bisect_right(revlist, oldrev)] < newrev), next_oldrev, newrev, '>', 'diff-next-link diff-old-rev', _('Diff with next old revision'), _("Can't change to newer revision")),
'rev': oldrev,
'rev_size': oldpage.size(),
'rev_author': oldlog.getEditor(request) or _('N/A'),
@@ -204,6 +224,8 @@
}
rev_info_new_html = rev_info_html % {
+ 'rev_prev_link': rev_nav_link((newrev > revlist[0]) and (oldrev < revlist[bisect_left(revlist, newrev) - 1]), oldrev, prev_newrev, '<', 'diff-prev-link diff-new-rev', _('Diff with previous new revision'), _("Can't change to older revision")),
+ 'rev_next_link': rev_nav_link(newrev < revlist[-1], oldrev, next_newrev, '>', 'diff-next-link diff-new-rev', _('Diff with next new revision'), _("No newer revision available fo diff")),
'rev': newrev,
'rev_size': newpage.size(),
'rev_author': newlog.getEditor(request) or _('N/A'),
}}}
-- [[HarryB]] <> that's a very nice feature :) thanks for that.
I understand that this feature is already installed on this wiki? <
>But when browsing at different revisions, the center of the diff is now moving. Is this intended? Didnt use to do this in previous versions.
Well, this feature is not pushed to moin repo yet, bu i hope it will be there soon (at least, before 1.9.1, i hope). The diff view is aligned by content (more precisely, the default table flow alignment rules are in place, because there is no scpecific css width definitions in standard themes). -- EugeneSyromyatnikov <>
Implemented in [[http://hg.moinmo.in/moin/1.9/rev/2b641be7728c]]. -- EugeneSyromyatnikov <>
----
CategoryFeatureImplemented