#!/usr/bin/env python import sys import yaml import empty def is_ht( s, c ): return len( s ) >= 2 and s[ 0 ] == c and s[ -1 ] == c def from_csv( s ): e = empty.new() e.in_quote = False e.s = '' e.lst = [ [] ] def flush(): s = e.s e.s = '' if is_ht( s, '"' ): s = s[ 1 : -1 ] s = s.replace( '""', '"' ) e.lst[ -1 ].append( s ) def add_c( c ): if c == '\r': return if not e.in_quote and c in ',\n': flush() if c == '\n': e.lst.append( [] ) return e.s += c if c == '"': e.in_quote = not e.in_quote s = s.strip() for c in s: add_c( c ) flush() return e.lst def to_csv( lst ): def cnv_row( cols ): def cnv_col( col ): s = str( col ) if '"' in s: s = s.replace( '"', '""' ) if any( map( lambda c: c in s, '",\n' ) ): s = '"' + s + '"' return s return ','.join( map( cnv_col, cols ) ) return '\n'.join( map( cnv_row, lst ) ) def from_ul( s ): e = empty.new() e.lst = [ [] ] e.ids = [] get_spc = lambda s: 1 + get_spc( s[ 1 : ] ) if s and s[ 0 ] == ' ' else 0 def cnv_nl( s ): k = '\\n' while k in s: i = s.index( k ) j = i + len( k ) n = get_spc( s[ j : ] ) s = s[ : i ] + '\n' + s[ j + n : ] return s def cnv_qt( s ): qts = [ "'", '"' ] if any( map( lambda qt: is_ht( s, qt ), qts ) ): s = s[ 1 : -1 ] return s lst = s.strip().replace( '\\\n', '' ).split( '\n' ) for s in lst: n = get_spc( s ) s = s[ n : ] s = cnv_nl( s ) s = cnv_qt( s ) if e.ids and n <= e.ids[ -1 ]: e.ids = list( filter( lambda v: v < n, e.ids ) ) e.lst.append( [] ) e.lst[ -1 ].extend( [ '' ] * len( e.ids ) ) e.lst[ -1 ].append( s ) e.ids.append( n ) return e.lst def to_ul( lst ): buf = [] for cols in lst: dirty = False for ( i, col ) in enumerate( cols ): col = str( col ) if not col and not dirty: continue dirty = True if not col: col = "''" s = col.replace( '\n', '\\n' ) s = ' ' * ( i * 2 ) + s buf.append( s ) return '\n'.join( buf ) def from_yaml( s ): return yaml.load( s ) def to_yaml( lst ): return yaml.dump( lst ) def from_raw( s ): return eval( s ) def to_raw( lst ): return str( lst ) if __name__ == "__main__": from_func = from_csv to_func = to_ul gdic = globals() for a in sys.argv[ 1 : ]: if a.startswith( 'from_' ) and a in gdic: from_func = gdic.get( a ) elif a.startswith( 'to_' ) and a in gdic: to_func = gdic.get( a ) f = sys.stdin s = f.read() lst = from_func( s ) s = to_func( lst ) print( s ) # EOF