cleanup diff files / add experimental diff
authorraph
Fri, 05 Feb 2010 16:01:32 +0100
changeset 149 0f2c5744b39b
parent 148 03106bfa4845
child 150 db7bc2e89156
cleanup diff files / add experimental diff
src/cm/converters/__init__.py
src/cm/converters/pandoc_converters.py
src/cm/diff.py
src/cm/ext/diff.py
src/cm/urls.py
src/cm/utils/diff.py
src/cm/utils/string.py
src/cm/utils/string_utils.py
src/cm/views/__init__.py
src/cm/views/texts.py
--- a/src/cm/converters/__init__.py	Fri Feb 05 15:15:46 2010 +0100
+++ b/src/cm/converters/__init__.py	Fri Feb 05 16:01:32 2010 +0100
@@ -1,6 +1,6 @@
 from pandoc_converters import pandoc_convert
 import chardet 
-from cm.utils.string import to_unicode 
+from cm.utils.string_utils import to_unicode 
 import re
 
 # TODO: move that in text_base: save images
--- a/src/cm/converters/pandoc_converters.py	Fri Feb 05 15:15:46 2010 +0100
+++ b/src/cm/converters/pandoc_converters.py	Fri Feb 05 16:01:32 2010 +0100
@@ -10,7 +10,7 @@
 from tempfile import mkstemp
 import StringIO
 import tidy
-from cm.utils.string import to_unicode
+from cm.utils.string_utils import to_unicode
 
 PANDOC_BIN = "pandoc"
 PANDOC_OPTIONS = "--sanitize-html "
