reportlab/platypus/paraparser.py
author aaron_watters
Tue, 13 Jun 2000 04:11:49 +0000
changeset 267 52a348f6c4c3
parent 266 081154da1a78
child 279 e7d8b3631d5c
permissions -rw-r--r--
noted replication of XML markup comment between paraparser.py and paragraph.py
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
162
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
     1
###############################################################################
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
     2
#
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
     3
#	ReportLab Public License Version 1.0
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
     4
#
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
     5
#   Except for the change of names the spirit and intention of this
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
     6
#   license is the same as that of Python
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
     7
#
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
     8
#	(C) Copyright ReportLab Inc. 1998-2000.
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
     9
#
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    10
#
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    11
# All Rights Reserved
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    12
#
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    13
# Permission to use, copy, modify, and distribute this software and its
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    14
# documentation for any purpose and without fee is hereby granted, provided
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    15
# that the above copyright notice appear in all copies and that both that
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    16
# copyright notice and this permission notice appear in supporting
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    17
# documentation, and that the name of ReportLab not be used
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    18
# in advertising or publicity pertaining to distribution of the software
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    19
# without specific, written prior permission. 
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    20
# 
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    21
#
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    22
# Disclaimer
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    23
#
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    24
# ReportLab Inc. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    25
# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    26
# IN NO EVENT SHALL ReportLab BE LIABLE FOR ANY SPECIAL, INDIRECT
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    27
# OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    28
# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    29
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    30
# PERFORMANCE OF THIS SOFTWARE. 
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    31
#
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    32
###############################################################################
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    33
#	$Log: paraparser.py,v $
267
52a348f6c4c3 noted replication of XML markup comment between paraparser.py and paragraph.py
aaron_watters
parents: 266
diff changeset
    34
#	Revision 1.23  2000/06/13 04:11:49  aaron_watters
52a348f6c4c3 noted replication of XML markup comment between paraparser.py and paragraph.py
aaron_watters
parents: 266
diff changeset
    35
#	noted replication of XML markup comment between paraparser.py and paragraph.py
52a348f6c4c3 noted replication of XML markup comment between paraparser.py and paragraph.py
aaron_watters
parents: 266
diff changeset
    36
#
266
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
    37
#	Revision 1.22  2000/06/12 11:27:17  andy_robinson
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
    38
#	Added Sequencer and associated XML tags
267
52a348f6c4c3 noted replication of XML markup comment between paraparser.py and paragraph.py
aaron_watters
parents: 266
diff changeset
    39
#	
253
cfcf8d555a2c Platypus re-organisation
rgbecker
parents: 250
diff changeset
    40
#	Revision 1.21  2000/06/01 15:23:06  rgbecker
cfcf8d555a2c Platypus re-organisation
rgbecker
parents: 250
diff changeset
    41
#	Platypus re-organisation
266
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
    42
#	
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
    43
#	Revision 1.20  2000/05/31 10:12:20  rgbecker
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
    44
#	<bullet> xml tag added
253
cfcf8d555a2c Platypus re-organisation
rgbecker
parents: 250
diff changeset
    45
#	
248
c103b7a55e79 Color fixes; thanks to J Alet
rgbecker
parents: 238
diff changeset
    46
#	Revision 1.19  2000/05/26 09:49:23  rgbecker
c103b7a55e79 Color fixes; thanks to J Alet
rgbecker
parents: 238
diff changeset
    47
#	Color fixes; thanks to J Alet
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
    48
#	
238
4c6d5db33635 Removed 1.5.2-style getattr call
andy_robinson
parents: 218
diff changeset
    49
#	Revision 1.18  2000/05/20 15:36:42  andy_robinson
4c6d5db33635 Removed 1.5.2-style getattr call
andy_robinson
parents: 218
diff changeset
    50
#	Removed 1.5.2-style getattr call
248
c103b7a55e79 Color fixes; thanks to J Alet
rgbecker
parents: 238
diff changeset
    51
#	
218
274db2129c04 Fixes/Changes to get testplatypus to work with new framework
rgbecker
parents: 211
diff changeset
    52
#	Revision 1.17  2000/05/16 14:28:55  rgbecker
274db2129c04 Fixes/Changes to get testplatypus to work with new framework
rgbecker
parents: 211
diff changeset
    53
#	Fixes/Changes to get testplatypus to work with new framework
238
4c6d5db33635 Removed 1.5.2-style getattr call
andy_robinson
parents: 218
diff changeset
    54
#	
211
52541f1643b6 CDATA handler added
rgbecker
parents: 209
diff changeset
    55
