Example #1
0
 def run(self, edit, payload=None, **kwargs):
     old_content = self.view.substr(sublime.Region(0, self.view.size()))
     if old_content == payload:
         return
     viewport = self.view.viewport_position()
     self.view.replace(edit, sublime.Region(0, self.view.size()), payload)
     diff = diff_match_patch().diff_lineMode(old_content, payload, time.time() + 10)
     offset = 0
     begin = 0
     end = 0
     for item in diff:
         if item[0] == 1 and begin == 0:
             begin = offset
         if item[0] != -1:
             offset += len(item[1])
         if item[0] == 1:
             end = offset
     self.view.add_regions('diff', [sublime.Region(begin, end)], 'comment')
     self.view.set_viewport_position(viewport)
     sublime.set_timeout(partial(self.set_viewport_position_, viewport), 0)
     sublime.set_timeout(self.clear_diff_markers_, 150)
Example #2
0
# Patch generation methods, only available if the google-diff-match-patch
# library is installed.
#
# http://code.google.com/p/google-diff-match-patch/


try:
    from diff.diff_match_patch import diff_match_patch
except ImportError:
    pass
else:
    dmp = diff_match_patch()

    def generate_diffs(old_version, new_version, field_name, cleanup):
        """Generates a diff array for the named field between the two versions."""
        # Extract the text from the versions.
        old_text = old_version.field_dict[field_name] or u""
        new_text = new_version.field_dict[field_name] or u""
        # Generate the patch.
        diffs = dmp.diff_main(unicode(old_text), unicode(new_text))
        if cleanup == "semantic":
            dmp.diff_cleanupSemantic(diffs)
        elif cleanup == "efficiency":
            dmp.diff_cleanupEfficiency(diffs)
        elif cleanup is None:
            pass
        else:
            raise ValueError("cleanup parameter should be one of 'semantic', 'efficiency' or None.")
        return diffs

    def generate_patch(old_version, new_version, field_name, cleanup=None):