--- a/src/cm/diff.py	Fri Feb 05 15:15:46 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-import difflib, string
-from django.utils.translation import ugettext as _
-
-def isatag(x): return x.startswith("<") and x.endswith(">")
-
-def text_diff(a, b):
-    res = []
-    a, b = createlist(a), createlist(b)
-    s = difflib.SequenceMatcher(isatag, a, b)
-    for e in s.get_opcodes():
-        if e[0] == "replace":
-            res.append('<del class="diff modified">'+''.join(a[e[1]:e[2]]) + '</del><ins class="diff modified">'+''.join(b[e[3]:e[4]])+"</ins>")
-        elif e[0] == "delete":
-            res.append('<del class="diff">'+ ''.join(a[e[1]:e[2]]) + "</del>")
-        elif e[0] == "insert":
-            res.append('<ins class="diff">'+''.join(b[e[3]:e[4]]) + "</ins>")
-        elif e[0] == "equal":
-            res.append(''.join(b[e[3]:e[4]]))
-        else: 
-            raise "error parsing %s" %(e[0])
-    return ''.join(res)
-
-COLORS = [
-'#FF0000',
-'#EE0000',
-'#DD0000',
-'#CC0000',
-'#BB0000',
-'#AA0000',
-'#990000',
-'#880000',
-'#770000',
-]
-
-from colorsys import hls_to_rgb, hsv_to_rgb
-
-def generatePastelColors(n):
-    s = .4
-    v = .99
-    return ['#'+''.join((hex(int(r*255))[2:],hex(int(g*255))[2:],hex(int(b*255))[2:])) for r,g,b in [hsv_to_rgb(h/200.,s,v) for h in range(1,100,100/n)]]
-    
-
-DEFAULT_COLOR = '#D9D9D9'
-def get_colors(authors, last_white = False):
-    """
-    returns a dict for authors's colors (with last one white if 'last_white')
-    """
-    authors = set(authors)
-    #new_colors = list(tuple(COLORS))
-    new_colors = generatePastelColors(len(set(authors)))
-    res = []
-    if None in authors or '' in authors:
-        res = [(_(u'unknown'),DEFAULT_COLOR) ]
-    res.extend([(author,new_colors.pop()) for author in authors if author])
-    #if authors[-1]:
-    #    res[authors[-1]] = '#FFFFFF'
-    return res
-    
-
-def text_history(versions, authors):
-    res = versions[0]
-    colors = get_colors(authors)
-    for ind in range(len(versions)-1):
-        author = authors[ind]
-        color = colors.get(author,DEFAULT_COLOR)
-        v_2 = versions[ind + 1]
-        res = text_diff_add(v_2, res, color)
-    return res,colors.items()
-
-from cm.utils.html import surrond_text_node
- 
-def text_diff_add(a,b, color):
-    res = []
-    a, b = createlist(a), createlist(b)
-    s = difflib.SequenceMatcher(isatag, a, b)
-    for e in s.get_opcodes():
-        if e[0] == "replace":
-            html_chunk = ''.join(b[e[3]:e[4]])
-            new_html_chunk = surrond_text_node(html_chunk,'<span style="background: %s;">' %color,'</span>')
-            res.append(new_html_chunk)
-            #res.append('<font style="background: %s;" class="diff modified">' %color+''.join(b[e[3]:e[4]])+"</font>")
-        elif e[0] == "delete":
-            pass
-        elif e[0] == "insert":
-            html_chunk = ''.join(b[e[3]:e[4]])
-            new_html_chunk = surrond_text_node(html_chunk,'<span style="background: %s;">' %color,'</span>') 
-            res.append(new_html_chunk)
-            #res.append('<font style="background: %s;" class="diff">' %color+''.join(b[e[3]:e[4]]) + "</font>")
-        elif e[0] == "equal":
-            res.append(''.join(b[e[3]:e[4]]))
-        else: 
-            raise "error parsing %s" %(e[0])
-    return ''.join(res)
-
-def createlist(x, b=0):
-    mode = 'char'
-    cur = ''
-    out = []
-    for c in x:
-        if mode == 'tag':
-            if c == '>': 
-                if b: cur += ']'
-                else: cur += c
-                out.append(cur); cur = ''; mode = 'char'
-            else: cur += c
-        elif mode == 'char':
-            if c == '<': 
-                out.append(cur)
-                if b: cur = '['
-                else: cur = c
-                mode = 'tag'
-            elif c in string.whitespace: out.append(cur+c); cur = ''
-            else: cur += c
-    out.append(cur)
-    return filter(lambda x: x is not '', out)
--- a/src/cm/ext/diff.py	Fri Feb 05 15:15:46 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,271 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2004-2009 Edgewall Software
-# Copyright (C) 2004-2006 Christopher Lenz <cmlenz@gmx.de>
-# All rights reserved.
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at http://trac.edgewall.org/wiki/TracLicense.
-#
-# This software consists of voluntary contributions made by many
-# individuals. For the exact contribution history, see the revision
-# history and logs, available at http://trac.edgewall.org/log/.
-#
-# Author: Christopher Lenz <cmlenz@gmx.de>
-
-from trac.util.html import escape, Markup
-from trac.util.text import expandtabs
-
-from difflib import SequenceMatcher
-import re
-
-__all__ = ['get_diff_options', 'hdf_diff', 'diff_blocks', 'unified_diff']
-
-
-def _get_change_extent(str1, str2):
-    """
-    Determines the extent of differences between two strings. Returns a tuple
-    containing the offset at which the changes start, and the negative offset
-    at which the changes end. If the two strings have neither a common prefix
-    nor a common suffix, (0, 0) is returned.
-    """
-    start = 0
-    limit = min(len(str1), len(str2))
-    while start < limit and str1[start] == str2[start]:
-        start += 1
-    end = -1
-    limit = limit - start
-    while -end <= limit and str1[end] == str2[end]:
-        end -= 1
-    return (start, end + 1)
-
-def _get_opcodes(fromlines, tolines, ignore_blank_lines=False,
-                 ignore_case=False, ignore_space_changes=False):
-    """
-    Generator built on top of SequenceMatcher.get_opcodes().
-    
-    This function detects line changes that should be ignored and emits them
-    as tagged as 'equal', possibly joined with the preceding and/or following
-    'equal' block.
-    """
-
-    def is_ignorable(tag, fromlines, tolines):
-        if tag == 'delete' and ignore_blank_lines:
-            if ''.join(fromlines) == '':
-                return True
-        elif tag == 'insert' and ignore_blank_lines:
-            if ''.join(tolines) == '':
-                return True
-        elif tag == 'replace' and (ignore_case or ignore_space_changes):
-            if len(fromlines) != len(tolines):
-                return False
-            def f(str):
-                if ignore_case:
-                    str = str.lower()
-                if ignore_space_changes:
-                    str = ' '.join(str.split())
-                return str
-            for i in range(len(fromlines)):
-                if f(fromlines[i]) != f(tolines[i]):
-                    return False
-            return True
-
-    matcher = SequenceMatcher(None, fromlines, tolines)
-    previous = None
-    for tag, i1, i2, j1, j2 in matcher.get_opcodes():
-        if tag == 'equal':
-            if previous:
-                previous = (tag, previous[1], i2, previous[3], j2)
-            else:
-                previous = (tag, i1, i2, j1, j2)
-        else:
-            if is_ignorable(tag, fromlines[i1:i2], tolines[j1:j2]):
-                if previous:
-                    previous = 'equal', previous[1], i2, previous[3], j2
-                else:
-                    previous = 'equal', i1, i2, j1, j2
-                continue
-            if previous:
-                yield previous
-            yield tag, i1, i2, j1, j2
-            previous = None
-
-    if previous:
-        yield previous
-
-def _group_opcodes(opcodes, n=3):
-    """
-    Python 2.2 doesn't have SequenceMatcher.get_grouped_opcodes(), so let's
-    provide equivalent here. The opcodes parameter can be any iterable or
-    sequence.
-
-    This function can also be used to generate full-context diffs by passing 
-    None for the parameter n.
-    """
-    # Full context produces all the opcodes
-    if n is None:
-        yield list(opcodes)
-        return
-
-    # Otherwise we leave at most n lines with the tag 'equal' before and after
-    # every change
-    nn = n + n
-    group = []
-    for idx, (tag, i1, i2, j1, j2) in enumerate(opcodes):
-        if idx == 0 and tag == 'equal': # Fixup leading unchanged block
-            i1, j1 = max(i1, i2 - n), max(j1, j2 - n)
-        elif tag == 'equal' and i2 - i1 > nn:
-            group.append((tag, i1, min(i2, i1 + n), j1, min(j2, j1 + n)))
-            yield group
-            group = []
-            i1, j1 = max(i1, i2 - n), max(j1, j2 - n)
-        group.append((tag, i1, i2, j1 ,j2))
-
-    if group and not (len(group) == 1 and group[0][0] == 'equal'):
-        if group[-1][0] == 'equal': # Fixup trailing unchanged block
-            tag, i1, i2, j1, j2 = group[-1]
-            group[-1] = tag, i1, min(i2, i1 + n), j1, min(j2, j1 + n)
-        yield group
-
-def hdf_diff(*args, **kwargs):
-    return diff_blocks(*args, **kwargs)
-
-def diff_blocks(fromlines, tolines, context=None, tabwidth=8,
-                ignore_blank_lines=0, ignore_case=0, ignore_space_changes=0):
-    """Return an array that is adequate for adding to the data dictionary
-
-    See the diff_div.html template.
-    """
-
-    type_map = {'replace': 'mod', 'delete': 'rem', 'insert': 'add',
-                'equal': 'unmod'}
-
-    space_re = re.compile(' ( +)|^ ')
-    def htmlify(match):
-        div, mod = divmod(len(match.group(0)), 2)
-        return div * '&nbsp; ' + mod * '&nbsp;'
-
-    def markup_intraline_changes(opcodes):
-        for tag, i1, i2, j1, j2 in opcodes:
-            if tag == 'replace' and i2 - i1 == j2 - j1:
-                for i in range(i2 - i1):
-                    fromline, toline = fromlines[i1 + i], tolines[j1 + i]
-                    (start, end) = _get_change_extent(fromline, toline)
-                    if start != 0 or end != 0:
-                        last = end+len(fromline)
-                        fromlines[i1+i] = fromline[:start] + '\0' + fromline[start:last] + \
-                                       '\1' + fromline[last:]
-                        last = end+len(toline)
-                        tolines[j1+i] = toline[:start] + '\0' + toline[start:last] + \
-                                     '\1' + toline[last:]
-            yield tag, i1, i2, j1, j2
-
-    changes = []
-    opcodes = _get_opcodes(fromlines, tolines, ignore_blank_lines, ignore_case,
-                           ignore_space_changes)
-    for group in _group_opcodes(opcodes, context):
-        blocks = []
-        last_tag = None
-        for tag, i1, i2, j1, j2 in markup_intraline_changes(group):
-            if tag != last_tag:
-                blocks.append({'type': type_map[tag],
-                               'base': {'offset': i1, 'lines': []},
-                               'changed': {'offset': j1, 'lines': []}})
-            if tag == 'equal':
-                for line in fromlines[i1:i2]:
-                    line = line.expandtabs(tabwidth)
-                    line = space_re.sub(htmlify, escape(line, quotes=False))
-                    blocks[-1]['base']['lines'].append(Markup(unicode(line)))
-                for line in tolines[j1:j2]:
-                    line = line.expandtabs(tabwidth)
-                    line = space_re.sub(htmlify, escape(line, quotes=False))
-                    blocks[-1]['changed']['lines'].append(Markup(unicode(line)))
-            else:
-                if tag in ('replace', 'delete'):
-                    for line in fromlines[i1:i2]:
-                        line = expandtabs(line, tabwidth, '\0\1')
-                        line = escape(line, quotes=False)
-                        line = '<del>'.join([space_re.sub(htmlify, seg)
-                                             for seg in line.split('\0')])
-                        line = line.replace('\1', '</del>')
-                        blocks[-1]['base']['lines'].append(
-                            Markup(unicode(line)))
-                if tag in ('replace', 'insert'):
-                    for line in tolines[j1:j2]:
-                        line = expandtabs(line, tabwidth, '\0\1')
-                        line = escape(line, quotes=False)
-                        line = '<ins>'.join([space_re.sub(htmlify, seg)
-                                             for seg in line.split('\0')])
-                        line = line.replace('\1', '</ins>')
-                        blocks[-1]['changed']['lines'].append(
-                            Markup(unicode(line)))
-        changes.append(blocks)
-    return changes
-
-def unified_diff(fromlines, tolines, context=None, ignore_blank_lines=0,
-                 ignore_case=0, ignore_space_changes=0):
-    opcodes = _get_opcodes(fromlines, tolines, ignore_blank_lines, ignore_case,
-                           ignore_space_changes)
-    for group in _group_opcodes(opcodes, context):
-        i1, i2, j1, j2 = group[0][1], group[-1][2], group[0][3], group[-1][4]
-        if i1 == 0 and i2 == 0:
-            i1, i2 = -1, -1 # support for 'A'dd changes
-        yield '@@ -%d,%d +%d,%d @@' % (i1 + 1, i2 - i1, j1 + 1, j2 - j1)
-        for tag, i1, i2, j1, j2 in group:
-            if tag == 'equal':
-                for line in fromlines[i1:i2]:
-                    yield ' ' + line
-            else:
-                if tag in ('replace', 'delete'):
-                    for line in fromlines[i1:i2]:
-                        yield '-' + line
-                if tag in ('replace', 'insert'):
-                    for line in tolines[j1:j2]:
-                        yield '+' + line
-
-def get_diff_options(req):
-    options_data = {}
-    data = {'options': options_data}
-    
-    def get_bool_option(name, default=0):
-        pref = int(req.session.get('diff_' + name, default))
-        arg = int(req.args.has_key(name))
-        if req.args.has_key('update') and arg != pref:
-            req.session['diff_' + name] = arg
-        else:
-            arg = pref
-        return arg
-
-    pref = req.session.get('diff_style', 'inline')
-    style = req.args.get('style', pref)
-    if req.args.has_key('update') and style != pref:
-        req.session['diff_style'] = style
-    data['style'] = style
-
-    pref = int(req.session.get('diff_contextlines', 2))
-    try:
-        arg = int(req.args.get('contextlines', pref))
-    except ValueError:
-        arg = -1
-    if req.args.has_key('update') and arg != pref:
-        req.session['diff_contextlines'] = arg
-    options = ['-U%d' % arg]
-    options_data['contextlines'] = arg
-
-    arg = get_bool_option('ignoreblanklines')
-    if arg:
-        options.append('-B')
-    options_data['ignoreblanklines'] = arg
-
-    arg = get_bool_option('ignorecase')
-    if arg:
-        options.append('-i')
-    options_data['ignorecase'] = arg
-
-    arg = get_bool_option('ignorewhitespace')
-    if arg:
-        options.append('-b')
-    options_data['ignorewhitespace'] = arg
-
-    return (style, options, data)
--- a/src/cm/urls.py	Fri Feb 05 15:15:46 2010 +0100
+++ b/src/cm/urls.py	Fri Feb 05 16:01:32 2010 +0100
@@ -64,14 +64,14 @@
      url(r'^text/(?P<key>\w*)/settings/$', text_settings, name="text-settings"),
      url(r'^text/(?P<key>\w*)/history/$', text_history, name="text-history"),
      url(r'^text/(?P<key>\w*)/history-version/(?P<version_key>\w*)/$', text_history_version, name="text-history-version"),
