def testInterline(self): """Testing inter-line diffs""" def deepEqual(A, B): typea, typeb = type(A), type(B) self.assertEqual(typea, typeb) if typea is tuple or typea is list: for a, b in map(None, A, B): deepEqual(a, b) else: self.assertEqual(A, B) deepEqual(diffutils.get_line_changed_regions(None, None), (None, None)) old = 'submitter = models.ForeignKey(Person, verbose_name="Submitter")' new = 'submitter = models.ForeignKey(User, verbose_name="Submitter")' regions = diffutils.get_line_changed_regions(old, new) deepEqual(regions, ([(30, 36)], [(30, 34)])) old = '-from reviews.models import ReviewRequest, Person, Group' new = '+from .reviews.models import ReviewRequest, Group' regions = diffutils.get_line_changed_regions(old, new) deepEqual(regions, ([(0, 1), (6, 6), (43, 51)], [(0, 1), (6, 7), (44, 44)])) old = 'abcdefghijklm' new = 'nopqrstuvwxyz' regions = diffutils.get_line_changed_regions(old, new) deepEqual(regions, (None, None))
def _render_change_replace_lines(self, differ, i1, i2, j1, j2, old_lines, new_lines): replace_new_lines = [] for i, j in zip(range(i1, i2), range(j1, j2)): old_line = old_lines[i] new_line = new_lines[j] old_regions, new_regions = \ get_line_changed_regions(unescape(strip_tags(old_line)), unescape(strip_tags(new_line))) old_line = highlightregion(old_line, old_regions) new_line = highlightregion(new_line, new_regions) yield ('<tr class="replace-old">' ' <td class="marker">~</td>' ' <td class="marker"> </td>' ' <td class="line rich-text">%s</td>' '</tr>' % old_line) replace_new_lines.append(new_line) for line in replace_new_lines: yield ('<tr class="replace-new">' ' <td class="marker"> </td>' ' <td class="marker">~</td>' ' <td class="line rich-text">%s</td>' '</tr>' % line)
def _render_change_replace_lines(self, differ, i1, i2, j1, j2, old_lines, new_lines): replace_new_lines = [] for i, j in zip(range(i1, i2), range(j1, j2)): old_line = old_lines[i] new_line = new_lines[j] parser = HTMLParser() old_regions, new_regions = \ get_line_changed_regions(parser.unescape(strip_tags(old_line)), parser.unescape(strip_tags(new_line))) old_line = highlightregion(old_line, old_regions) new_line = highlightregion(new_line, new_regions) yield ( '<tr class="replace-old">' ' <td class="marker">~</td>' ' <td class="marker"> </td>' ' <td class="line rich-text">%s</td>' '</tr>' % old_line) replace_new_lines.append(new_line) for line in replace_new_lines: yield ( '<tr class="replace-new">' ' <td class="marker"> </td>' ' <td class="marker">~</td>' ' <td class="line rich-text">%s</td>' '</tr>' % line)
def _diff_line(self, tag, meta, v_line_num, old_line_num, new_line_num, old_line, new_line, old_markup, new_markup): """Creates a single line in the diff viewer. Information on the line will be returned, and later will be used for rendering the line. The line represents a single row of a side-by-side diff. It contains a row number, real line numbers, region information, syntax-highlighted HTML for the text, and other metadata. """ if (tag == 'replace' and old_line and new_line and len(old_line) <= self.STYLED_MAX_LINE_LEN and len(new_line) <= self.STYLED_MAX_LINE_LEN and old_line != new_line): # Generate information on the regions that changed between the # two lines. old_region, new_region = \ get_line_changed_regions(old_line, new_line) else: old_region = new_region = [] old_markup = old_markup or '' new_markup = new_markup or '' line_pair = (old_line_num, new_line_num) indentation_changes = meta.get('indentation_changes', {}) if line_pair[0] is not None and line_pair[1] is not None: indentation_change = indentation_changes.get('%d-%d' % line_pair) if indentation_change: old_markup, new_markup = self._highlight_indentation( old_markup, new_markup, *indentation_change) result = [ v_line_num, old_line_num or '', mark_safe(old_markup), old_region, new_line_num or '', mark_safe(new_markup), new_region, line_pair in meta['whitespace_lines'] ] moved_info = {} if old_line_num and old_line_num in meta.get('moved-to', {}): moved_info['to'] = ( meta['moved-to'][old_line_num], old_line_num - 1 not in meta['moved-to'], ) if new_line_num and new_line_num in meta.get('moved-from', {}): moved_info['from'] = ( meta['moved-from'][new_line_num], new_line_num - 1 not in meta['moved-from'], ) if moved_info: result.append(moved_info) return result
def get_line_changed_regions(self, old_line_num, old_line, new_line_num, new_line): """Return information on changes between two lines. This returns a tuple containing a list of tuples of ranges in the old line, and a list of tuples of ranges in the new line, that should be highlighted. This defaults to simply wrapping get_line_changed_regions() from diffutils. Subclasses can override to provide custom behavior. """ return get_line_changed_regions(old_line, new_line)
def _diff_line(self, v_line_num, old_line_num, new_line_num, old_line, new_line, old_markup, new_markup): """Creates a single line in the diff viewer. Information on the line will be returned, and later will be used for rendering the line. The line represents a single row of a side-by-side diff. It contains a row number, real line numbers, region information, syntax-highlighted HTML for the text, and other metadata. """ if (old_line and new_line and len(old_line) <= self.STYLED_MAX_LINE_LEN and len(new_line) <= self.STYLED_MAX_LINE_LEN and old_line != new_line): old_region, new_region = \ get_line_changed_regions(old_line, new_line) else: old_region = new_region = [] old_markup = old_markup or '' new_markup = new_markup or '' meta = self._cur_meta line_pair = (old_line_num, new_line_num) indentation_changes = meta.get('indentation_changes', {}) if line_pair[0] is not None and line_pair[1] is not None: indentation_change = indentation_changes.get('%d-%d' % line_pair) if indentation_change: old_markup, new_markup = self._highlight_indentation( old_markup, new_markup, *indentation_change) result = [ v_line_num, old_line_num or '', mark_safe(old_markup), old_region, new_line_num or '', mark_safe(new_markup), new_region, line_pair in meta['whitespace_lines'] ] moved_info = {} if old_line_num and old_line_num in meta.get('moved-to', {}): moved_info['to'] = meta['moved-to'][old_line_num] if new_line_num and new_line_num in meta.get('moved-from', {}): moved_info['from'] = meta['moved-from'][new_line_num] if moved_info: result.append(moved_info) return result