#!/usr/bin/env python import os import empty def to_str(lst, pre='', delim='\n', last=False): s = delim.join( map( lambda s: pre + s, lst ) ) if last: s += delim return s def filter_str(f, s): return ''.join( filter(f, s) ) def filter_div(f, lst): not_f = lambda e: not f(e) return ( list( filter( f, lst ) ), list( filter( not_f, lst ) ) ) def add_path(base, add, delim='/'): lst = [] if base: lst.append( base ) if add: lst.append( add ) return delim.join( lst ) def path_lst(name, from__file__): lst = [ name ] dir_ = os.path.dirname( from__file__ ) if dir_ != '.': lst.append( os.path.join( dir_, name ) ) return list( filter( os.path.exists, lst ) ) def find_path(name, from__file__, dv=None): lst = path_lst( name, from__file__ ) return lst[0] if lst else dv def can_hash(o): try: hash( o ) return True except: pass return False def rev_dic(dic): items = filter( lambda kv: can_hash( kv[ 1 ] ), dic.items() ) return dict( map( reversed, items ) ) def dic_update_r(targ, add): for (k, v) in add.items(): tv = targ.get( k ) if type( v ) == dict and type( tv ) == dict: dic_update_r( tv, v ) else: targ[ k ] = v def str_find(s, key_h, key_t=None): if key_h not in s: return None i = s.index( key_h ) i_in = i + len( key_h ) s_ = s[ i_in : ] if key_t: if key_t not in s_: return None j_in = i_in + s_.index( key_t ) j = j_in + len( key_t ) else: dlims = ' \t\n' f = lambda dlim: s_.index( dlim ) if dlim in s_ else len( s_ ) j = j_in = i_in + min( map( f, dlims ) ) s_in = s[ i_in : j_in ] return empty.new( locals() ) def str_replace_dic(s, dic): keys = [ ( '${', '}' ), ( '$(', ')' ), ( '$', None ), ] while True: bak = s for (key_h, key_t) in keys: r = str_find( s, key_h, key_t ) if r and r.s_in in dic: s = s [ : r.i ] + dic.get( r.s_in ) + s [ r.j : ] break if s == bak: break return s # EOF