reportlab/platypus/paraparser.py
author rgbecker
Tue, 11 Apr 2000 15:58:39 +0000
changeset 115 49b2fae9ea60
parent 113 2c20ecb9015e
child 119 b4dc589c8364
permissions -rw-r--r--
Fixes to superscript stuff
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
     1
import string
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
     2
import types
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
     3
import sys
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
     4
import os
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
     5
import copy
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
     6
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
     7
try:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
     8
	from xml.parsers import xmllib
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
     9
	_xmllib_newStyle = 1
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    10
except ImportError:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    11
	import xmllib
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    12
	_xmllib_newStyle = 0
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    13
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    14
from reportlab.lib.colors import stringToColor, white, black, red, Color
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    15
from reportlab.lib.fonts import tt2ps, ps2tt
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    16
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    17
sizeDelta = 2		# amount to reduce font size by for super and sub script
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    18
subFraction = 0.5	# fraction of font size that a sub script should be lowered
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    19
superFraction = 0.5	# fraction of font size that a super script should be raised
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    20
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    21
def _num(s):
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    22
	try:
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    23
		return int(s)
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    24
	except ValueError:
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    25
		return float(s)
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    26
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    27
#characters not supported: epsi, Gammad, gammad, kappav, rhov, Upsi, upsi
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    28
greeks = {
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    29
	'alpha':'a',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    30
	'beta':'b',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    31
	'chi':'c',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    32
	'Delta':'D',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    33
	'delta':'d',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    34
	'epsiv':'e',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    35
	'eta':'h',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    36
	'Gamma':'G',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    37
	'gamma':'g',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    38
	'iota':'i',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    39
	'kappa':'k',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    40
	'Lambda':'L',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    41
	'lambda':'l',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    42
	'mu':'m',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    43
	'nu':'n',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    44
	'Omega':'W',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    45
	'omega':'w',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    46
	'omicron':'x',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    47
	'Phi':'F',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    48
	'phi':'f',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    49
	'phiv':'j',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    50
	'Pi':'P',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    51
	'pi':'p',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    52
	'piv':'v',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    53
	'Psi':'Y',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    54
	'psi':'y',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    55
	'rho':'r',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    56
	'Sigma':'S',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    57
	'sigma':'s',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    58
	'sigmav':'V',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    59
	'tau':'t',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    60
	'Theta':'Q',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    61
	'theta':'q',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    62
	'thetav':'j',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    63
	'Xi':'X',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    64
	'xi':'x',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    65
	'zeta':'z'
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    66
}
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    67
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    68
#------------------------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    69
class ParaFrag:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    70
	"""class ParaFrag contains the intermediate representation of string
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    71
	segments as they are being parsed by the XMLParser.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    72
	"""
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    73
	def __init__(self,**attr):
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    74
		for k,v in attr.items():
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    75
			setattr(self,k,v)
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    76
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    77
	def clone(self,**attr):
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    78
		n = apply(ParaFrag,(),self.__dict__)
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    79
		if attr != {}: apply(ParaFrag.__init__,(n,),attr)
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    80
		return n
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    81
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    82
#------------------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    83
# The ParaFormatter will be able to format the following xml
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    84
# tags:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    85
#	   < b > < /b > - bold
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    86
#	   < i > < /i > - italics
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    87
#	   < u > < /u > - underline
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    88
#	   < super > < /super > - superscript
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    89
#	   < sub > < /sub > - subscript
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    90
#	   <font name=fontfamily/fontname color=colorname size=float>
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    91
#
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    92
# It will also be able to handle any MathML specified Greek characters.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    93
#------------------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    94
class ParaParser(xmllib.XMLParser):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    95
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    96
	#----------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    97
	# First we will define all of the xml tag handler functions.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    98
	#
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    99
	# start_<tag>(attributes)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   100
	# end_<tag>()
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   101
	#
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   102
	# While parsing the xml ParaFormatter will call these
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   103
	# functions to handle the string formatting tags.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   104
	# At the start of each tag the corresponding field will
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   105
	# be set to 1 and at the end tag the corresponding field will
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   106
	# be set to 0.	Then when handle_data is called the options
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   107
	# for that data will be aparent by the current settings.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   108
	#----------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   109
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   110
	#### bold
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   111
	def start_b( self, attributes ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   112
		self._push(bold=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   113
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   114
	def end_b( self ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   115
		self._pop(bold=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   116
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   117
	#### italics
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   118
	def start_i( self, attributes ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   119
		self._push(italic=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   120
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   121
	def end_i( self ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   122
		self._pop(italic=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   123
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   124
	#### underline
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   125
	def start_u( self, attributes ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   126
		self._push(underline=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   127
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   128
	def end_u( self ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   129
		self._pop(underline=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   130
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   131
	#### super script
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   132
	def start_super( self, attributes ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   133
		self._push(super=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   134
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   135
	def end_super( self ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   136
		self._pop(super=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   137
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   138
	#### sub script
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   139
	def start_sub( self, attributes ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   140
		self._push(sub=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   141
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   142
	def end_sub( self ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   143
		self._pop(sub=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   144
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   145
	#### greek script
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   146
	if _xmllib_newStyle:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   147
		def handle_entityref(self,name):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   148
			if greeks.has_key(name):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   149
				self._push(greek=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   150
				self.handle_data(greeks[name])
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   151
				self._pop(greek=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   152
			else:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   153
				xmllib.XMLParser.handle_entityref(self,name)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   154
	else:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   155
		def start_greekLetter(self, attributes,letter):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   156
			self._push(greek=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   157
			self.handle_data(letter)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   158
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   159
	def start_greek(self, attributes):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   160
		self._push(greek=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   161
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   162
	def end_greek(self):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   163
		self._pop(greek=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   164
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   165
	#things which are valid font attributes
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   166
	_fontAttrMap = {'size': ('fontSize',_num),
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   167
					'name': ('fontName', None),
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   168
					'color':('textColor',stringToColor)}
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   169
	def start_font(self,attr):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   170
		A = {}
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   171
		for i, j in self._fontAttrMap.items():
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   172
			if attr.has_key(i):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   173
				func = j[1]
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   174
				val  = attr[i]
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   175
				try:
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   176
					A[j[0]] = (func is None) and val or apply(func,(val,))
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   177
				except:
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   178
					self.syntax_error('%s: invalid value %s'%(i,val))
113
2c20ecb9015e Fixed start_font
rgbecker
parents: 112
diff changeset
   179
		apply(self._push,(),A)
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   180
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   181
	def end_font(self):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   182
		self._pop()
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   183
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   184
	def _push(self,**kw):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   185
		frag = copy.copy(self._stack[-1])
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   186
		for k, v in kw.items():
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   187
			setattr(frag,k,v)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   188
		self._stack.append(frag)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   189
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   190
	def _pop(self,**kw):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   191
		frag = self._stack[-1]
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   192
		del self._stack[-1]
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   193
		for k, v in kw.items():
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   194
			assert getattr(frag,k)==v
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   195
		return frag
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   196
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   197
	#----------------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   198
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   199
	def __init__(self,verbose=0):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   200
		if _xmllib_newStyle:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   201
			xmllib.XMLParser.__init__(self,verbose=verbose)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   202
		else:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   203
			xmllib.XMLParser.__init__(self)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   204
			# set up handlers for various tags
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   205
			self.elements = {	'b': (self.start_b, self.end_b),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   206
							'u': (self.start_u, self.end_u),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   207
							'i': (self.start_i, self.end_i),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   208
							'super': (self.start_super, self.end_super),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   209
							'sub': (self.start_sub, self.end_sub),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   210
							'font': (self.start_font, self.end_font),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   211
							'greek': (self.start_greek, self.end_greek)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   212
							}
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   213
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   214
			# automatically add handlers for all of the greek characters
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   215
			for item in greeks.keys():
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   216
				self.elements[item] = (lambda attr,self=self,letter=greeks[item]:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   217
					self.start_greekLetter(attr,letter), self.end_greek)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   218
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   219
			# set up dictionary for greek characters, this is a class variable
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   220
			self.entitydefs = copy.copy(self.entitydefs)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   221
			for item in greeks.keys():
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   222
				self.entitydefs[item] = '<%s/>' % item
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   223
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   224
	def _reset(self, style):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   225
		'''reset the parser'''
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   226
		xmllib.XMLParser.reset(self)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   227
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   228
		# initialize list of string segments to empty
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   229
		self.errors = []
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   230
		self.fragList = []
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   231
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   232
		# initialize frag values
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   233
		frag = ParaFrag()
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   234
		frag.sub = 0
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   235
		frag.super = 0
112
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   236
		frag.rise = 0
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   237
		frag.fontName, frag.bold, frag.italic = ps2tt(style.fontName)
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   238
		frag.fontSize = style.fontSize
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   239
		frag.underline = 0
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   240
		frag.greek = 0
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   241
		frag.textColor = style.textColor
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   242
		self._stack = [frag]
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   243
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   244
	def syntax_error(self,message):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   245
		if message[:11]=="attribute `" and message[-18:]=="' value not quoted": return
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   246
		self.errors.append(message)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   247
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   248
	#----------------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   249
	def handle_data(self,data):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   250
		"Creates an intermediate representation of string segments."
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   251
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   252
		frag = copy.copy(self._stack[-1])
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   253
		#save our data
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   254
		frag.text = data
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   255
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   256
		# if sub and super are both one they will cancel each other out
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   257
		if frag.sub == 1 and frag.super == 1:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   258
			frag.sub = 0
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   259
			frag.super = 0
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   260
112
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   261
		if frag.sub:
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   262
			frag.rise = -frag.fontSize*subFraction
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   263
			frag.fontSize = max(frag.fontSize-sizeDelta,3)
115
49b2fae9ea60 Fixes to superscript stuff
rgbecker
parents: 113
diff changeset
   264
		elif frag.super:
112
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   265
			frag.rise = frag.fontSize*superFraction
115
49b2fae9ea60 Fixes to superscript stuff
rgbecker
parents: 113
diff changeset
   266
			frag.fontSize = max(frag.fontSize-sizeDelta,3)
112
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   267
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   268
		if frag.greek: frag.fontName = 'symbol'
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   269
		# bold, italic, and underline
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   270
		frag.fontName = tt2ps(frag.fontName,frag.bold,frag.italic)
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   271
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   272
		self.fragList.append(frag)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   273
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   274
	#----------------------------------------------------------------
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   275
	def parse(self, text, style):
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   276
		"""Given a formatted string will return a list of
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   277
		ParaFrag objects with their calculated widths.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   278
		If errors occur None will be returned and the
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   279
		self.errors holds a list of the error messages.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   280
		"""
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   281
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   282
		# the xmlparser requires that all text be surrounded by xml
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   283
		# tags, therefore we must throw some unused flags around the
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   284
		# given string
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   285
		self._reset(style)	# reinitialise the parser
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   286
		self.feed("<ReportLabParagraph>"+text+"</ReportLabParagraph>")
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   287
		self.close()	# force parsing to complete
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   288
		if len(self.errors)==0:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   289
			fragList = self.fragList
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   290
			self.fragList = []
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   291
			return fragList
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   292
		else:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   293
			return None
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   294
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   295
if __name__=='__main__':
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   296
	from reportlab.platypus.layout import cleanBlockQuotedText
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   297
	_parser=ParaParser()
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   298
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   299
	style=ParaFrag()
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   300
	style.fontName='Times-Roman'
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   301
	style.fontSize = 12
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   302
	style.textColor = black
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   303
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   304
	text='''
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   305
	<b><i><greek>a</greek>D</i></b>&beta;
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   306
	<font name="helvetica" size="15" color=green>
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   307
	Tell me, O muse, of that ingenious hero who travelled far and wide
113
2c20ecb9015e Fixed start_font
rgbecker
parents: 112
diff changeset
   308
	after</font> he had sacked the famous town of Troy. Many cities did he visit,
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   309
	and many were the nations with whose manners and customs he was acquainted;
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   310
	moreover he suffered much by sea while trying to save his own life
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   311
	and bring his men safely home; but do what he might he could not save
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   312
	his men, for they perished through their own sheer folly in eating
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   313
	the cattle of the Sun-god Hyperion; so the god prevented them from
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   314
	ever reaching home. Tell me, too, about all these things, O daughter
115
49b2fae9ea60 Fixes to superscript stuff
rgbecker
parents: 113
diff changeset
   315
	of Jove, from whatsoever source you<super>1</super> may know them.
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   316
	'''
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   317
	text = cleanBlockQuotedText(text)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   318
	rv = _parser.parse(text,style)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   319
	if rv is None:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   320
		for l in _parser.errors:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   321
			print l
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   322
	else:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   323
		for l in rv:
115
49b2fae9ea60 Fixes to superscript stuff
rgbecker
parents: 113
diff changeset
   324
			print l.fontName,l.fontSize,l.textColor,l.bold, l.rise, l.text[:25]