#!/usr/bin/env python import sys import os import six def inc_text(s): if not s.startswith( '@' ): return None path = s[ 1: ] r = False if not os.path.exists( path ): return r with open( path, 'rb' ) as f: try: r = f.read().decode( 'utf-8' ) if r[ -1 ] == '\n': r = r[ : -1 ] return ( r, path ) # ! except: pass return r paths = [ '-' ] def err(s, i): sys.stderr.write( 'err {}, {} L{}\n'.format( s, paths[ -1 ], i+1 ) ) sys.exit( 1 ) def inc_exp(s, inc_text): def inc_exp_line(i_s): (i, s) = i_s r = inc_text( s ) if r == False: err( s, i ) if r == None: return s (s, path) = r if path in paths: return '' # ! paths.append( path ) s = inc_exp( s, inc_text ) paths.pop() return s return '\n'.join( map( inc_exp_line, enumerate( s.split( '\n' ) ) ) ) if __name__ == "__main__": f = sys.stdin if six.PY2 else sys.stdin.buffer s = f.read().decode( 'utf-8' ) s = inc_exp( s, inc_text ) f = sys.stdout if six.PY2 else sys.stdout.buffer f.write( s.encode( 'utf-8' ) ) # EOF