'%type)
if s1!=None and s1!="":
- sys.stdout.write('%d | '%line1)
- sys.stdout.write('')
- sys.stdout.write(convert(s1, linesize=LINESIZE, ponct=1))
- sys.stdout.write(' | ')
+ outputfile.write('%d | '%line1)
+ outputfile.write('')
+ outputfile.write(convert(s1, linesize=linesize, ponct=1))
+ outputfile.write(' | ')
else:
s1=""
- sys.stdout.write(' | ')
+ outputfile.write(' | ')
if s2!=None and s2!="":
- sys.stdout.write('%d | '%line2)
- sys.stdout.write('')
- sys.stdout.write(convert(s2, linesize=LINESIZE, ponct=1))
- sys.stdout.write(' | ')
+ outputfile.write('%d | '%line2)
+ outputfile.write('')
+ outputfile.write(convert(s2, linesize=linesize, ponct=1))
+ outputfile.write(' | ')
else:
s2=""
- sys.stdout.write(' | ')
+ outputfile.write(' | ')
- sys.stdout.write('
\n')
+ outputfile.write('\n')
if s1!="":
line1 += 1
@@ -247,17 +268,17 @@ def add_line(s1, s2):
def empty_buffer():
- global buffer
+ global buf
global add_cpt
global del_cpt
if del_cpt == 0 or add_cpt == 0:
- for l in buffer:
+ for l in buf:
add_line(l[0], l[1])
elif del_cpt != 0 and add_cpt != 0:
l0, l1 = [], []
- for l in buffer:
+ for l in buf:
if l[0] != None:
l0.append(l[0])
if l[1] != None:
@@ -272,65 +293,132 @@ def empty_buffer():
add_line(s0, s1)
add_cpt, del_cpt = 0,0
- buffer = []
+ buf = []
+def parse_input():
+ global buf, add_cpt, del_cpt
+ global line1, line2
+ global hunk_off1, hunk_size1, hunk_off2, hunk_size2
-sys.stdout.write(html_hdr)
+ if not exclude_headers:
+ outputfile.write(html_hdr)
+ outputfile.write(table_hdr)
+
+ while True:
+ l=inputfile.readline()
+ if l=="":
+ break
-while True:
- l=sys.stdin.readline()
- if l=="":
- break
-
- m=re.match('^--- ([^\s]*)', l)
- if m:
- empty_buffer()
- file1=m.groups()[0]
- l=sys.stdin.readline()
- m=re.match('^\+\+\+ ([^\s]*)', l)
+ m=re.match('^--- ([^\s]*)', l)
if m:
- file2=m.groups()[0]
- add_filename(file1, file2)
- hunk_off1, hunk_size1, hunk_off2, hunk_size2 = 0,0,0,0
- continue
+ empty_buffer()
+ file1=m.groups()[0]
+ l=inputfile.readline()
+ m=re.match('^\+\+\+ ([^\s]*)', l)
+ if m:
+ file2=m.groups()[0]
+ add_filename(file1, file2)
+ hunk_off1, hunk_size1, hunk_off2, hunk_size2 = 0,0,0,0
+ continue
+
+ m=re.match("@@ -(\d+),?(\d*) \+(\d+),?(\d*)", l)
+ if m:
+ empty_buffer()
+ hunk_data = map(lambda x:x=="" and 1 or int(x), m.groups())
+ hunk_off1, hunk_size1, hunk_off2, hunk_size2 = hunk_data
+ line1, line2 = hunk_off1, hunk_off2
+ add_hunk()
+ continue
+
+ if hunk_size1 == 0 and hunk_size2 == 0:
+ empty_buffer()
+ add_comment(l)
+ continue
+
+ if re.match("^\+", l):
+ add_cpt += 1
+ hunk_size2 -= 1
+ buf.append((None, l[1:]))
+ continue
+
+ if re.match("^\-", l):
+ del_cpt += 1
+ hunk_size1 -= 1
+ buf.append((l[1:], None))
+ continue
+
+ if re.match("^\ ", l) and hunk_size1 and hunk_size2:
+ empty_buffer()
+ hunk_size1 -= 1
+ hunk_size2 -= 1
+ buf.append((l[1:], l[1:]))
+ continue
- m=re.match("@@ -(\d+),?(\d*) \+(\d+),?(\d*)", l)
- if m:
- empty_buffer()
- hunk_data = map(lambda x:x=="" and 1 or int(x), m.groups())
- hunk_off1, hunk_size1, hunk_off2, hunk_size2 = hunk_data
- line1, line2 = hunk_off1, hunk_off2
- add_hunk()
- continue
-
- if hunk_size1 == 0 and hunk_size2 == 0:
empty_buffer()
add_comment(l)
- continue
-
- if re.match("^\+", l):
- add_cpt += 1
- hunk_size2 -= 1
- buffer.append((None, l[1:]))
- continue
-
- if re.match("^\-", l):
- del_cpt += 1
- hunk_size1 -= 1
- buffer.append((l[1:], None))
- continue
-
- if re.match("^\ ", l) and hunk_size1 and hunk_size2:
- empty_buffer()
- hunk_size1 -= 1
- hunk_size2 -= 1
- buffer.append((l[1:], l[1:]))
- continue
empty_buffer()
- add_comment(l)
-
+ outputfile.write(table_footer)
+ if not exclude_headers:
+ outputfile.write(html_footer)
+
+
+def usage():
+ print '''
+diff2html.py [-i file] [-o file] [-x]
+diff2html.py -h
+
+Transform a unified diff from stdin to a colored side-by-side HTML
+page on stdout.
+
+ -i file set input file, else use stdin
+ -o file set output file, else use stdout
+ -x exclude html header and footer
+ -t tabsize set tab size (default 8)
+ -l linesize set maximum line size is there is no word break (default 20)
+ -r show \\r characters
+ -k show hunk infos
+ -h show help and exit
+'''
+
+def main():
+ global linesize, tabsize
+ global inputfile, outputfile
+ global exclude_headers, show_CR, show_hunk_infos
+
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], "hi:o:xt:l:rk",
+ ["help", "input=", "output=",
+ "exclude-html-headers", "tabsize=",
+ "linesize=", "show-cr", "show-hunk-infos"])
+ except getopt.GetoptError, err:
+ print str(err) # will print something like "option -a not recognized"
+ usage()
+ sys.exit(2)
+ output = None
+ verbose = False
+ for o, a in opts:
+ if o in ("-h", "--help"):
+ usage()
+ sys.exit()
+ elif o in ("-i", "--input"):
+ inputfile = open(a, "r")
+ elif o in ("-o", "--output"):
+ outputfile = open(a, "w")
+ elif o in ("-x", "--exclude-html-headers"):
+ exclude_headers = True
+ elif o in ("-t", "--tabsize"):
+ tabsize = int(a)
+ elif o in ("-l", "--linesize"):
+ linesize = int(a)
+ elif o in ("-r", "--show-cr"):
+ show_CR = True
+ elif o in ("-k", "--show-hunk-infos"):
+ show_hunk_infos = True
+ else:
+ assert False, "unhandled option"
+ parse_input()
-empty_buffer()
-sys.stdout.write(html_footer)
+if __name__ == "__main__":
+ main()