X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/ee01d50d05b7d72dd372e8f3a0c78b9da6c23b38..66c6a11da0b0128e1693582dbbb8b375fd4aedb9:/apps/wiki/nice_diff.py?ds=sidebyside

diff --git a/apps/wiki/nice_diff.py b/apps/wiki/nice_diff.py
old mode 100755
new mode 100644
index c000b13c..b228fad9
--- a/apps/wiki/nice_diff.py
+++ b/apps/wiki/nice_diff.py
@@ -1,29 +1,61 @@
 # -*- coding: utf-8 -*-
 #
 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
-# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.  
+# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 import difflib
 import re
+from collections import deque
 
 from django.template.loader import render_to_string
 from django.utils.html import escape as html_escape
 
-DIFF_RE = re.compile(r"""\x00([+^-])""" ,re.UNICODE)
-NAMES = { '+': 'added', '-': 'removed', '^': 'changed' }
+DIFF_RE = re.compile(r"""\x00([+^-])""", re.UNICODE)
+NAMES = {'+': 'added', '-': 'removed', '^': 'changed'}
+
 
 def diff_replace(match):
-	return """<span class="diff_mark diff_mark_%s">""" %  NAMES[match.group(1)]
+    return """<span class="diff_mark diff_mark_%s">""" % NAMES[match.group(1)]
+
 
 def filter_line(line):
-	return  DIFF_RE.sub(diff_replace, html_escape(line)).replace('\x01', '</span>')
-
-def html_diff_table(la, lb):
-	return render_to_string("wiki/diff_table.html", {
-		"changes": [(a[0],filter_line(a[1]),
-					 b[0],filter_line(b[1]),
-					 change) for a, b, change in difflib._mdiff(la, lb)]
-	}); 
-										
-	
-__all__ = ['html_diff_table']
\ No newline at end of file
+    return  DIFF_RE.sub(diff_replace, html_escape(line)).replace('\x01', '</span>')
+
+
+def format_changeset(a, b, change):
+    return (a[0], filter_line(a[1]), b[0], filter_line(b[1]), change)
+
+
+def html_diff_table(la, lb, context=None):
+    all_changes = difflib._mdiff(la, lb)
+
+    if context is None:
+        changes = (format_changeset(*c) for c in all_changes)
+    else:
+        changes = []
+        q = deque()
+        after_change = False
+
+        for changeset in all_changes:
+            q.append(changeset)
+
+            if changeset[2]:
+                after_change = True
+                if not after_change:
+                    changes.append((0, '-----', 0, '-----', False))
+                changes.extend(format_changeset(*c) for c in q)
+                q.clear()
+            else:
+                if len(q) == context and after_change:
+                    changes.extend(format_changeset(*c) for c in q)
+                    q.clear()
+                    after_change = False
+                elif len(q) > context:
+                    q.popleft()
+
+    return render_to_string("wiki/diff_table.html", {
+        "changes": changes,
+    })
+
+
+__all__ = ['html_diff_table']