aether9
clone your own copy | download snapshot

Snapshots | iceberg

Inside this repository

perfo.py
text/x-python

Download raw (3.8 KB)

"""
perfo.Reader
perfo.Writer
"""

import os.path as opath
import re
import time
from datetime import datetime

class FileDoesNotExist(Exception):
	def __init__(self, fname):
		self.filename = fname
	def __str__(self):
		return '%s does not exist'%(self.filename)

class NoDate(Exception):
	def __init__(self, fname):
		self.filename = fname
	def __str__(self):
		return '%s does not provide any date info'%(self.filename)		
		
class Reader:
	performance_sep_pattern = r'\n---\n'
	line_sep_pattern = r'\n'
	infos_sep_pattern = r':\s+'
	included_fields = ['title', 'description', 'performers', 'duration', 'date', 'time', 'event', 'location']

	def __init__(self, filename):
		if not opath.exists(filename):
			raise FileDoesNotExist(filename)
		data_str = False
		try:
			f = open(filename)
			data_str = f.read()
		except IOError:
			print 'Cannot open %s: expect missing data'%(filename,)
		except Exception as e:
			print 'Unhandle exception: %s'%(e,)
		finally:
			f.close()
		
		self.data = {}
		self.data['perfos'] = []
		
		if data_str:
			data = re.split(self.performance_sep_pattern, data_str, flags=re.MULTILINE)
			
			for bloc in data:
				self.process_bloc(bloc.strip())
				
	def process_bloc(self, bloc):
		perfo = {'type': 'perfo'}
		for line in re.split (self.line_sep_pattern, bloc, flags=re.MULTILINE):
			parts = re.split (self.infos_sep_pattern, line)
			
			if parts[0].lower() in self.included_fields:
				perfo[parts[0].lower()] = parts[1].strip()

		time = None
		
		if 'time' in perfo:
			time = re.search ('\d{2}:\d{2}', perfo['time'])
		
		if time <> None:
			perfo['date'] = datetime.strptime ('%s %s' % (perfo['date'], time.group(0)), '%m %d, %Y %H:%M')
			del perfo['time']
		else:
			try:
				perfo['date'] = datetime.strptime (perfo['date'], '%m %d, %Y')
				del perfo['time']
			except Exception as e:
				raise NoDate (e)
			
		if 'performers' in perfo:
			perfo['seperate_performers'] = map(lambda performer: performer.strip(), perfo['performers'].split (','))
		
		# If we transform to uppercase in the writer we also uppercase the tex commands.
		if 'description' in perfo:
			perfo['description'] = perfo['description'].upper()
		
		self.data['perfos'].append(perfo)
		
class Writer:
	tex_special_chars = {r'&': '\\&', r'%': '\\%', r'$': '\\$', r'#': '\\#', r'_': '\\_', r'{': '\\{', r'}': '\\}', r'~': '\\textasciitilde{}', r'^': '\\textasciicircum{}', '\\' : '\\textbackslash{}', '|':'\\textbar{}'}
	et_pat = '[%s]'%(re.escape(''.join(tex_special_chars.keys())),)
	def __init__(self, pdict):
		self.perfo = pdict
		
	def as_string(self):
		aref = []
		#for r in self.ref['author']:
			#aref.append('\\in{section}[%s](p.\\at{page}[%s])'%(r,r))
		#	aref.append('%s.%s'%('\\ref[p]['+r+']', r.split(':')[-1]))
		
		ret = []
		ret.append('\\stylepiece{%d}'%self.id)
		ret.append('')
		ret.append('\\styleinfoperfo')
		ret.append('\\startinfopar \perfotitle{%s}\n\n\\infopar %s\n\n\\infopar %s\n\n\\infopar %s\n\n\\infopar %s\\stopinfopar'%(self.title,self.date,self.event,self.location,'\n'.join(self.performers.split())))
		ret.append('\\blackrule[color=black, width=60mm, height=0.5pt, depth=0mm]')
		ret.append('\\styleperfo')
		ret.append(self.description)
		ret.append('\\blackrule[color=black, width=60mm, height=0.5pt, depth=0mm]')
		#ret.append('\\stopcolumnsetspan')
		return '%s' % '\n'.join(ret)
		
	def escape_tex(self, pt):
		r = pt.group()
		#print('matched: %s'%r)
		if r in self.tex_special_chars:
			return self.tex_special_chars[r]
		return r
			
		
	def __getattr__(self, name):
		try:
			return re.sub(et_pat, getattr(self, 'escape_tex'), self.perfo[name])
		except Exception:
			try:
				return self.perfo[name]
			except Exception:
				raise AttributeError(name)
		
if __name__ == '__main__':
	reader = Reader ('../../TEXT_FILES/perfo_descriptions.txt')
	print reader.data['perfos'][0]
	print Writer (reader.data['perfos'][0]).as_string()