#	Revision 1.16  2000/05/15 12:15:29  rgbecker
52541f1643b6 CDATA handler added
rgbecker
parents: 209
diff changeset
    56
#	CDATA handler added
218
274db2129c04 Fixes/Changes to get testplatypus to work with new framework
rgbecker
parents: 211
diff changeset
    57
#	
209
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
    58
#	Revision 1.15  2000/05/13 16:04:06  rgbecker
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
    59
#	made size alias of fontsize for <para>
211
52541f1643b6 CDATA handler added
rgbecker
parents: 209
diff changeset
    60
#	
192
256091132520 Use reportlab.lib.xmllib
rgbecker
parents: 162
diff changeset
    61
#	Revision 1.14  2000/05/11 14:05:17  rgbecker
256091132520 Use reportlab.lib.xmllib
rgbecker
parents: 162
diff changeset
    62
#	Use reportlab.lib.xmllib
209
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
    63
#	
162
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    64
#	Revision 1.13  2000/04/25 13:07:57  rgbecker
1cc78f90fe24 Added license
rgbecker
parents: 134
diff changeset
    65
#	Added license
192
256091132520 Use reportlab.lib.xmllib
rgbecker
parents: 162
diff changeset
    66
#	
267
52a348f6c4c3 noted replication of XML markup comment between paraparser.py and paragraph.py
aaron_watters
parents: 266
diff changeset
    67
__version__=''' $Id: paraparser.py,v 1.23 2000/06/13 04:11:49 aaron_watters Exp $ '''
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    68
import string
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
    69
import re
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
    70
from types import TupleType
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    71
import sys
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    72
import os
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    73
import copy
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    74
192
256091132520 Use reportlab.lib.xmllib
rgbecker
parents: 162
diff changeset
    75
#try:
256091132520 Use reportlab.lib.xmllib
rgbecker
parents: 162
diff changeset
    76
#	from xml.parsers import xmllib
256091132520 Use reportlab.lib.xmllib
rgbecker
parents: 162
diff changeset
    77
#	_xmllib_newStyle = 1
209
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
    78
try:
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
    79
	from reportlab.lib import xmllib
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
    80
	_xmllib_newStyle = 1
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
    81
except ImportError:
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
    82
	import xmllib
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
    83
	_xmllib_newStyle = 0
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
    84
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    85
248
c103b7a55e79 Color fixes; thanks to J Alet
rgbecker
parents: 238
diff changeset
    86
from reportlab.lib.colors import toColor, white, black, red, Color
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    87
from reportlab.lib.fonts import tt2ps, ps2tt
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
    88
from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
266
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
    89
from reportlab.lib.sequencer import Sequencer
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
    90
_re_para = re.compile('^\\s*<\\s*para(\\s+|>)')
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    91
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    92
sizeDelta = 2		# amount to reduce font size by for super and sub script
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    93
subFraction = 0.5	# fraction of font size that a sub script should be lowered
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    94
superFraction = 0.5	# fraction of font size that a super script should be raised
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
    95
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
    96
