# reverses cells (<td, <th) in every row of a table 

import sys

with open(sys.argv[1],"r") as fin:
    lines=fin.readlines()

tags=["<td", "<th"]

def starts_with_tag(line, tags):
    for tag in tags:
        if line.startswith(tag): return True
    return False

a=[starts_with_tag(line,tags) for line in lines] # if lines to be reversed

# in a list, returns ranges of elements to be reversed   
def seq_to_ranges(a, cond_value):
    indices = [idx for idx,val in enumerate(a) if val==cond_value]
    ranges = [[]]
    for val in indices:
        if not ranges[-1] or ranges[-1][-1] == val-1:
            ranges[-1].append(val)
        else:
            ranges.append([val])
    ranges = [[item[0],item[-1]] if len(item) > 1 else item for item in ranges]
    return ranges

# islands to be reversed , to be held
ranges_invert=seq_to_ranges(a,True)
ranges_hold=seq_to_ranges(a,False)

# cumulate, concatenate
result=[]
for range_hold,range_invert in zip(ranges_hold[:-1],ranges_invert):
    result+=lines[range_hold[0]:range_hold[-1]+1]+lines[range_invert[-1]:range_invert[0]-1:-1]
result+=lines[ranges_hold[-1][0]:]

with open(sys.argv[2]+sys.argv[1],"w+") as fout:
    fout.write("".join(result))