-     url(r'^text/(?P<key>\w*)/history-compare/(?P<v1_version_key>\w*)/(?P<v2_version_key>\w*)/$', text_history_compare, name="text-history-compare"),
+     url(r'^text/(?P<key>\w*)/history-compare/(?P<v1_version_key>\w*)/(?P<v2_version_key>\w*)/(?P<mode>\d*)$', text_history_compare, name="text-history-compare"),
      url(r'^text/(?P<key>\w*)/revert/(?P<text_version_key>\w*)/$', text_revert, name="text-revert"),
      url(r'^text/(?P<key>\w*)/attach/(?P<attach_key>\w*)/$', text_attach, name="text-attach"),
      url(r'^text/(?P<key>\w*)/delete/$', text_delete, name="text-delete"),
      url(r'^text/(?P<key>\w*)/(?P<text_version_key>\w*)/delete/$', text_version_delete, name="text-version-delete"),        
      url(r'^text/(?P<key>\w*)/export/(?P<format>\w*)/(?P<download>\w*)/(?P<whichcomments>\w*)/(?P<withcolor>\w*)/$', text_export, name="text-export"),
      url(r'^text/(?P<key>\w*)/history/$', text_history, name="text-history"),
-     url(r'^text/(?P<key>\w*)/diff/(?P<id_v1>\w*)/(?P<id_v2>\w*)/$', text_diff, name="text-diff"),
+     #url(r'^text/(?P<key>\w*)/diff/(?P<id_v1>\w*)/(?P<id_v2>\w*)/$', text_diff, name="text-diff"),
 #     url(r'^text/(?P<key>\w*)/version/(?P<id_version>\w*)/$', text_version, name="text-version"),
      
      # main client frame
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/utils/diff.py	Fri Feb 05 16:01:32 2010 +0100
@@ -0,0 +1,115 @@
+import difflib, string
+from django.utils.translation import ugettext as _
+
+def isatag(x): return x.startswith("<") and x.endswith(">")
+
+def text_diff(a, b):
+    res = []
+    a, b = createlist(a), createlist(b)
+    s = difflib.SequenceMatcher(isatag, a, b)
+    for e in s.get_opcodes():
+        if e[0] == "replace":
+            res.append('<del class="diff modified">'+''.join(a[e[1]:e[2]]) + '</del><ins class="diff modified">'+''.join(b[e[3]:e[4]])+"</ins>")
+        elif e[0] == "delete":
+            res.append('<del class="diff">'+ ''.join(a[e[1]:e[2]]) + "</del>")
+        elif e[0] == "insert":
+            res.append('<ins class="diff">'+''.join(b[e[3]:e[4]]) + "</ins>")
+        elif e[0] == "equal":
+            res.append(''.join(b[e[3]:e[4]]))
+        else: 
+            raise "error parsing %s" %(e[0])
+    return ''.join(res)
+
+COLORS = [
+'#FF0000',
+'#EE0000',
+'#DD0000',
+'#CC0000',
+'#BB0000',
+'#AA0000',
+'#990000',
+'#880000',
+'#770000',
+]
+
+from colorsys import hls_to_rgb, hsv_to_rgb
+
+def generatePastelColors(n):
+    s = .4
+    v = .99
+    return ['#'+''.join((hex(int(r*255))[2:],hex(int(g*255))[2:],hex(int(b*255))[2:])) for r,g,b in [hsv_to_rgb(h/200.,s,v) for h in range(1,100,100/n)]]
+    
+
+DEFAULT_COLOR = '#D9D9D9'
+def get_colors(authors, last_white = False):
+    """
+    returns a dict for authors's colors (with last one white if 'last_white')
+    """
+    authors = set(authors)
+    #new_colors = list(tuple(COLORS))
+    new_colors = generatePastelColors(len(set(authors)))
+    res = []
+    if None in authors or '' in authors:
+        res = [(_(u'unknown'),DEFAULT_COLOR) ]
+    res.extend([(author,new_colors.pop()) for author in authors if author])
+    #if authors[-1]:
+    #    res[authors[-1]] = '#FFFFFF'
+    return res
+    
+
+def text_history(versions, authors):
+    res = versions[0]
+    colors = get_colors(authors)
+    for ind in range(len(versions)-1):
+        author = authors[ind]
+        color = colors.get(author,DEFAULT_COLOR)
+        v_2 = versions[ind + 1]
+        res = text_diff_add(v_2, res, color)
+    return res,colors.items()
+
+from cm.utils.html import surrond_text_node
+ 
+def text_diff_add(a,b, color):
+    res = []
+    a, b = createlist(a), createlist(b)
+    s = difflib.SequenceMatcher(isatag, a, b)
+    for e in s.get_opcodes():
+        if e[0] == "replace":
+            html_chunk = ''.join(b[e[3]:e[4]])
+            new_html_chunk = surrond_text_node(html_chunk,'<span style="background: %s;">' %color,'</span>')
+            res.append(new_html_chunk)
+            #res.append('<font style="background: %s;" class="diff modified">' %color+''.join(b[e[3]:e[4]])+"</font>")
+        elif e[0] == "delete":
+            pass
+        elif e[0] == "insert":
+            html_chunk = ''.join(b[e[3]:e[4]])
+            new_html_chunk = surrond_text_node(html_chunk,'<span style="background: %s;">' %color,'</span>') 
+            res.append(new_html_chunk)
+            #res.append('<font style="background: %s;" class="diff">' %color+''.join(b[e[3]:e[4]]) + "</font>")
+        elif e[0] == "equal":
+            res.append(''.join(b[e[3]:e[4]]))
+        else: 
+            raise "error parsing %s" %(e[0])
+    return ''.join(res)
+
+def createlist(x, b=0):
+    mode = 'char'
+    cur = ''
+    out = []
+    for c in x:
+        if mode == 'tag':
+            if c == '>': 
+                if b: cur += ']'
+                else: cur += c
+                out.append(cur); cur = ''; mode = 'char'
+            else: cur += c
+        elif mode == 'char':
+            if c == '<': 
+                out.append(cur)
+                if b: cur = '['
+                else: cur = c
+                mode = 'tag'            
+            elif c in string.whitespace: out.append(cur+c); cur = ''
+            else: cur += c
+    out.append(cur)
+    return filter(lambda x: x is not '', out)
--- a/src/cm/utils/string.py	Fri Feb 05 15:15:46 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-import chardet
-
-def to_unicode(input):
-    if type(input) == str:
-        res = None
-        for encoding in [chardet.detect(input)['encoding'], 'utf8', 'latin1']:
-            try:
-                res = unicode(input, encoding)
-                break;
-            except UnicodeDecodeError:
-                pass
-        if not res:
-            raise Exception('UnicodeDecodeError: could not decode')
-        return res
-    return input
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/utils/string_utils.py	Fri Feb 05 16:01:32 2010 +0100
@@ -0,0 +1,15 @@
+import chardet
+
+def to_unicode(input):
+    if type(input) == str:
+        res = None
+        for encoding in [chardet.detect(input)['encoding'], 'utf8', 'latin1']:
+            try:
+                res = unicode(input, encoding)
+                break;
+            except UnicodeDecodeError:
+                pass
+        if not res:
+            raise Exception('UnicodeDecodeError: could not decode')
+        return res
+    return input
\ No newline at end of file
--- a/src/cm/views/__init__.py	Fri Feb 05 15:15:46 2010 +0100
+++ b/src/cm/views/__init__.py	Fri Feb 05 16:01:32 2010 +0100
@@ -1,5 +1,3 @@
-from cm.diff import text_diff as _text_diff, \
-    text_history as inner_text_history, get_colors
 from cm.message import display_message
 from cm.models import Text, TextVersion, Attachment, Comment, Configuration
 from cm.security import has_global_perm