def _num(s):
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
    97
	if s[0] in ['+','-']:
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
    98
		try:
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
    99
			return ('relative',int(s))
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   100
		except ValueError:
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   101
			return ('relative',float(s))
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   102
	else:
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   103
		try:
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   104
			return int(s)
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   105
		except ValueError:
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   106
			return float(s)
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   107
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   108
def _align(s):
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   109
	s = string.lower(s)
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   110
	if s=='left': return TA_LEFT
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   111
	elif s=='right': return TA_RIGHT
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   112
	elif s=='justify': return TA_JUSTIFY
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   113
	elif s in ('centre','center'): return TA_CENTER
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   114
	else: raise ValueError
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   115
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   116
_paraAttrMap = {'font': ('fontName', None),
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   117
				'face': ('fontName', None),
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   118
				'fontsize': ('fontSize', _num),
209
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
   119
				'size': ('fontSize', _num),
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   120
				'leading': ('leading', _num),
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   121
				'lindent': ('leftIndent', _num),
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   122
				'rindent': ('rightIndent', _num),
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   123
				'findent': ('firstLineIndent', _num),
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   124
				'align': ('alignment', _align),
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   125
				'spaceb': ('spaceBefore', _num),
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   126
				'spacea': ('spaceAfter', _num),
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   127
				'bfont': ('bulletFontName', None),
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   128
				'bfontsize': ('bulletFontSize',_num),
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   129
				'bindent': ('bulletIndent',_num),
248
c103b7a55e79 Color fixes; thanks to J Alet
rgbecker
parents: 238
diff changeset
   130
				'bcolor': ('bulletColor',toColor),
c103b7a55e79 Color fixes; thanks to J Alet
rgbecker
parents: 238
diff changeset
   131
				'color':('textColor',toColor),
c103b7a55e79 Color fixes; thanks to J Alet
rgbecker
parents: 238
diff changeset
   132
				'fg': ('textColor',toColor)}
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   133
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   134
_bulletAttrMap = {
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   135
				'font': ('bulletFontName', None),
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   136
				'face': ('bulletFontName', None),
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   137
				'size': ('bulletFontSize',_num),
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   138
				'fontsize': ('bulletFontSize',_num),
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   139
				'indent': ('bulletIndent',_num),
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   140
				'color': ('bulletColor',toColor),
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   141
				'fg': ('bulletColor',toColor)}
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   142
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   143
#things which are valid font attributes
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   144
_fontAttrMap = {'size': ('fontSize', _num),
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   145
				'face': ('fontName', None),
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   146
				'name': ('fontName', None),
248
c103b7a55e79 Color fixes; thanks to J Alet
rgbecker
parents: 238
diff changeset
   147
				'fg': 	('textColor', toColor),
c103b7a55e79 Color fixes; thanks to J Alet
rgbecker
parents: 238
diff changeset
   148
				'color':('textColor', toColor)}
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   149
266
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   150
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   151
def _addAttributeNames(m):
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   152
	K = m.keys()
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   153
	for k in K:
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   154
		n = string.lower(m[k][0])
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   155
		if not m.has_key(n):
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   156
			m[n] = m[k]
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   157
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   158
_addAttributeNames(_paraAttrMap)
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   159
_addAttributeNames(_fontAttrMap)
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   160
_addAttributeNames(_bulletAttrMap)
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   161
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   162
def _applyAttributes(obj, attr):
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   163
	for k, v in attr.items():
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   164
		if type(v) is TupleType and v[0]=='relative':
238
4c6d5db33635 Removed 1.5.2-style getattr call
andy_robinson
parents: 218
diff changeset
   165
			#AR 20/5/2000 - remove 1.5.2-ism
4c6d5db33635 Removed 1.5.2-style getattr call
andy_robinson
parents: 218
diff changeset
   166
			#v = v[1]+getattr(obj,k,0)
4c6d5db33635 Removed 1.5.2-style getattr call
andy_robinson
parents: 218
diff changeset
   167
			if hasattr(obj, k):
4c6d5db33635 Removed 1.5.2-style getattr call
andy_robinson
parents: 218
diff changeset
   168
				v = v[1]+getattr(obj,k)
4c6d5db33635 Removed 1.5.2-style getattr call
andy_robinson
parents: 218
diff changeset
   169
			else:
