allow to be called with strings instead of IO files
[diff2html.git] / diff2html.py
index 9c0af69..337667f 100644 (file)
@@ -20,6 +20,7 @@
 #
 # Authors: Olivier MATZ <zer0@droids-corp.org>
 #          Alan De Smet <adesmet@cs.wisc.edu>
+#          Sergey Satskiy <sergey.satskiy@gmail.com>
 #
 # Inspired by diff2html.rb from Dave Burt <dave (at) burt.id.au>
 # (mainly for html theme)
@@ -32,7 +33,7 @@
 #   and display those directly.
 
 
-import sys, re, htmlentitydefs, getopt
+import sys, re, htmlentitydefs, getopt, StringIO
 
 # minimum line size, we add a zero-sized breakable space every
 # LINESIZE characters
@@ -164,7 +165,6 @@ def linediff(s, t):
 def convert(s, linesize=0, ponct=0):
     i = 0
     t = ""
-    l=[]
     for c in s:
         # used by diffs
         if c == DIFFON:
@@ -309,10 +309,12 @@ def parse_input(input_file, output_file,
         if m:
             empty_buffer(output_file)
             file1 = m.groups()[0]
-            l = input_file.readline()
-            m = re.match('^\+\+\+ ([^\s]*)', l)
-            if m:
-                file2 = m.groups()[0]
+            while True:
+                l = input_file.readline()
+                m = re.match('^\+\+\+ ([^\s]*)', l)
+                if m:
+                    file2 = m.groups()[0]
+                    break
             add_filename(file1, file2, output_file)
             hunk_off1, hunk_size1, hunk_off2, hunk_size2 = 0, 0, 0, 0
             continue
@@ -396,7 +398,6 @@ def main():
         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"):
@@ -421,6 +422,11 @@ def main():
     parse_input(input_file, output_file,
                 exclude_headers, show_hunk_infos)
 
+def parse_from_memory(txt, exclude_headers, show_hunk_infos):
+    " Parses diff from memory and returns a string with html "
+    stream = StringIO.StringIO(txt)
+    parse_input(stream, stream, exclude_headers, show_hunk_infos)
+    return stream.buf
 
 if __name__ == "__main__":
     main()