--- a/src/cm/views/texts.py	Fri Feb 05 15:15:46 2010 +0100
+++ b/src/cm/views/texts.py	Fri Feb 05 16:01:32 2010 +0100
@@ -3,8 +3,6 @@
 from cm.client import jsonize, get_filter_datas, edit_comment, remove_comment, \
     add_comment, RequestComplexEncoder, comments_thread, own_notify
 from cm.cm_settings import NEW_TEXT_VERSION_ON_EDIT
-from cm.diff import text_diff as _text_diff, text_history as inner_text_history, \
-    get_colors
 from cm.exception import UnauthorizedException
 from cm.message import *
 from cm.models import *
@@ -471,12 +469,16 @@
                               context_instance=RequestContext(request))
 
 #@has_perm_on_text('can_view_text')
-def text_history_compare(request, key, v1_version_key, v2_version_key):
+def text_history_compare(request, key, v1_version_key, v2_version_key, mode=''):
     text = get_text_by_keys_or_404(key)
     v1 = get_textversion_by_keys_or_404(v1_version_key, key=key)
     v2 = get_textversion_by_keys_or_404(v2_version_key, key=key)
 
     content = get_uniffied_inner_diff_table(cleanup_textarea(v1.content), cleanup_textarea(v2.content))
+    if mode=='1':
+        # alternate diff
+        from cm.utils.diff import text_diff
+        content = text_diff(v1.get_content(), v2.get_content())
 
     template_dict = {
                      'text' : text,
@@ -582,32 +584,11 @@
 #         template_dict['admin'] = True          
 #    return render_to_response('site/text_history.html', template_dict, context_instance=RequestContext(request))
 #
-#def _text_history_version(request, text, admin=False):
-#    pass
-#    
 class TextVersionForm(ModelForm):
     class Meta:
         model = TextVersion
         fields = ('title', 'content', 'format')
 
-@has_perm_on_text('can_view_text')
-def text_diff(request, key, id_v1, id_v2):
-    text = get_text_by_keys_or_404(key)
-    text_version_1 = TextVersion.objects.get(pk=id_v1)
-    text_version_2 = TextVersion.objects.get(pk=id_v2)
-    content = _text_diff(text_version_1.get_content(), text_version_2.get_content())
-    title = _text_diff(text_version_1.title, text_version_2.title)
-    return render_to_response('site/text_view.html', {'text' : text, 'text_version_1' : text_version_1, 'text_version_2' : text_version_2, 'title' : title, 'content' : content}, context_instance=RequestContext(request))
-
-# commented out, unused suspected 
-#@has_perm_on_text('can_view_text')
-#def text_version(request, key, id_version):
-#    text = get_text_by_keys_or_404(key)
-#    text_version = TextVersion.objects.get(pk=id_version)
-#    # TODO : assert text_v in text ...
-#    # TODO : do not use db id    
-#    return render_to_response('site/text_view.html', {'text' : text, 'text_version' : text_version, 'title' : text_version.title, 'content' : text_version.get_content()}, context_instance=RequestContext(request))
-
 class EditTextForm(ModelForm):
     title = forms.CharField(label=_("Title"), widget=forms.TextInput)
     #format = forms.CharField(label=_("Format"))