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)
# 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):