4c6d5db33635 Removed 1.5.2-style getattr call
andy_robinson
parents: 218
diff changeset
   170
				v = v[1]
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   171
		setattr(obj,k,v)
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   172
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   173
#characters not supported: epsi, Gammad, gammad, kappav, rhov, Upsi, upsi
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   174
greeks = {
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   175
	'alpha':'a',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   176
	'beta':'b',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   177
	'chi':'c',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   178
	'Delta':'D',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   179
	'delta':'d',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   180
	'epsiv':'e',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   181
	'eta':'h',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   182
	'Gamma':'G',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   183
	'gamma':'g',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   184
	'iota':'i',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   185
	'kappa':'k',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   186
	'Lambda':'L',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   187
	'lambda':'l',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   188
	'mu':'m',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   189
	'nu':'n',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   190
	'Omega':'W',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   191
	'omega':'w',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   192
	'omicron':'x',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   193
	'Phi':'F',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   194
	'phi':'f',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   195
	'phiv':'j',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   196
	'Pi':'P',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   197
	'pi':'p',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   198
	'piv':'v',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   199
	'Psi':'Y',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   200
	'psi':'y',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   201
	'rho':'r',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   202
	'Sigma':'S',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   203
	'sigma':'s',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   204
	'sigmav':'V',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   205
	'tau':'t',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   206
	'Theta':'Q',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   207
	'theta':'q',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   208
	'thetav':'j',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   209
	'Xi':'X',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   210
	'xi':'x',
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   211
	'zeta':'z'
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
#------------------------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   215
class ParaFrag:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   216
	"""class ParaFrag contains the intermediate representation of string
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   217
	segments as they are being parsed by the XMLParser.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   218
	"""
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   219
	def __init__(self,**attr):
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   220
		for k,v in attr.items():
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   221
			setattr(self,k,v)
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   222
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   223
	def clone(self,**attr):
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   224
		n = apply(ParaFrag,(),self.__dict__)
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   225
		if attr != {}: apply(ParaFrag.__init__,(n,),attr)
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   226
		return n
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   227
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   228
#------------------------------------------------------------------
267
52a348f6c4c3 noted replication of XML markup comment between paraparser.py and paragraph.py
aaron_watters
parents: 266
diff changeset
   229
# !!! NOTE !!! THIS TEXT IS NOW REPLICATED IN PARAGRAPH.PY !!!
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   230
# The ParaFormatter will be able to format the following xml
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   231
# tags:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   232
#	   < b > < /b > - bold
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   233
#	   < i > < /i > - italics
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   234
#	   < u > < /u > - underline
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   235
#	   < super > < /super > - superscript
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   236
#	   < sub > < /sub > - subscript
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   237
#	   <font name=fontfamily/fontname color=colorname size=float>
266
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   238
#      < bullet > </bullet> - bullet text (at head of para only)
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   239
#		The whole may be surrounded by <para> </para> tags
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   240
#
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   241
# It will also be able to handle any MathML specified Greek characters.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   242
#------------------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   243
class ParaParser(xmllib.XMLParser):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   244
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   245
	#----------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   246
	# First we will define all of the xml tag handler functions.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   247
	#
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   248
	# start_<tag>(attributes)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   249
	# end_<tag>()
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   250
	#
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   251
	# While parsing the xml ParaFormatter will call these
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   252
	# functions to handle the string formatting tags.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   253
	# At the start of each tag the corresponding field will
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   254
	# be set to 1 and at the end tag the corresponding field will
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   255
	# be set to 0.	Then when handle_data is called the options
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   256
	# for that data will be aparent by the current settings.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   257
	#----------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   258
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   259
	#### bold
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   260
	def start_b( self, attributes ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   261
		self._push(bold=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   262
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   263
	def end_b( self ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   264
		self._pop(bold=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   265
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   266
	#### italics
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   267
	def start_i( self, attributes ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   268
		self._push(italic=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   269
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   270
	def end_i( self ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   271
		self._pop(italic=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   272
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   273
	#### underline
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   274
	def start_u( self, attributes ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   275
		self._push(underline=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   276
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   277
	def end_u( self ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   278
		self._pop(underline=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   279
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   280
	#### super script
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   281
	def start_super( self, attributes ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   282
		self._push(super=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   283
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   284
	def end_super( self ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   285
		self._pop(super=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   286
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   287
	#### sub script
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   288
	def start_sub( self, attributes ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   289
		self._push(sub=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   290
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   291
	def end_sub( self ):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   292
		self._pop(sub=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   293
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   294
	#### greek script
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   295
	if _xmllib_newStyle:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   296
		def handle_entityref(self,name):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   297
			if greeks.has_key(name):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   298
				self._push(greek=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   299
				self.handle_data(greeks[name])
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   300
				self._pop(greek=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   301
			else:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   302
				xmllib.XMLParser.handle_entityref(self,name)
134
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   303
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   304
		def syntax_error(self,lineno,message):
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   305
			self._syntax_error(message)
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   306
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   307
	else:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   308
		def start_greekLetter(self, attributes,letter):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   309
			self._push(greek=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   310
			self.handle_data(letter)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   311
134
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   312
		def syntax_error(self,message):
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   313
			self._syntax_error(message)
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   314
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   315
	def _syntax_error(self,message):
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   316
		if message[:10]=="attribute " and message[-17:]==" value not quoted": return
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   317
		self.errors.append(message)
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   318
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   319
	def start_greek(self, attributes):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   320
		self._push(greek=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   321
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   322
	def end_greek(self):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   323
		self._pop(greek=1)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   324
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   325
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   326
	def start_font(self,attr):
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   327
		A = self.getAttributes(attr,_fontAttrMap)
113
2c20ecb9015e Fixed start_font
rgbecker
parents: 112
diff changeset
   328
		apply(self._push,(),A)
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   329
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   330
	def end_font(self):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   331
		self._pop()
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   332
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   333
	def _initial_frag(self,attr,attrMap,bullet=0):
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   334
		style = self._style
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   335
		if attr!={}:
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   336
			style = copy.deepcopy(style)
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   337
			_applyAttributes(style,self.getAttributes(attr,attrMap))
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   338
			self._style = style
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   339
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   340
		# initialize semantic values
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   341
		frag = ParaFrag()
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   342
		frag.sub = 0
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   343
		frag.super = 0
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   344
		frag.rise = 0
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   345
		frag.underline = 0
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   346
		frag.greek = 0
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   347
		if bullet:
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   348
			frag.fontName, frag.bold, frag.italic = ps2tt(style.bulletFontName)
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   349
			frag.fontSize = style.bulletFontSize
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   350
			frag.textColor = hasattr(style,'bulletColor') and style.bulletColor or style.textColor
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   351
		else:
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   352
			frag.fontName, frag.bold, frag.italic = ps2tt(style.fontName)
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   353
			frag.fontSize = style.fontSize
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   354
			frag.textColor = style.textColor
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   355
		return frag
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   356
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   357
	def start_para(self,attr):
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   358
		self._stack = [self._initial_frag(attr,_paraAttrMap)]
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   359
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   360
	def end_para(self):
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   361
		self._pop()
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   362
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   363
	def start_bullet(self,attr):
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   364
		if hasattr(self,'bFragList'):
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   365
			self._syntax_error('only one <bullet> tag allowed')
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   366
		self.bFragList = []
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   367
		frag = self._initial_frag(attr,_bulletAttrMap,1)
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   368
		frag.isBullet = 1
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   369
		self._stack.append(frag)
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   370
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   371
	def end_bullet(self):
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   372
		self._pop()
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   373
266
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   374
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   375
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   376
	#---------------------------------------------------------------
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   377
	def setSequencer(self, seq):
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   378
		self._seq = seq
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   379
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   380
	def getSequencer(self):
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   381
		if self._seq is None:
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   382
			self._seq = Sequencer()
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   383
		return self._seq
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   384
		
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   385
	def start_seqdefault(self, attr):
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   386
		try:
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   387
			default = attr['id']
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   388
		except KeyError:
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   389
			default = None
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   390
		self.getSequencer().setDefaultCounter(default)
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   391
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   392
	def end_seqdefault(self):
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   393
		pass
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   394
	
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   395
	def start_seqreset(self, attr):
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   396
		try:
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   397
			id = attr['id']
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   398
		except KeyError:
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   399
			id = None
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   400
		try:
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   401
			base = math.atoi(attr['base'])
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   402
		except:
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   403
			base=1
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   404
		self.getSequencer().reset(id, base)
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   405
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   406
	def end_seqreset(self):
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   407
		pass
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   408
	
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   409
	def start_seq(self, attr):
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   410
		#if it has a template, use that; otherwise try for id;
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   411
		#otherwise take default sequence
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   412
		if attr.has_key('template'):
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   413
			templ = attr['template']
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   414
			self.handle_data(templ % self.getSequencer())
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   415
			return
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   416
		elif attr.has_key('id'):
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   417
			id = attr['id']
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   418
		else: 
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   419
			id = None
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   420
		output = self.getSequencer().nextf(id)
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   421
		self.handle_data(output)
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   422
		
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   423
	def end_seq(self):
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   424
		pass
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   425
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   426
	#---------------------------------------------------------------
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   427
	def _push(self,**attr):
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   428
		frag = copy.copy(self._stack[-1])
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   429
		_applyAttributes(frag,attr)
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   430
		self._stack.append(frag)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   431
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   432
	def _pop(self,**kw):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   433
		frag = self._stack[-1]
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   434
		del self._stack[-1]
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   435
		for k, v in kw.items():
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   436
			assert getattr(frag,k)==v
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   437
		return frag
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   438
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   439
	def getAttributes(self,attr,attrMap):
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   440
		A = {}
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   441
		for k, v in attr.items():
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   442
			k = string.lower(k)
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   443
			if k in attrMap.keys():
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   444
				j = attrMap[k]
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   445
				func = j[1]
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   446
				try:
123
daa339ac3104 Fixes to attribute handling and test script
rgbecker
parents: 119
diff changeset
   447
					A[j[0]] = (func is None) and v or apply(func,(v,))
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   448
				except:
134
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   449
					self._syntax_error('%s: invalid value %s'%(k,v))
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   450
			else:
134
60e8e0aee073 Fixed syntax_error handling
rgbecker
parents: 133
diff changeset
   451
				self._syntax_error('invalid attribute name %s'%k)
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   452
		return A
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   453
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   454
	#----------------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   455
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   456
	def __init__(self,verbose=0):
266
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   457
		# the sequencing stuff presumes access to a sequencer.
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   458
		# this may be set with setSequencer(); if a <seq> tag
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   459
		# is encountered and it has not been set, a default
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   460
		# sequencer will be provided.  
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   461
		self._seq = None
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   462
		
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   463
		if _xmllib_newStyle:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   464
			xmllib.XMLParser.__init__(self,verbose=verbose)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   465
		else:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   466
			xmllib.XMLParser.__init__(self)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   467
			# set up handlers for various tags
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   468
			self.elements = {	'b': (self.start_b, self.end_b),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   469
							'u': (self.start_u, self.end_u),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   470
							'i': (self.start_i, self.end_i),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   471
							'super': (self.start_super, self.end_super),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   472
							'sub': (self.start_sub, self.end_sub),
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   473
							'font': (self.start_font, self.end_font),
132
8a9576d734b9 Fix for 1.5.2 xmllib + <para>
rgbecker
parents: 129
diff changeset
   474
							'greek': (self.start_greek, self.end_greek),
8a9576d734b9 Fix for 1.5.2 xmllib + <para>
rgbecker
parents: 129
diff changeset
   475
							'para': (self.start_para, self.end_para)
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   476
							}
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   477
132
8a9576d734b9 Fix for 1.5.2 xmllib + <para>
rgbecker
parents: 129
diff changeset
   478
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   479
			# automatically add handlers for all of the greek characters
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   480
			for item in greeks.keys():
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   481
				self.elements[item] = (lambda attr,self=self,letter=greeks[item]:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   482
					self.start_greekLetter(attr,letter), self.end_greek)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   483
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   484
			# set up dictionary for greek characters, this is a class variable
192
256091132520 Use reportlab.lib.xmllib
rgbecker
parents: 162
diff changeset
   485
			self.entitydefs = self.entitydefs.copy()
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   486
			for item in greeks.keys():
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   487
				self.entitydefs[item] = '<%s/>' % item
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   488
266
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   489
		
081154da1a78 Added Sequencer and associated XML tags
andy_robinson
parents: 253
diff changeset
   490
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   491
	def _iReset(self):
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   492
		self.fragList = []
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   493
		if hasattr(self, 'bFragList'): delattr(self,'bFragList')
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   494
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   495
	def _reset(self, style):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   496
		'''reset the parser'''
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   497
		xmllib.XMLParser.reset(self)
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   498
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   499
		# initialize list of string segments to empty
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   500
		self.errors = []
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   501
		self._style = style
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   502
		self._iReset()
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   503
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   504
	#----------------------------------------------------------------
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   505
	def handle_data(self,data):
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   506
		"Creates an intermediate representation of string segments."
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   507
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   508
		frag = copy.copy(self._stack[-1])
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   509
		#save our data
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   510
		frag.text = data
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   511
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   512
		# if sub and super are both one they will cancel each other out
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   513
		if frag.sub == 1 and frag.super == 1:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   514
			frag.sub = 0
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   515
			frag.super = 0
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   516
112
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   517
		if frag.sub:
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   518
			frag.rise = -frag.fontSize*subFraction
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   519
			frag.fontSize = max(frag.fontSize-sizeDelta,3)
115
49b2fae9ea60 Fixes to superscript stuff
rgbecker
parents: 113
diff changeset
   520
		elif frag.super:
112
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   521
			frag.rise = frag.fontSize*superFraction
115
49b2fae9ea60 Fixes to superscript stuff
rgbecker
parents: 113
diff changeset
   522
			frag.fontSize = max(frag.fontSize-sizeDelta,3)
112
1d4892961fdb Added rise attribute
rgbecker
parents: 102
diff changeset
   523
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   524
		if frag.greek: frag.fontName = 'symbol'
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   525
		# bold, italic, and underline
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   526
		frag.fontName = tt2ps(frag.fontName,frag.bold,frag.italic)
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   527
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   528
		if hasattr(frag,'isBullet'):
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   529
			delattr(frag,'isBullet')
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   530
			self.bFragList.append(frag)
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   531
		else:
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   532
			self.fragList.append(frag)
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   533
211
52541f1643b6 CDATA handler added
rgbecker
parents: 209
diff changeset
   534
	def handle_cdata(self,data):
52541f1643b6 CDATA handler added
rgbecker
parents: 209
diff changeset
   535
		self.handle_data(data)
52541f1643b6 CDATA handler added
rgbecker
parents: 209
diff changeset
   536
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   537
	#----------------------------------------------------------------
102
1818e7fa3738 Added clone method to ParaFrag
rgbecker
parents: 96
diff changeset
   538
	def parse(self, text, style):
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   539
		"""Given a formatted string will return a list of
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   540
		ParaFrag objects with their calculated widths.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   541
		If errors occur None will be returned and the
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   542
		self.errors holds a list of the error messages.
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   543
		"""
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   544
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   545
		# the xmlparser requires that all text be surrounded by xml
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   546
		# tags, therefore we must throw some unused flags around the
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   547
		# given string
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   548
		self._reset(style)	# reinitialise the parser
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   549
		if not(len(text)>=6 and text[0]=='<' and _re_para.match(text)):
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   550
			text = "<para>"+text+"</para>"
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   551
		self.feed(text)
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   552
		self.close()	# force parsing to complete
119
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   553
		style = self._style
b4dc589c8364 <para> tag added in layout.py paraparser.py
rgbecker
parents: 115
diff changeset
   554
		del self._style
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   555
		if len(self.errors)==0:
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   556
			fragList = self.fragList
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   557
			bFragList = hasattr(self,'bFragList') and self.bFragList or None
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   558
			self._iReset()
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   559
		else:
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   560
			fragList = bFragList = None
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   561
		return style, fragList, bFragList
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   562
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   563
if __name__=='__main__':
253
cfcf8d555a2c Platypus re-organisation
rgbecker
parents: 250
diff changeset
   564
	from reportlab.platypus import cleanBlockQuotedText
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   565
	_parser=ParaParser()
133
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   566
	def check_text(text,p=_parser):
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   567
		print '##########'
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   568
		text = cleanBlockQuotedText(text)
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   569
		l,rv,bv = p.parse(text,style)
133
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   570
		if rv is None:
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   571
			for l in _parser.errors:
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   572
				print l
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   573
		else:
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   574
			print 'ParaStyle', l.fontName,l.fontSize,l.textColor
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   575
			for l in rv:
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   576
				print l.fontName,l.fontSize,l.textColor,l.bold, l.rise, l.text[:25]
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   577
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   578
	style=ParaFrag()
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   579
	style.fontName='Times-Roman'
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   580
	style.fontSize = 12
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   581
	style.textColor = black
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   582
	style.bulletFontName = black
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   583
	style.bulletFontName='Times-Roman'
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   584
	style.bulletFontSize=12
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   585
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   586
	text='''
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   587
	<b><i><greek>a</greek>D</i></b>&beta;
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   588
	<font name="helvetica" size="15" color=green>
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   589
	Tell me, O muse, of that ingenious hero who travelled far and wide
113
2c20ecb9015e Fixed start_font
rgbecker
parents: 112
diff changeset
   590
	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
   591
	and many were the nations with whose manners and customs he was acquainted;
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   592
	moreover he suffered much by sea while trying to save his own life
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   593
	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
   594
	his men, for they perished through their own sheer folly in eating
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   595
	the cattle of the Sun-god Hyperion; so the god prevented them from
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   596
	ever reaching home. Tell me, too, about all these things, O daughter
115
49b2fae9ea60 Fixes to superscript stuff
rgbecker
parents: 113
diff changeset
   597
	of Jove, from whatsoever source you<super>1</super> may know them.
96
2a9cca4c5cf0 Beginnings of a paragraph parser
rgbecker
parents:
diff changeset
   598
	'''
133
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   599
	check_text(text)
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   600
	check_text('<para> </para>')
209
f46e0d4d113b made size alias of fontsize for <para>
rgbecker
parents: 192
diff changeset
   601
	check_text('<para font="times-bold" size=24 leading=28.8 spaceAfter=72>ReportLab -- Reporting for the Internet Age</para>')
133
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   602
	check_text('''
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   603
	<font color=red>&tau;</font>Tell me, O muse, of that ingenious hero who travelled far and wide
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   604
	after he had sacked the famous town of Troy. Many cities did he visit,
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   605
	and many were the nations with whose manners and customs he was acquainted;
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   606
	moreover he suffered much by sea while trying to save his own life
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   607
	and bring his men safely home; but do what he might he could not save
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   608
	his men, for they perished through their own sheer folly in eating
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   609
	the cattle of the Sun-god Hyperion; so the god prevented them from
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   610
	ever reaching home. Tell me, too, about all these things, O daughter
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   611
	of Jove, from whatsoever source you may know them.''')
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   612
	check_text('''
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   613
	Telemachus took this speech as of good omen and rose at once, for
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   614
	he was bursting with what he had to say. He stood in the middle of
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   615
	the assembly and the good herald Pisenor brought him his staff. Then,
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   616
	turning to Aegyptius, "Sir," said he, "it is I, as you will shortly
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   617
	learn, who have convened you, for it is I who am the most aggrieved.
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   618
	I have not got wind of any host approaching about which I would warn
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   619
	you, nor is there any matter of public moment on which I would speak.
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   620
	My grieveance is purely personal, and turns on two great misfortunes
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   621
	which have fallen upon my house. The first of these is the loss of
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   622
	my excellent father, who was chief among all you here present, and
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   623
	was like a father to every one of you; the second is much more serious,
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   624
	and ere long will be the utter ruin of my estate. The sons of all
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   625
	the chief men among you are pestering my mother to marry them against
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   626
	her will. They are afraid to go to her father Icarius, asking him
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   627
	to choose the one he likes best, and to provide marriage gifts for
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   628
	his daughter, but day by day they keep hanging about my father's house,
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   629
	sacrificing our oxen, sheep, and fat goats for their banquets, and
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   630
	never giving so much as a thought to the quantity of wine they drink.
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   631
	No estate can stand such recklessness; we have now no Ulysses to ward
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   632
	off harm from our doors, and I cannot hold my own against them. I
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   633
	shall never all my days be as good a man as he was, still I would
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   634
	indeed defend myself if I had power to do so, for I cannot stand such
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   635
	treatment any longer; my house is being disgraced and ruined. Have
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   636
	respect, therefore, to your own consciences and to public opinion.
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   637
	Fear, too, the wrath of heaven, lest the gods should be displeased
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   638
	and turn upon you. I pray you by Jove and Themis, who is the beginning
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   639
	and the end of councils, [do not] hold back, my friends, and leave
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   640
	me singlehanded- unless it be that my brave father Ulysses did some
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   641
	wrong to the Achaeans which you would now avenge on me, by aiding
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   642
	and abetting these suitors. Moreover, if I am to be eaten out of house
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   643
	and home at all, I had rather you did the eating yourselves, for I
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   644
	could then take action against you to some purpose, and serve you
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   645
	with notices from house to house till I got paid in full, whereas
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   646
	now I have no remedy."''')
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   647
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   648
	check_text('''
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   649
But as the sun was rising from the fair sea into the firmament of
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   650
heaven to shed light on mortals and immortals, they reached Pylos
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   651
the city of Neleus. Now the people of Pylos were gathered on the sea
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   652
shore to offer sacrifice of black bulls to Neptune lord of the Earthquake.
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   653
There were nine guilds with five hundred men in each, and there were
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   654
nine bulls to each guild. As they were eating the inward meats and
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   655
burning the thigh bones [on the embers] in the name of Neptune, Telemachus
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   656
and his crew arrived, furled their sails, brought their ship to anchor,
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   657
and went ashore. ''')
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   658
	check_text('''
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   659
So the neighbours and kinsmen of Menelaus were feasting and making
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   660
merry in his house. There was a bard also to sing to them and play
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   661
his lyre, while two tumblers went about performing in the midst of
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   662
them when the man struck up with his tune.]''')
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   663
	check_text('''
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   664
"When we had passed the [Wandering] rocks, with Scylla and terrible
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   665
Charybdis, we reached the noble island of the sun-god, where were
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   666
the goodly cattle and sheep belonging to the sun Hyperion. While still
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   667
at sea in my ship I could bear the cattle lowing as they came home
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   668
to the yards, and the sheep bleating. Then I remembered what the blind
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   669
Theban prophet Teiresias had told me, and how carefully Aeaean Circe
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   670
had warned me to shun the island of the blessed sun-god. So being
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   671
much troubled I said to the men, 'My men, I know you are hard pressed,
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   672
but listen while I tell you the prophecy that Teiresias made me, and
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   673
how carefully Aeaean Circe warned me to shun the island of the blessed
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   674
sun-god, for it was here, she said, that our worst danger would lie.
ba7b4eb9be6c Debugging xml changes
rgbecker
parents: 132
diff changeset
   675
Head the ship, therefore, away from the island.''')
192
256091132520 Use reportlab.lib.xmllib
rgbecker
parents: 162
diff changeset
   676
	check_text('''&lt; &gt; &amp; &quot; &apos;''')
211
52541f1643b6 CDATA handler added
rgbecker
parents: 209
diff changeset
   677
	check_text('''<![CDATA[<>&'"]]>''')
250
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   678
	check_text('''<bullet face=courier size=14 color=green>+</bullet>
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   679
There was a bard also to sing to them and play
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   680
his lyre, while two tumblers went about performing in the midst of
a1bcf9c6c21e <bullet> xml tag added
rgbecker
parents: 248
diff changeset
   681
them when the man struck up with his tune.]''')