我们从Python开源项目中,提取了以下31个代码示例,用于说明如何使用difflib.HtmlDiff()。
def diff( self, id1, id2, r1=None, r2=None ): cdfl = CoreData.FileList() cdfl.__createFileList__() fn1 = cdf.__filterByFlightNumberAndRevision__( id1, r1 ) fn2 = cdf.__filterByFlightNumberAndRevision__( id2, r2 ) fc1 = __getFlightConstants__( fn1 ) fc2 = __getFlightConstants__( fn2 ) differ = difflib.HtmlDiff( tabsize=4, wrapcolumn=40 ) html = differ.make_file( fc1, fc2, context=False ) outfile = open( '/home/axel/tmp/difftest.html', 'w' ) outfile.write(html) outfile.close()
def getDiff(self, cr, uid, v1, v2, context=None): history_pool = self.pool.get('blog.post.history') text1 = history_pool.read(cr, uid, [v1], ['content'])[0]['content'] text2 = history_pool.read(cr, uid, [v2], ['content'])[0]['content'] line1 = line2 = '' if text1: line1 = text1.splitlines(1) if text2: line2 = text2.splitlines(1) if (not line1 and not line2) or (line1 == line2): raise osv.except_osv(_('Warning!'), _('There are no changes in revisions.')) diff = difflib.HtmlDiff() return diff.make_table(line1, line2, "Revision-%s" % (v1), "Revision-%s" % (v2), context=True)
def lines_from_sourcepairs(pairs, numlines=2, enc='utf-8'): # type: (List[BytesPair], int, str) -> Tuple[List[str], List[str]] def safeunistr(s): # type: (bytes) -> str # The bytes 0 and 1 that appear in the intermediate result of # difflib.HtmlDiff.make_table are replaced by opening and closing span tags. # If the input to make_table already contains 0 and 1 bytes we get mismatched # span tags. # We use '\x02' as escape character and encode '\x00', '\x01', '\x02' as # '\x02' followed by the digit 0, 1, 2 respectively. def escape_zeroonetwo(m): return b'\x02' + int2byte(ord('0') + ord(m.group(0))) s = re.sub(b'[\x00-\x02]', escape_zeroonetwo, s) return surrdecode(s, enc=enc) a = [a for a, _ in pairs] b = [b for _, b in pairs] a = concat_sources(a, numlines=numlines).splitlines(True) b = concat_sources(b, numlines=numlines).splitlines(True) atext = list(map(safeunistr, a)) btext = list(map(safeunistr, b)) return atext, btext # yapf: disable # ---------------------------------------------------------------------- # http://stackoverflow.com/questions/1707890/ # fast-way-to-filter-illegal-xml-unicode-chars-in-python
def email_changes(zone, prev_addrs, curr_addrs, subject, server, fromaddr, toaddr, test=False): bindformat = format_records_for_email(curr_addrs) prev_addrs = ' '.join(prev_addrs) curr_addrs = ' '.join(curr_addrs) prev = sorted([s for s in prev_addrs.split() if 'ip' in s]) curr = sorted([s for s in curr_addrs.split() if 'ip' in s]) diff = HtmlDiff() table = diff.make_table( fromlines=prev, tolines=curr, fromdesc='Old records', todesc='New records' ) header = '<h1>Diff</h1>' html = _email_style + bindformat + header + table html = MIMEText(html, 'html') msg_template = MIMEMultipart('alternative') msg_template['Subject'] = subject.format(zone=zone) email = msg_template email.attach(html) try: mailserver = smtplib.SMTP() mailserver.connect(server) mailserver.sendmail(fromaddr, toaddr, email.as_string()) except Exception as err: print('Email failed: ' + str(err)) with open('result.html', 'w+') as mailfile: mailfile.write(html.as_string()) if test: return bindformat
def test_main(): difflib.HtmlDiff._default_prefix = 0 Doctests = doctest.DocTestSuite(difflib) run_unittest( TestWithAscii, TestAutojunk, TestSFpatches, TestSFbugs, TestOutputFormat, Doctests)
def main(): usage = "usage: %prog [options] fromfile tofile" parser = optparse.OptionParser(usage) parser.add_option("-c", action="store_true", default=False, help='Produce a context format diff (default)') parser.add_option("-u", action="store_true", default=False, help='Produce a unified format diff') parser.add_option("-m", action="store_true", default=False, help='Produce HTML side by side diff (can use -c and -l in conjunction)') parser.add_option("-n", action="store_true", default=False, help='Produce a ndiff format diff') parser.add_option("-l", "--lines", type="int", default=3, help='Set number of context lines (default 3)') (options, args) = parser.parse_args() if len(args) == 0: parser.print_help() sys.exit(1) if len(args) != 2: parser.error("need to specify both a fromfile and tofile") n = options.lines fromfile, tofile = args fromdate = time.ctime(os.stat(fromfile).st_mtime) todate = time.ctime(os.stat(tofile).st_mtime) fromlines = open(fromfile, 'U').readlines() tolines = open(tofile, 'U').readlines() if options.u: diff = difflib.unified_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n) elif options.n: diff = difflib.ndiff(fromlines, tolines) elif options.m: diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile,context=options.c,numlines=n) else: diff = difflib.context_diff(fromlines, tolines, fromfile, tofile, fromdate, todate, n=n) sys.stdout.writelines(diff)
def make_diff(old, new): """ Render in HTML the diff between two texts """ df = HtmlDiff() old_lines = old.splitlines(1) new_lines = new.splitlines(1) html = df.make_table(old_lines, new_lines, context=True) html = html.replace(' nowrap="nowrap"','') return html
def html_diff(old_as_text, new_as_text): # {{{1 """ returns a utf8 string containing the code of a html table showing differences of the utf8 parameters """ old_as_text = old_as_text.splitlines() new_as_text = new_as_text.splitlines() table = HtmlDiff( tabsize = 4 ).make_table( old_as_text, new_as_text ) return table.replace( ' ', ' ' ).replace( ' nowrap="nowrap"', '' )
def make_file(self, context=False, lines=3): return difflib.HtmlDiff().make_file( self.fromlines, self.tolines, self._fromfile, self._tofile, context=context, numlines=lines)
def diff_working(repo,file,src=source.PATH): store=repo.object_store index=repo.open_index() tree=store[store[repo.head()].tree] parent_tree=store[store[store[repo.head()].parents[0]].tree] tree_ver=store[tree.lookup_path(store.peel_sha,file)[1]].data local_ver=open(os.path.join(repo.path,file)).read() h=HtmlDiff(wrapcolumn=70,tabsize=4) if src==source.PATH: f=h.make_file(tree_ver.splitlines(),local_ver.splitlines(), file, 'last commit:'+repo.head()) elif src==source.INDEX: index_ver=store[index._byname[file].sha].data f=h.make_file(tree_ver.splitlines(),index_ver.splitlines(),file+' staged change', 'last commit'+repo.head()) else: parent_tree_ver=store[parent_tree.lookup_path(store.peel_sha,file)[1]].data f=h.make_file(parent_tree_ver.splitlines(),tree_ver.splitlines(), file+' HEAD','HEAD^1') return f #f=diff_working(porcelain.open_repo('.'),'gitui.py') #w=ui.WebView() #w.load_html(f) #w.present()
def create_diff_report(file1, file2, file_name, from_desc, to_desc, is_64_bit): """ Create a report showing the differences between two files Arguments : file1 : path to a file to disassemble file2 : path to a file to disassemble report_name : The name to use for the report from_desc : A description of the 'from' element to_desc : A description of the 'to' element """ # Disassemble each file and split into lines disassembled_1 = OPcacheDisassembler(is_64_bit).disassemble(file1).split("\n") disassembled_2 = OPcacheDisassembler(is_64_bit).disassemble(file2).split("\n") # Differ html_differ = difflib.HtmlDiff() # Generate the report and write into a file file_name = file_name.replace("/", "%2f") + '.html' hash_name = hashlib.sha1(file_name).hexdigest() with open(hunt_report + "/" + hash_name + ".html", "w") as f: content = html_differ.make_file(disassembled_1, disassembled_2, from_desc, to_desc) f.write(content) # Return the name of the report return (file_name, hash_name + ".html")
def test_html_diff(self): # Check SF patch 914575 for generating HTML differences f1a = ((patch914575_from1 + '123\n'*10)*3) t1a = (patch914575_to1 + '123\n'*10)*3 f1b = '456\n'*10 + f1a t1b = '456\n'*10 + t1a f1a = f1a.splitlines() t1a = t1a.splitlines() f1b = f1b.splitlines() t1b = t1b.splitlines() f2 = patch914575_from2.splitlines() t2 = patch914575_to2.splitlines() f3 = patch914575_from3 t3 = patch914575_to3 i = difflib.HtmlDiff() j = difflib.HtmlDiff(tabsize=2) k = difflib.HtmlDiff(wrapcolumn=14) full = i.make_file(f1a,t1a,'from','to',context=False,numlines=5) tables = '\n'.join( [ '<h2>Context (first diff within numlines=5(default))</h2>', i.make_table(f1a,t1a,'from','to',context=True), '<h2>Context (first diff after numlines=5(default))</h2>', i.make_table(f1b,t1b,'from','to',context=True), '<h2>Context (numlines=6)</h2>', i.make_table(f1a,t1a,'from','to',context=True,numlines=6), '<h2>Context (numlines=0)</h2>', i.make_table(f1a,t1a,'from','to',context=True,numlines=0), '<h2>Same Context</h2>', i.make_table(f1a,f1a,'from','to',context=True), '<h2>Same Full</h2>', i.make_table(f1a,f1a,'from','to',context=False), '<h2>Empty Context</h2>', i.make_table([],[],'from','to',context=True), '<h2>Empty Full</h2>', i.make_table([],[],'from','to',context=False), '<h2>tabsize=2</h2>', j.make_table(f2,t2), '<h2>tabsize=default</h2>', i.make_table(f2,t2), '<h2>Context (wrapcolumn=14,numlines=0)</h2>', k.make_table(f3.splitlines(),t3.splitlines(),context=True,numlines=0), '<h2>wrapcolumn=14,splitlines()</h2>', k.make_table(f3.splitlines(),t3.splitlines()), '<h2>wrapcolumn=14,splitlines(True)</h2>', k.make_table(f3.splitlines(True),t3.splitlines(True)), ]) actual = full.replace('</body>','\n%s\n</body>' % tables) # temporarily uncomment next two lines to baseline this test #with open('test_difflib_expect.html','w') as fp: # fp.write(actual) with open(findfile('test_difflib_expect.html')) as fp: self.assertEqual(actual, fp.read())
def check(language): """ Ensure that external code files exist and check which external files have changed from what's in the .rst files. Generate files in the _deltas subdirectory showing what has changed. """ class Result: # Messenger def __init__(self, `kwargs): self.__dict__ = kwargs result = Result(missing = [], deltas = []) listings = [Result(code = shift(code), file = f) for f in restFiles for code in language.listings.findall(open(f).read())] paths = [os.path.normpath(os.path.join("..", "code", path)) for path in [listing.code[0].strip()[len(language.commentTag):].strip() for listing in listings]] if os.path.exists("_deltas"): shutil.rmtree("_deltas") for path, listing in zip(paths, listings): if not os.path.exists(path): result.missing.append(path) else: code = open(path).read().splitlines() for i in difflib.ndiff(listing.code, code): if i.startswith("+ ") or i.startswith("- "): d = difflib.HtmlDiff() if not os.path.exists("_deltas"): os.makedirs("_deltas") html = os.path.join("_deltas", os.path.basename(path).split('.')[0] + ".html") open(html, 'w').write( "<html><h1>Left: %s<br>Right: %s</h1>" % (listing.file, path) + d.make_file(listing.code, code)) result.deltas.append(Result(file = listing.file, path = path, html = html, code = code)) break if result.missing: print("Missing %s files:\n%s" % (language.__name__, "\n".join(result.missing))) for delta in result.deltas: print("%s changed in %s; see %s" % (delta.file, delta.path, delta.html)) return result
def check(language): """ Ensure that external code files exist and check which external files have changed from what's in the .rst files. Generate files in the _deltas subdirectory showing what has changed. """ class Result: # Messenger def __init__(self, **kwargs): self.__dict__ = kwargs result = Result(missing = [], deltas = []) listings = [Result(code = shift(code), file = f) for f in restFiles for code in language.listings.findall(open(f).read())] paths = [os.path.normpath(os.path.join("..", "code", path)) for path in [listing.code[0].strip()[len(language.commentTag):].strip() for listing in listings]] if os.path.exists("_deltas"): shutil.rmtree("_deltas") for path, listing in zip(paths, listings): if not os.path.exists(path): result.missing.append(path) else: code = open(path).read().splitlines() for i in difflib.ndiff(listing.code, code): if i.startswith("+ ") or i.startswith("- "): d = difflib.HtmlDiff() if not os.path.exists("_deltas"): os.makedirs("_deltas") html = os.path.join("_deltas", os.path.basename(path).split('.')[0] + ".html") open(html, 'w').write( "<html><h1>Left: %s<br>Right: %s</h1>" % (listing.file, path) + d.make_file(listing.code, code)) result.deltas.append(Result(file = listing.file, path = path, html = html, code = code)) break if result.missing: print("Missing %s files:\n%s" % (language.__name__, "\n".join(result.missing))) for delta in result.deltas: print("%s changed in %s; see %s" % (delta.file, delta.path, delta.html)) return result
def check(language, verbose=True): """ Ensure that external code files exist and check which external files have changed from what's in the .rst files. Generate files in the _deltas subdirectory showing what has changed. """ class Result: # Messenger def __init__(self, **kwargs): self.__dict__ = kwargs result = Result(missing = [], deltas = []) listings = [Result(code = shift(code), file = f) for f in restFiles for code in language.listings.findall(open(f).read())] paths = [os.path.normpath(os.path.join("..", "code", path)) for path in [listing.code[0].strip()[len(language.commentTag):].strip() for listing in listings]] if os.path.exists("_deltas"): shutil.rmtree("_deltas") for path, listing in zip(paths, listings): if not os.path.exists(path): result.missing.append(path) else: code = open(path).read().splitlines() if difference(listing.code, code): d = difflib.HtmlDiff() if not os.path.exists("_deltas"): os.makedirs("_deltas") html = os.path.join("_deltas", os.path.basename(path).split('.')[0] + ".html") open(html, 'w').write( "<html><h1>Left: %s<br>Right: %s</h1>" % (listing.file, path) + d.make_file(listing.code, code)) result.deltas.append(Result(file = listing.file, path = path, html = html, code = code)) if result.missing: print("Missing %s files:\n%s" % (language.__name__, "\n".join(result.missing))) if verbose: for delta in result.deltas: print("%s <==> %s; see %s" % (delta.file, delta.path, delta.html)) return result
def compare_fiff(fname_1, fname_2, fname_out=None, show=True, indent=' ', read_limit=np.inf, max_str=30, verbose=None): """Compare the contents of two fiff files using diff and show_fiff Parameters ---------- fname_1 : str First file to compare. fname_2 : str Second file to compare. fname_out : str | None Filename to store the resulting diff. If None, a temporary file will be created. show : bool If True, show the resulting diff in a new tab in a web browser. indent : str How to indent the lines. read_limit : int Max number of bytes of data to read from a tag. Can be np.inf to always read all data (helps test read completion). max_str : int Max number of characters of string representation to print for each tag's data. verbose : bool, str, int, or None If not None, override default verbose level (see mne.verbose). Returns ------- fname_out : str The filename used for storing the diff. Could be useful for when a temporary file is used. """ file_1 = show_fiff(fname_1, output=list, indent=indent, read_limit=read_limit, max_str=max_str) file_2 = show_fiff(fname_2, output=list, indent=indent, read_limit=read_limit, max_str=max_str) diff = difflib.HtmlDiff().make_file(file_1, file_2, fname_1, fname_2) if fname_out is not None: f = open(fname_out, 'wb') else: f = tempfile.NamedTemporaryFile('wb', delete=False, suffix='.html') fname_out = f.name with f as fid: fid.write(diff.encode('utf-8')) if show is True: webbrowser.open_new_tab(fname_out) return fname_out