#gopatterns

def flip(s):
	out=""
	sp=s.splitlines()
	#print "sp",sp
	#print len(sp)
	for x in range(len(sp[0])):
		for y in range(len(sp)):
			out=out+sp[y][x]
		out=out+"\n"
	if out.endswith("\n"): out=out[:-1]
	if out.startswith("\n"): out=out[1:]
	return out

class pattern(object):
	def __init__(self,name,data):
		self.name=name
		if data.endswith("\n"): data=data[:-1]
		self.rawdata=data
		
		try:
			self.data=self.make_sym()
		except:
			print "failed on pattern:",self.rawdata
		
	def make_sym(self):
		#print "entered make_sym"
		raw=self.rawdata
		if raw=='':return
		rev=raw[::-1]
		joinrev="\n".join(raw.split("\n")[::-1])
		joinrevrev="\n".join((raw.split("\n")[::-1]))[::-1]
		#nonflipped
		ok={}
		ok[rev]=1
		ok[raw]=1
		ok[joinrev]=1
		ok[joinrevrev]=1
		#flipped
		ok[flip(rev)]=1
		ok[flip(raw)]=1
		ok[flip(joinrev)]=1
		ok[flip(joinrevrev)]=1
		return ok.keys()
		
	def show(self):
		print "this is",self.name
		print self.name
		print self.data

A=pattern(name="test",data="abcd\nefgh")

def readpatterns(file="gopatterns.txt"):
	lines=open(file,'r').readlines()
	divider=1
	patterns=[]
	data=""
	name=""
	for l in lines:
		if l=="\n": continue
		if l.startswith("#"): continue
		if l.startswith("done"): 
			p=pattern(name=name,data=data)
			patterns.append(p)
			name=""
			data=""
			continue
		if l[0].islower():
			name=l.replace("\n","")
			continue
		if not name:
			continue
		data=data+l
	return patterns
		
if __name__=="__main__":
	p=readpatterns()
	print "read"
	for t in p:
		t.show()