Removed all trailing whitespace
authorandy_robinson
Wed, 24 Jul 2002 19:56:39 +0000
changeset 1683 7fa753e4420a
parent 1682 e2639301c342
child 1684 44263de9d6c9
Removed all trailing whitespace
reportlab/__init__.py
reportlab/demos/colors/colortest.py
reportlab/demos/gadflypaper/gfe.py
reportlab/demos/odyssey/dodyssey.py
reportlab/demos/odyssey/fodyssey.py
reportlab/demos/odyssey/odyssey.py
reportlab/demos/rlzope/rlzope.py
reportlab/demos/stdfonts/stdfonts.py
reportlab/demos/tests/testdemos.py
reportlab/docs/genAll.py
reportlab/docs/graphguide/ch1_intro.py
reportlab/docs/graphguide/ch2_concepts.py
reportlab/docs/graphguide/ch3_shapes.py
reportlab/docs/graphguide/ch4_widgets.py
reportlab/docs/graphguide/ch5_charts.py
reportlab/docs/graphguide/gengraphguide.py
reportlab/docs/reference/genreference.py
reportlab/docs/userguide/app_demos.py
reportlab/docs/userguide/ch1_intro.py
reportlab/docs/userguide/ch2_graphics.py
reportlab/docs/userguide/ch2a_fonts.py
reportlab/docs/userguide/ch3_pdffeatures.py
reportlab/docs/userguide/ch4_platypus_concepts.py
reportlab/docs/userguide/ch5_paragraphs.py
reportlab/docs/userguide/ch6_tables.py
reportlab/docs/userguide/ch7_custom.py
reportlab/docs/userguide/ch9_future.py
reportlab/docs/userguide/genuserguide.py
reportlab/extensions/__init__.py
reportlab/graphics/__init__.py
reportlab/graphics/charts/__init__.py
reportlab/graphics/charts/axes.py
reportlab/graphics/charts/barcharts.py
reportlab/graphics/charts/legends.py
reportlab/graphics/charts/linecharts.py
reportlab/graphics/charts/lineplots.py
reportlab/graphics/charts/markers.py
reportlab/graphics/charts/piecharts.py
reportlab/graphics/charts/textlabels.py
reportlab/graphics/charts/utils.py
reportlab/graphics/renderPDF.py
reportlab/graphics/renderPM.py
reportlab/graphics/renderPS.py
reportlab/graphics/renderSVG.py
reportlab/graphics/renderbase.py
reportlab/graphics/shapes.py
reportlab/graphics/testdrawings.py
reportlab/graphics/testshapes.py
reportlab/graphics/widgetbase.py
reportlab/graphics/widgets/__init__.py
reportlab/graphics/widgets/flags.py
reportlab/graphics/widgets/grids.py
reportlab/graphics/widgets/markers.py
reportlab/graphics/widgets/signsandsymbols.py
reportlab/lib/PyFontify.py
reportlab/lib/__init__.py
reportlab/lib/abag.py
reportlab/lib/attrmap.py
reportlab/lib/codecharts.py
reportlab/lib/colors.py
reportlab/lib/corp.py
reportlab/lib/enums.py
reportlab/lib/fonts.py
reportlab/lib/formatters.py
reportlab/lib/logger.py
reportlab/lib/normalDate.py
reportlab/lib/pagesizes.py
reportlab/lib/randomtext.py
reportlab/lib/sequencer.py
reportlab/lib/setup.py
reportlab/lib/styles.py
reportlab/lib/tocindex.py
reportlab/lib/units.py
reportlab/lib/utils.py
reportlab/lib/validators.py
reportlab/lib/xmllib.py
reportlab/lib/yaml.py
reportlab/pdfbase/__init__.py
reportlab/pdfbase/_cidfontdata.py
reportlab/pdfbase/_fontdata.py
reportlab/pdfbase/cidfonts.py
reportlab/pdfbase/pdfdoc.py
reportlab/pdfbase/pdfform.py
reportlab/pdfbase/pdfmetrics.py
reportlab/pdfbase/pdfpattern.py
reportlab/pdfbase/pdfutils.py
reportlab/pdfbase/ttfonts.py
reportlab/pdfgen/__init__.py
reportlab/pdfgen/canvas.py
reportlab/pdfgen/pathobject.py
reportlab/pdfgen/pdfgeom.py
reportlab/pdfgen/pdfimages.py
reportlab/pdfgen/textobject.py
reportlab/platypus/__init__.py
reportlab/platypus/doctemplate.py
reportlab/platypus/figures.py
reportlab/platypus/flowables.py
reportlab/platypus/frames.py
reportlab/platypus/paragraph.py
reportlab/platypus/paraparser.py
reportlab/platypus/tableofcontents.py
reportlab/platypus/tables.py
reportlab/platypus/xpreformatted.py
reportlab/rl_config.py
reportlab/test/__init__.py
reportlab/test/runAll.py
reportlab/test/test_charts_textlabels.py
reportlab/test/test_docs_build.py
reportlab/test/test_docstrings.py
reportlab/test/test_extra.py
reportlab/test/test_graphics_charts.py
reportlab/test/test_graphics_images.py
reportlab/test/test_graphics_speed.py
reportlab/test/test_hello.py
reportlab/test/test_lib_colors.py
reportlab/test/test_lib_sequencer.py
reportlab/test/test_lib_validators.py
reportlab/test/test_multibyte_chs.py
reportlab/test/test_multibyte_cht.py
reportlab/test/test_multibyte_jpn.py
reportlab/test/test_multibyte_kor.py
reportlab/test/test_paragraphs.py
reportlab/test/test_pdfbase_encodings.py
reportlab/test/test_pdfbase_fontembed.py
reportlab/test/test_pdfbase_pdfmetrics.py
reportlab/test/test_pdfbase_pdfutils.py
reportlab/test/test_pdfbase_ttfonts.py
reportlab/test/test_pdfgen_callback.py
reportlab/test/test_pdfgen_general.py
reportlab/test/test_pdfgen_pagemodes.py
reportlab/test/test_platypus_breaking.py
reportlab/test/test_platypus_general.py
reportlab/test/test_platypus_paragraphs.py
reportlab/test/test_platypus_tables.py
reportlab/test/test_platypus_toc.py
reportlab/test/test_platypus_xref.py
reportlab/test/test_pyfiles.py
reportlab/test/test_renderSVG.py
reportlab/test/test_source_chars.py
reportlab/test/test_tools_pythonpoint.py
reportlab/test/test_widgetbase_tpc.py
reportlab/test/test_widgets_grids.py
reportlab/test/unittest.py
reportlab/test/utils.py
reportlab/tools/__init__.py
reportlab/tools/docco/__init__.py
reportlab/tools/docco/codegrab.py
reportlab/tools/docco/docpy.py
reportlab/tools/docco/examples.py
reportlab/tools/docco/graphdocpy.py
reportlab/tools/docco/inspect.py
reportlab/tools/docco/rl_doc_utils.py
reportlab/tools/docco/rltemplate.py
reportlab/tools/docco/stylesheet.py
reportlab/tools/docco/t_parse.py
reportlab/tools/docco/yaml.py
reportlab/tools/docco/yaml2pdf.py
reportlab/tools/py2pdf/__init__.py
reportlab/tools/py2pdf/demo.py
reportlab/tools/py2pdf/idle_print.py
reportlab/tools/py2pdf/py2pdf.py
reportlab/tools/pythonpoint/__init__.py
reportlab/tools/pythonpoint/customshapes.py
reportlab/tools/pythonpoint/demos/examples.py
reportlab/tools/pythonpoint/pythonpoint.py
reportlab/tools/pythonpoint/stdparser.py
reportlab/tools/pythonpoint/styles/__init__.py
reportlab/tools/pythonpoint/styles/horrible.py
reportlab/tools/pythonpoint/styles/modern.py
reportlab/tools/pythonpoint/styles/projection.py
reportlab/tools/pythonpoint/styles/standard.py
--- a/reportlab/__init__.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/__init__.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/__init__.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/__init__.py,v 1.21 2002/05/28 15:50:03 rgbecker Exp $
-__version__=''' $Id: __init__.py,v 1.21 2002/05/28 15:50:03 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/__init__.py,v 1.22 2002/07/24 19:56:34 andy_robinson Exp $
+__version__=''' $Id: __init__.py,v 1.22 2002/07/24 19:56:34 andy_robinson Exp $ '''
 __doc__="""The Reportlab PDF generation library."""
 Version = "1.14"
 
@@ -16,4 +16,3 @@
     else:
         # this signals that it should revert to default processing
         return None
-
--- a/reportlab/demos/colors/colortest.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/demos/colors/colortest.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/demos/colors/colortest.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/demos/colors/colortest.py,v 1.2 2000/10/25 08:57:44 rgbecker Exp $
+#$Header: /tmp/reportlab/reportlab/demos/colors/colortest.py,v 1.3 2002/07/24 19:56:35 andy_robinson Exp $
 import reportlab.pdfgen.canvas
 from reportlab.lib import colors
 from reportlab.lib.units import inch
@@ -28,7 +28,7 @@
     c.setFillColorRGB(1,0,0)
     c.rect(200, y, 300, 30, fill=1)
     y = y - 40
-    
+
     c.setFillColorRGB(0,0,0)
     c.drawString(100, y, 'magenta')
     c.setFillColorCMYK(0,1,0,0)
@@ -46,13 +46,13 @@
     c.setFillColorCMYK(0,0,1,0)
     c.rect(200, y, 300, 30, fill=1)
     y = y - 40
-    
+
     c.setFillColorRGB(0,0,0)
     c.drawString(100, y, 'blue')
     c.setFillColorRGB(0,0,1)
     c.rect(200, y, 300, 30, fill=1)
     y = y - 40
-        
+
     c.setFillColorRGB(0,0,0)
     c.drawString(100, y, 'black')
     c.setFillColorCMYK(0,0,0,1)
@@ -61,7 +61,7 @@
 
 
     c.showPage()
-    
+
     #do all named colors
     framePage(c, 'Color Demo - RGB Space - page %d' % c.getPageNumber())
 
@@ -83,17 +83,17 @@
 
 
 
-            
+
     c.save()
 
 def framePage(canvas, title):
     canvas.setFont('Times-BoldItalic',20)
     canvas.drawString(inch, 10.5 * inch, title)
-                            
+
     canvas.setFont('Times-Roman',10)
     canvas.drawCentredString(4.135 * inch, 0.75 * inch,
                             'Page %d' % canvas.getPageNumber())
-    
+
     #draw a border
     canvas.setStrokeColorRGB(1,0,0)
     canvas.setLineWidth(5)
@@ -104,4 +104,3 @@
 
 if __name__ == '__main__':
     run()
-    
--- a/reportlab/demos/gadflypaper/gfe.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/demos/gadflypaper/gfe.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/demos/gadflypaper/gfe.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/demos/gadflypaper/gfe.py,v 1.14 2001/03/16 14:51:50 rgbecker Exp $
-__version__=''' $Id: gfe.py,v 1.14 2001/03/16 14:51:50 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/demos/gadflypaper/gfe.py,v 1.15 2002/07/24 19:56:35 andy_robinson Exp $
+__version__=''' $Id: gfe.py,v 1.15 2002/07/24 19:56:35 andy_robinson Exp $ '''
 __doc__=''
 
 #REPORTLAB_TEST_SCRIPT
@@ -46,7 +46,7 @@
     canvas.setFont('Times-Roman',9)
     canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
     canvas.restoreState()
-    
+
 def myLaterPages(canvas, doc):
     #canvas.drawImage("snkanim.gif", 36, 36)
     canvas.saveState()
@@ -56,7 +56,7 @@
     canvas.setFont('Times-Roman',9)
     canvas.drawString(inch, 0.75 * inch, "Page %d %s" % (doc.page, pageinfo))
     canvas.restoreState()
-    
+
 def go():
     Elements.insert(0,Spacer(0,inch))
     doc = SimpleDocTemplate('gfe.pdf')
@@ -79,7 +79,7 @@
 
 #pre = p # XXX
 
-PreStyle = styles["Code"] 
+PreStyle = styles["Code"]
 
 def pre(txt):
     s = Spacer(0.1*inch, 0.1*inch)
@@ -112,52 +112,52 @@
 pre("""\
  -- drinkers who frequent bars (this is a comment)
  select * from frequents
- 
- DRINKER | PERWEEK | BAR     
+
+ DRINKER | PERWEEK | BAR
  ============================
- adam    | 1       | lolas   
- woody   | 5       | cheers  
- sam     | 5       | cheers  
- norm    | 3       | cheers  
- wilt    | 2       | joes    
- norm    | 1       | joes    
- lola    | 6       | lolas   
- norm    | 2       | lolas   
- woody   | 1       | lolas   
+ adam    | 1       | lolas
+ woody   | 5       | cheers
+ sam     | 5       | cheers
+ norm    | 3       | cheers
+ wilt    | 2       | joes
+ norm    | 1       | joes
+ lola    | 6       | lolas
+ norm    | 2       | lolas
+ woody   | 1       | lolas
  pierre  | 0       | frankies
 )
 """)
 pre("""\
  -- drinkers who like beers
  select * from likes
- 
- DRINKER | PERDAY | BEER        
+
+ DRINKER | PERDAY | BEER
  ===============================
- adam    | 2      | bud         
- wilt    | 1      | rollingrock 
- sam     | 2      | bud         
- norm    | 3      | rollingrock 
- norm    | 2      | bud         
+ adam    | 2      | bud
+ wilt    | 1      | rollingrock
+ sam     | 2      | bud
+ norm    | 3      | rollingrock
+ norm    | 2      | bud
  nan     | 1      | sierranevada
- woody   | 2      | pabst       
- lola    | 5      | mickies     
+ woody   | 2      | pabst
+ lola    | 5      | mickies
 
 """)
 pre("""\
  -- beers served from bars
  select * from serves
 
- BAR      | QUANTITY | BEER       
+ BAR      | QUANTITY | BEER
  =================================
- cheers   | 500      | bud        
- cheers   | 255      | samadams  
- joes     | 217      | bud        
- joes     | 13       | samadams  
- joes     | 2222     | mickies    
- lolas    | 1515     | mickies    
- lolas    | 333      | pabst      
+ cheers   | 500      | bud
+ cheers   | 255      | samadams
+ joes     | 217      | bud
+ joes     | 13       | samadams
+ joes     | 2222     | mickies
+ lolas    | 1515     | mickies
+ lolas    | 333      | pabst
  winkos   | 432      | rollingrock
- frankies | 5        | snafu      
+ frankies | 5        | snafu
 """)
 p("""
 The relational model for database structures makes
@@ -178,7 +178,7 @@
 relational tables. Several years ago SQL was one
 of many Relational Database Management System
 (RDBMS) query languages in use, and many would
-argue not the best on. Now, largely due 
+argue not the best on. Now, largely due
 to standardization efforts and the
 backing of IBM, SQL is THE standard way to talk
 to database systems.
@@ -186,8 +186,8 @@
 p("""
 There are many advantages SQL offers over other
 database query languages and alternative paradigms
-at this time (please see [O'Neill] or [Korth and Silberschatz] 
-for more extensive discussions and comparisons between the 
+at this time (please see [O'Neill] or [Korth and Silberschatz]
+for more extensive discussions and comparisons between the
 SQL/relational approach and others.)
 """)
 p("""
@@ -268,7 +268,7 @@
 ones) straightforward.  """)
 
 p("""For an example of a moderately
-sophisticated query using the tables given above, 
+sophisticated query using the tables given above,
 the following query lists the drinkers who frequent lolas bar
 and like at least two beers not served by lolas
 """)
@@ -292,7 +292,7 @@
 pre("""
     DRINKER
     =======
-    norm   
+    norm
 """)
 p("""
 Experience shows that queries of this sort are actually
@@ -408,7 +408,7 @@
 example B is the join of B with A, E is the join of B with D and""")
 
 pre("""
-    E join I = 
+    E join I =
       [DRINKER=>'sam', BAR=>'cheers', BEER=>'mickies', CAPACITY=>300]""")
 
 p("""For any two substitutions either (1) they disagree on the value
@@ -431,7 +431,7 @@
 is defined to produce the substitution S2 such that""")
 
 pre("""
-    Name=>Value in S2 if and only if 
+    Name=>Value in S2 if and only if
         Name1=>Value in S and Name<=Name1 in R
 """)
 
@@ -730,7 +730,7 @@
        def __init__(self): pass
 
        def attributes(self):
-           return kjbuckets.kjSet("PATTERN", "NAME") 
+           return kjbuckets.kjSet("PATTERN", "NAME")
 
        def estimate(self, known_attributes):
            if known_attributes.member("PATTERN"):
@@ -824,16 +824,16 @@
 function f, g, and h in combinations of Python, C and java:""")
 
 pre("""
-COST    | FLANG  | GLANG  | HLANG 
+COST    | FLANG  | GLANG  | HLANG
 ==================================
-111000  | C      | C      | C     
-115000  | java   | C      | C     
-120000  | python | C      | C     
-155000  | java   | java   | C     
-210000  | python | python | C     
-555000  | java   | java   | java 
-560000  | python | java   | java  
-610000  | python | python | java  
+111000  | C      | C      | C
+115000  | java   | C      | C
+120000  | python | C      | C
+155000  | java   | java   | C
+210000  | python | python | C
+555000  | java   | java   | java
+560000  | python | java   | java
+610000  | python | python | java
 1110000 | python | python | python
 """)
 
@@ -901,4 +901,4 @@
 p("""[Gadfly]Gadfly: SQL Relational Database in Python,
 http://www.chordate.com/kwParsing/gadfly.html""")
 
-go()
+go()
\ No newline at end of file
--- a/reportlab/demos/odyssey/dodyssey.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/demos/odyssey/dodyssey.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/demos/odyssey/dodyssey.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/demos/odyssey/dodyssey.py,v 1.12 2002/07/17 22:46:22 andy_robinson Exp $
-__version__=''' $Id: dodyssey.py,v 1.12 2002/07/17 22:46:22 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/demos/odyssey/dodyssey.py,v 1.13 2002/07/24 19:56:35 andy_robinson Exp $
+__version__=''' $Id: dodyssey.py,v 1.13 2002/07/24 19:56:35 andy_robinson Exp $ '''
 __doc__=''
 
 #REPORTLAB_TEST_SCRIPT
@@ -34,7 +34,7 @@
     canvas.setFont('Times-Roman',9)
     canvas.drawString(inch, 0.75 * inch, "Page %d" % doc.page)
     canvas.restoreState()
-    
+
 def go():
     def myCanvasMaker(fn,**kw):
         from reportlab.pdfgen.canvas import Canvas
@@ -66,7 +66,7 @@
 InitialStyle = copy.deepcopy(ChapterStyle)
 InitialStyle.fontsize = 16
 InitialStyle.leading = 20
-PreStyle = styles["Code"] 
+PreStyle = styles["Code"]
 
 def newPage():
     Elements.append(PageBreak())
@@ -90,7 +90,7 @@
 
 def fTitle(txt,style=InitialStyle):
     Elements.append(Paragraph(txt, style))
-    
+
 ParaStyle = copy.deepcopy(styles["Normal"])
 ParaStyle.spaceBefore = 0.1*inch
 if 'right' in sys.argv:
@@ -104,7 +104,7 @@
 else:
     ParaStyle.alignment = TA_JUSTIFY
 
-useTwoCol = 'notwocol' not in sys.argv 
+useTwoCol = 'notwocol' not in sys.argv
 
 def spacer(inches):
     Elements.append(Spacer(0.1*inch, inches*inch))
@@ -202,7 +202,7 @@
         else:
             style = PreStyle
             func = pre
-    
+
         while 1:
             s=f
             f, k=findNext(L,s)
@@ -231,4 +231,4 @@
         break
 
 if __name__=='__main__':
-    parseOdyssey(fn)
+    parseOdyssey(fn)
\ No newline at end of file
--- a/reportlab/demos/odyssey/fodyssey.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/demos/odyssey/fodyssey.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/demos/odyssey/fodyssey.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/demos/odyssey/fodyssey.py,v 1.16 2002/07/17 22:46:22 andy_robinson Exp $
-__version__=''' $Id: fodyssey.py,v 1.16 2002/07/17 22:46:22 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/demos/odyssey/fodyssey.py,v 1.17 2002/07/24 19:56:35 andy_robinson Exp $
+__version__=''' $Id: fodyssey.py,v 1.17 2002/07/24 19:56:35 andy_robinson Exp $ '''
 __doc__=''
 
 #REPORTLAB_TEST_SCRIPT
@@ -20,13 +20,13 @@
 def myFirstPage(canvas, doc):
     canvas.saveState()
     canvas.restoreState()
-    
+
 def myLaterPages(canvas, doc):
     canvas.saveState()
     canvas.setFont('Times-Roman',9)
     canvas.drawString(inch, 0.75 * inch, "Page %d" % doc.page)
     canvas.restoreState()
-    
+
 def go():
     doc = SimpleDocTemplate('fodyssey.pdf',showBoundary='showboundary' in sys.argv)
     doc.allowSplitting = not 'nosplitting' in sys.argv
@@ -40,7 +40,7 @@
 InitialStyle = copy.deepcopy(ChapterStyle)
 InitialStyle.fontsize = 16
 InitialStyle.leading = 20
-PreStyle = styles["Code"] 
+PreStyle = styles["Code"]
 
 def newPage():
     Elements.append(PageBreak())
@@ -135,7 +135,7 @@
         else:
             style = PreStyle
             func = pre
-    
+
         while 1:
             s=f
             f, k=findNext(L,s)
@@ -163,4 +163,4 @@
     if os.path.isfile(fn):
         break
 if __name__=='__main__':
-    parseOdyssey(fn)
+    parseOdyssey(fn)
\ No newline at end of file
--- a/reportlab/demos/odyssey/odyssey.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/demos/odyssey/odyssey.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/demos/odyssey/odyssey.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/demos/odyssey/odyssey.py,v 1.10 2002/07/17 22:46:22 andy_robinson Exp $
-__version__=''' $Id: odyssey.py,v 1.10 2002/07/17 22:46:22 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/demos/odyssey/odyssey.py,v 1.11 2002/07/24 19:56:35 andy_robinson Exp $
+__version__=''' $Id: odyssey.py,v 1.11 2002/07/24 19:56:35 andy_robinson Exp $ '''
 ___doc__=''
 #odyssey.py
 #
@@ -47,7 +47,7 @@
     canv.drawCentredString(0.5*A4[0], 0.5 * inch,
                "Page %d" % canv.getPageNumber())
 
-    
+
 
 def run():
     started = time.time()
@@ -71,14 +71,14 @@
     tx.textLine("")
     tx.textLine("Andy Robinson, Robinson Analytics Ltd.")
     canv.drawText(tx)
-    
+
     canv.showPage()
     #on with the text...
     drawPageFrame(canv)
-    
+
     canv.setFont('Times-Roman', 12)
     tx = canv.beginText(left_margin, top_margin - 0.5*inch)
-    
+
     for fn in ('odyssey.full.txt','odyssey.txt'):
         if os.path.isfile(fn):
             break
@@ -92,7 +92,7 @@
         #canv.textOut(line)
         #canv.textLine('')
 
-        #page breaking        
+        #page breaking
         y = tx.getY()   #get y coordinate
         if y < bottom_margin + 0.5*inch:
             canv.drawText(tx)
@@ -110,17 +110,17 @@
         canv.drawText(tx)
         canv.showPage()
         drawPageFrame(canv)
-        
+
     print 'about to write to disk...'
-    
+
     canv.save()
-    
+
     finished = time.time()
     elapsed = finished - started
     pages = canv.getPageNumber()-1
     speed =  pages / elapsed
     print '%d pages in %0.2f seconds = %0.2f pages per second' % (
                 pages, elapsed, speed)
- 
+
 if __name__=='__main__':
-    run()
+    run()
\ No newline at end of file
--- a/reportlab/demos/rlzope/rlzope.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/demos/rlzope/rlzope.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,4 +1,4 @@
-# $Header: /tmp/reportlab/reportlab/demos/rlzope/rlzope.py,v 1.3 2002/03/25 00:51:49 andy_robinson Exp $
+# $Header: /tmp/reportlab/reportlab/demos/rlzope/rlzope.py,v 1.4 2002/07/24 19:56:35 andy_robinson Exp $
 #
 # Using the ReportLab toolkit from within Zope
 #
@@ -167,4 +167,4 @@
         content = '<html><head></head><body><pre>%s</pre></body></html>' % cgi.escape(content.getvalue())
 
     # then we also return the PDF content to the browser
-    return content
+    return content
\ No newline at end of file
--- a/reportlab/demos/stdfonts/stdfonts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/demos/stdfonts/stdfonts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/demos/stdfonts/stdfonts.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/demos/stdfonts/stdfonts.py,v 1.11 2002/07/17 20:58:39 andy_robinson Exp $
-__version__=''' $Id: stdfonts.py,v 1.11 2002/07/17 20:58:39 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/demos/stdfonts/stdfonts.py,v 1.12 2002/07/24 19:56:35 andy_robinson Exp $
+__version__=''' $Id: stdfonts.py,v 1.12 2002/07/24 19:56:35 andy_robinson Exp $ '''
 __doc__="""
 This generates tables showing the 14 standard fonts in both
 WinAnsi and MacRoman encodings, and their character codes.
@@ -24,14 +24,14 @@
 def run(mode):
 
     label_formatter, caption = label_formats[mode]
-    
+
     for enc in ['MacRoman', 'WinAnsi']:
         canv = canvas.Canvas(
                 'StandardFonts_%s.pdf' % enc,
                 encoding=enc
                 )
         canv.setPageCompression(0)
-        
+
         for faceName in pdfmetrics.standardFonts:
             if faceName in ['Symbol', 'ZapfDingbats']:
                 encLabel = 'StandardEncoding'
@@ -43,13 +43,13 @@
                                         faceName,
                                         encLabel)
                         )
-                
+
             canv.setFont('Times-Bold', 18)
             canv.drawString(80, 744, fontName)
             canv.setFont('Times-BoldItalic', 12)
             canv.drawRightString(515, 744, 'Labels in ' + caption)
-            
-            
+
+
             #for dingbats, we need to use another font for the numbers.
             #do two parallel text objects.
             if faceName == 'ZapfDingbats':
@@ -64,7 +64,7 @@
                 canv.drawString(x, y, label_formatter % byt)
                 canv.setFont(fontName, 14)
                 canv.drawString(x + 44, y , chr(byt))
-            canv.showPage()            
+            canv.showPage()
         canv.save()
 
 if __name__ == '__main__':
@@ -72,10 +72,9 @@
         mode = string.lower(sys.argv[1])
         if mode not in ['dec','oct','hex']:
             print __doc__
-            
+
     elif len(sys.argv) == 1:
         mode = 'dec'
         run(mode)
     else:
         print __doc__
-    
--- a/reportlab/demos/tests/testdemos.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/demos/tests/testdemos.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,8 +2,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/demos/tests/testdemos.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/demos/tests/testdemos.py,v 1.6 2002/07/17 22:46:22 andy_robinson Exp $
-__version__=''' $Id: testdemos.py,v 1.6 2002/07/17 22:46:22 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/demos/tests/testdemos.py,v 1.7 2002/07/24 19:56:35 andy_robinson Exp $
+__version__=''' $Id: testdemos.py,v 1.7 2002/07/24 19:56:35 andy_robinson Exp $ '''
 __doc__='Test all demos'
 _globals=globals().copy()
 import os, sys
@@ -12,4 +12,4 @@
 for p in ('pythonpoint/pythonpoint.py','stdfonts/stdfonts.py','odyssey/odyssey.py', 'gadflypaper/gfe.py'):
     fn = os.path.normcase(os.path.normpath(os.path.join(os.path.dirname(pdfgen.__file__),'..','demos',p)))
     os.chdir(os.path.dirname(fn))
-    execfile(fn,_globals.copy())
+    execfile(fn,_globals.copy())
\ No newline at end of file
--- a/reportlab/docs/genAll.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/genAll.py	Wed Jul 24 19:56:39 2002 +0000
@@ -29,9 +29,9 @@
 
 """Runs the manual-building scripts"""
 if __name__=='__main__':
-    #need a quiet mode for the test suite   
+    #need a quiet mode for the test suite
     if '-s' in sys.argv:  # 'silent
         verbose = 0
     else:
         verbose = 1
-    _genAll(os.path.dirname(sys.argv[0]),verbose)
+    _genAll(os.path.dirname(sys.argv[0]),verbose)
\ No newline at end of file
--- a/reportlab/docs/graphguide/ch1_intro.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/graphguide/ch1_intro.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/graphguide/ch1_intro.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/graphguide/ch1_intro.py,v 1.5 2001/11/08 17:30:21 johnprecedo Exp $
+#$Header: /tmp/reportlab/reportlab/docs/graphguide/ch1_intro.py,v 1.6 2002/07/24 19:56:35 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 import reportlab
 
@@ -22,7 +22,7 @@
 
 heading2("About this document")
 disc("""
-This document is intended to be a helpful and reasonably full 
+This document is intended to be a helpful and reasonably full
 introduction to the use of the ReportLab Graphics sub-package.
 Starting with simple drawings and shapes, we will take you through the
 slightly more complex reusable widgets all the way through to our
@@ -39,8 +39,8 @@
 """)
 
 disc("""
-We recommend that you read some or all of the User Guide and have at 
-least a basic understanding of how the ReportLab library works before 
+We recommend that you read some or all of the User Guide and have at
+least a basic understanding of how the ReportLab library works before
 you start getting to grips with ReportLab Graphics.
 """)
 
@@ -105,4 +105,3 @@
 $http://www.egroups.com/group/reportlab-users$.  This list is
 the place to report bugs and get support. """)
 
-
--- a/reportlab/docs/graphguide/ch2_concepts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/graphguide/ch2_concepts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/graphguide/ch2_graphics.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/graphguide/ch2_concepts.py,v 1.4 2002/05/27 09:20:31 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/docs/graphguide/ch2_concepts.py,v 1.5 2002/07/24 19:56:35 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 
 heading1("General Concepts")
@@ -15,7 +15,7 @@
 heading2("Drawings and Renderers")
 
 disc("""
-A <i>Drawing</i> is a platform-independent description of a collection of 
+A <i>Drawing</i> is a platform-independent description of a collection of
 shapes.
 It is not directly associated with PDF, Postscript or any other output
 format.
@@ -36,13 +36,13 @@
 """)
 
 disc("""
-The package provides several <i>Renderers</i> which know how to draw a 
+The package provides several <i>Renderers</i> which know how to draw a
 drawing into different formats.
 These include PDF (of course), Postscript, and bitmap output.
 The bitmap renderer uses Raph Levien's <i>libart</i> rasterizer
 and Fredrik Lundh's <i>Python Imaging Library</i> (PIL).
-Very recently, an experimental SVG renderer was also added. 
-It makes use of Python's standard library XML modules, so you don't 
+Very recently, an experimental SVG renderer was also added.
+It makes use of Python's standard library XML modules, so you don't
 need to install the XML-SIG's additional package named PyXML.
 If you have the right extensions installed, you can generate drawings
 in bitmap form for the web as well as vector form for PDF documents,
@@ -60,21 +60,21 @@
 
 disc("""
 The SVG renderer is special as it is still pretty experimental.
-The SVG code it generates is not really optimised in any way and 
+The SVG code it generates is not really optimised in any way and
 maps only the features available in ReportLab Graphics (RLG) to
 SVG. This means there is no support for SVG animation, interactivity,
-scripting or more sophisticated clipping, masking or graduation 
+scripting or more sophisticated clipping, masking or graduation
 shapes.
 So, be careful, and please report any bugs you find!
 """)
 
 disc("""
-We expect to add both input and output filters for many vector 
+We expect to add both input and output filters for many vector
 graphics formats in future.
 SVG was the most prominent first one to start with for which there
 is now an output filter in the graphics package.
 An SVG input filter will probably become available in Summer 2002
-as an additional module. 
+as an additional module.
 GUIs will be able to obtain screen images from the bitmap output
 filter working with PIL, so a chart could appear in a Tkinter
 GUI window.
@@ -87,7 +87,7 @@
 The Y-direction in our X-Y coordinate system points from the
 bottom <i>up</i>.
 This is consistent with PDF, Postscript and mathematical notation.
-It also appears to be more natural for people, especially when 
+It also appears to be more natural for people, especially when
 working with charts.
 Note that in other graphics models (such as SVG) the Y-coordinate
 points <i>down</i>.
@@ -107,33 +107,33 @@
 heading2("Getting Started")
 
 disc("""
-Let's create a simple drawing containing the string "Hello World", 
+Let's create a simple drawing containing the string "Hello World",
 displayed on top of a coloured rectangle.
 After creating it we will save the drawing to a standalone PDF file.
 """)
 
 eg("""
     from reportlab.lib import colors
-    from reportlab.graphics.shapes import * 
- 
+    from reportlab.graphics.shapes import *
+
     d = Drawing(400, 200)
     d.add(Rect(50, 50, 300, 100, fillColor=colors.yellow))
     d.add(String(150,100, 'Hello World',
                  fontSize=18, fillColor=colors.red))
- 
-    from reportlab.graphics import renderPDF 
-    renderPDF.drawToFile(d, 'example1.pdf', 'My First Drawing') 
+
+    from reportlab.graphics import renderPDF
+    renderPDF.drawToFile(d, 'example1.pdf', 'My First Drawing')
 """)
 
 disc("This will produce a PDF file containing the following graphic:")
 
-from reportlab.graphics.shapes import * 
+from reportlab.graphics.shapes import *
 from reportlab.graphics import testshapes
 t = testshapes.getDrawing01()
 draw(t, "'Hello World'")
- 
+
 disc("""
-Each renderer is allowed to do whatever is appropriate for its format, 
+Each renderer is allowed to do whatever is appropriate for its format,
 and may have whatever API is needed.
 If it refers to a file format, it usually has a $drawToFile$ function,
 and that's all you need to know about the renderer.
@@ -141,12 +141,12 @@
 """)
 
 ##eg("""
-##    from reportlab.graphics import renderPS 
-##    renderPS.drawToFile(D, 'example1.eps', 'My First Drawing') 
+##    from reportlab.graphics import renderPS
+##    renderPS.drawToFile(D, 'example1.eps', 'My First Drawing')
 ##""")
 eg("""
-    from reportlab.graphics import renderPS 
-    renderPS.drawToFile(d, 'example1.eps') 
+    from reportlab.graphics import renderPS
+    renderPS.drawToFile(d, 'example1.eps')
 """)
 
 disc("""
@@ -157,8 +157,8 @@
 """)
 
 eg("""
-    from reportlab.graphics import renderPM 
-    renderPM.saveToFile(d, 'example1.png', 'PNG') 
+    from reportlab.graphics import renderPM
+    renderPM.saveToFile(d, 'example1.png', 'PNG')
 """)
 
 disc("""
@@ -174,8 +174,8 @@
 """)
 
 eg("""
-    from reportlab.graphics import renderSVG 
-    renderSVG.drawToFile(d, 'example1.svg') 
+    from reportlab.graphics import renderSVG
+    renderSVG.drawToFile(d, 'example1.svg')
 """)
 
 
@@ -202,9 +202,9 @@
 
 eg("""
 >>> r = Rect(10,10,200,100, fillColor=colors.red)
->>> 
->>> r.fullColor = colors.green # note the typo 
->>> r.x = 'not a number'       # illegal argument type 
+>>>
+>>> r.fullColor = colors.green # note the typo
+>>> r.x = 'not a number'       # illegal argument type
 >>> del r.width                # that should confuse it
 """)
 
@@ -220,16 +220,16 @@
 """)
 
 eg("""
->>> r = shapes.Rect(10,10,200,80) 
->>> r.fullColor = colors.green 
+>>> r = shapes.Rect(10,10,200,80)
+>>> r.fullColor = colors.green
 Traceback (most recent call last):
-  File "<interactive input>", line 1, in ? 
+  File "<interactive input>", line 1, in ?
   File "C:\code\users\andy\graphics\shapes.py", line 254, in __setattr__
     validateSetattr(self,attr,value)    #from reportlab.lib.attrmap
   File "C:\code\users\andy\lib\attrmap.py", line 74, in validateSetattr
     raise AttributeError, "Illegal attribute '%s' in class %s" % (name, obj.__class__.__name__)
 AttributeError: Illegal attribute 'fullColor' in class Rect
->>>  
+>>>
 """)
 
 disc("""
@@ -240,14 +240,14 @@
 """)
 
 eg("""
->>> import reportlab.rl_config 
->>> reportlab.rl_config.shapeChecking = 0 
->>> from reportlab.graphics import shapes 
+>>> import reportlab.rl_config
+>>> reportlab.rl_config.shapeChecking = 0
+>>> from reportlab.graphics import shapes
 >>>
 """)
 
 disc("""
-Once you turn off $shapeChecking$, the classes are actually built 
+Once you turn off $shapeChecking$, the classes are actually built
 without the verification hook; code should get faster, then.
 Currently the penalty seems to be about 25% on batches of charts,
 so it is hardly worth disabling.
@@ -268,54 +268,54 @@
 heading2("Property Editing")
 
 disc("""
-A cornerstone of the reportlab/graphics which we will cover below is 
+A cornerstone of the reportlab/graphics which we will cover below is
 that you can automatically document widgets.
 This means getting hold of all of their editable properties,
 including those of their subcomponents.
 """)
 
 disc("""
-Another goal is to be able to create GUIs and config files for 
+Another goal is to be able to create GUIs and config files for
 drawings.
-A generic GUI can be built to show all editable properties 
+A generic GUI can be built to show all editable properties
 of a drawing, and let you modify them and see the results.
 The Visual Basic or Delphi development environment are good
 examples of this kind of thing.
-In a batch charting application, a file could list all the 
+In a batch charting application, a file could list all the
 properties of all the components in a chart, and be merged
 with a database query to make a batch of charts.
 """)
 
 disc("""
-To support these applications we have two interfaces, $getProperties$ 
+To support these applications we have two interfaces, $getProperties$
 and $setProperties$, as well as a convenience method $dumpProperties$.
 The first returns a dictionary of the editable properties of an
 object; the second sets them en masse.
 If an object has publicly exposed 'children' then one can recursively
-set and get their properties too. 
+set and get their properties too.
 This will make much more sense when we look at <i>Widgets</i> later on,
 but we need to put the support into the base of the framework.
 """)
 
 eg("""
 >>> r = shapes.Rect(0,0,200,100)
->>> import pprint 
->>> pprint.pprint(r.getProperties()) 
-{'fillColor': Color(0.00,0.00,0.00), 
- 'height': 100, 
- 'rx': 0, 
- 'ry': 0, 
- 'strokeColor': Color(0.00,0.00,0.00), 
- 'strokeDashArray': None, 
- 'strokeLineCap': 0, 
- 'strokeLineJoin': 0, 
- 'strokeMiterLimit': 0, 
- 'strokeWidth': 1, 
- 'width': 200, 
- 'x': 0, 
- 'y': 0} 
->>> r.setProperties({'x':20, 'y':30, 'strokeColor': colors.red}) 
->>> r.dumpProperties() 
+>>> import pprint
+>>> pprint.pprint(r.getProperties())
+{'fillColor': Color(0.00,0.00,0.00),
+ 'height': 100,
+ 'rx': 0,
+ 'ry': 0,
+ 'strokeColor': Color(0.00,0.00,0.00),
+ 'strokeDashArray': None,
+ 'strokeLineCap': 0,
+ 'strokeLineJoin': 0,
+ 'strokeMiterLimit': 0,
+ 'strokeWidth': 1,
+ 'width': 200,
+ 'x': 0,
+ 'y': 0}
+>>> r.setProperties({'x':20, 'y':30, 'strokeColor': colors.red})
+>>> r.dumpProperties()
 fillColor = Color(0.00,0.00,0.00)
 height = 100
 rx = 0
@@ -338,8 +338,8 @@
 """)
 
 disc("""
-These three methods don't seem to do much here, but as we will see 
-they make our widgets framework much more powerful when dealing with 
+These three methods don't seem to do much here, but as we will see
+they make our widgets framework much more powerful when dealing with
 non-primitive objects.
 """)
 
@@ -355,12 +355,12 @@
 """)
 
 eg("""
->>> d = shapes.Drawing(400, 200) 
->>> s = shapes.String(10, 10, 'Hello World') 
->>> d.add(s, 'caption') 
->>> s.caption.text 
-'Hello World' 
->>>  
+>>> d = shapes.Drawing(400, 200)
+>>> s = shapes.String(10, 10, 'Hello World')
+>>> d.add(s, 'caption')
+>>> s.caption.text
+'Hello World'
+>>>
 """)
 
 disc("""
@@ -372,6 +372,6 @@
 """)
 
 disc("""
-This provides one paradigm for creating and modifying interactive 
+This provides one paradigm for creating and modifying interactive
 drawings.
-""")
+""")
\ No newline at end of file
--- a/reportlab/docs/graphguide/ch3_shapes.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/graphguide/ch3_shapes.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/graphguide/ch2_graphics.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/graphguide/ch3_shapes.py,v 1.2 2001/10/27 22:37:02 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/graphguide/ch3_shapes.py,v 1.3 2002/07/24 19:56:35 andy_robinson Exp $
 
 from reportlab.tools.docco.rl_doc_utils import *
 from reportlab.graphics.shapes import *
@@ -22,7 +22,7 @@
 Drawings are made up of Shapes.
 Absolutely anything can be built up by combining the same set of
 primitive shapes.
-The module $shapes.py$ supplies a number of primitive shapes and 
+The module $shapes.py$ supplies a number of primitive shapes and
 constructs which can be added to a drawing.
 They are:
 """)
@@ -49,12 +49,12 @@
 
 t = testshapes.getDrawing06()
 draw(t, "Basic shapes")
- 
+
 
 heading2("Shape Properties")
 
 disc("""
-Shapes have two kinds of properties - some to define their geometry 
+Shapes have two kinds of properties - some to define their geometry
 and some to define their style.
 Let's create a red rectangle with 3-point thick green borders:
 """)
@@ -66,7 +66,7 @@
 >>> r.fillColor = red
 >>> r.strokeColor = green
 >>> r.strokeWidth = 3
->>> 
+>>>
 """)
 
 from reportlab.graphics.shapes import Rect
@@ -105,7 +105,7 @@
 width = 200
 x = 5
 y = 5
->>> 
+>>>
 """)
 
 disc("""
@@ -118,16 +118,16 @@
 """)
 
 disc("""
-You may set other properties on subsequent lines, or by passing them 
+You may set other properties on subsequent lines, or by passing them
 as optional arguments to the constructor.
 We could also have created our rectangle this way:
 """)
 
 eg("""
->>> r = Rect(5, 5, 200, 100, 
-             fillColor=red, 
-             strokeColor=green, 
-             strokeWidth=3) 
+>>> r = Rect(5, 5, 200, 100,
+             fillColor=red,
+             strokeColor=green,
+             strokeWidth=3)
 """)
 
 disc("""
@@ -197,7 +197,7 @@
 textAnchor = start
 x = 10
 y = 50
->>> 
+>>>
 """)
 
 disc("""
@@ -209,7 +209,7 @@
 """)
 
 disc("""
-Strings use a common font standard: the Type 1 Postscript fonts 
+Strings use a common font standard: the Type 1 Postscript fonts
 present in Acrobat Reader.
 We can thus use the basic 14 fonts in ReportLab and get accurate
 metrics for them.
@@ -282,38 +282,38 @@
 # NB This commented out section is for 'future compatibility' - paths haven't
 #    been implemented yet, but when they are we can uncomment this back in.
 
-    ##disc("""Postscript paths are a widely understood concept in graphics. A Path 
-    ##       is a way of defining a region in space. You put an imaginary pen down, 
-    ##       draw straight and curved segments, and even pick the pen up and move 
-    ##       it. At the end of this you have described a region, which may consist 
-    ##       of several distinct close shapes or unclosed lines. At the end, this 
-    ##       'path' is 'stroked and filled' according to its properties. A Path has 
-    ##       the same style properties as a solid shape. It can be used to create 
+    ##disc("""Postscript paths are a widely understood concept in graphics. A Path
+    ##       is a way of defining a region in space. You put an imaginary pen down,
+    ##       draw straight and curved segments, and even pick the pen up and move
+    ##       it. At the end of this you have described a region, which may consist
+    ##       of several distinct close shapes or unclosed lines. At the end, this
+    ##       'path' is 'stroked and filled' according to its properties. A Path has
+    ##       the same style properties as a solid shape. It can be used to create
     ##       any irregular shape.""")
     ##
-    ##disc("""In Postscript-based imaging models such as PDF, Postscript and SVG, 
-    ##       everything is done with paths. All the specific shapes covered above 
-    ##       are instances of paths; even text strings (which are shapes in which 
-    ##       each character is an outline to be filled). Here we begin creating a 
+    ##disc("""In Postscript-based imaging models such as PDF, Postscript and SVG,
+    ##       everything is done with paths. All the specific shapes covered above
+    ##       are instances of paths; even text strings (which are shapes in which
+    ##       each character is an outline to be filled). Here we begin creating a
     ##       path with a straight line and a bezier curve:""")
     ##
     ##eg("""
-    ##>>> P = Path(0,0, strokeWidth=3, strokeColor=red) 
-    ##>>> P.lineTo(0, 50) 
-    ##>>> P.curveTo(10,50,80,80,100,30) 
-    ##>>> 
+    ##>>> P = Path(0,0, strokeWidth=3, strokeColor=red)
+    ##>>> P.lineTo(0, 50)
+    ##>>> P.curveTo(10,50,80,80,100,30)
+    ##>>>
     ##""")
 
-    ##disc("""As well as being the only way to draw complex shapes, paths offer some 
-    ##       performance advantages in renderers which support them. If you want to 
-    ##       create a scatter plot with 5000 blue circles of different sizes, you 
-    ##       can create 5000 circles, or one path object. With the latter, you only 
-    ##       need to set the color and line width once. PINGO just remembers the 
-    ##       drawing sequence, and writes it out into the file. In renderers which 
-    ##       do not support paths, the renderer will still have to decompose it 
+    ##disc("""As well as being the only way to draw complex shapes, paths offer some
+    ##       performance advantages in renderers which support them. If you want to
+    ##       create a scatter plot with 5000 blue circles of different sizes, you
+    ##       can create 5000 circles, or one path object. With the latter, you only
+    ##       need to set the color and line width once. PINGO just remembers the
+    ##       drawing sequence, and writes it out into the file. In renderers which
+    ##       do not support paths, the renderer will still have to decompose it
     ##       into 5000 circles so you won't save anything.""")
     ##
-    ##disc("""<b>Note that our current path implementation is an approximation; it 
+    ##disc("""<b>Note that our current path implementation is an approximation; it
     ##         should be finished off accurately for PDF and PS.</b>""")
 
 
@@ -330,9 +330,9 @@
 """)
 
 eg("""
->>> g =Group(shape1, shape2, shape3) 
->>> g.rotate(30) 
->>> g.translate(50, 200) 
+>>> g =Group(shape1, shape2, shape3)
+>>> g.rotate(30)
+>>> g.translate(50, 200)
 """)
 
 disc("""
@@ -357,13 +357,13 @@
         Line(0,30,10,30),
         Line(0,40,10,40),
         Line(10,0,10,10), # ticks on x axis
-        Line(20,0,20,10), 
-        Line(30,0,30,10), 
-        Line(40,0,40,10), 
-        Line(50,0,50,10), 
-        Line(60,0,60,10), 
-        Line(70,0,70,10), 
-        Line(80,0,80,10), 
+        Line(20,0,20,10),
+        Line(30,0,30,10),
+        Line(40,0,40,10),
+        Line(50,0,50,10),
+        Line(60,0,60,10),
+        Line(70,0,70,10),
+        Line(80,0,80,10),
         Line(90,0,90,10),
         String(20, 35, 'Axes', fill=colors.black)
         )
@@ -371,15 +371,15 @@
     firstAxisGroup = Group(Axis)
     firstAxisGroup.translate(10,10)
     d.add(firstAxisGroup)
-    
+
     secondAxisGroup = Group(Axis)
     secondAxisGroup.translate(150,10)
     secondAxisGroup.rotate(15)
-    
+
     d.add(secondAxisGroup)
 
-    thirdAxisGroup = Group(Axis, 
-                           transform=mmult(translate(300,10), 
+    thirdAxisGroup = Group(Axis,
+                           transform=mmult(translate(300,10),
                                            rotate(30)))
     d.add(thirdAxisGroup)
 """)
@@ -393,13 +393,13 @@
     Line(0,30,10,30),
     Line(0,40,10,40),
     Line(10,0,10,10), # ticks on x axis
-    Line(20,0,20,10), 
-    Line(30,0,30,10), 
-    Line(40,0,40,10), 
-    Line(50,0,50,10), 
-    Line(60,0,60,10), 
-    Line(70,0,70,10), 
-    Line(80,0,80,10), 
+    Line(20,0,20,10),
+    Line(30,0,30,10),
+    Line(40,0,40,10),
+    Line(50,0,50,10),
+    Line(60,0,60,10),
+    Line(70,0,70,10),
+    Line(80,0,80,10),
     Line(90,0,90,10),
     String(20, 35, 'Axes', fill=colors.black)
     )
@@ -410,8 +410,8 @@
 secondAxisGroup.translate(150,10)
 secondAxisGroup.rotate(15)
 d.add(secondAxisGroup)
-thirdAxisGroup = Group(Axis, 
-                       transform=mmult(translate(300,10), 
+thirdAxisGroup = Group(Axis,
+                       transform=mmult(translate(300,10),
                                        rotate(30)))
 d.add(thirdAxisGroup)
-draw(d, "Groups examples")
+draw(d, "Groups examples")
\ No newline at end of file
--- a/reportlab/docs/graphguide/ch4_widgets.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/graphguide/ch4_widgets.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,61 +1,61 @@
 #copyright ReportLab Inc. 2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/graphguide/ch2_graphics.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/graphguide/ch4_widgets.py,v 1.2 2001/10/27 22:37:02 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/graphguide/ch4_widgets.py,v 1.3 2002/07/24 19:56:35 andy_robinson Exp $
 
 from reportlab.tools.docco.rl_doc_utils import *
 from reportlab.graphics.shapes import *
 from reportlab.graphics.widgets import signsandsymbols
 
-heading1("Widgets") 
+heading1("Widgets")
 
 disc("""
 We now describe widgets and how they relate to shapes.
 Using many examples it is shown how widgets make reusable
-graphics components. 
+graphics components.
 """)
 
 
 heading2("Shapes vs. Widgets")
 
-disc("""Up until now, Drawings have been 'pure data'. There is no code in them 
-       to actually do anything, except assist the programmer in checking and 
-       inspecting the drawing. In fact, that's the cornerstone of the whole 
-       concept and is what lets us achieve portability - a renderer only 
+disc("""Up until now, Drawings have been 'pure data'. There is no code in them
+       to actually do anything, except assist the programmer in checking and
+       inspecting the drawing. In fact, that's the cornerstone of the whole
+       concept and is what lets us achieve portability - a renderer only
        needs to implement the primitive shapes.""")
 
-disc("""We want to build reusable graphic objects, including a powerful chart 
-       library. To do this we need to reuse more tangible things than 
-       rectangles and circles. We should be able to write objects for other 
-       to reuse - arrows, gears, text boxes, UML diagram nodes, even fully 
+disc("""We want to build reusable graphic objects, including a powerful chart
+       library. To do this we need to reuse more tangible things than
+       rectangles and circles. We should be able to write objects for other
+       to reuse - arrows, gears, text boxes, UML diagram nodes, even fully
        fledged charts.""")
 
 disc("""
-The Widget standard is a standard built on top of the shapes module. 
-Anyone can write new widgets, and we can build up libraries of them. 
+The Widget standard is a standard built on top of the shapes module.
+Anyone can write new widgets, and we can build up libraries of them.
 Widgets support the $getProperties()$ and $setProperties()$ methods,
 so you can inspect and modify as well as document them in a uniform
 way.
 """)
 
 bullet("A widget is a reusable shape ")
-bullet("""it can be initialized with no arguments 
-       when its $draw()$ method is called it creates a primitive Shape or a 
+bullet("""it can be initialized with no arguments
+       when its $draw()$ method is called it creates a primitive Shape or a
        Group to represent itself""")
-bullet("""It can have any parameters you want, and they can drive the way it is 
+bullet("""It can have any parameters you want, and they can drive the way it is
        drawn""")
-bullet("""it has a $demo()$ method which should return an attractively drawn 
-       example of itself in a 200x100 rectangle. This is the cornerstone of 
-       the automatic documentation tools. The $demo()$ method should also have 
+bullet("""it has a $demo()$ method which should return an attractively drawn
+       example of itself in a 200x100 rectangle. This is the cornerstone of
+       the automatic documentation tools. The $demo()$ method should also have
        a well written docstring, since that is printed too!""")
 
-disc("""Widgets run contrary to the idea that a drawing is just a bundle of 
-       shapes; surely they have their own code? The way they work is that a 
-       widget can convert itself to a group of primitive shapes. If some of 
-       its components are themselves widgets, they will get converted too. 
-       This happens automatically during rendering; the renderer will not see 
-       your chart widget, but just a collection of rectangles, lines and 
-       strings. You can also explicitly 'flatten out' a drawing, causing all 
+disc("""Widgets run contrary to the idea that a drawing is just a bundle of
+       shapes; surely they have their own code? The way they work is that a
+       widget can convert itself to a group of primitive shapes. If some of
+       its components are themselves widgets, they will get converted too.
+       This happens automatically during rendering; the renderer will not see
+       your chart widget, but just a collection of rectangles, lines and
+       strings. You can also explicitly 'flatten out' a drawing, causing all
        widgets to be converted to primitives.""")
 
 
@@ -66,7 +66,7 @@
 We will use a widget to draw a face, then show how it was implemented.""")
 
 eg("""
->>> from reportlab.lib import colors 
+>>> from reportlab.lib import colors
 >>> from reportlab.graphics import shapes
 >>> from reportlab.graphics import widgetbase
 >>> from reportlab.graphics import renderPDF
@@ -89,28 +89,28 @@
 draw(d, 'A sample widget')
 
 disc("""
-Let's see what properties it has available, using the $setProperties()$ 
+Let's see what properties it has available, using the $setProperties()$
 method we have seen earlier:
 """)
 
 eg("""
->>> f.dumpProperties() 
-eyeColor = Color(0.00,0.00,1.00) 
-mood = sad 
-size = 80 
-skinColor = Color(1.00,1.00,0.00) 
-x = 10 
-y = 10 
+>>> f.dumpProperties()
+eyeColor = Color(0.00,0.00,1.00)
+mood = sad
+size = 80
+skinColor = Color(1.00,1.00,0.00)
+x = 10
+y = 10
 >>>
 """)
 
 disc("""
-One thing which seems strange about the above code is that we did not 
+One thing which seems strange about the above code is that we did not
 set the size or position when we made the face.
 This is a necessary trade-off to allow a uniform interface for
 constructing widgets and documenting them - they cannot require
 arguments in their $__init__()$ method.
-Instead, they are generally designed to fit in a 200 x 100 
+Instead, they are generally designed to fit in a 200 x 100
 window, and you move or resize them by setting properties such as
 x, y, width and so on after creation.
 """)
@@ -125,7 +125,7 @@
 """)
 
 disc("""
-Here are a handful of simple widgets available in the module 
+Here are a handful of simple widgets available in the module
 <i>signsandsymbols.py</i>:
 """)
 
@@ -180,114 +180,114 @@
 
 heading2("Compound Widgets")
 
-disc("""Let's imagine a compound widget which draws two faces side by side. 
+disc("""Let's imagine a compound widget which draws two faces side by side.
        This is easy to build when you have the Face widget.""")
 
 eg("""
->>> tf = widgetbase.TwoFaces() 
->>> tf.faceOne.mood 
-'happy' 
->>> tf.faceTwo.mood 
-'sad' 
->>> tf.dumpProperties() 
-faceOne.eyeColor = Color(0.00,0.00,1.00) 
-faceOne.mood = happy 
-faceOne.size = 80 
-faceOne.skinColor = None 
-faceOne.x = 10 
-faceOne.y = 10 
-faceTwo.eyeColor = Color(0.00,0.00,1.00) 
-faceTwo.mood = sad 
-faceTwo.size = 80 
-faceTwo.skinColor = None 
-faceTwo.x = 100 
-faceTwo.y = 10 
+>>> tf = widgetbase.TwoFaces()
+>>> tf.faceOne.mood
+'happy'
+>>> tf.faceTwo.mood
+'sad'
+>>> tf.dumpProperties()
+faceOne.eyeColor = Color(0.00,0.00,1.00)
+faceOne.mood = happy
+faceOne.size = 80
+faceOne.skinColor = None
+faceOne.x = 10
+faceOne.y = 10
+faceTwo.eyeColor = Color(0.00,0.00,1.00)
+faceTwo.mood = sad
+faceTwo.size = 80
+faceTwo.skinColor = None
+faceTwo.x = 100
+faceTwo.y = 10
 >>>
 """)
 
-disc("""The attributes 'faceOne' and 'faceTwo' are deliberately exposed so you 
-       can get at them directly. There could also be top-level attributes, 
+disc("""The attributes 'faceOne' and 'faceTwo' are deliberately exposed so you
+       can get at them directly. There could also be top-level attributes,
        but there aren't in this case.""")
 
 
 heading2("Verifying Widgets")
 
-disc("""The widget designer decides the policy on verification, but by default 
-       they work like shapes - checking every assignment - if the designer 
+disc("""The widget designer decides the policy on verification, but by default
+       they work like shapes - checking every assignment - if the designer
        has provided the checking information.""")
 
 
 heading2("Implementing Widgets")
 
-disc("""We tried to make it as easy to implement widgets as possible. Here's 
+disc("""We tried to make it as easy to implement widgets as possible. Here's
        the code for a Face widget which does not do any type checking:""")
 
 eg("""
-class Face(Widget): 
-    \"\"\"This draws a face with two eyes, mouth and nose.\"\"\" 
-         
-    def __init__(self): 
-        self.x = 10 
-        self.y = 10 
-        self.size = 80 
-        self.skinColor = None 
-        self.eyeColor = colors.blue 
-        self.mood = 'happy' 
- 
-    def draw(self): 
-        s = self.size  # abbreviate as we will use this a lot 
-        g = shapes.Group() 
-        g.transform = [1,0,0,1,self.x, self.y] 
-        # background 
-        g.add(shapes.Circle(s * 0.5, s * 0.5, s * 0.5, 
-                            fillColor=self.skinColor)) 
-        # CODE OMITTED TO MAKE MORE SHAPES 
-        return g 
+class Face(Widget):
+    \"\"\"This draws a face with two eyes, mouth and nose.\"\"\"
+
+    def __init__(self):
+        self.x = 10
+        self.y = 10
+        self.size = 80
+        self.skinColor = None
+        self.eyeColor = colors.blue
+        self.mood = 'happy'
+
+    def draw(self):
+        s = self.size  # abbreviate as we will use this a lot
+        g = shapes.Group()
+        g.transform = [1,0,0,1,self.x, self.y]
+        # background
+        g.add(shapes.Circle(s * 0.5, s * 0.5, s * 0.5,
+                            fillColor=self.skinColor))
+        # CODE OMITTED TO MAKE MORE SHAPES
+        return g
 """)
 
-disc("""We left out all the code to draw the shapes in this document, but you 
+disc("""We left out all the code to draw the shapes in this document, but you
        can find it in the distribution in $widgetbase.py$.""")
 
-disc("""By default, any attribute without a leading underscore is returned by 
-       setProperties. This is a deliberate policy to encourage consistent 
+disc("""By default, any attribute without a leading underscore is returned by
+       setProperties. This is a deliberate policy to encourage consistent
        coding conventions.""")
 
-disc("""Once your widget works, you probably want to add support for 
-       verification. This involves adding a dictionary to the class called 
-       $_verifyMap$, which map from attribute names to 'checking functions'. 
-       The $widgetbase.py$ module defines a bunch of checking functions with names 
-       like $isNumber$, $isListOfShapes$ and so on. You can also simply use $None$, 
-       which means that the attribute must be present but can have any type. 
-       And you can and should write your own checking functions. We want to 
-       restrict the "mood" custom attribute to the values "happy", "sad" or 
+disc("""Once your widget works, you probably want to add support for
+       verification. This involves adding a dictionary to the class called
+       $_verifyMap$, which map from attribute names to 'checking functions'.
+       The $widgetbase.py$ module defines a bunch of checking functions with names
+       like $isNumber$, $isListOfShapes$ and so on. You can also simply use $None$,
+       which means that the attribute must be present but can have any type.
+       And you can and should write your own checking functions. We want to
+       restrict the "mood" custom attribute to the values "happy", "sad" or
        "ok". So we do this:""")
 
 eg("""
-class Face(Widget): 
-    \"\"\"This draws a face with two eyes.  It exposes a 
-    couple of properties to configure itself and hides 
-    all other details\"\"\" 
-    def checkMood(moodName): 
-        return (moodName in ('happy','sad','ok')) 
-    _verifyMap = { 
-        'x': shapes.isNumber, 
-        'y': shapes.isNumber, 
-        'size': shapes.isNumber, 
-        'skinColor':shapes.isColorOrNone, 
-        'eyeColor': shapes.isColorOrNone, 
-        'mood': checkMood  
-        } 
+class Face(Widget):
+    \"\"\"This draws a face with two eyes.  It exposes a
+    couple of properties to configure itself and hides
+    all other details\"\"\"
+    def checkMood(moodName):
+        return (moodName in ('happy','sad','ok'))
+    _verifyMap = {
+        'x': shapes.isNumber,
+        'y': shapes.isNumber,
+        'size': shapes.isNumber,
+        'skinColor':shapes.isColorOrNone,
+        'eyeColor': shapes.isColorOrNone,
+        'mood': checkMood
+        }
 """)
 
-disc("""This checking will be performed on every attribute assignment; or, if 
+disc("""This checking will be performed on every attribute assignment; or, if
        $config.shapeChecking$ is off, whenever you call $myFace.verify()$.""")
 
 
 heading2("Documenting Widgets")
 
 disc("""
-We are working on a generic tool to document any Python package or 
-module; this is already checked into ReportLab and will be used to 
+We are working on a generic tool to document any Python package or
+module; this is already checked into ReportLab and will be used to
 generate a reference for the ReportLab package.
 When it encounters widgets, it adds extra sections to the
 manual including:""")
@@ -298,7 +298,7 @@
 bullet("the property dump for the widget in the drawing. ")
 
 disc("""
-This tool will mean that we can have guaranteed up-to-date 
+This tool will mean that we can have guaranteed up-to-date
 documentation on our widgets and charts, both on the web site
 and in print; and that you can do the same for your own widgets,
 too!
@@ -307,51 +307,51 @@
 
 heading2("Widget Design Strategies")
 
-disc("""We could not come up with a consistent architecture for designing 
-       widgets, so we are leaving that problem to the authors! If you do not 
-       like the default verification strategy, or the way 
+disc("""We could not come up with a consistent architecture for designing
+       widgets, so we are leaving that problem to the authors! If you do not
+       like the default verification strategy, or the way
        $setProperties/getProperties$ works, you can override them yourself.""")
 
-disc("""For simple widgets it is recommended that you do what we did above: 
-       select non-overlapping properties, initialize every property on 
-       $__init__$ and construct everything when $draw()$ is called. You can 
-       instead have $__setattr__$ hooks and have things updated when certain 
-       attributes are set. Consider a pie chart. If you want to expose the 
+disc("""For simple widgets it is recommended that you do what we did above:
+       select non-overlapping properties, initialize every property on
+       $__init__$ and construct everything when $draw()$ is called. You can
+       instead have $__setattr__$ hooks and have things updated when certain
+       attributes are set. Consider a pie chart. If you want to expose the
        individual wedges, you might write code like this:""")
 
 eg("""
 from reportlab.graphics.charts import piecharts
 pc = piecharts.Pie()
-pc.defaultColors = [navy, blue, skyblue] #used in rotation 
-pc.data = [10,30,50,25] 
-pc.slices[7].strokeWidth = 5 
+pc.defaultColors = [navy, blue, skyblue] #used in rotation
+pc.data = [10,30,50,25]
+pc.slices[7].strokeWidth = 5
 """)
 #removed 'pc.backColor = yellow' from above code example
 
-disc("""The last line is problematic as we have only created four wedges - in 
-       fact we might not have created them yet. Does $pc.wedges[7]$ raise an 
-       error? Is it a prescription for what should happen if a seventh wedge 
-       is defined, used to override the default settings? We dump this 
-       problem squarely on the widget author for now, and recommend that you 
-       get a simple one working before exposing 'child objects' whose 
+disc("""The last line is problematic as we have only created four wedges - in
+       fact we might not have created them yet. Does $pc.wedges[7]$ raise an
+       error? Is it a prescription for what should happen if a seventh wedge
+       is defined, used to override the default settings? We dump this
+       problem squarely on the widget author for now, and recommend that you
+       get a simple one working before exposing 'child objects' whose
        existence depends on other properties' values :-)""")
 
-disc("""We also discussed rules by which parent widgets could pass properties 
-       to their children. There seems to be a general desire for a global way 
-       to say that 'all wedges get their lineWidth from the lineWidth of 
-       their parent' without a lot of repetitive coding. We do not have a 
-       universal solution, so again leave that to widget authors. We hope 
-       people will experiment with push-down, pull-down and pattern-matching 
-       approaches and come up with something nice. In the meantime, we 
-       certainly can write monolithic chart widgets which work like the ones 
+disc("""We also discussed rules by which parent widgets could pass properties
+       to their children. There seems to be a general desire for a global way
+       to say that 'all wedges get their lineWidth from the lineWidth of
+       their parent' without a lot of repetitive coding. We do not have a
+       universal solution, so again leave that to widget authors. We hope
+       people will experiment with push-down, pull-down and pattern-matching
+       approaches and come up with something nice. In the meantime, we
+       certainly can write monolithic chart widgets which work like the ones
        in, say, Visual Basic and Delphi.""")
 
-disc("""For now have a look at the following sample code using an early 
+disc("""For now have a look at the following sample code using an early
        version of a pie chart widget and the output it generates:""")
 
 eg("""
 from reportlab.lib.colors import *
-from reportlab.graphics import shapes,renderPDF 
+from reportlab.graphics import shapes,renderPDF
 from reportlab.graphics.charts.piecharts import Pie
 
 d = Drawing(400,200)
@@ -388,7 +388,7 @@
 disc("")
 
 from reportlab.lib.colors import *
-from reportlab.graphics import shapes,renderPDF 
+from reportlab.graphics import shapes,renderPDF
 from reportlab.graphics.charts.piecharts import Pie
 
 d = Drawing(400,200)
@@ -420,4 +420,4 @@
 pc3.slices.fontColor = colors.yellow
 d.add(pc3, 'pie3')
 
-draw(d, 'Some sample Pies')
+draw(d, 'Some sample Pies')
\ No newline at end of file
--- a/reportlab/docs/graphguide/ch5_charts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/graphguide/ch5_charts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/graphguide/ch2_graphics.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/graphguide/ch5_charts.py,v 1.2 2001/10/27 22:37:02 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/graphguide/ch5_charts.py,v 1.3 2002/07/24 19:56:35 andy_robinson Exp $
 
 from reportlab.tools.docco.rl_doc_utils import *
 from reportlab.graphics.shapes import *
@@ -10,7 +10,7 @@
 
 disc("""
 The motivation for much of this is to create a flexible chart
-package. 
+package.
 This chapter presents a treatment of the ideas behind our charting
 model, what the design goals are and what components of the chart
 package already exist.
@@ -22,31 +22,31 @@
 disc("Here are some of the design goals: ")
 
 disc("<i>Make simple top-level use really simple </i>")
-disc("""<para lindent=+36>It should be possible to create a simple chart with minimum lines of 
-       code, yet have it 'do the right things' with sensible automatic 
-       settings. The pie chart snippets above do this. If a real chart has 
-       many subcomponents, you still should not need to interact with them 
+disc("""<para lindent=+36>It should be possible to create a simple chart with minimum lines of
+       code, yet have it 'do the right things' with sensible automatic
+       settings. The pie chart snippets above do this. If a real chart has
+       many subcomponents, you still should not need to interact with them
        unless you want to customize what they do.""")
 
 disc("<i>Allow precise positioning </i>")
-disc("""<para lindent=+36>An absolute requirement in publishing and graphic design is to control 
-       the placing and style of every element. We will try to have properties 
-       that specify things in fixed sizes and proportions of the drawing, 
-       rather than having automatic resizing. Thus, the 'inner plot 
-       rectangle' will not magically change when you make the font size of 
-       the y labels bigger, even if this means your labels can spill out of 
-       the left edge of the chart rectangle. It is your job to preview the 
+disc("""<para lindent=+36>An absolute requirement in publishing and graphic design is to control
+       the placing and style of every element. We will try to have properties
+       that specify things in fixed sizes and proportions of the drawing,
+       rather than having automatic resizing. Thus, the 'inner plot
+       rectangle' will not magically change when you make the font size of
+       the y labels bigger, even if this means your labels can spill out of
+       the left edge of the chart rectangle. It is your job to preview the
        chart and choose sizes and spaces which will work.""")
 
-disc("""<para lindent=+36>Some things do need to be automatic. For example, if you want to fit N 
-       bars into a 200 point space and don't know N in advance, we specify 
-       bar separation as a percentage of the width of a bar rather than a 
-       point size, and let the chart work it out. This is still deterministic 
+disc("""<para lindent=+36>Some things do need to be automatic. For example, if you want to fit N
+       bars into a 200 point space and don't know N in advance, we specify
+       bar separation as a percentage of the width of a bar rather than a
+       point size, and let the chart work it out. This is still deterministic
        and controllable.""")
 
 disc("<i>Control child elements individually or as a group</i>")
-disc("""<para lindent=+36>We use smart collection classes that let you customize a group of 
-       things, or just one of them. For example you can do this in our 
+disc("""<para lindent=+36>We use smart collection classes that let you customize a group of
+       things, or just one of them. For example you can do this in our
        experimental pie chart:""")
 
 eg("""
@@ -64,23 +64,23 @@
 pc.slices[3].fontColor = colors.red
 d.add(pc, '')
 """)
- 
-disc("""<para lindent=+36>pc.slices[3] actually lazily creates a little object which holds 
-       information about the slice in question; this will be used to format a 
+
+disc("""<para lindent=+36>pc.slices[3] actually lazily creates a little object which holds
+       information about the slice in question; this will be used to format a
        fourth slice at draw-time if there is one.""")
 
 disc("<i>Only expose things you should change </i>")
-disc("""<para lindent=+36>It would be wrong from a statistical viewpoint to let you directly 
-       adjust the angle of one of the pie wedges in the above example, since 
-       that is determined by the data. So not everything will be exposed 
-       through the public properties. There may be 'back doors' to let you 
-       violate this when you really need to, or methods to provide advanced 
+disc("""<para lindent=+36>It would be wrong from a statistical viewpoint to let you directly
+       adjust the angle of one of the pie wedges in the above example, since
+       that is determined by the data. So not everything will be exposed
+       through the public properties. There may be 'back doors' to let you
+       violate this when you really need to, or methods to provide advanced
        functionality, but in general properties will be orthogonal.""")
 
 disc("<i>Composition and component based </i>")
-disc("""<para lindent=+36>Charts are built out of reusable child widgets. A Legend is an 
-       easy-to-grasp example. If you need a specialized type of legend (e.g. 
-       circular colour swatches), you should subclass the standard Legend 
+disc("""<para lindent=+36>Charts are built out of reusable child widgets. A Legend is an
+       easy-to-grasp example. If you need a specialized type of legend (e.g.
+       circular colour swatches), you should subclass the standard Legend
        widget. Then you could either do something like...""")
 
 eg("""
@@ -90,48 +90,48 @@
 c.data = [10,20,30]   #   and then configure as usual...
 """)
 
-disc("""<para lindent=+36>...or create/modify your own chart or drawing class which creates one 
-       of these by default. This is also very relevant for time series 
+disc("""<para lindent=+36>...or create/modify your own chart or drawing class which creates one
+       of these by default. This is also very relevant for time series
        charts, where there can be many styles of x axis.""")
 
-disc("""<para lindent=+36>Top level chart classes will create a number of such components, and 
-       then either call methods or set private properties to tell them their 
-       height and position - all the stuff which should be done for you and 
-       which you cannot customise. We are working on modelling what the 
-       components should be and will publish their APIs here as a consensus 
+disc("""<para lindent=+36>Top level chart classes will create a number of such components, and
+       then either call methods or set private properties to tell them their
+       height and position - all the stuff which should be done for you and
+       which you cannot customise. We are working on modelling what the
+       components should be and will publish their APIs here as a consensus
        emerges.""")
 
 disc("<i>Multiples </i>")
-disc("""<para lindent=+36>A corollary of the component approach is that you can create diagrams 
-       with multiple charts, or custom data graphics. Our favourite example 
-       of what we are aiming for is the weather report in our gallery 
-       contributed by a user; we'd like to make it easy to create such 
-       drawings, hook the building blocks up to their legends, and feed that 
+disc("""<para lindent=+36>A corollary of the component approach is that you can create diagrams
+       with multiple charts, or custom data graphics. Our favourite example
+       of what we are aiming for is the weather report in our gallery
+       contributed by a user; we'd like to make it easy to create such
+       drawings, hook the building blocks up to their legends, and feed that
        data in a consistent way.""")
-disc("""<para lindent=+36>(If you want to see the image, it is available on our website at 
+disc("""<para lindent=+36>(If you want to see the image, it is available on our website at
 <font color=blue>http://www.reportlab.com/demos/provencio.pdf</font>)""")
 
 
 ##heading2("Key Concepts and Components")
 heading2("Overview")
 
-disc("""A chart or plot is an object which is placed on a drawing; it is not 
-       itself a drawing. You can thus control where it goes, put several on 
+disc("""A chart or plot is an object which is placed on a drawing; it is not
+       itself a drawing. You can thus control where it goes, put several on
        the same drawing, or add annotations.""")
 
-disc("""Charts have two axes; axes may be Value or Category axes. Axes in turn 
-       have a Labels property which lets you configure all text labels or 
-       each one individually. Most of the configuration details which vary 
+disc("""Charts have two axes; axes may be Value or Category axes. Axes in turn
+       have a Labels property which lets you configure all text labels or
+       each one individually. Most of the configuration details which vary
        from chart to chart relate to axis properties, or axis labels.""")
 
-disc("""Objects expose properties through the interfaces discussed in the 
-       previous section; these are all optional and are there to let the end 
-       user configure the appearance. Things which must be set for a chart to 
-       work, and essential communication between a chart and its components, 
+disc("""Objects expose properties through the interfaces discussed in the
+       previous section; these are all optional and are there to let the end
+       user configure the appearance. Things which must be set for a chart to
+       work, and essential communication between a chart and its components,
        are handled through methods.""")
 
-disc("""You can subclass any chart component and use your replacement instead 
-       of the original provided you implement the essential methods and 
+disc("""You can subclass any chart component and use your replacement instead
+       of the original provided you implement the essential methods and
        properties.""")
 
 
@@ -144,11 +144,11 @@
 Labels may contain newline characters, but only one font.
 """)
 
-disc("""The text and 'origin' of a label are typically set by its parent 
-       object. They are accessed by methods rather than properties. Thus, the 
-       X axis decides the 'reference point' for each tickmark label and the 
-       numeric or date text for each label. However, the end user can set 
-       properties of the label (or collection of labels) directly to affect 
+disc("""The text and 'origin' of a label are typically set by its parent
+       object. They are accessed by methods rather than properties. Thus, the
+       X axis decides the 'reference point' for each tickmark label and the
+       numeric or date text for each label. However, the end user can set
+       properties of the label (or collection of labels) directly to affect
        its position relative to this origin and all of its formatting.""")
 
 eg("""
@@ -197,13 +197,13 @@
 
 
 disc("""
-In the drawing above, the label is defined relative to the green blob. 
-The text box should have its north-east corner ten points down from 
+In the drawing above, the label is defined relative to the green blob.
+The text box should have its north-east corner ten points down from
 the origin, and be rotated by 45 degrees about that corner.
 """)
 
 disc("""
-At present labels have the following properties, which we believe are 
+At present labels have the following properties, which we believe are
 sufficient for all charts we have seen to date:
 """)
 
@@ -261,23 +261,23 @@
 """)
 
 disc("""
-Axes are responsible for determining the mapping from data to image 
-coordinates; transforming points on request from the chart; drawing 
+Axes are responsible for determining the mapping from data to image
+coordinates; transforming points on request from the chart; drawing
 themselves and their tickmarks, gridlines and axis labels.
 """)
 
 disc("""
-This drawing shows two axes, one of each kind, which have been created 
+This drawing shows two axes, one of each kind, which have been created
 directly without reference to any chart:
 """)
 
 
 from reportlab.graphics import shapes
-from reportlab.graphics.charts.axes import XCategoryAxis,YValueAxis 
+from reportlab.graphics.charts.axes import XCategoryAxis,YValueAxis
 
 drawing = Drawing(400, 200)
 
-data = [(10, 20, 30, 40), (15, 22, 37, 42)]        
+data = [(10, 20, 30, 40), (15, 22, 37, 42)]
 
 xAxis = XCategoryAxis()
 xAxis.setPosition(75, 75, 300)
@@ -302,11 +302,11 @@
 
 eg("""
 from reportlab.graphics import shapes
-from reportlab.graphics.charts.axes import XCategoryAxis,YValueAxis 
+from reportlab.graphics.charts.axes import XCategoryAxis,YValueAxis
 
 drawing = Drawing(400, 200)
 
-data = [(10, 20, 30, 40), (15, 22, 37, 42)]        
+data = [(10, 20, 30, 40), (15, 22, 37, 42)]
 
 xAxis = XCategoryAxis()
 xAxis.setPosition(75, 75, 300)
@@ -339,7 +339,7 @@
 heading3("XCategoryAxis class")
 
 disc("""
-A Category Axis doesn't really have a scale; it just divides itself 
+A Category Axis doesn't really have a scale; it just divides itself
 into equal-sized buckets.
 It is simpler than a value axis.
 The chart (or programmer) sets its location with the method
@@ -362,7 +362,7 @@
 
 data=[["Property", "Meaning"],
       ["visible", """Should the axis be drawn at all? Sometimes you don't want
-to display one or both axes, but they still need to be there as 
+to display one or both axes, but they still need to be there as
 they manage the scaling of points."""],
       ["strokeColor", "Color of the axis"],
       ["strokeDashArray", """Whether to draw axis with a dash and, if so, what kind.
@@ -406,7 +406,7 @@
 """)
 
 disc("""
-$setPosition(x, y, length)$ and $configure(data)$ work exactly as 
+$setPosition(x, y, length)$ and $configure(data)$ work exactly as
 for a category axis.
 If you have not fully specified the maximum, minimum and tick
 interval, then $configure()$ results in the axis choosing suitable
@@ -419,7 +419,7 @@
 eg("""
 >>> yAxis = YValueAxis()
 >>> yAxis.setPosition(50, 50, 125)
->>> data = [(10, 20, 30, 40),(15, 22, 37, 42)]   
+>>> data = [(10, 20, 30, 40),(15, 22, 37, 42)]
 >>> yAxis.configure(data)
 >>> yAxis.scale(10)  # should be bottom of chart
 50.0
@@ -428,16 +428,16 @@
 >>>
 """)
 
-disc("""By default, the highest data point is aligned with the top of the 
-       axis, the lowest with the bottom of the axis, and the axis choose 
-       'nice round numbers' for its tickmark points. You may override these 
+disc("""By default, the highest data point is aligned with the top of the
+       axis, the lowest with the bottom of the axis, and the axis choose
+       'nice round numbers' for its tickmark points. You may override these
        settings with the properties below. """)
 
 disc("")
 
 data=[["Property", "Meaning"],
       ["visible", """Should the axis be drawn at all? Sometimes you don't want
-to display one or both axes, but they still need to be there as 
+to display one or both axes, but they still need to be there as
 they manage the scaling of points."""],
       ["strokeColor", "Color of the axis"],
       ["strokeDashArray", """Whether to draw axis with a dash and, if so, what kind.
@@ -491,10 +491,10 @@
 caption("""Table <seq template="%(Chapter)s-%(Table+)s"/> - YValueAxis properties""")
 
 disc("""
-The $valueSteps$ property lets you explicitly specify the 
-tick mark locations, so you don't have to follow regular intervals. 
-Hence, you can plot month ends and month end dates with a couple of 
-helper functions, and without needing special time series chart 
+The $valueSteps$ property lets you explicitly specify the
+tick mark locations, so you don't have to follow regular intervals.
+Hence, you can plot month ends and month end dates with a couple of
+helper functions, and without needing special time series chart
 classes.
 The following code show how to create a simple $XValueAxis$ with special
 tick intervals. Make sure to set the $valueSteps$ attribute before calling
@@ -503,11 +503,11 @@
 
 eg("""
 from reportlab.graphics.shapes import Drawing
-from reportlab.graphics.charts.axes import XValueAxis 
+from reportlab.graphics.charts.axes import XValueAxis
 
 drawing = Drawing(400, 100)
 
-data = [(10, 20, 30, 40)]        
+data = [(10, 20, 30, 40)]
 
 xAxis = XValueAxis()
 xAxis.setPosition(75, 50, 300)
@@ -518,13 +518,13 @@
 drawing.add(xAxis)
 """)
 
-   
+
 from reportlab.graphics import shapes
-from reportlab.graphics.charts.axes import XValueAxis 
+from reportlab.graphics.charts.axes import XValueAxis
 
 drawing = Drawing(400, 100)
 
-data = [(10, 20, 30, 40)]        
+data = [(10, 20, 30, 40)]
 
 xAxis = XValueAxis()
 xAxis.setPosition(75, 50, 300)
@@ -583,9 +583,9 @@
 disc("""
 This describes our current $VerticalBarChart$ class, which uses the
 axes and labels above.
-We think it is step in the right direction but is is 
+We think it is step in the right direction but is is
 far from final.
-Note that people we speak to are divided about 50/50 on whether to 
+Note that people we speak to are divided about 50/50 on whether to
 call this a 'Vertical' or 'Horizontal' bar chart.
 We chose this name because 'Vertical' appears next to 'Bar', so
 we take it to mean that the bars rather than the category axis
@@ -597,7 +597,7 @@
 """)
 
 from reportlab.graphics.shapes import Drawing
-from reportlab.graphics.charts.barcharts import VerticalBarChart 
+from reportlab.graphics.charts.barcharts import VerticalBarChart
 
 drawing = Drawing(400, 200)
 
@@ -605,7 +605,7 @@
         (13, 5, 20, 22, 37, 45, 19, 4),
         (14, 6, 21, 23, 38, 46, 20, 5)
         ]
-            
+
 bc = VerticalBarChart()
 bc.x = 50
 bc.y = 50
@@ -634,7 +634,7 @@
     # code to produce the above chart
 
     from reportlab.graphics.shapes import Drawing
-    from reportlab.graphics.charts.barcharts import VerticalBarChart 
+    from reportlab.graphics.charts.barcharts import VerticalBarChart
 
     drawing = Drawing(400, 200)
 
@@ -642,7 +642,7 @@
             (13, 5, 20, 22, 37, 45, 19, 4),
             (14, 6, 21, 23, 38, 46, 20, 5)
             ]
-                
+
     bc = VerticalBarChart()
     bc.x = 50
     bc.y = 50
@@ -654,7 +654,7 @@
     bc.valueAxis.valueMin = 0
     bc.valueAxis.valueMax = 50
     bc.valueAxis.valueStep = 10
-    
+
     bc.categoryAxis.labels.boxAnchor = 'ne'
     bc.categoryAxis.labels.dx = 8
     bc.categoryAxis.labels.dy = -2
@@ -666,7 +666,7 @@
 """)
 
 disc("""
-Most of this code is concerned with setting up the axes and 
+Most of this code is concerned with setting up the axes and
 labels, which we have already covered.
 Here are the top-level properties of the $VerticalBarChart$ class:
 """)
@@ -754,7 +754,7 @@
 """)
 
 from reportlab.graphics.shapes import Drawing
-from reportlab.graphics.charts.barcharts import VerticalBarChart 
+from reportlab.graphics.charts.barcharts import VerticalBarChart
 
 drawing = Drawing(400, 200)
 
@@ -762,7 +762,7 @@
         (13, 5, 20, 22, 37, 45, 19, 4),
         (14, 6, 21, 23, 38, 46, 20, 5)
         ]
-            
+
 bc = VerticalBarChart()
 bc.x = 50
 bc.y = 50
@@ -796,25 +796,25 @@
 """)
 
 
-##Property Value 
+##Property Value
 ##data This should be a "list of lists of numbers" or "list of tuples of numbers". If you have just one series, write it as
 ##data = [(10,20,30,42),]
-## 
-##x, y, width, height These define the inner 'plot rectangle'. We highlighted this with a yellow border above. Note that it is your job to place the chart on the drawing in a way which leaves room for all the axis labels and tickmarks. We specify this 'inner rectangle' because it makes it very easy to lay out multiple charts in a consistent manner. 
-##strokeColor Defaults to None. This will draw a border around the plot rectangle, which may be useful in debugging. Axes will overwrite this. 
-##fillColor Defaults to None. This will fill the plot rectangle with a solid color. (Note that we could implement dashArray etc. as for any other solid shape) 
-##barLabelFormat This is a format string or function used for displaying labels above each bar. We're working on ways to position these labels so that they work for positive and negative bars. 
-##useAbsolute Defaults to 0. If 1, the three properties below are absolute values in points (which means you can make a chart where the bars stick out from the plot rectangle); if 0, they are relative quantities and indicate the proportional widths of the elements involved. 
-##barWidth As it says. Defaults to 10. 
-##groupSpacing Defaults to 5. This is the space between each group of bars. If you have only one series, use groupSpacing and not barSpacing to split them up. Half of the groupSpacing is used before the first bar in the chart, and another half at the end. 
-##barSpacing Defaults to 0. This is the spacing between bars in each group. If you wanted a little gap between green and red bars in the example above, you would make this non-zero. 
-##barLabelFormat Defaults to None. As with the YValueAxis, if you supply a function or format string then labels will be drawn next to each bar showing the numeric value. 
+##
+##x, y, width, height These define the inner 'plot rectangle'. We highlighted this with a yellow border above. Note that it is your job to place the chart on the drawing in a way which leaves room for all the axis labels and tickmarks. We specify this 'inner rectangle' because it makes it very easy to lay out multiple charts in a consistent manner.
+##strokeColor Defaults to None. This will draw a border around the plot rectangle, which may be useful in debugging. Axes will overwrite this.
+##fillColor Defaults to None. This will fill the plot rectangle with a solid color. (Note that we could implement dashArray etc. as for any other solid shape)
+##barLabelFormat This is a format string or function used for displaying labels above each bar. We're working on ways to position these labels so that they work for positive and negative bars.
+##useAbsolute Defaults to 0. If 1, the three properties below are absolute values in points (which means you can make a chart where the bars stick out from the plot rectangle); if 0, they are relative quantities and indicate the proportional widths of the elements involved.
+##barWidth As it says. Defaults to 10.
+##groupSpacing Defaults to 5. This is the space between each group of bars. If you have only one series, use groupSpacing and not barSpacing to split them up. Half of the groupSpacing is used before the first bar in the chart, and another half at the end.
+##barSpacing Defaults to 0. This is the spacing between bars in each group. If you wanted a little gap between green and red bars in the example above, you would make this non-zero.
+##barLabelFormat Defaults to None. As with the YValueAxis, if you supply a function or format string then labels will be drawn next to each bar showing the numeric value.
 ##barLabels A collection of labels used to format all bar labels. Since this is a two-dimensional array, you may explicitly format the third label of the second series using this syntax:
 ##    chart.barLabels[(1,2)].fontSize = 12
-## 
-##valueAxis The value axis, which may be formatted as described previously 
-##categoryAxis The categoryAxis, which may be formatted as described previously 
-##title, subTitle Not implemented yet. These would be label-like objects whose text could be set directly and which would appear in sensible locations. For now, you can just place extra strings on the drawing. 
+##
+##valueAxis The value axis, which may be formatted as described previously
+##categoryAxis The categoryAxis, which may be formatted as described previously
+##title, subTitle Not implemented yet. These would be label-like objects whose text could be set directly and which would appear in sensible locations. For now, you can just place extra strings on the drawing.
 
 
 heading2("Line Charts")
@@ -985,7 +985,7 @@
 disc("""
 We've already seen a pie chart example above.
 This is provisional but seems to do most things.
-At the very least we need to change the name. 
+At the very least we need to change the name.
 For completeness we will cover it here.
 """)
 
@@ -1046,21 +1046,21 @@
 disc("")
 todo("Add properties table.")
 
-##Property Value 
-##data a list or tuple of numbers 
-##x, y, width, height Bounding box of the pie. Note that x and y do NOT specify the centre but the bottom left corner, and that width and height do not have to be equal; pies may be elliptical and wedges will be drawn correctly. 
-##labels None, or a list of strings. Make it None if you don't want labels around the edge of the pie. Since it is impossible to know the size of slices, we generally discourage placing labels in or around pies; it is much better to put them in a legend alongside. 
-##startAngle Where is the start angle of the first pie slice? The default is '90' which is twelve o'clock. 
-##direction Which direction do slices progress in? The default is 'clockwise'. 
-##wedges Collection of wedges. This lets you customise each wedge, or individual ones. See below 
-##wedges.strokeWidth Border width for wedge 
-##wedges.strokeColor Border color 
+##Property Value
+##data a list or tuple of numbers
+##x, y, width, height Bounding box of the pie. Note that x and y do NOT specify the centre but the bottom left corner, and that width and height do not have to be equal; pies may be elliptical and wedges will be drawn correctly.
+##labels None, or a list of strings. Make it None if you don't want labels around the edge of the pie. Since it is impossible to know the size of slices, we generally discourage placing labels in or around pies; it is much better to put them in a legend alongside.
+##startAngle Where is the start angle of the first pie slice? The default is '90' which is twelve o'clock.
+##direction Which direction do slices progress in? The default is 'clockwise'.
+##wedges Collection of wedges. This lets you customise each wedge, or individual ones. See below
+##wedges.strokeWidth Border width for wedge
+##wedges.strokeColor Border color
 ##wedges.strokeDashArray Solid or dashed line configuration for
 ##wedges.popout How far out should the slice(s) stick from the centre of
 ##the pie? default is zero.
-##wedges.fontName 
+##wedges.fontName
 ##wedges.fontSize
-##wedges.fontColor Used for text labels 
+##wedges.fontColor Used for text labels
 ##wedges.labelRadius This controls the anchor point for a text label. It
 ##is a fraction of the radius; 0.7 will place the text inside the pie,
 ##1.2 will place it slightly outside. (note that if we add labels, we
@@ -1115,7 +1115,7 @@
 """)
 
 list("""
-Color specification - right now the chart has an undocumented property 
+Color specification - right now the chart has an undocumented property
 $defaultColors$, which provides a list of colors to cycle through,
 such that each data series gets its own color.
 Right now, if you introduce a legend, you need to make sure it shares
@@ -1162,7 +1162,7 @@
 heading3("Marker customisation and custom shapes")
 
 disc("""
-Well known plotting packages such as excel, Mathematica and Excel 
+Well known plotting packages such as excel, Mathematica and Excel
 offer ranges of marker types to add to charts.
 We can do better - you can write any kind of chart widget you
 want and just tell the chart to use it as an example.
@@ -1227,4 +1227,4 @@
 disc("""
 This is the tool that was mentioned in the section on 'Documenting
 Widgets'.
-""")
+""")
\ No newline at end of file
--- a/reportlab/docs/graphguide/gengraphguide.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/graphguide/gengraphguide.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,8 +2,8 @@
 #copyright ReportLab Inc. 2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/graphguide/gengraphguide.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/graphguide/gengraphguide.py,v 1.4 2002/07/17 22:46:22 andy_robinson Exp $
-__version__=''' $Id: gengraphguide.py,v 1.4 2002/07/17 22:46:22 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/docs/graphguide/gengraphguide.py,v 1.5 2002/07/24 19:56:35 andy_robinson Exp $
+__version__=''' $Id: gengraphguide.py,v 1.5 2002/07/24 19:56:35 andy_robinson Exp $ '''
 __doc__ = """
 This module contains the script for building the graphics guide.
 """
@@ -54,4 +54,4 @@
         print 'set page size to',sys.argv[1]
     else:
         (w, h) = defaultPageSize
-    run((w, h),verbose)
+    run((w, h),verbose)
\ No newline at end of file
--- a/reportlab/docs/reference/genreference.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/reference/genreference.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,8 +2,8 @@
 #copyright ReportLab Inc. 2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/reference/genreference.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/reference/genreference.py,v 1.3 2001/10/28 21:18:03 andy_robinson Exp $
-__version__=''' $Id: genreference.py,v 1.3 2001/10/28 21:18:03 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/docs/reference/genreference.py,v 1.4 2002/07/24 19:56:35 andy_robinson Exp $
+__version__=''' $Id: genreference.py,v 1.4 2002/07/24 19:56:35 andy_robinson Exp $ '''
 __doc__ = """
 This module contains the script for building the reference.
 """
@@ -34,4 +34,3 @@
 
 if __name__=='__main__':
     run(verbose=('-s' not in sys.argv))
-    
\ No newline at end of file
--- a/reportlab/docs/userguide/app_demos.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/app_demos.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/app_demos.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/app_demos.py,v 1.2 2001/10/27 22:37:02 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/app_demos.py,v 1.3 2002/07/24 19:56:35 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 
 Appendix1("ReportLab Demos")
@@ -111,4 +111,4 @@
 Exotic features of PDF such as fadeins and bookmarks are also shown to good effect. The use of
 an XML document can be contrasted with the <i>inline</i> style of the gadflypaper demo; the
 content is completely separate from the formatting
-""")
+""")
\ No newline at end of file
--- a/reportlab/docs/userguide/ch1_intro.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/ch1_intro.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/ch1_intro.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/ch1_intro.py,v 1.6 2002/05/28 15:06:55 rgbecker Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/ch1_intro.py,v 1.7 2002/07/24 19:56:35 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 import reportlab
 
@@ -112,14 +112,14 @@
 """)
 disc("""
 Python is an <i>interpreted, interactive, object-oriented</i> programming language. It is often compared to Tcl, Perl,
-Scheme or Java. 
+Scheme or Java.
 """)
 
 disc("""
 Python combines remarkable power with very clear syntax. It has modules, classes, exceptions, very high level
 dynamic data types, and dynamic typing. There are interfaces to many system calls and libraries, as well as to
 various windowing systems (X11, Motif, Tk, Mac, MFC). New built-in modules are easily written in C or C++.
-Python is also usable as an extension language for applications that need a programmable interface. 
+Python is also usable as an extension language for applications that need a programmable interface.
 """)
 
 disc("""
@@ -128,11 +128,11 @@
 IBM operating systems, VxWorks, PSOS, ... If
 your favorite system isn't listed here, it may still be supported, if there's a C
 programming language compiler for it. Ask around on
-comp.lang.python -- or just try compiling Python yourself. 
+comp.lang.python -- or just try compiling Python yourself.
 """)
 
 disc("""
-Python is copyrighted but <b>freely usable and distributable, even for commercial use</b>. 
+Python is copyrighted but <b>freely usable and distributable, even for commercial use</b>.
 The ReportLab core modules share the same copyright with the name of the copyright holder
 modified.  Both packages use the "Berkeley Standard Distribution (BSD) style" free software copyright.
 """)
@@ -147,7 +147,7 @@
 font technicalities and the LettErrorRobot-Chrome type 1 font.""")
 
 disc("""Marius Gedminas deserves a big hand for contributing the work on TrueType fonts and we
-are glad to include these in the toolkit. Finally we thank Bigelow & Holmes Inc ($design@bigelowandholmes.com$) 
+are glad to include these in the toolkit. Finally we thank Bigelow & Holmes Inc ($design@bigelowandholmes.com$)
 for Luxi Serif Regular and Ray Larabie ($http://www.larabiefonts.com$) for the Rina TrueType font.""")
 
 heading2("Installation and Setup")
@@ -183,7 +183,7 @@
 $reportlab.tgz$), which is actually a symbolic link to the latest
 numbered version.""")
 
-disc("""We also make nightly snapshots of our CVS 
+disc("""We also make nightly snapshots of our CVS
 (version control) tree available.  In
 general, these are very stable because we have a comprehensive test
 suite that all developers can run at any time.
@@ -256,9 +256,9 @@
 the script completes and the file test_pdfgen_general.pdf should be ready for
 viewing.  If PIL is installed, there should be a "Python Powered"
 image on page 7.""")
-list("""$test_pdfgen_general.py$ tests most of the functions that you 
-will need. To run all the tests and make sure that absolutely 
-everything works, type $runAll.py$. If none of the tests fail, you're 
+list("""$test_pdfgen_general.py$ tests most of the functions that you
+will need. To run all the tests and make sure that absolutely
+everything works, type $runAll.py$. If none of the tests fail, you're
 done!""")
 
 disc("""
@@ -281,10 +281,10 @@
 get the latest RPM or DEB or whatever package and install (or get your
 super user (system administrator) to do the work).""")
 
-list("""If you are building Python yourself, unpack the sources into a 
-temporary directory using a tar command e.g. $tar xzvf py152.tgz$; 
-this will create a subdirectory called Python-1.5.2 (or whatever) cd 
-into this directory. Then read the file $README$! It contains the 
+list("""If you are building Python yourself, unpack the sources into a
+temporary directory using a tar command e.g. $tar xzvf py152.tgz$;
+this will create a subdirectory called Python-1.5.2 (or whatever) cd
+into this directory. Then read the file $README$! It contains the
 latest information on how to install Python.""")
 
 list("""If your system has the gzip libz library installed
@@ -335,7 +335,7 @@
 also possible to run Reportlab with any official Python from 1.5.2
 upwards.  You get the software (ready to run) by following the link from
 $http://www.python.org/download/download_mac.html$.
-Currently, you should go to 'Jack's MacPython page' and download 
+Currently, you should go to 'Jack's MacPython page' and download
 $MacPython21active.bin$.
 """)
 
@@ -365,9 +365,9 @@
 
 
 disc("""
-We should now tell the OS about Python files, so you get the right 
-icons and so the operating system knows that  .py files are text 
-files. Open the File Exchange control panel. Click the Add button. 
+We should now tell the OS about Python files, so you get the right
+icons and so the operating system knows that  .py files are text
+files. Open the File Exchange control panel. Click the Add button.
 Wait for a list of applications to be generated.
 """)
 
@@ -383,7 +383,7 @@
 button and choose "Python Interpreter" from the list of applications.
 The 'File Type' box should then show 'text' and a logo like the one
 above. Fill in the same options on the right hand side as in the
-illustration above. Click 'change', then close the control panel. 
+illustration above. Click 'change', then close the control panel.
 """)
 
 disc("""
@@ -402,8 +402,8 @@
 You should get the following modal dialog.
 This is the point, where your special data goes in.
 Reportlab is on the path in Extensions. So all you have to do is add
-the last line 
-<b>$(PYTHON):Extensions</b>. 
+the last line
+<b>$(PYTHON):Extensions</b>.
 """)
 
 image('Edit_Prefs.gif',3*inch,3*inch)
@@ -419,7 +419,7 @@
 installed both Python and the basic ReportLab package. If you want to
 do a full test of everything, execute the script reportlab:test:runAll
 with a double click. It runs lots of tests for a few minutes and
-eventually says 'OK'. 
+eventually says 'OK'.
 """)
 
 
@@ -463,7 +463,7 @@
 The python script module $reportlab/rl_config.py$ may be edited to change the values of several
 important sitewide properties.""")
 bullet("""verbose: set to integer values to control diagnostic output.""")
-bullet("""shapeChecking: set this to zero to turn off a lot of error checking in the graphics modules""") 
+bullet("""shapeChecking: set this to zero to turn off a lot of error checking in the graphics modules""")
 bullet("""defaultEncoding: set this to WinAnsiEncoding or MacRomanEncoding.""")
 bullet("""defaultPageSize: set this to one of the values defined in reportlab/lib/pagesizes.py; as delivered
 it is set to pagesizes.A4; other values are pagesizes.letter etc.""")
@@ -487,7 +487,7 @@
 heading2("Learning More About Python")
 
 disc("""
-If you are a total beginner to Python, you should check out one or more from the 
+If you are a total beginner to Python, you should check out one or more from the
 growing number of resources on Python programming. The following are freely
 available on the web:
 """)
@@ -512,19 +512,19 @@
 """)
 disc("")
 
-bullet("""<b>How to think like a computer scientist</b> (Python version)</b>.  
+bullet("""<b>How to think like a computer scientist</b> (Python version)</b>.
 $http://www.ibiblio.org/obp/thinkCSpy/$
 """)
 disc("")
 
-bullet("""<b>Instant Python</b>.  
-A 6-page minimal crash course by Magnus Lie Hetland.  
+bullet("""<b>Instant Python</b>.
+A 6-page minimal crash course by Magnus Lie Hetland.
 $http://www.hetland.org/python/instant-python.php$
 """)
 disc("")
 
-bullet("""<b>Dive Into Python</b>.  
+bullet("""<b>Dive Into Python</b>.
 A free Python tutorial for experienced programmers.
 $http://diveintopython.org/$
 """)
-disc("")
+disc("")
\ No newline at end of file
--- a/reportlab/docs/userguide/ch2_graphics.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/ch2_graphics.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,10 +1,10 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/ch2_graphics.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/ch2_graphics.py,v 1.7 2002/03/25 00:34:56 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/ch2_graphics.py,v 1.8 2002/07/24 19:56:35 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 from reportlab.lib.codecharts import SingleByteEncodingChart
-    
+
 heading1("Graphics and Text with $pdfgen$")
 
 heading2("Basic Concepts")
@@ -13,7 +13,7 @@
 generating PDF documents.  A $pdfgen$ program is essentially
 a sequence of instructions for "painting" a document onto
 a sequence of pages.  The interface object which provides the
-painting operations is the $pdfgen canvas$.  
+painting operations is the $pdfgen canvas$.
 """)
 
 disc("""
@@ -99,9 +99,9 @@
 
 disc("""Very often, you will want to calculate things based on
 the page size.  In the example above we extracted the width and
-height.  Later in the program we may use the $width$ variable to 
+height.  Later in the program we may use the $width$ variable to
 define a right margin as $width - inch$ rather than using
-a constant.  By using variables the margin will still make sense even 
+a constant.  By using variables the margin will still make sense even
 if the page size changes.""")
 
 disc("""The $bottomup$ argument
@@ -152,7 +152,7 @@
 give more output in future.""")
 
 todo("to do - all the info functions and other non-drawing stuff")
-     
+
 
 
 
@@ -174,7 +174,7 @@
 on the page such as a text string or a rectangle or a line.  The second
 type changes the state of the canvas such as
 changing the current fill or stroke color or changing the current font
-type and size.  
+type and size.
 """)
 
 disc("""
@@ -275,7 +275,7 @@
 disc("""It is also possible
 to use a path as a "clipping region" using the $clipPath$ method -- for example a circular path
 can be used to clip away the outer parts of a rectangular image leaving
-only a circular part of the image visible on the page. 
+only a circular part of the image visible on the page.
 """)
 
 heading3("Image methods")
@@ -288,7 +288,7 @@
 
 disc("""
 There are two similar-sounding ways to draw images.  The preferred one is
-the $drawImage$ method.  This implements a caching system so you can 
+the $drawImage$ method.  This implements a caching system so you can
 define an image once and draw it many times; it will only be
 stored once in the PDF file.  $drawImage$ also exposes one advanced parameter,
 a transparency mask, and will expose more in future.  The older technique,
@@ -419,7 +419,7 @@
 other graphics state in order to restore them later. The $saveState$ method marks the
 current graphics state for later restoration by a matching $restoreState$.  Note that
 the save and restore method invokation must match -- a restore call restores the state to
-the most recently saved state which hasn't been restored yet.  
+the most recently saved state which hasn't been restored yet.
 You cannot save the state on one page and restore
 it on the next, however -- no state is preserved between pages.""")
 
@@ -448,7 +448,7 @@
  canvas.getAvailableFonts()
  canvas.stringWidth(self, text, fontName, fontSize, encoding=None)
  canvas.setPageCompression(onoff=1)
- canvas.setPageTransition(self, effectname=None, duration=1, 
+ canvas.setPageTransition(self, effectname=None, duration=1,
                         direction=0,dimension='H',motion='I')
 """)
 
@@ -495,7 +495,7 @@
 
 
 disc("""
-<i>Note:</i> As illustrated in the example it is perfectly possible to draw objects 
+<i>Note:</i> As illustrated in the example it is perfectly possible to draw objects
 or parts of objects "off the page".
 In particular a common confusing bug is a translation operation that translates the
 entire drawing off the visible area of the page.  If a program produces a blank page
@@ -546,9 +546,9 @@
 
 
 disc("""<em>Note:</em> scaling shrinks or grows everything including line widths
-so using the canvas.scale method to render a microscopic drawing in 
+so using the canvas.scale method to render a microscopic drawing in
 scaled microscopic units
-may produce a blob (because all line widths will get expanded a huge amount).  
+may produce a blob (because all line widths will get expanded a huge amount).
 Also rendering an aircraft wing in meters scaled to centimeters may cause the lines
 to shrink to the point where they disappear.  For engineering or scientific purposes
 such as these scale and translate
@@ -719,7 +719,7 @@
 """)
 
 disc("""
-A text object maintains a text cursor which moves about the page when 
+A text object maintains a text cursor which moves about the page when
 text is drawn.  For example the $setTextOrigin$ places the cursor
 in a known position and the $textLine$ and $textLines$ methods move
 the text cursor down past the lines that have been missing.
@@ -762,7 +762,7 @@
 
 eg(examples.testcharspace)
 
-disc("""The 
+disc("""The
 $charspace$ function exercises various spacing settings.
 It produces the following page.""")
 
@@ -785,7 +785,7 @@
 
 eg("""textobject.setHorizScale(horizScale)""")
 
-disc("""Lines of text can be stretched or shrunken horizontally by the 
+disc("""Lines of text can be stretched or shrunken horizontally by the
 $setHorizScale$ method.""")
 
 eg(examples.testhorizontalscale)
@@ -827,8 +827,8 @@
 (for creating superscripts or subscripts, for example).
 """)
 
-eg("""textobject.setFillColor(aColor); 
-textobject.setStrokeColor(self, aColor) 
+eg("""textobject.setFillColor(aColor);
+textobject.setStrokeColor(self, aColor)
 # and similar""")
 
 disc("""
@@ -911,7 +911,7 @@
 Combinations of lines, curves, arcs and other figures
 can be combined into a single figure using path objects.
 For example the function shown below constructs two path
-objects using lines and curves.  
+objects using lines and curves.
 This function will be used later on as part of a
 pencil icon construction.
 """)
@@ -961,7 +961,7 @@
 eg(examples.testbezier)
 
 disc("""
-A Bezier curve is specified by four control points 
+A Bezier curve is specified by four control points
 $(x1,y1)$, $(x2,y2)$, $(x3,y3)$, $(x4,y4)$.
 The curve starts at $(x1,y1)$ and ends at $(x4,y4)$
 and the line segment from $(x1,y1)$ to $(x2,y2)$
@@ -1037,7 +1037,7 @@
 
 disc("""
 The $arc$ and $arcTo$ methods paint partial ellipses.  The $arc$ method first "lifts the brush"
-and starts a new shape sequence.  The $arcTo$ method joins the start of 
+and starts a new shape sequence.  The $arcTo$ method joins the start of
 the partial ellipse to the current
 shape sequence by line segment before drawing the partial ellipse.  The points
 ^(x1,y1)^ and ^(x2,y2)^ define opposite corner points of a rectangle enclosing
@@ -1171,4 +1171,4 @@
 """)
 
 
-##### FILL THEM IN
+##### FILL THEM IN
\ No newline at end of file
--- a/reportlab/docs/userguide/ch2a_fonts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/ch2a_fonts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,11 +1,11 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/ch2_graphics.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/ch2a_fonts.py,v 1.5 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/ch2a_fonts.py,v 1.6 2002/07/24 19:56:35 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 from reportlab.lib.codecharts import SingleByteEncodingChart
 from reportlab.platypus import Image
-    
+
 heading1("Fonts and encodings")
 
 disc("""
@@ -20,11 +20,11 @@
 
 disc("""
 Support for custom fonts and encoding is was new
-in reportlab (Release 1.10, 6 Nov. 2001), and may 
-change in the future. The canvas methods  $setFont$, $getFont$, 
-$registerEncoding$ and $registerTypeFace$ can all be considered 
-stable. Other things such as how reportlab searches for fonts are more 
-liable to change.  
+in reportlab (Release 1.10, 6 Nov. 2001), and may
+change in the future. The canvas methods  $setFont$, $getFont$,
+$registerEncoding$ and $registerTypeFace$ can all be considered
+stable. Other things such as how reportlab searches for fonts are more
+liable to change.
 """)
 
 
@@ -161,7 +161,7 @@
 The Reportlab PDF library offers very fine-grained control
 of character encodings, which can be critical.  You can specify
 the encoding to use at a per-installation, per-document or per-font
-level, and also synthesize your own encodings.  
+level, and also synthesize your own encodings.
 """)
 
 disc("""The module reportlab/rl_config.py contains a variable
@@ -176,7 +176,7 @@
 and Western Europe.  It is also knows as Code Page 1252, and is practically
 identical to ISO-Latin-1 (it contains one or two extra characters). This
 is the default encoding used by the Reportlab PDF Library. It was generated from
-a standard routine in $reportlab/lib$, $codecharts.py$, 
+a standard routine in $reportlab/lib$, $codecharts.py$,
 which can be used to display the contents of fonts.  The index numbers
 along the edges are in hex.""")
 
@@ -413,7 +413,7 @@
 CPage(3)
 heading3("Korean")
 disc("""
-'language prefix': $kor$ 
+'language prefix': $kor$
 """)
 disc("""
 typefaces: '$HYSMyeongJoStd-Medium$','$HYGothic-Medium$'
@@ -435,7 +435,7 @@
                     #extensions, Script Manager Code 3
 'UniKS-UCS2-H',     #Unicode (UCS-2) encoding for the Adobe-Korea1 character collection
 'UniKS-UCS2-V'      #Vertical version of UniKS-UCS2-H
-    
+
 """)
 disc("""
 test:
@@ -614,4 +614,4 @@
 <font name="Rina" color="magenta" size="14">and this is in magenta Rina!</font>""","Using TTF fonts in paragraphs")
 
 
-##### FILL THEM IN
+##### FILL THEM IN
\ No newline at end of file
--- a/reportlab/docs/userguide/ch3_pdffeatures.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/ch3_pdffeatures.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/ch3_pdffeatures.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/ch3_pdffeatures.py,v 1.2 2001/10/27 22:37:02 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/ch3_pdffeatures.py,v 1.3 2002/07/24 19:56:35 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 
 
@@ -25,7 +25,7 @@
 disc("""The example below shows the basic sequence used.  A real
     program would probably define the forms up front and refer to
     them from another location.""")
-    
+
 
 eg(examples.testforms)
 
@@ -41,12 +41,12 @@
 eg("""
  canvas.bookmarkPage(name)
  canvas.bookmarkHorizontalAbsolute(name, yhorizontal)""")
- 
+
 disc("""
     The $bookmarkPage$ method bookmarks the entire page.
     After jumping to an endpoint defined by $bookmarkPage$ the
     PDF browser will display the whole page on the screen.""")
-    
+
 disc("""
     By contrast, $bookmarkHorizontalAbsolute$ defines a destination
     associated with a horizontal position on a page.  When the PDF browser
@@ -67,7 +67,7 @@
 eg("""
  canvas.linkAbsolute(contents, destinationname, Rect=None, addtopage=1, name=None, **kw)
  """)
- 
+
 disc("""
     The $linkAbsolute$ method defines a starting point for a jump.  When the user
     is browsing the generated document using a dynamic viewer (such as Acrobat Reader)
@@ -97,7 +97,7 @@
 """)
 
 eg("""
- canvas.linkAbsolute("Find the Meaning of Life", "Meaning_of_life", 
+ canvas.linkAbsolute("Find the Meaning of Life", "Meaning_of_life",
                      (inch, inch, 6*inch, 2*inch))
 """)
 
@@ -110,7 +110,7 @@
 """)
 
 eg("""
- canvas.linkAbsolute("Meaning of Life", "Meaning_of_life", 
+ canvas.linkAbsolute("Meaning of Life", "Meaning_of_life",
                      (inch, inch, 6*inch, 2*inch), Border='[0 0 0]')
 """)
 
@@ -135,7 +135,7 @@
      heading).  Finally, the ^closed^ argument specifies
     whether the node in the outline pane is closed
     or opened by default.""")
-    
+
 disc("""The snippet below is taken from the document template
     that formats this user guide.  A central processor looks
     at each paragraph in turn, and makes a new outline entry
@@ -146,7 +146,7 @@
     outline entry points aims at the whole page, but it could
     as easily have been an individual paragraph.
     """)
-    
+
 eg("""
 #abridged code from our document template
 if paragraph.style == 'Heading1':
@@ -156,15 +156,15 @@
     self.canv.addOutlineEntry(paragraph.getPlainText(),
                                             key, 0, 0)
     """)
-    
+
 heading2("Page Transition Effects")
 
 
 eg("""
- canvas.setPageTransition(self, effectname=None, duration=1, 
+ canvas.setPageTransition(self, effectname=None, duration=1,
                         direction=0,dimension='H',motion='I')
                         """)
-                        
+
 disc("""
 The $setPageTransition$ method specifies how one page will be replaced with
 the next.  By setting the page transition effect to "dissolve" for example
@@ -181,7 +181,7 @@
  canvas.setTitle(title)
  canvas.setSubject(subj)
  """)
- 
+
 disc("""
 These methods have no automatically seen visible effect on the document.
 They add internal annotations to the document.  These annotations can be
@@ -202,4 +202,3 @@
 """)
 
 illust(examples.annotations, "Setting document internal annotations")
- 
--- a/reportlab/docs/userguide/ch4_platypus_concepts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/ch4_platypus_concepts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/ch4_platypus_concepts.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/ch4_platypus_concepts.py,v 1.3 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/ch4_platypus_concepts.py,v 1.4 2002/07/24 19:56:36 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 
 #####################################################################################################3
@@ -35,20 +35,20 @@
 several layers, top down, these are""")
 
 disc("<b>$DocTemplates$</b> the outermost container for the document;")
- 
+
 disc("<b>$PageTemplates$</b> specifications for layouts of pages of various kinds;")
- 
+
 disc("<b>$Frames$</b> specifications of regions in pages that can contain flowing text or graphics.")
- 
-disc("""<b>$Flowables$</b> text or graphic elements that should be "flowed 
+
+disc("""<b>$Flowables$</b> text or graphic elements that should be "flowed
    into the document (i.e. things like images, paragraphs and tables, but not things
    like page footers or fixed page graphics).""")
-   
+
 disc("""<b>$pdfgen.Canvas$</b> the lowest level which ultimately receives the painting of the
    document from the other layers.""")
- 
+
 illust(examples.doctemplateillustration, "Illustration of DocTemplate structure")
- 
+
 disc("""
  The illustration above graphically illustrates the concepts of $DocTemplates$,
  $PageTemplates$ and $Flowables$.  It is deceptive, however, because each
@@ -108,7 +108,7 @@
 first we define an alternate layout for the fixed features
 of the other pages.  Note that the two functions above use
 the $pdfgen$ level canvas operations to paint the annotations for
-the pages.  
+the pages.
 """)
 
 eg(examples.platypusgo)
@@ -119,7 +119,7 @@
 comes pre-built with page templates.  We are also using a pre-built
 paragraph style.  We are only using two types of flowables here
 -- $Spacers$ and $Paragraphs$.  The first $Spacer$ ensures that the
-Paragraphs skip past the title string. 
+Paragraphs skip past the title string.
 """)
 
 disc("""
@@ -347,7 +347,7 @@
 """)
 disc("""
 This is the main method which is of interest to the application
-programmer. Assuming that the document instance is correctly set up the 
+programmer. Assuming that the document instance is correctly set up the
 $build$ method takes the <i>story</i> in the shape of the list of flowables
 (the $flowables$ argument) and loops through the list forcing the flowables
 one at a time through the formatting machinery. Effectively this causes
@@ -493,4 +493,3 @@
 standard behaviour, whilst the attributes allow instance changes. The $id$ argument is used at
 run time to perform $PageTemplate$ switching so $id='FirstPage'$ or $id='TwoColumns'$ are typical.
 """)
-
--- a/reportlab/docs/userguide/ch5_paragraphs.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/ch5_paragraphs.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/ch5_paragraphs.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/ch5_paragraphs.py,v 1.2 2001/10/27 22:37:02 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/ch5_paragraphs.py,v 1.3 2002/07/24 19:56:36 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 
 #begin chapter oon paragraphs
@@ -12,7 +12,7 @@
 an XML style markup. The overall shape of the formatted text can be justified, right or left ragged
 or centered. The XML markup can even be used to insert greek characters or to do subscripts.
 """)
-disc("""The following text creates an instance of the $Paragraph$ class:""") 
+disc("""The following text creates an instance of the $Paragraph$ class:""")
 eg("""Paragraph(text, style, bulletText=None)""")
 disc("""The $text$ argument contains the text of the
 paragraph; excess white space is removed from the text at the ends and internally after
@@ -76,7 +76,7 @@
 
 s1 = ParagraphStyle('Normal')
 parabox(sample, s1, 'The default $ParagraphStyle$')
-    
+
 disc("""The two attributes $spaceBefore$ and $spaceAfter$ do what they
 say, except at the top or bottom of a frame. At the top of a frame,
 $spaceBefore$ is ignored, and at the bottom, $spaceAfter$ is ignored.
@@ -308,7 +308,7 @@
 creation.
 """)
 parabox("""<bullet>\267</bullet>this is a bullet point.  Spam
-spam spam spam spam spam spam spam spam spam spam spam 
+spam spam spam spam spam spam spam spam spam spam spam
 spam spam spam spam spam spam spam spam spam spam """,
         styleSheet['Bullet'],
         'Basic use of bullet points')
@@ -317,4 +317,4 @@
 except that a sequence tag is used.  It is also possible
 to put  a multi-character string in the bullet; with a deep
 indent and bold bullet font, you can make a compact
-definition list.""")
+definition list.""")
\ No newline at end of file
--- a/reportlab/docs/userguide/ch6_tables.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/ch6_tables.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/ch6_tables.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/ch6_tables.py,v 1.3 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/ch6_tables.py,v 1.4 2002/07/24 19:56:36 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 from reportlab.platypus import Image
 
@@ -9,7 +9,7 @@
 disc("""
 The $Table$ class is derived from the $Flowable$ class and is intended
 as a simple textual gridding mechanism. $Table$ cells can hold anything which can be converted to
-a <b>Python</b> $string$. 
+a <b>Python</b> $string$.
 """)
 
 disc("""
@@ -282,7 +282,7 @@
 
    This is a non rearranging form of the <b>Paragraph</b> class;
    <b><font color=red>XML</font></b> tags are allowed in <i>text</i> and have the same
-   
+
       meanings as for the <b>Paragraph</b> class.
    As for <b>Preformatted</b>, if dedent is non zero <font color=red size=+1>dedent</font>
        common leading spaces will be removed from the
@@ -334,7 +334,7 @@
 """)
 CPage(1)
 heading2("""$CondPageBreak(height)$""")
-disc("""This $Flowable$ attempts to force a $Frame$ break if insufficient vertical space remains 
+disc("""This $Flowable$ attempts to force a $Frame$ break if insufficient vertical space remains
 in the current $Frame$. It is thus probably wrongly named and should probably be renamed as
 $CondFrameBreak$.
 """)
@@ -344,4 +344,4 @@
 This compound $Flowable$ takes a list of $Flowables$ and attempts to keep them in the same $Frame$.
 If the total height of the $Flowables$ in the list $flowables$ exceeds the current frame's available
 space then all the space is used and a frame break is forced.
-""")
+""")
\ No newline at end of file
--- a/reportlab/docs/userguide/ch7_custom.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/ch7_custom.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/ch7_custom.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/ch7_custom.py,v 1.3 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/ch7_custom.py,v 1.4 2002/07/24 19:56:36 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 
 heading1("Writing your own $Flowable$ Objects")
@@ -28,7 +28,7 @@
 """)
 illust(examples.hand, "a hand")
 disc("""
-To embed this or any other drawing in a Platypus flowable we must define a 
+To embed this or any other drawing in a Platypus flowable we must define a
 subclass of $Flowable$
 with at least a $wrap$ method and a $draw$ method.
 """)
@@ -79,4 +79,4 @@
         Image.draw(self)
 I = RotatedImage('%s')
 I.hAlign = 'CENTER'
-""" % I,'I')
+""" % I,'I')
\ No newline at end of file
--- a/reportlab/docs/userguide/ch9_future.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/ch9_future.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/ch9_future.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/ch9_future.py,v 1.2 2001/10/27 22:37:02 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/ch9_future.py,v 1.3 2002/07/24 19:56:36 andy_robinson Exp $
 from reportlab.tools.docco.rl_doc_utils import *
 
 heading1("Future Directions")
@@ -33,4 +33,4 @@
 look to $http://www.reportlab.com$ for the latest mailing list and
 contact information.""")
 
-# this comment is a trivial test of SF checkin rights - delete it some time!  AR 2001-04-17
+# this comment is a trivial test of SF checkin rights - delete it some time!  AR 2001-04-17
\ No newline at end of file
--- a/reportlab/docs/userguide/genuserguide.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/docs/userguide/genuserguide.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,9 +2,9 @@
 #copyright ReportLab Inc. 2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/userguide/genuserguide.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/docs/userguide/genuserguide.py,v 1.11 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/docs/userguide/genuserguide.py,v 1.12 2002/07/24 19:56:36 andy_robinson Exp $
 
-__version__=''' $Id: genuserguide.py,v 1.11 2002/07/17 22:46:22 andy_robinson Exp $ '''
+__version__=''' $Id: genuserguide.py,v 1.12 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 __doc__ = """
 This module contains the script for building the user guide.
@@ -49,7 +49,7 @@
 def makeSuite():
     "standard test harness support - run self as separate process"
     from reportlab.test.utils import ScriptThatMakesFileTest
-    return ScriptThatMakesFileTest('../docs/userguide', 'genuserguide.py', 'userguide.pdf') 
+    return ScriptThatMakesFileTest('../docs/userguide', 'genuserguide.py', 'userguide.pdf')
 
 if __name__=="__main__":
     outDir = filter(lambda x: x[:9]=='--outdir=',sys.argv)
@@ -86,4 +86,4 @@
         import profile
         profile.run('run((w, h),verbose,outDir)','genuserguide.stats')
     else:
-        run((w, h), verbose,outDir)
+        run((w, h), verbose,outDir)
\ No newline at end of file
--- a/reportlab/extensions/__init__.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/extensions/__init__.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,9 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/extensions/__init__.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/extensions/__init__.py,v 1.2 2000/10/25 08:57:45 rgbecker Exp $
-__version__=''' $Id: __init__.py,v 1.2 2000/10/25 08:57:45 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/extensions/__init__.py,v 1.3 2002/07/24 19:56:36 andy_robinson Exp $
+__version__=''' $Id: __init__.py,v 1.3 2002/07/24 19:56:36 andy_robinson Exp $ '''
 __doc__="""
 """
 # No usable content. Do not add to this file!
-
--- a/reportlab/graphics/__init__.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/__init__.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,5 +1,5 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/__init__.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/__init__.py,v 1.3 2002/03/26 11:49:09 rgbecker Exp $
-__version__=''' $Id: __init__.py,v 1.3 2002/03/26 11:49:09 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/graphics/__init__.py,v 1.4 2002/07/24 19:56:36 andy_robinson Exp $
+__version__=''' $Id: __init__.py,v 1.4 2002/07/24 19:56:36 andy_robinson Exp $ '''
\ No newline at end of file
--- a/reportlab/graphics/charts/__init__.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/charts/__init__.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,5 +1,5 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/charts/__init__.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/charts/__init__.py,v 1.3 2002/03/26 11:49:10 rgbecker Exp $
-__version__=''' $Id: __init__.py,v 1.3 2002/03/26 11:49:10 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/graphics/charts/__init__.py,v 1.4 2002/07/24 19:56:36 andy_robinson Exp $
+__version__=''' $Id: __init__.py,v 1.4 2002/07/24 19:56:36 andy_robinson Exp $ '''
\ No newline at end of file
--- a/reportlab/graphics/charts/axes.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/charts/axes.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/charts/axes.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/charts/axes.py,v 1.57 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/charts/axes.py,v 1.58 2002/07/24 19:56:36 andy_robinson Exp $
 """Collection of axes for charts.
 
 The current collection comprises axes for charts using cartesian
@@ -31,7 +31,7 @@
 at any absolute value (specified in points) or at some value of
 the former axes in its own coordinate system.
 """
-__version__=''' $Id: axes.py,v 1.57 2002/07/17 22:46:22 andy_robinson Exp $ '''
+__version__=''' $Id: axes.py,v 1.58 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 import string
 from types import FunctionType, StringType, TupleType, ListType
@@ -1819,4 +1819,4 @@
     drawing.add(xAxis)
     drawing.add(yAxis)
 
-    return drawing
+    return drawing
\ No newline at end of file
--- a/reportlab/graphics/charts/barcharts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/charts/barcharts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/charts/barcharts.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/charts/barcharts.py,v 1.63 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/charts/barcharts.py,v 1.64 2002/07/24 19:56:36 andy_robinson Exp $
 """This module defines a variety of Bar Chart components.
 
 The basic flavors are Side-by-side, available in horizontal and
@@ -9,7 +9,7 @@
 
 Stacked and percentile bar charts to follow...
 """
-__version__=''' $Id: barcharts.py,v 1.63 2002/07/17 22:46:22 andy_robinson Exp $ '''
+__version__=''' $Id: barcharts.py,v 1.64 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 import string, copy
 from types import FunctionType, StringType
@@ -1834,4 +1834,4 @@
         bc.categoryAxis.labels.boxAnchor = 'e'
         bc.categoryAxis.categoryNames = ['Ying', 'Yang']
 
-        self.add(bc,name='HBC')
+        self.add(bc,name='HBC')
\ No newline at end of file
--- a/reportlab/graphics/charts/legends.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/charts/legends.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,10 +1,10 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/charts/legends.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/charts/legends.py,v 1.22 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/charts/legends.py,v 1.23 2002/07/24 19:56:36 andy_robinson Exp $
 """This will be a collection of legends to be used with charts.
 """
-__version__=''' $Id: legends.py,v 1.22 2002/07/17 22:46:22 andy_robinson Exp $ '''
+__version__=''' $Id: legends.py,v 1.23 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 import string, copy
 
@@ -29,15 +29,15 @@
 
     Strings can be nicely aligned left or right to the swatches.
     """
-    
+
     _attrMap = AttrMap(
         x = AttrMapValue(isNumber, desc="x-coordinate of upper-left reference point"),
         y = AttrMapValue(isNumber, desc="y-coordinate of upper-left reference point"),
         deltax = AttrMapValue(isNumberOrNone, desc="x-distance between neighbouring swatches"),
         deltay = AttrMapValue(isNumberOrNone, desc="y-distance between neighbouring swatches"),
         dxTextSpace = AttrMapValue(isNumber, desc="Distance between swatch rectangle and text"),
-        autoXPadding = AttrMapValue(isNumber, desc="x Padding between columns if deltax=None"), 
-        autoYPadding = AttrMapValue(isNumber, desc="y Padding between rows if deltay=None"), 
+        autoXPadding = AttrMapValue(isNumber, desc="x Padding between columns if deltax=None"),
+        autoYPadding = AttrMapValue(isNumber, desc="y Padding between rows if deltay=None"),
         dx = AttrMapValue(isNumber, desc="Width of swatch rectangle"),
         dy = AttrMapValue(isNumber, desc="Height of swatch rectangle"),
         columnMaximum = AttrMapValue(isNumber, desc="Max. number of items per column"),
@@ -217,7 +217,7 @@
         "Make sample legend."
 
         d = Drawing(200, 100)
-        
+
         legend = Legend()
         legend.alignment = 'left'
         legend.x = 0
@@ -234,9 +234,9 @@
 
 def sample1c():
     "Make sample legend."
-    
+
     d = Drawing(200, 100)
-    
+
     legend = Legend()
     legend.alignment = 'right'
     legend.x = 0
@@ -255,7 +255,7 @@
     "Make sample legend."
 
     d = Drawing(200, 100)
-    
+
     legend = Legend()
     legend.alignment = 'right'
     legend.x = 20
@@ -269,4 +269,4 @@
 
     d.add(legend, 'legend')
 
-    return d
+    return d
\ No newline at end of file
--- a/reportlab/graphics/charts/linecharts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/charts/linecharts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,11 +1,11 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/charts/linecharts.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/charts/linecharts.py,v 1.23 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/charts/linecharts.py,v 1.24 2002/07/24 19:56:36 andy_robinson Exp $
 """
 This modules defines a very preliminary Line Chart example.
 """
-__version__=''' $Id: linecharts.py,v 1.23 2002/07/17 22:46:22 andy_robinson Exp $ '''
+__version__=''' $Id: linecharts.py,v 1.24 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 import string
 from types import FunctionType, StringType
@@ -527,4 +527,4 @@
 
     drawing.add(lc)
 
-    return drawing
+    return drawing
\ No newline at end of file
--- a/reportlab/graphics/charts/lineplots.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/charts/lineplots.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,16 +1,16 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/charts/lineplots.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/charts/lineplots.py,v 1.32 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/charts/lineplots.py,v 1.33 2002/07/24 19:56:36 andy_robinson Exp $
 """This module defines a very preliminary Line Plot example.
 """
-__version__=''' $Id: lineplots.py,v 1.32 2002/07/17 22:46:22 andy_robinson Exp $ '''
+__version__=''' $Id: lineplots.py,v 1.33 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 import string, time
 from types import FunctionType
 
-from reportlab.lib import colors 
-from reportlab.lib.validators import * 
+from reportlab.lib import colors
+from reportlab.lib.validators import *
 from reportlab.lib.attrmap import *
 from reportlab.graphics.shapes import Drawing, Group, Rect, Line, PolyLine
 from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder
@@ -626,11 +626,11 @@
         self.x=self.x+_maxWidth(str(self.yValueAxis.valueMax), self.yValueAxis.labels.fontName, self.yValueAxis.labels.fontSize)
         self.y = self.bottomPadding+_axisTickLengths+_labelOffset+self.xValueAxis.labels.fontSize
 
-        self.xValueAxis.labels.dy = -_labelOffset 
+        self.xValueAxis.labels.dy = -_labelOffset
         self.xValueAxis.tickDown = _axisTickLengths
         self.xValueAxis.strokeWidth = _axisStrokeWidth
         self.xValueAxis.rangeRound='both'
-        self.yValueAxis.labels.dx = -_labelOffset 
+        self.yValueAxis.labels.dx = -_labelOffset
         self.yValueAxis.tickLeft = _axisTickLengths
         self.yValueAxis.strokeWidth = _axisStrokeWidth
         self.yValueAxis.rangeRound='both'
@@ -879,4 +879,4 @@
 
     drawing.add(lp)
 
-    return drawing
+    return drawing
\ No newline at end of file
--- a/reportlab/graphics/charts/markers.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/charts/markers.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,15 +1,15 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/charts/markers.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/charts/markers.py,v 1.7 2002/03/26 11:17:17 rgbecker Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/charts/markers.py,v 1.8 2002/07/24 19:56:36 andy_robinson Exp $
 """
 This modules defines a collection of markers used in charts.
 
 The make* functions return a simple shape or a widget as for
 the smiley.
 """
-__version__=''' $Id: markers.py,v 1.7 2002/03/26 11:17:17 rgbecker Exp $ '''
-from reportlab.lib import colors 
+__version__=''' $Id: markers.py,v 1.8 2002/07/24 19:56:36 andy_robinson Exp $ '''
+from reportlab.lib import colors
 from reportlab.graphics.shapes import Rect, Line, Circle, Polygon
 from reportlab.graphics.widgets.signsandsymbols import SmileyFace
 
@@ -79,4 +79,4 @@
     s.y = y-d
     s.size = d*2
 
-    return s
+    return s
\ No newline at end of file
--- a/reportlab/graphics/charts/piecharts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/charts/piecharts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/charts/piecharts.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/charts/piecharts.py,v 1.22 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/charts/piecharts.py,v 1.23 2002/07/24 19:56:36 andy_robinson Exp $
 # experimental pie chart script.  Two types of pie - one is a monolithic
 #widget with all top-level properties, the other delegates most stuff to
 #a wedges collection whic lets you customize the group or every individual
@@ -12,7 +12,7 @@
 This permits you to customize and pop out individual wedges;
 supports elliptical and circular pies.
 """
-__version__=''' $Id: piecharts.py,v 1.22 2002/07/17 22:46:22 andy_robinson Exp $ '''
+__version__=''' $Id: piecharts.py,v 1.23 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 import copy
 from math import sin, cos, pi
@@ -32,7 +32,7 @@
 
 class WedgeProperties(PropHolder):
     """This holds descriptive information about the wedges in a pie chart.
-    
+
     It is not to be confused with the 'wedge itself'; this just holds
     a recipe for how to format one, and does not allow you to hack the
     angles.  It can format a genuine Wedge object for you with its
@@ -75,7 +75,7 @@
         direction = AttrMapValue( OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"),
         slices = AttrMapValue(None, desc="collection of wedge descriptor objects"),
         )
-    
+
     def __init__(self):
         self.x = 0
         self.y = 0
@@ -85,17 +85,17 @@
         self.labels = None  # or list of strings
         self.startAngle = 90
         self.direction = "clockwise"
-        
+
         self.slices = TypedPropertyCollection(WedgeProperties)
         self.slices[0].fillColor = colors.darkcyan
         self.slices[1].fillColor = colors.blueviolet
         self.slices[2].fillColor = colors.blue
         self.slices[3].fillColor = colors.cyan
 
-        
+
     def demo(self):
         d = Drawing(200, 100)
-    
+
         pc = Pie()
         pc.x = 50
         pc.y = 10
@@ -132,7 +132,7 @@
             normData.append(360.0 * number / sum)
 
         return normData
-    
+
 
     def makeWedges(self):
         # normalize slice data
@@ -163,7 +163,7 @@
         g = Group()
         i = 0
         styleCount = len(self.slices)
-        
+
         startAngle = self.startAngle #% 360
         for angle in normData:
             endAngle = (startAngle + (angle * whichWay)) #% 360
@@ -200,7 +200,7 @@
                 theWedge.strokeDashArray = wedgeStyle.strokeDashArray
 
                 g.add(theWedge)
-                    
+
                 # now draw a label
                 if labels[i] <> "":
                     averageAngle = (a1+a2)/2.0
@@ -208,7 +208,7 @@
                     labelRadius = wedgeStyle.labelRadius
                     labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius)
                     labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius)
-                    
+
                     theLabel = String(labelX, labelY, labels[i])
                     theLabel.textAnchor = "middle"
                     theLabel.fontSize = wedgeStyle.fontSize
@@ -308,7 +308,7 @@
         self.leftPadding = 5
         self.rightPadding = 5
         self.topPadding = 5
-        self.bottomPadding = 5        
+        self.bottomPadding = 5
         self.drawLegend = 1
 
     def draw(self):
@@ -392,7 +392,7 @@
     pc.data = [10]
     pc.labels = ['a']
     pc.slices.strokeWidth=1#0.5
-    
+
     d.add(pc)
 
     return d
@@ -411,7 +411,7 @@
     pc.data = [10]
     pc.labels = ['a']
     pc.slices.strokeWidth=1#0.5
-    
+
     d.add(pc)
 
     return d
@@ -434,7 +434,7 @@
     pc.slices[3].strokeDashArray = [2,2]
     pc.slices[3].labelRadius = 1.75
     pc.slices[3].fontColor = colors.red
-    
+
     d.add(pc)
 
     return d
@@ -518,4 +518,4 @@
 
     d.add(pc)
 
-    return d
+    return d
\ No newline at end of file
--- a/reportlab/graphics/charts/textlabels.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/charts/textlabels.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/charts/textlabels.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/charts/textlabels.py,v 1.25 2002/07/17 22:46:22 andy_robinson Exp $
-__version__=''' $Id: textlabels.py,v 1.25 2002/07/17 22:46:22 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/graphics/charts/textlabels.py,v 1.26 2002/07/24 19:56:36 andy_robinson Exp $
+__version__=''' $Id: textlabels.py,v 1.26 2002/07/24 19:56:36 andy_robinson Exp $ '''
 import string
 
 from reportlab.lib import colors
@@ -129,7 +129,7 @@
     def __init__(self):
         self.x = 0
         self.y = 0
-        self._text = 'Multi-Line\nString' 
+        self._text = 'Multi-Line\nString'
 
         self.dx = 0
         self.dy = 0
@@ -213,7 +213,7 @@
             self._top = 0
         elif boxAnchor in ['s','sw','se']:
             self._top = self._height
-        else: 
+        else:
             self._top = 0.5 * self._height
         self._bottom = self._top - self._height
 
@@ -408,4 +408,4 @@
     def __init__(self):
         BarChartLabel.__init__(self)
         self.text = 'n/a'
-NoneOrInstanceOfNA_Label=NoneOr(isInstanceOf(NA_Label))
+NoneOrInstanceOfNA_Label=NoneOr(isInstanceOf(NA_Label))
\ No newline at end of file
--- a/reportlab/graphics/charts/utils.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/charts/utils.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,9 +1,9 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/charts/utils.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/charts/utils.py,v 1.8 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/charts/utils.py,v 1.9 2002/07/24 19:56:36 andy_robinson Exp $
 "Utilities used here and there."
-__version__=''' $Id: utils.py,v 1.8 2002/07/17 22:46:22 andy_robinson Exp $ '''
+__version__=''' $Id: utils.py,v 1.9 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 from time import mktime, gmtime, strftime
 import string
@@ -17,7 +17,7 @@
     list = [0] * 9
     dd, mm, yyyy = map(int, string.split(timeString, '/'))
     list[:3] = [yyyy, mm, dd]
-    
+
     return tuple(list)
 
 
@@ -45,7 +45,7 @@
     what that is in chart space, and ask for the nextRoundNumber().
     Tries the series 1,2,5,10,20,50,100.., going up or down as needed.
     """
-    
+
     #guess to nearest order of magnitude
     if x in (0, 1):
         return x
@@ -77,7 +77,7 @@
 
 
 ### Robin's stuff from rgb_ticks.
-        
+
 from math import log10, floor
 
 _intervals=(.1, .2, .25, .5)
@@ -164,7 +164,7 @@
     if power==0: power = 1
     w = grid/10.**power
     w = int(w)!=w
-    
+
     if power > 3 or power < -3:
         format = '%+'+`w+7`+'.0e'
     else:
@@ -174,7 +174,7 @@
         else:
             digits = w-int(power)
             format = '%'+`digits+2`+'.'+`digits`+'f'
-    
+
     if percent: format=format+'%%'
     T = []
     n = int(float(hi-t)/grid+0.1)+1
@@ -189,4 +189,4 @@
         for i in xrange(n):
             v = t+grid*i
             T.append((v, format % v))
-        return T
+        return T
\ No newline at end of file
--- a/reportlab/graphics/renderPDF.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/renderPDF.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/renderPDF.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/renderPDF.py,v 1.19 2002/07/03 10:21:07 rgbecker Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/renderPDF.py,v 1.20 2002/07/24 19:56:36 andy_robinson Exp $
 # renderPDF - draws Drawings onto a canvas
 """Usage:
     import renderpdf
@@ -9,7 +9,7 @@
 Execute the script to see some test drawings.
 changed
 """
-__version__=''' $Id: renderPDF.py,v 1.19 2002/07/03 10:21:07 rgbecker Exp $ '''
+__version__=''' $Id: renderPDF.py,v 1.20 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 from reportlab.graphics.shapes import *
 from reportlab.pdfgen.canvas import Canvas
@@ -136,7 +136,7 @@
         path.arcTo(centerx-radius, centery-yradius, centerx+radius, centery+yradius,
                    startangledegrees, angle)
         path.close()
-        self._canvas.drawPath(path, 
+        self._canvas.drawPath(path,
                     fill=self._fill,
                     stroke=self._stroke)
 
@@ -167,7 +167,7 @@
             S = self._tracker.getState()
             text_anchor, x, y, text = S['textAnchor'], stringObj.x,stringObj.y,stringObj.text
             if not text_anchor in ['start','inherited']:
-                font, font_size = S['fontName'], S['fontSize'] 
+                font, font_size = S['fontName'], S['fontSize']
                 textLen = stringWidth(text, font,font_size)
                 if text_anchor=='end':
                     x = x-textLen
@@ -189,7 +189,7 @@
         if path.isClipPath:
             self._canvas.clipPath(pdfPath, fill=fill, stroke=self._stroke)
         else:
-            self._canvas.drawPath(pdfPath, 
+            self._canvas.drawPath(pdfPath,
                         fill=fill,
                         stroke=self._stroke)
 
@@ -253,7 +253,7 @@
 
 def drawToFile(d, fn, msg="", showBoundary=rl_config.showBoundary, autoSize=1):
     """Makes a one-page PDF with just the drawing.
-    
+
     If autoSize=1, the PDF will be the same size as
     the drawing; if 0, it will place the drawing on
     an A4 page with a title above it - possibly overflowing
@@ -262,7 +262,7 @@
     c.setFont('Times-Roman', 36)
     c.drawString(80, 750, msg)
     c.setTitle(msg)
-        
+
     if autoSize:
         c.setPageSize((d.width, d.height))
         draw(d, c, 0, 0, showBoundary=showBoundary)
@@ -337,7 +337,7 @@
 ##    doc = SimpleDocTemplate('test_flowable.pdf')
 ##    story = []
 ##    story.append(Paragraph("This sees is a drawing can work as a flowable", styNormal))
-##    
+##
 ##    import testdrawings
 ##    drawings = []
 ##
@@ -355,4 +355,4 @@
 
 if __name__=='__main__':
     test()
-    #testFlowable()
+    #testFlowable()
\ No newline at end of file
--- a/reportlab/graphics/renderPM.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/renderPM.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2001
 #see license.txt for license details
 #history www.reportlab.co.uk/rl-cgi/viewcvs.cgi/rlextra/graphics/Csrc/renderPM/renderP.py
-#$Header: /tmp/reportlab/reportlab/graphics/renderPM.py,v 1.20 2002/07/24 09:38:32 rgbecker Exp $
-__version__=''' $Id: renderPM.py,v 1.20 2002/07/24 09:38:32 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/graphics/renderPM.py,v 1.21 2002/07/24 19:56:36 andy_robinson Exp $
+__version__=''' $Id: renderPM.py,v 1.21 2002/07/24 19:56:36 andy_robinson Exp $ '''
 """Usage:
     from reportlab.graphics import renderPM
     renderPM.drawToFile(drawing,filename,kind='GIF')
@@ -26,7 +26,7 @@
     import _renderPM
 except ImportError, errMsg:
     raise ImportError, "No module named _renderPM\n" + \
-        (str(errMsg)!='No module named _renderPM' and "it may be the wrong version or badly installed!" or 
+        (str(errMsg)!='No module named _renderPM' and "it may be the wrong version or badly installed!" or
                                     "see http://www.reportlab.com/rl_addons.html")
 
 from types import TupleType, ListType
@@ -42,7 +42,7 @@
     """As it says"""
     R = _PMRenderer()
     R.draw(drawing, canvas, x, y)
-    
+
 from reportlab.graphics.renderbase import Renderer
 class _PMRenderer(Renderer):
     """This draws onto a pix map image. It needs to be a class
@@ -179,7 +179,7 @@
             S = self._tracker.getState()
             text_anchor, x, y, text = S['textAnchor'], stringObj.x,stringObj.y,stringObj.text
             if not text_anchor in ['start','inherited']:
-                font, font_size = S['fontName'], S['fontSize'] 
+                font, font_size = S['fontName'], S['fontSize']
                 textLen = stringWidth(text, font,font_size)
                 if text_anchor=='end':
                     x = x-textLen
@@ -410,7 +410,7 @@
         # first segment
         x0 = cx + rx   # (x0,y0) start pt
         y0 = cy
-        
+
         x3 = cx        # (x3,y3) end pt of arc
         y3 = cy-ry
 
@@ -424,7 +424,7 @@
         # next segment
         x0 = x3
         y0 = y3
-        
+
         x3 = cx-rx
         y3 = cy
 
@@ -437,7 +437,7 @@
         # next segment
         x0 = x3
         y0 = y3
-        
+
         x3 = cx
         y3 = cy+ry
 
@@ -450,7 +450,7 @@
         #last segment
         x0 = x3
         y0 = y3
-        
+
         x3 = cx+rx
         y3 = cy
 
@@ -513,7 +513,7 @@
                 w = int(drawing.width)
                 h = int(drawing.height)
                 html.append('<hr><h2>Drawing %s %d</h2>\n<pre>%s</pre>' % (name, i, docstring))
-                    
+
                 for k in ['gif','tiff', 'png', 'jpg']:
                     if k in ['gif','png','jpg']:
                         html.append('<p>%s format</p>\n' % string.upper(k))
@@ -535,4 +535,4 @@
         htmlFileName = os.path.join('pmout', 'index.html')
         open(htmlFileName, 'w').writelines(html)
         print 'wrote %s' % htmlFileName
-    test()
+    test()
\ No newline at end of file
--- a/reportlab/graphics/renderPS.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/renderPS.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/renderPS.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/renderPS.py,v 1.19 2002/07/21 08:18:44 andy_robinson Exp $
-__version__=''' $Id: renderPS.py,v 1.19 2002/07/21 08:18:44 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/graphics/renderPS.py,v 1.20 2002/07/24 19:56:36 andy_robinson Exp $
+__version__=''' $Id: renderPS.py,v 1.20 2002/07/24 19:56:36 andy_robinson Exp $ '''
 import string, types
 from reportlab.pdfbase.pdfmetrics import stringWidth # for font info
 from reportlab.lib.utils import fp_str, getStringIO
@@ -39,7 +39,7 @@
   /FontName get exch definefont pop
 } bind def
 
-/WinAnsiEncoding [ 
+/WinAnsiEncoding [
   39/quotesingle 96/grave 128/euro 130/quotesinglbase/florin/quotedblbase
   /ellipsis/dagger/daggerdbl/circumflex/perthousand
   /Scaron/guilsinglleft/OE 145/quoteleft/quoteright
@@ -76,7 +76,7 @@
 
 
         self._fontsUsed = {}  # track them as we go
-        
+
         self.setFont(STATE_DEFAULTS['fontName'],STATE_DEFAULTS['fontSize'])
         self.setStrokeColor(STATE_DEFAULTS['strokeColor'])
         self.setLineCap(2)
@@ -122,7 +122,7 @@
         for fontName in self._fontsUsed.keys():
             fontReencode.append('WinAnsiEncoding /%s /%s RE' % (fontName, fontName))
         self.code.insert(1, string.join(fontReencode, self._sep))
-        
+
         file.write(string.join(self.code,self._sep))
         if file is not f: file.close()
 
@@ -148,7 +148,7 @@
         if self._lineJoin!=v:
             self._lineJoin = v
             self.code.append('%d setlinejoin'%v)
-            
+
     def setDash(self, array=[], phase=0):
         """Two notations.  pass two numbers, or an array and phase"""
         # copied and modified from reportlab.canvas
@@ -197,12 +197,12 @@
         return a copy of string s with special characters in postscript strings
         escaped with backslashes.
         Have not handled characters that are converted normally in python strings
-        i.e. \n -> newline 
+        i.e. \n -> newline
         '''
         str = string.replace(s, chr(0x5C), r'\\' )
         str = string.replace(str, '(', '\(' )
         str = string.replace(str, ')', '\)')
-        return str 
+        return str
 
     def drawString(self, s, x, y, angle=0):
         if self._fillColor != None:
@@ -239,17 +239,17 @@
     def rect(self, x1,y1, x2,y2, rx=8, ry=8):
         "Draw a rectangle between x1,y1, and x2,y2"
         # Path is drawn in counter-clockwise direction"
-        
+
         x1, x2 = min(x1,x2), max(x1, x2) # from piddle.py
         y1, y2 = min(y1,y2), max(y1, y2)
         self.polygon(((x1,y1),(x2,y1),(x2,y2),(x1,y2)), closed=1)
 
     def roundRect(self, x1,y1, x2,y2, rx=8, ry=8):
-        """Draw a rounded rectangle between x1,y1, and x2,y2, 
-        with corners inset as ellipses with x radius rx and y radius ry. 
+        """Draw a rounded rectangle between x1,y1, and x2,y2,
+        with corners inset as ellipses with x radius rx and y radius ry.
         These should have x1<x2, y1<y2, rx>0, and ry>0."""
         # Path is drawn in counter-clockwise direction
-        
+
         x1, x2 = min(x1,x2), max(x1, x2) # from piddle.py
         y1, y2 = min(y1,y2), max(y1, y2)
 
@@ -257,7 +257,7 @@
         # save current matrix, translate to center of ellipse, scale by rx ry, and draw
         # a circle of unit radius in counterclockwise dir, return to original matrix
         # arguments are (cx, cy, rx, ry, startAngle, endAngle)
-        ellipsePath = 'matrix currentmatrix %s %s translate %s %s scale 0 0 1 %s %s arc setmatrix' 
+        ellipsePath = 'matrix currentmatrix %s %s translate %s %s scale 0 0 1 %s %s arc setmatrix'
 
         # choice between newpath and moveTo beginning of arc
         # go with newpath for precision, does this violate any assumptions in code???
@@ -268,11 +268,11 @@
         rrCode.append(ellipsePath % (x2-rx, y2-ry, rx, -ry, 270, 360))
         rrCode.append(ellipsePath % (x2-rx, y1+ry, rx, -ry, 0,  90) )
         rrCode.append('closepath')
-        
+
         self._fillAndStroke(rrCode)
 
     def ellipse(self, x1,y1, x2,y2):
-        """Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2. 
+        """Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2.
         These should have x1<x2 and y1<y2."""
         #Just invoke drawArc to actually draw the ellipse
         self.drawArc(x1,y1, x2,y2)
@@ -282,22 +282,22 @@
 
     def drawArc(self, x1,y1, x2,y2, startAng=0, extent=360, fromcenter=0):
         """Draw a partial ellipse inscribed within the rectangle x1,y1,x2,y2,
-        starting at startAng degrees and covering extent degrees.   Angles 
+        starting at startAng degrees and covering extent degrees.   Angles
         start with 0 to the right (+x) and increase counter-clockwise.
         These should have x1<x2 and y1<y2."""
         #calculate centre of ellipse
         #print "x1,y1,x2,y2,startAng,extent,fromcenter", x1,y1,x2,y2,startAng,extent,fromcenter
         cx, cy = (x1+x2)/2.0, (y1+y2)/2.0
         rx, ry = (x2-x1)/2.0, (y2-y1)/2.0
-        
-        codeline = self._genArcCode(x1, y1, x2, y2, startAng, extent) 
+
+        codeline = self._genArcCode(x1, y1, x2, y2, startAng, extent)
 
         startAngleRadians = math.pi*startAng/180.0
         extentRadians = math.pi*extent/180.0
         endAngleRadians = startAngleRadians + extentRadians
 
         codelineAppended = 0
-        
+
         # fill portion
 
         if self._fillColor != None:
@@ -313,7 +313,7 @@
         if self._strokeColor != None:
             # this is a bit hacked up.  There is certainly a better way...
             self.setColor(self._strokeColor)
-            (startx, starty) = (cx+rx*math.cos(startAngleRadians), cy+ry*math.sin(startAngleRadians)) 
+            (startx, starty) = (cx+rx*math.cos(startAngleRadians), cy+ry*math.sin(startAngleRadians))
             if not codelineAppended:
                 self.code.append(codeline)
             if fromcenter:
@@ -346,7 +346,7 @@
 
         start = p[0]
         p = p[1:]
-        
+
         polyCode = []
         polyCode.append("%s m" % fp_str(start))
         for point in p:
@@ -388,7 +388,7 @@
     def drawFigure(self, partList, closed=0):
         figureCode = []
         first = 1
-        
+
         for part in partList:
             op = part[0]
             args = list(part[1:])
@@ -453,7 +453,7 @@
 
     ############################################################################################
     # drawImage(self. image, x1, y1, x2=None, y2=None) is now defined by either _drawImageLevel1
-    #    ._drawImageLevel2, the choice is made in .__init__ depending on option 
+    #    ._drawImageLevel2, the choice is made in .__init__ depending on option
     def _drawImageLevel1(self, image, x1, y1, x2=None,y2=None):
         # Postscript Level1 version available for fallback mode when Level2 doesn't work
         """drawImage(self,image,x1,y1,x2=None,y2=None) : If x2 and y2 are ommitted, they are
@@ -485,7 +485,7 @@
         # user space to the rect...on the page that is to receive the
         # image. A common ImageMatrix is [width 0 0 -height 0 height]
         # (for a left to right, top to bottom image )
-        
+
         # first let's map the user coordinates start at offset x1,y1 on page
 
         self.code.extend([
@@ -510,10 +510,10 @@
         # piddlePDF again
 
         rawimage = myimage.tostring()
-        assert(len(rawimage) == imgwidth*imgheight, 'Wrong amount of data for image') 
+        assert(len(rawimage) == imgwidth*imgheight, 'Wrong amount of data for image')
         #compressed = zlib.compress(rawimage) # no zlib at moment
         hex_encoded = self._AsciiHexEncode(rawimage)
-        
+
         # write in blocks of 78 chars per line
         outstream = getStringIO(hex_encoded)
 
@@ -540,12 +540,12 @@
             print 'found image.mode= L'
             imBitsPerComponent = 8
             imNumComponents = 1
-            myimage = image 
+            myimage = image
         elif image.mode == '1':
             print 'found image.mode= 1'
             myimage = image.convert('L')
             imNumComponents = 1
-            myimage = image 
+            myimage = image
         else :
             myimage = image.convert('RGB')
             imNumComponents = 3
@@ -587,10 +587,10 @@
                             'image'])
         # after image operator just need to dump image dat to file as hexstring
         rawimage = myimage.tostring()
-        assert(len(rawimage) == imwidth*imheight, 'Wrong amount of data for image') 
+        assert(len(rawimage) == imwidth*imheight, 'Wrong amount of data for image')
         #compressed = zlib.compress(rawimage) # no zlib at moment
         hex_encoded = self._AsciiHexEncode(rawimage)
-        
+
         # write in blocks of 78 chars per line
         outstream = getStringIO(hex_encoded)
 
@@ -743,7 +743,7 @@
             S = self._tracker.getState()
             text_anchor, x, y, text = S['textAnchor'], stringObj.x,stringObj.y,stringObj.text
             if not text_anchor in ['start','inherited']:
-                font, fontSize = S['fontName'], S['fontSize'] 
+                font, fontSize = S['fontName'], S['fontSize']
                 textLen = stringWidth(text, font,fontSize)
                 if text_anchor=='end':
                     x = x-textLen
@@ -846,4 +846,4 @@
         outdir = sys.argv[1]
     else:
         outdir = 'epsout'
-    test(outdir)
+    test(outdir)
\ No newline at end of file
--- a/reportlab/graphics/renderSVG.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/renderSVG.py	Wed Jul 24 19:56:39 2002 +0000
@@ -65,13 +65,13 @@
 def transformNode(doc, newTag, node=None, **attrDict):
     """Transform a DOM node into new node and copy selected attributes.
 
-    Creates a new DOM node with tag name 'newTag' for document 'doc' 
+    Creates a new DOM node with tag name 'newTag' for document 'doc'
     and copies selected attributes from an existing 'node' as provided
     in 'attrDict'. The source 'node' can be None. Attribute values will
     be converted to strings.
 
-    E.g. 
-    
+    E.g.
+
         n = transformNode(doc, "node1", x="0", y="1")
         -> DOM node for <node1 x="0" y="1"/>
 
@@ -85,7 +85,7 @@
     newNode = doc.createElement(newTag)
     for newAttr, attr in attrDict.items():
         sattr =  str(attr)
-        if not node: 
+        if not node:
             newNode.setAttribute(newAttr, sattr)
         else:
             attrVal = node.getAttribute(sattr)
@@ -117,12 +117,12 @@
         title = self.doc.createElement('title')
         text = self.doc.createTextNode('...')
         title.appendChild(text)
-        self.svg.appendChild(title)                 
-                 
+        self.svg.appendChild(title)
+
         desc = self.doc.createElement('desc')
         text = self.doc.createTextNode('...')
         desc.appendChild(text)
-        self.svg.appendChild(desc)                 
+        self.svg.appendChild(desc)
 
         self.setFont(STATE_DEFAULTS['fontName'], STATE_DEFAULTS['fontSize'])
         self.setStrokeColor(STATE_DEFAULTS['strokeColor'])
@@ -131,14 +131,14 @@
         self.setLineWidth(1)
 
         # Add a rectangular clipping path identical to view area.
-        clipPath = transformNode(self.doc, "clipPath", id="clip") 
-        clipRect = transformNode(self.doc, "rect", x=0, y=0, 
+        clipPath = transformNode(self.doc, "clipPath", id="clip")
+        clipRect = transformNode(self.doc, "rect", x=0, y=0,
             width=self.width, height=self.height)
         clipPath.appendChild(clipRect)
         self.svg.appendChild(clipPath)
 
-        self.groupTree = transformNode(self.doc, "g", 
-            id="group", 
+        self.groupTree = transformNode(self.doc, "g",
+            id="group",
             transform="scale(1,-1) translate(0,-%d)" % self.height,
             style="clip-path: url(#clip)")
         self.svg.appendChild(self.groupTree)
@@ -158,12 +158,12 @@
         # use = self.doc.createElement('use')
         # use.setAttribute("xlink:href", "#group")
         # use.setAttribute("transform", "scale(1, -1)")
-        # self.svg.appendChild(use)        
+        # self.svg.appendChild(use)
 
         result = self.svg.toprettyxml(indent="    ")
         file.write(result)
 
-        if file is not f: 
+        if file is not f:
             file.close()
 
 
@@ -192,14 +192,14 @@
                 if word in include:
                     tmp.append(word)
             keys = tmp
-            
+
         items = []
         for k in keys:
             items.append((k, self.style[k]))
-        items = map(lambda i: "%s: %s"%(i[0], i[1]), items) 
+        items = map(lambda i: "%s: %s"%(i[0], i[1]), items)
         str = string.join(items, '; ') + ';'
 
-        return str 
+        return str
 
 
     def _escape(self, s):
@@ -207,17 +207,17 @@
         return a copy of string s with special characters in postscript strings
         escaped with backslashes.
         Have not handled characters that are converted normally in python strings
-        i.e. \n -> newline 
+        i.e. \n -> newline
         """
 
         str = string.replace(s, chr(0x5C), r'\\' )
         str = string.replace(str, '(', '\(' )
         str = string.replace(str, ')', '\)')
-        return str 
+        return str
 
 
     def _genArcCode(self, x1, y1, x2, y2, startAng, extent):
-        """Calculate the path for an arc inscribed in rectangle defined 
+        """Calculate the path for an arc inscribed in rectangle defined
         by (x1,y1),(x2,y2)."""
 
         return
@@ -240,7 +240,7 @@
 
 
     def _fillAndStroke(self, code, clip=0):
-        path = transformNode(self.doc, "path", 
+        path = transformNode(self.doc, "path",
             d=self.path, style=self._formatStyle(LINE_STYLES))
         self.currGroup.appendChild(path)
         self.path = ''
@@ -266,7 +266,7 @@
                 self.code.append("clip")
                 self.code.append("newpath")
         """
- 
+
 
     ### styles ###
 
@@ -282,7 +282,7 @@
         if self._lineJoin != v:
             self._lineJoin = v
             self.style['stroke-linecap'] = vals[v]
-            
+
 
     def setDash(self, array=[], phase=0):
         """Two notations. Pass two numbers, or an array and phase."""
@@ -337,11 +337,11 @@
 
     def rect(self, x1,y1, x2,y2, rx=8, ry=8):
         "Draw a rectangle between x1,y1 and x2,y2."
-        
+
         if self.verbose: print "+++ SVGCanvas.rect"
 
-        rect = transformNode(self.doc, "rect", 
-            x=x1, y=y1, width=x2-x1, height=y2-y1, 
+        rect = transformNode(self.doc, "rect",
+            x=x1, y=y1, width=x2-x1, height=y2-y1,
             style=self._formatStyle(LINE_STYLES))
 
         self.currGroup.appendChild(rect)
@@ -349,13 +349,13 @@
 
     def roundRect(self, x1,y1, x2,y2, rx=8, ry=8):
         """Draw a rounded rectangle between x1,y1 and x2,y2.
- 
-        Corners inset as ellipses with x-radius rx and y-radius ry. 
+
+        Corners inset as ellipses with x-radius rx and y-radius ry.
         These should have x1<x2, y1<y2, rx>0, and ry>0.
         """
 
-        rect = transformNode(self.doc, "rect", 
-            x=x1, y=y1, width=x2-x1, height=y2-y1, rx=rx, ry=ry, 
+        rect = transformNode(self.doc, "rect",
+            x=x1, y=y1, width=x2-x1, height=y2-y1, rx=rx, ry=ry,
             style=self._formatStyle(LINE_STYLES))
 
         self.currGroup.appendChild(rect)
@@ -371,8 +371,8 @@
             if angle != 0:
                st = st + " rotate(%f %f %f);" % (angle, x, y)
             st = st + " fill: %s;" % self.style['fill']
-            text = transformNode(self.doc, "text", 
-                x=x, y=y, style=st, 
+            text = transformNode(self.doc, "text",
+                x=x, y=y, style=st,
                 transform="translate(0,%d) scale(1,-1)" % (2*y))
             content = self.doc.createTextNode(s)
             text.appendChild(content)
@@ -394,11 +394,11 @@
     def line(self, x1, y1, x2, y2):
         if self._strokeColor != None:
             if 0: # something is wrong with line in my SVG viewer...
-                line = transformNode(self.doc, "line", 
-                    x=x1, y=y1, x2=x2, y2=y2, 
+                line = transformNode(self.doc, "line",
+                    x=x1, y=y1, x2=x2, y2=y2,
                     style=self._formatStyle(LINE_STYLES))
                 self.currGroup.appendChild(line)
-            path = transformNode(self.doc, "path", 
+            path = transformNode(self.doc, "path",
                 d="M %f,%f L %f,%f Z" % (x1,y1,x2,y2),
                 style=self._formatStyle(LINE_STYLES))
             self.currGroup.appendChild(path)
@@ -406,20 +406,20 @@
 
     def ellipse(self, x1, y1, x2, y2):
         """Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2.
- 
+
         These should have x1<x2 and y1<y2.
         """
 
-        ellipse = transformNode(self.doc, "ellipse", 
-            cx=(x1+x2)/2.0, cy=(y1+y2)/2.0, rx=(x2-x1)/2.0, ry=(y2-y1)/2.0, 
+        ellipse = transformNode(self.doc, "ellipse",
+            cx=(x1+x2)/2.0, cy=(y1+y2)/2.0, rx=(x2-x1)/2.0, ry=(y2-y1)/2.0,
             style=self._formatStyle(LINE_STYLES))
 
         self.currGroup.appendChild(ellipse)
 
 
     def circle(self, xc, yc, r):
-        circle = transformNode(self.doc, "circle", 
-            cx=xc, cy=yc, r=r, 
+        circle = transformNode(self.doc, "circle",
+            cx=xc, cy=yc, r=r,
             style=self._formatStyle(LINE_STYLES))
 
         self.currGroup.appendChild(circle)
@@ -444,7 +444,7 @@
     def drawArc(self, x1,y1, x2,y2, startAng=0, extent=360, fromcenter=0):
         """Draw a partial ellipse inscribed within the rectangle x1,y1,x2,y2.
 
-        Starting at startAng degrees and covering extent degrees. Angles 
+        Starting at startAng degrees and covering extent degrees. Angles
         start with 0 to the right (+x) and increase counter-clockwise.
         These should have x1<x2 and y1<y2.
         """
@@ -456,7 +456,7 @@
         ax = rx * cos((startAng+extent)*pi/180) + cx
         ay = ry * sin((startAng+extent)*pi/180) + cy
 
-        str = ''        
+        str = ''
         if fromcenter:
             str = str + "M %f, %f L %f, %f " % (cx, cy, ax, ay)
 
@@ -470,7 +470,7 @@
         if fromcenter:
             str = str + "L %f, %f Z " % (cx, cy)
 
-        path = transformNode(self.doc, "path", 
+        path = transformNode(self.doc, "path",
             d=str, style=self._formatStyle())
         self.currGroup.appendChild(path)
 
@@ -484,7 +484,7 @@
             for i in xrange(len(points)):
                 pairs.append("%f %f" % (points[i]))
             pts = string.join(pairs, ', ')
-            polyline = transformNode(self.doc, "polygon", 
+            polyline = transformNode(self.doc, "polygon",
                 points=pts, style=self._formatStyle(LINE_STYLES))
             self.currGroup.appendChild(polyline)
 
@@ -511,7 +511,7 @@
             for i in xrange(len(points)):
                 pairs.append("%f %f" % (points[i]))
             pts = string.join(pairs, ', ')
-            polyline = transformNode(self.doc, "polyline", 
+            polyline = transformNode(self.doc, "polyline",
                 points=pts, style=self._formatStyle(LINE_STYLES))
             self.currGroup.appendChild(polyline)
 
@@ -590,7 +590,7 @@
 
 
     def draw(self, drawing, canvas, x, y, showBoundary=rl_config.showBoundary):
-        """This is the top level function, which draws the drawing at the given 
+        """This is the top level function, which draws the drawing at the given
         location. The recursive part is handled by drawNode.
         """
 
@@ -680,7 +680,7 @@
             #pdfgen roundRect function.  TODO
             self._canvas.roundRect(
                     rect.x, rect.y,
-                    rect.x+rect.width, rect.y+rect.height, 
+                    rect.x+rect.width, rect.y+rect.height,
                     rect.rx, rect.ry
                     )
 
@@ -690,7 +690,7 @@
             S = self._tracker.getState()
             text_anchor, x, y, text = S['textAnchor'], stringObj.x, stringObj.y, stringObj.text
             if not text_anchor in ['start', 'inherited']:
-                font, fontSize = S['fontName'], S['fontSize'] 
+                font, fontSize = S['fontName'], S['fontSize']
                 textLen = stringWidth(text, font,fontSize)
                 if text_anchor=='end':
                     x = x-textLen
@@ -755,7 +755,7 @@
 
         for key, value in delta.items():
             if key == 'transform':
-                pass 
+                pass
                 #self._canvas.transform(value[0], value[1], value[2], value[3], value[4], value[5])
             elif key == 'strokeColor':
                 self._canvas.setStrokeColor(value)
@@ -826,4 +826,4 @@
 if __name__=='__main__':
     test0()
     test1()
-    test2()
+    test2()
\ No newline at end of file
--- a/reportlab/graphics/renderbase.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/renderbase.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/renderbase.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/renderbase.py,v 1.13 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/renderbase.py,v 1.14 2002/07/24 19:56:36 andy_robinson Exp $
 """
 Superclass for renderers to factor out common functionality and default implementations.
 """
@@ -282,4 +282,4 @@
 
 if __name__=='__main__':
     print "this file has no script interpretation"
-    print __doc__
+    print __doc__
\ No newline at end of file
--- a/reportlab/graphics/shapes.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/shapes.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,11 +1,11 @@
 #copyright ReportLab Inc. 2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/shapes.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/shapes.py,v 1.77 2002/07/24 09:38:32 rgbecker Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/shapes.py,v 1.78 2002/07/24 19:56:36 andy_robinson Exp $
 """
 core of the graphics library - defines Drawing and Shapes
 """
-__version__=''' $Id: shapes.py,v 1.77 2002/07/24 09:38:32 rgbecker Exp $ '''
+__version__=''' $Id: shapes.py,v 1.78 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 import string, os, sys
 from math import pi, cos, sin, tan
@@ -760,7 +760,7 @@
 
 class Path(SolidShape):
     """Path, made up of straight lines and bezier curves."""
-    
+
     _attrMap = AttrMap(
         strokeColor = AttrMapValue(isColorOrNone),
         strokeWidth = AttrMapValue(isNumber),
@@ -809,7 +809,7 @@
     O = []
     P = []
     for seg in pathSegs:
-        if type(seg) not in [ListType,TupleType]: 
+        if type(seg) not in [ListType,TupleType]:
             opName = seg
             args = []
         else:
@@ -1154,4 +1154,4 @@
 
 
 if __name__=='__main__':
-    test()
+    test()
\ No newline at end of file
--- a/reportlab/graphics/testdrawings.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/testdrawings.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,7 +2,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/testdrawings.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/testdrawings.py,v 1.2 2001/04/05 09:30:11 rgbecker Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/testdrawings.py,v 1.3 2002/07/24 19:56:36 andy_robinson Exp $
 __version__=''' $Id $ '''
 """This contains a number of routines to generate test drawings
 for reportlab/graphics.  For now they are contrived, but we will expand them
@@ -15,12 +15,12 @@
 
 def getDrawing1():
     """Hello World, on a rectangular background"""
-    
+
     D = Drawing(400, 200)
-    D.add(Rect(50, 50, 300, 100, fillColor=colors.yellow))  #round corners    
+    D.add(Rect(50, 50, 300, 100, fillColor=colors.yellow))  #round corners
     D.add(String(180,100, 'Hello World', fillColor=colors.red))
 
-    
+
     return D
 
 
@@ -29,7 +29,7 @@
     no groups or references.  Each solid shape should have
     a purple fill."""
     D = Drawing(400, 200) #, fillColor=colors.purple)
-    
+
     D.add(Line(10,10,390,190))
     D.add(Circle(100,100,20, fillColor=colors.purple))
     D.add(Circle(200,100,20, fillColor=colors.purple))
@@ -38,7 +38,7 @@
     D.add(Wedge(330,100,40, -10,40, fillColor=colors.purple))
 
     D.add(PolyLine([120,10,130,20,140,10,150,20,160,10,
-                    170,20,180,10,190,20,200,10]))    
+                    170,20,180,10,190,20,200,10]))
 
     D.add(Polygon([300,20,350,20,390,80,300,75, 330, 40]))
 
@@ -48,8 +48,8 @@
                strokeWidth=10,
                strokeColor=colors.red,
                fillColor=colors.yellow))  #square corners
-    
-    D.add(Rect(220, 150, 60, 30, 10, 10))  #round corners    
+
+    D.add(Rect(220, 150, 60, 30, 10, 10))  #round corners
 
     D.add(String(10,50, 'Basic Shapes', fillColor=colors.black))
 
@@ -95,7 +95,7 @@
 ##
 ##        #group attributes
 ##        #strokeColor=colors.blue
-##        )        
+##        )
 ##    D.add(Group2)
 
 ##    return D
@@ -105,10 +105,10 @@
 ##    """This uses a named reference object.  The house is a 'subroutine'
 ##    the basic brick colored walls are defined, but the roof and window
 ##    color are undefined and may be set by the container."""
-##    
+##
 ##    D = Drawing(400, 200, fill=colors.bisque)
 ##
-##    
+##
 ##    House = Group(
 ##        Rect(2,20,36,30, fill=colors.bisque),  #walls
 ##        Polygon([0,20,40,20,20,5]), #roof
@@ -116,8 +116,8 @@
 ##        Rect(25, 38, 8, 7), #window
 ##        Rect(8, 25, 8, 7), #window
 ##        Rect(25, 25, 8, 7) #window
-##        
-##        )        
+##
+##        )
 ##    D.addDef('MyHouse', House)
 ##
 ##    # one row all the same color
@@ -150,8 +150,8 @@
 ##                             fill = color,
 ##                             )
 ##              )
-##        
-##        
+##
+##
 ##    return D
 ##
 ##def getDrawing4():
@@ -170,9 +170,9 @@
 ##            stroke_width=3,
 ##            fill=colors.aqua
 ##            )
-##    D.add(G)    
+##    D.add(G)
 ##
-##    
+##
 ##    D.add(String(10,50, 'Stack Unwinding - should be red, blue, red'))
 ##
 ##    return D
@@ -181,7 +181,7 @@
 ##def getDrawing5():
 ##    """This Rotates Coordinate Axes"""
 ##    D = Drawing(400, 200)
-##    
+##
 ##
 ##
 ##    Axis = Group(
@@ -192,19 +192,19 @@
 ##        Line(0,30,10,30),
 ##        Line(0,40,10,40),
 ##        Line(10,0,10,10), #ticks on x axis
-##        Line(20,0,20,10), 
-##        Line(30,0,30,10), 
-##        Line(40,0,40,10), 
-##        Line(50,0,50,10), 
-##        Line(60,0,60,10), 
-##        Line(70,0,70,10), 
-##        Line(80,0,80,10), 
+##        Line(20,0,20,10),
+##        Line(30,0,30,10),
+##        Line(40,0,40,10),
+##        Line(50,0,50,10),
+##        Line(60,0,60,10),
+##        Line(70,0,70,10),
+##        Line(80,0,80,10),
 ##        Line(90,0,90,10),
 ##        String(20, 35, 'Axes', fill=colors.black)
 ##        )
 ##
-##    D.addDef('Axes', Axis)        
-##    
+##    D.addDef('Axes', Axis)
+##
 ##    D.add(NamedReference('Axis', Axis,
 ##            transform=translate(10,10)))
 ##    D.add(NamedReference('Axis', Axis,
@@ -220,9 +220,9 @@
 ##    C = (colors.black,colors.red,colors.green,colors.blue,colors.brown,colors.gray, colors.pink,
 ##        colors.lavender,colors.lime, colors.mediumblue, colors.magenta, colors.limegreen)
 ##
-##    for i in range(12):    
+##    for i in range(12):
 ##        D.add(String(0, 0, ' - - Rotated Text', fill=C[i%len(C)], transform=mmult(xform, rotate(30*i))))
-##    
+##
 ##    return D
 ##
 ##def getDrawing7():
@@ -233,7 +233,7 @@
 ##
 ##    class MyUserNode(UserNode0):
 ##        import whrandom, math
-##        
+##
 ##
 ##        def provideNode(self, sender):
 ##            """draw a simple chart that changes everytime it's drawn"""
@@ -256,7 +256,7 @@
 ##            return g
 ##
 ##    D = Drawing(400,200, fill=colors.white)  # AR - same size as others
-##    
+##
 ##    D.add(MyUserNode())
 ##
 ##    graphcolor= [colors.green, colors.red, colors.brown, colors.purple]
@@ -287,9 +287,9 @@
 ##    D.add(Line(220,150, 220,200, stroke=colors.red))
 ##    D.add(String(220,180, "Text should be centered", text_anchor="middle") )
 ##
-##    
+##
 ##    return D
-    
+
 
 if __name__=='__main__':
-    print __doc__
+    print __doc__
\ No newline at end of file
--- a/reportlab/graphics/testshapes.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/testshapes.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,7 +2,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/testshapes.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/testshapes.py,v 1.16 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/testshapes.py,v 1.17 2002/07/24 19:56:36 andy_robinson Exp $
 
 # testshapes.py - draws shapes onto a PDF canvas.
 
@@ -45,7 +45,7 @@
     function does something terribly wrong! The box contains
     an attention triangle, plus some error message.
     """
-    
+
     D = Drawing(400, 200)
 
     points = [200,170, 140,80, 260,80]
@@ -70,7 +70,7 @@
     The rectangle's fillColor is yellow.
     The string's fillColor is red.
     """
-    
+
     D = Drawing(400, 200)
     D.add(Rect(50, 50, 300, 100, fillColor=colors.yellow))
     D.add(String(180,100, 'Hello World', fillColor=colors.red))
@@ -84,7 +84,7 @@
     The lines are blue and their strokeWidth is 5 mm.
     One line has a strokeDashArray set to [5, 10, 15].
     """
-    
+
     D = Drawing(400, 200)
     D.add(Line(50,50, 300,100,
                strokeColor=colors.blue,
@@ -109,7 +109,7 @@
     Times-Roman.  Finally, a solitary Courier string at
     the top right corner.
     """
-    
+
     D = Drawing(400, 200)
     for size in range(12, 36, 4):
         D.add(String(10+size*2,
@@ -131,7 +131,7 @@
     Colours are blue, yellow and red from bottom left
     to upper right.
     """
-    
+
     D = Drawing(400, 200)
     i = 0
     for color in (colors.blue, colors.yellow, colors.red):
@@ -147,7 +147,7 @@
 
     Text alignment conforms to the anchors in the left column.
     """
-    
+
     D = Drawing(400, 200)
 
     lineX = 250
@@ -171,9 +171,9 @@
 
     purple = colors.purple
     purple = colors.green
-    
+
     D = Drawing(400, 200) #, fillColor=purple)
-    
+
     D.add(Line(10,10, 390,190))
 
     D.add(Circle(100,100,20, fillColor=purple))
@@ -193,8 +193,8 @@
                strokeWidth=10,
                strokeColor=colors.yellow,
                fillColor=purple))  #square corners
-    
-    D.add(Rect(220, 150, 60, 30, 10, 10, fillColor=purple))  #round corners    
+
+    D.add(Rect(220, 150, 60, 30, 10, 10, fillColor=purple))  #round corners
 
     D.add(String(10,50, 'Basic Shapes', fillColor=colors.black))
 
@@ -214,13 +214,13 @@
         Line(0,30,10,30),
         Line(0,40,10,40),
         Line(10,0,10,10), #ticks on x axis
-        Line(20,0,20,10), 
-        Line(30,0,30,10), 
-        Line(40,0,40,10), 
-        Line(50,0,50,10), 
-        Line(60,0,60,10), 
-        Line(70,0,70,10), 
-        Line(80,0,80,10), 
+        Line(20,0,20,10),
+        Line(30,0,30,10),
+        Line(40,0,40,10),
+        Line(50,0,50,10),
+        Line(60,0,60,10),
+        Line(70,0,70,10),
+        Line(80,0,80,10),
         Line(90,0,90,10),
         String(20, 35, 'Axes', fill=colors.black)
         )
@@ -228,17 +228,17 @@
     firstAxisGroup = Group(Axis)
     firstAxisGroup.translate(10,10)
     D.add(firstAxisGroup)
-    
+
     secondAxisGroup = Group(Axis)
     secondAxisGroup.translate(150,10)
     secondAxisGroup.rotate(15)
-    
+
     D.add(secondAxisGroup)
 
 
     thirdAxisGroup = Group(Axis, transform=mmult(translate(300,10), rotate(30)))
     D.add(thirdAxisGroup)
-   
+
     return D
 
 
@@ -257,13 +257,13 @@
         Line(0,30,10,30),
         Line(0,40,10,40),
         Line(10,0,10,10), #ticks on x axis
-        Line(20,0,20,10), 
-        Line(30,0,30,10), 
-        Line(40,0,40,10), 
-        Line(50,0,50,10), 
-        Line(60,0,60,10), 
-        Line(70,0,70,10), 
-        Line(80,0,80,10), 
+        Line(20,0,20,10),
+        Line(30,0,30,10),
+        Line(40,0,40,10),
+        Line(50,0,50,10),
+        Line(60,0,60,10),
+        Line(70,0,70,10),
+        Line(80,0,80,10),
         Line(90,0,90,10),
         String(20, 35, 'Axes', fill=colors.black)
         )
@@ -271,12 +271,12 @@
     firstAxisGroup = Group(Axis)
     firstAxisGroup.translate(10,10)
     D.add(firstAxisGroup)
-    
+
     secondAxisGroup = Group(Axis)
     secondAxisGroup.translate(150,10)
     secondAxisGroup.scale(1,2)
     D.add(secondAxisGroup)
-    
+
     thirdAxisGroup = Group(Axis)
     thirdAxisGroup.translate(10,125)
     thirdAxisGroup.scale(2,1)
@@ -287,7 +287,7 @@
     fourthAxisGroup.skew(30,0)
     D.add(fourthAxisGroup)
 
-    
+
     return D
 
 def getDrawing09():
@@ -337,14 +337,14 @@
 
     g2 = Group(g1, transform = translate(25,25))
     D.add(g2)
-    
+
     g3 = Group(g2, transform = translate(25,25))
     D.add(g3)
 
     g4 = Group(g3, transform = translate(25,25))
     D.add(g4)
 
-        
+
     return D
 
 from widgets.signsandsymbols import SmileyFace
@@ -420,7 +420,7 @@
 
 def writePDF(drawings):
     "Create and save a PDF file containing some drawings."
-    
+
     pdfPath = os.path.splitext(sys.argv[0])[0] + '.pdf'
     c = Canvas(pdfPath)
     c.setFont('Times-Roman', 32)
@@ -450,7 +450,7 @@
 
     c.save()
     print 'wrote %s ' % pdfPath
-        
+
 
 class ShapesTestCase(unittest.TestCase):
     "Test generating all kinds of shapes."
@@ -466,7 +466,7 @@
         "Do what has to be done after the tests are over."
 
         writePDF(self.drawings)
-    
+
 
     # This should always succeed. If each drawing would be
     # wrapped in a dedicated test method like this one, it
@@ -484,11 +484,11 @@
 
 def makeSuite():
     "Make a test suite for unit testing."
-    
+
     suite = unittest.TestSuite()
     suite.addTest(ShapesTestCase('testAllDrawings'))
     return suite
 
 
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/graphics/widgetbase.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/widgetbase.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/widgetbase.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/widgetbase.py,v 1.31 2002/07/17 22:46:22 andy_robinson Exp $
-__version__=''' $Id: widgetbase.py,v 1.31 2002/07/17 22:46:22 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/graphics/widgetbase.py,v 1.32 2002/07/24 19:56:36 andy_robinson Exp $
+__version__=''' $Id: widgetbase.py,v 1.32 2002/07/24 19:56:36 andy_robinson Exp $ '''
 import string
 
 from reportlab.graphics import shapes
@@ -146,7 +146,7 @@
     def provideNode(self):
         return self.draw()
 
-        
+
 _ItemWrapper={}
 
 class TypedPropertyCollection(PropHolder):
@@ -211,7 +211,7 @@
 
     def __len__(self):
         return len(self._children.keys())
-        
+
     def getProperties(self,recur=1):
         # return any children which are defined and whatever
         # differs from the parent
@@ -250,7 +250,7 @@
 
     A legend could be as simple as a wrapper around a list of style
     properties, where the 'desc' attribute contains a descriptive
-    string and the rest could be used by the legend e.g. to draw 
+    string and the rest could be used by the legend e.g. to draw
     something like a color swatch. The graphical presentation of
     the legend would be its own business, though.
 
@@ -261,7 +261,7 @@
     drawing the bars while a line chart could also use additional
     ones like strokeWidth.
     """
-    
+
     _attrMap = AttrMap(
         strokeWidth = AttrMapValue(isNumber),
         strokeLineCap = AttrMapValue(isNumber),
@@ -279,7 +279,7 @@
 
         for k, v in kwargs.items():
             setattr(self, k, v)
-            
+
 
     def __setattr__(self, name, value):
         "Verify attribute name and value, before setting it."
@@ -416,4 +416,4 @@
 
 
 if __name__=='__main__':
-    test()
+    test()
\ No newline at end of file
--- a/reportlab/graphics/widgets/__init__.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/widgets/__init__.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,5 +1,5 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/widgets/__init__.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/widgets/__init__.py,v 1.3 2002/03/26 11:49:10 rgbecker Exp $
-__version__=''' $Id: __init__.py,v 1.3 2002/03/26 11:49:10 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/graphics/widgets/__init__.py,v 1.4 2002/07/24 19:56:36 andy_robinson Exp $
+__version__=''' $Id: __init__.py,v 1.4 2002/07/24 19:56:36 andy_robinson Exp $ '''
\ No newline at end of file
--- a/reportlab/graphics/widgets/flags.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/widgets/flags.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,6 +1,6 @@
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/widgets/flags.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/widgets/flags.py,v 1.21 2002/07/17 22:46:22 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/widgets/flags.py,v 1.22 2002/07/24 19:56:36 andy_robinson Exp $
 # Flag Widgets - a collection of flags as widgets
 # author: John Precedo (johnp@reportlab.com)
 """This file is a collection of flag graphics as widgets.
@@ -26,7 +26,7 @@
 Others:
 USA, Czech Republic, European Union, Switzerland, Turkey
 """
-__version__=''' $Id: flags.py,v 1.21 2002/07/17 22:46:22 andy_robinson Exp $ '''
+__version__=''' $Id: flags.py,v 1.22 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 from reportlab.lib import colors
 from reportlab.lib.validators import *
@@ -795,4 +795,4 @@
             D = None
 
 if __name__=='__main__':
-    test()
+    test()
\ No newline at end of file
--- a/reportlab/graphics/widgets/grids.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/widgets/grids.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/widgets/grids.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/widgets/grids.py,v 1.25 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: grids.py,v 1.25 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/graphics/widgets/grids.py,v 1.26 2002/07/24 19:56:36 andy_robinson Exp $
+__version__=''' $Id: grids.py,v 1.26 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 from reportlab.lib import colors
 from reportlab.lib.validators import *
@@ -31,7 +31,7 @@
         elif inc < 0 and next <= end:
             break
         L.append(next)
-        
+
     return L
 
 
@@ -94,9 +94,9 @@
     def __init__(self):
         self.x = 0
         self.y = 0
-        self.width = 100 
-        self.height = 100 
-        self.orientation = 'vertical' 
+        self.width = 100
+        self.height = 100
+        self.orientation = 'vertical'
         self.useLines = 0
         self.useRects = 1
         self.delta = 20
@@ -154,12 +154,12 @@
             r.insert(0, start)
         #print 'Grid.makeLinePosList() -> %s' % r
         return r
-    
+
 
     def makeInnerLines(self):
         # inner grid lines
         group = Group()
-        
+
         w, h = self.width, self.height
 
         if self.useLines == 1:
@@ -180,7 +180,7 @@
 
         return group
 
-    
+
     def makeInnerTiles(self):
         # inner grid lines
         group = Group()
@@ -197,7 +197,7 @@
                 r = self.makeLinePosList(self.y, isX=0)
 
             dist = makeDistancesList(r)
-            
+
             i = 0
             for j in range(len(dist)):
                 if self.orientation == 'vertical':
@@ -206,18 +206,18 @@
                 elif self.orientation == 'horizontal':
                     y = r[j]
                     stripe = Rect(self.x, y, w, dist[j])
-                stripe.fillColor = cols[i % len(cols)] 
+                stripe.fillColor = cols[i % len(cols)]
                 stripe.strokeColor = None
                 group.add(stripe)
                 i = i + 1
 
         return group
 
-    
+
     def draw(self):
         # general widget bits
         group = Group()
-        
+
         group.add(self.makeOuterRect())
         group.add(self.makeInnerTiles())
         group.add(self.makeInnerLines())
@@ -248,15 +248,15 @@
     def __init__(self):
         self.x = 0
         self.y = 0
-        self.width = 100 
-        self.height = 100 
+        self.width = 100
+        self.height = 100
 
-        g0 = Grid()        
+        g0 = Grid()
         g0.x = self.x
         g0.y = self.y
-        g0.width = self.width 
-        g0.height = self.height 
-        g0.orientation = 'vertical' 
+        g0.width = self.width
+        g0.height = self.height
+        g0.orientation = 'vertical'
         g0.useLines = 1
         g0.useRects = 0
         g0.delta = 20
@@ -267,12 +267,12 @@
         g0.strokeColor = colors.black
         g0.strokeWidth = 1
 
-        g1 = Grid()        
+        g1 = Grid()
         g1.x = self.x
         g1.y = self.y
-        g1.width = self.width 
-        g1.height = self.height 
-        g1.orientation = 'horizontal' 
+        g1.width = self.width
+        g1.height = self.height
+        g1.orientation = 'horizontal'
         g1.useLines = 1
         g1.useRects = 0
         g1.delta = 20
@@ -310,7 +310,7 @@
         # Order groups to make sure both v and h lines
         # are visible (works only when there is only
         # one kind of stripes, v or h).
-        if g0.useRects == 1 and g1.useRects == 0:       
+        if g0.useRects == 1 and g1.useRects == 0:
             group.add(g0.draw())
             group.add(g1.draw())
         else:
@@ -326,7 +326,7 @@
     Colors are interpolated linearly between 'fillColorStart'
     and 'fillColorEnd', both of which appear at the margins.
     If 'numShades' is set to one, though, only 'fillColorStart'
-    is used.    
+    is used.
     """
 
     _attrMap = AttrMap(
@@ -346,9 +346,9 @@
     def __init__(self):
         self.x = 0
         self.y = 0
-        self.width = 100 
-        self.height = 100 
-        self.orientation = 'vertical' 
+        self.width = 100
+        self.height = 100
+        self.orientation = 'vertical'
         self.numShades = 20
         self.fillColorStart = colors.pink
         self.fillColorEnd = colors.black
@@ -367,20 +367,20 @@
 
     def _flipRectCorners(self):
         "Flip rectangle's corners if width or height is negative."
-        x, y, width, height, fillColorStart, fillColorEnd = self.x, self.y, self.width, self.height, self.fillColorStart, self.fillColorEnd 
+        x, y, width, height, fillColorStart, fillColorEnd = self.x, self.y, self.width, self.height, self.fillColorStart, self.fillColorEnd
         if width < 0 and height > 0:
-            x = x + width 
-            width = -width 
+            x = x + width
+            width = -width
             if self.orientation=='vertical': fillColorStart, fillColorEnd = fillColorEnd, fillColorStart
         elif height<0 and width>0:
-            y = y + height 
-            height = -height 
+            y = y + height
+            height = -height
             if self.orientation=='horizontal': fillColorStart, fillColorEnd = fillColorEnd, fillColorStart
         elif height < 0 and height < 0:
-            x = x + width 
-            width = -width 
-            y = y + height 
-            height = -height 
+            x = x + width
+            width = -width
+            y = y + height
+            height = -height
         return x, y, width, height, fillColorStart, fillColorEnd
 
     def draw(self):
@@ -423,7 +423,7 @@
             stripe.strokeColor = None
             stripe.strokeWidth = 0
             group.add(stripe)
- 
+
 #
         return group
 
@@ -439,4 +439,3 @@
             C.append(colors.linearlyInterpolatedColor(c0,c1,0,lim, i))
     return C
 
-
--- a/reportlab/graphics/widgets/markers.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/widgets/markers.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,11 +1,11 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/widgets/markers.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/widgets/markers.py,v 1.11 2002/07/17 22:46:23 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/widgets/markers.py,v 1.12 2002/07/24 19:56:36 andy_robinson Exp $
 """
 This modules defines a collection of markers used in charts.
 """
-__version__=''' $Id: markers.py,v 1.11 2002/07/17 22:46:23 andy_robinson Exp $ '''
+__version__=''' $Id: markers.py,v 1.12 2002/07/24 19:56:36 andy_robinson Exp $ '''
 from types import FunctionType, ClassType
 from reportlab.graphics.shapes import Rect, Line, Circle, Polygon, Drawing, Group
 from reportlab.graphics.widgets.signsandsymbols import SmileyFace
@@ -212,4 +212,4 @@
 if __name__=='__main__':
     D = Drawing()
     D.add(Marker())
-    D.save(fnRoot='Marker',formats=['pdf'], outDir='/tmp')
+    D.save(fnRoot='Marker',formats=['pdf'], outDir='/tmp')
\ No newline at end of file
--- a/reportlab/graphics/widgets/signsandsymbols.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/graphics/widgets/signsandsymbols.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/graphics/widgets/signsandsymbols.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/graphics/widgets/signsandsymbols.py,v 1.21 2002/07/17 22:46:23 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/graphics/widgets/signsandsymbols.py,v 1.22 2002/07/24 19:56:36 andy_robinson Exp $
 # signsandsymbols.py
 # A collection of new widgets
 # author: John Precedo (johnp@reportlab.com)
@@ -24,7 +24,7 @@
 - ArrowOne, and
 - ArrowTwo
 """
-__version__=''' $Id: signsandsymbols.py,v 1.21 2002/07/17 22:46:23 andy_robinson Exp $ '''
+__version__=''' $Id: signsandsymbols.py,v 1.22 2002/07/24 19:56:36 andy_robinson Exp $ '''
 
 from reportlab.lib import colors
 from reportlab.lib.validators import *
@@ -917,4 +917,4 @@
     print 'wrote file: signsandsymbols.pdf'
 
 if __name__=='__main__':
-    test()
+    test()
\ No newline at end of file
--- a/reportlab/lib/PyFontify.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/PyFontify.py	Wed Jul 24 19:56:39 2002 +0000
@@ -4,13 +4,13 @@
     tags = fontify(pytext, searchfrom, searchto)
 
 The 'pytext' argument is a string containing Python source code.
-The (optional) arguments 'searchfrom' and 'searchto' may contain a slice in pytext. 
+The (optional) arguments 'searchfrom' and 'searchto' may contain a slice in pytext.
 The returned value is a list of tuples, formatted like this:
     [('keyword', 0, 6, None), ('keyword', 11, 17, None), ('comment', 23, 53, None), etc. ]
 The tuple contents are always like this:
     (tag, startindex, endindex, sublist)
 tag is one of 'keyword', 'string', 'comment' or 'identifier'
-sublist is not used, hence always None. 
+sublist is not used, hence always None.
 """
 
 # Based on FontText.py by Mitchell S. Chapman,
@@ -19,7 +19,7 @@
 # Many thanks for regular expression debugging & authoring are due to:
 #   Tim (the-incredib-ly y'rs) Peters and Cristian Tismer
 # So, who owns the copyright? ;-) How about this:
-# Copyright 1996-2001: 
+# Copyright 1996-2001:
 #   Mitchell S. Chapman,
 #   Zachary Roadhouse,
 #   Tim Peters,
@@ -97,14 +97,14 @@
     # Cache a few attributes for quicker reference.
     search = matchRE.search
     idSearch = idRE.search
-    
+
     tags = []
     tags_append = tags.append
     commentTag = 'comment'
     stringTag = 'string'
     keywordTag = 'keyword'
     identifierTag = 'identifier'
-    
+
     start = 0
     end = searchfrom
     while 1:
@@ -152,4 +152,4 @@
     f.close()
     tags = fontify(text)
     for tag, start, end, sublist in tags:
-        print tag, `text[start:end]`
+        print tag, `text[start:end]`
\ No newline at end of file
--- a/reportlab/lib/__init__.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/__init__.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,7 +2,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/__init__.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/__init__.py,v 1.3 2000/12/14 13:39:24 rgbecker Exp $
-__version__=''' $Id: __init__.py,v 1.3 2000/12/14 13:39:24 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/__init__.py,v 1.4 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: __init__.py,v 1.4 2002/07/24 19:56:37 andy_robinson Exp $ '''
 import os
-RL_DEBUG = os.environ.has_key('RL_DEBUG')
+RL_DEBUG = os.environ.has_key('RL_DEBUG')
\ No newline at end of file
--- a/reportlab/lib/abag.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/abag.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/abag.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/abag.py,v 1.7 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: abag.py,v 1.7 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/abag.py,v 1.8 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: abag.py,v 1.8 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 class ABag:
     """
@@ -37,9 +37,9 @@
             L.append(rv)
         L.append(") #"+n)
         return string.join(L, "\n")
-        
+
 if __name__=="__main__":
     AB = ABag(a=1, c="hello")
     CD = AB.clone()
     print AB
-    print CD
+    print CD
\ No newline at end of file
--- a/reportlab/lib/attrmap.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/attrmap.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/attrmap.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/attrmap.py,v 1.5 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: attrmap.py,v 1.5 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/attrmap.py,v 1.6 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: attrmap.py,v 1.6 2002/07/24 19:56:37 andy_robinson Exp $ '''
 from UserDict import UserDict
 from reportlab.lib.validators import isAnything, _SequenceTypes
 
@@ -16,7 +16,7 @@
 
     def __call__(self):
         return apply(self.func,self.args,self.kw)
-        
+
 class AttrMapValue:
     '''Simple multi-value holder for attribute maps'''
     def __init__(self,validate=None,desc=None,initial=None, **kw):
@@ -120,4 +120,4 @@
         obj, attr = _findObjectAndAttr(src,d)
         if obj:
             dA = getattr(obj,'_attrMap',None)
-            assert dA and attr in dA.keys(), 'target attribute %s not in _attrMap' % d
+            assert dA and attr in dA.keys(), 'target attribute %s not in _attrMap' % d
\ No newline at end of file
--- a/reportlab/lib/codecharts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/codecharts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -44,7 +44,7 @@
         self.xlist = []
         for col in range(self.charsPerRow + 2):
             self.xlist.append(col * self.boxSize)
-        
+
     def formatByte(self, byt):
         if self.hex:
             return '%02X' % byt
@@ -82,7 +82,7 @@
         self.canv.rect(0, self.ylist[-2], self.width, self.boxSize, fill=1, stroke=0)
         self.canv.rect(0, 0, self.boxSize, self.ylist[-2], fill=1, stroke=0)
         self.canv.setFillGray(0.0)
-        
+
         #label each row and column
         self.canv.setFont('Helvetica-Oblique',0.375 * self.boxSize)
         byt = 0
@@ -107,7 +107,7 @@
                                         (self.rows + 0.25) * self.boxSize,
                                         topLeft
                                         )
-            
+
 class SingleByteEncodingChart(CodeChartBase):
     def __init__(self, faceName='Helvetica', encodingName='WinAnsiEncoding',
                  charsPerRow=16, boxSize=14, hex=1):
@@ -125,14 +125,14 @@
                                 )
 
         self.calcLayout()
-        
-        
+
+
     def draw(self):
         self.drawLabels()
         charList = [None] * 32 + map(chr, range(32, 256))
         self.drawChars(charList)
         self.canv.grid(self.xlist, self.ylist)
-                    
+
 
 class KutenRowCodeChart(CodeChartBase):
     """Formats one 'row' of the 94x94 space used in many Asian encodings.aliases
@@ -163,7 +163,7 @@
             self.faceName = 'Helvetica'
             self.encodingName = 'WinAnsiEncoding'
         self.fontName = self.faceName + '-' + self.encodingName
-        self.calcLayout()        
+        self.calcLayout()
 
     def makeRow(self, row):
         """Works out the character values for this kuten row"""
@@ -180,15 +180,15 @@
         else:
             cells.append([None] * 94)
         return cells
-                
+
     def draw(self):
         self.drawLabels(topLeft= 'R%d' % self.row)
 
         # work out which characters we need for the row
         #assert string.find(self.encodingName, 'EUC') > -1, 'Only handles EUC encoding today, you gave me %s!' % self.encodingName
-        
+
         # pad out by 1 to match Ken Lunde's tables
-        charList = [None] + self.makeRow(self.row) 
+        charList = [None] + self.makeRow(self.row)
         self.drawChars(charList)
         self.canv.grid(self.xlist, self.ylist)
 
@@ -217,7 +217,7 @@
             self.faceName = 'Helvetica'
             self.encodingName = 'WinAnsiEncoding'
         self.fontName = self.faceName + '-' + self.encodingName
-        self.calcLayout()        
+        self.calcLayout()
 
     def makeRow(self, row):
         """Works out the character values for this Big5 row.
@@ -230,15 +230,15 @@
                     col = y*16+x
                     ch = chr(row) + chr(col)
                     cells.append(ch)
-                
+
         else:
             cells.append([None] * 160)
         return cells
-                
+
     def draw(self):
         self.drawLabels(topLeft='%02X' % self.row)
 
-        charList = self.makeRow(self.row) 
+        charList = self.makeRow(self.row)
         self.drawChars(charList)
         self.canv.grid(self.xlist, self.ylist)
 
@@ -271,7 +271,7 @@
         self.y = 0
         self.width = 160
         self.height = 160
-        
+
     def draw(self):
         dx = self.width / 16.0
         dy = self.height / 16.0
@@ -286,12 +286,12 @@
                                self.y + (self.height - y*dy), chr(charValue))
                     g.add(s)
         return g
-        
+
 
 
-    
+
 
-    
+
 def test():
     c = Canvas('codecharts.pdf')
     c.setFont('Helvetica-Bold', 24)
@@ -324,5 +324,4 @@
 if __name__=='__main__':
     test()
 
-    
-        
\ No newline at end of file
+
--- a/reportlab/lib/colors.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/colors.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/colors.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/colors.py,v 1.34 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: colors.py,v 1.34 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/colors.py,v 1.35 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: colors.py,v 1.35 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 import string, math
 from types import StringType, ListType, TupleType
@@ -38,7 +38,7 @@
 
     def hexval(self):
         return '0x%02x%02x%02x' % tuple(map(lambda x: int(x*255), self.rgb()))
-    
+
 class CMYKColor(Color):
     """This represents colors using the CMYK (cyan, magenta, yellow, black)
     model commonly used in professional printing.  This is implemented
@@ -212,7 +212,7 @@
         g = c0.green+x*(c1.green- c0.green)/dx
         b = c0.blue+x*(c1.blue - c0.blue)/dx
         return Color(r,g,b)
-    elif cname is 'CMYKColor': 
+    elif cname is 'CMYKColor':
         c = c0.cyan+x*(c1.cyan - c0.cyan)/dx
         m = c0.magenta+x*(c1.magenta - c0.magenta)/dx
         y = c0.yellow+x*(c1.yellow - c0.yellow)/dx
@@ -265,7 +265,7 @@
 _CMYK_black=CMYKColor(0,0,0,1)
 _PCMYK_black=PCMYKColor(0,0,0,100)
 
-# Special colors 
+# Special colors
 ReportLabBlue =     HexColor(0x4e5688)
 ReportLabLightBlue = HexColor(0xb7b9d3)
 
@@ -544,4 +544,4 @@
         b = _PCMYK_black
     elif isinstance(c,CMYKColor): w = _CMYK_black
     else: b = black
-    return linearlyInterpolatedColor(b, c, 0, 1, f)
+    return linearlyInterpolatedColor(b, c, 0, 1, f)
\ No newline at end of file
--- a/reportlab/lib/corp.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/corp.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,11 +2,11 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/corp.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/corp.py,v 1.9 2002/07/17 22:46:23 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/lib/corp.py,v 1.10 2002/07/24 19:56:37 andy_robinson Exp $
 """ This module includes some reusable routines for ReportLab's
  'Corporate Image' - the logo, standard page backdrops and
  so on - you are advised to do the same for your own company!"""
-__version__=''' $Id: corp.py,v 1.9 2002/07/17 22:46:23 andy_robinson Exp $ '''
+__version__=''' $Id: corp.py,v 1.10 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 from reportlab.lib.units import inch,cm
 from reportlab.lib.validators import *
@@ -187,12 +187,12 @@
 
 class ReportLabLogo:
     """vector reportlab logo centered in a 250x by 150y rectangle"""
-    
+
     def __init__(self, atx=0, aty=0, width=2.5*inch, height=1.5*inch, powered_by=0):
         self.origin = (atx, aty)
         self.dimensions = (width, height)
         self.powered_by = powered_by
-        
+
     def draw(self, canvas):
         from reportlab.graphics import renderPDF
         canvas.saveState()
@@ -217,7 +217,7 @@
     _attrMap = AttrMap(
         fillColor = AttrMapValue(isColorOrNone),
         strokeColor = AttrMapValue(isColorOrNone),
-        altStrokeColor = AttrMapValue(isColorOrNone), 
+        altStrokeColor = AttrMapValue(isColorOrNone),
         x = AttrMapValue(isNumber),
         y = AttrMapValue(isNumber),
         height = AttrMapValue(isNumber),
@@ -301,7 +301,7 @@
         g2 = Group()
         rl=RL_CorpLogo()
         rl.height = 1.25*cm
-        rl.width = 1.9*cm   
+        rl.width = 1.9*cm
         rl.draw()
         g2.add(rl)
         g.add(g2)
@@ -372,7 +372,7 @@
                             textAnchor = 'start',
                             text = self.name))
 
-        ty1 = ty-10*1.2 
+        ty1 = ty-10*1.2
 
         g.add(String(x = self.borderWidth+(self.borderWidth/5.0),
                             y = ty1-8,
@@ -417,4 +417,4 @@
     D.save(fnRoot='RL_BusinessCard',formats=['pdf'])
 
 if __name__=='__main__':
-    test()
+    test()
\ No newline at end of file
--- a/reportlab/lib/enums.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/enums.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,12 +1,12 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/enums.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/enums.py,v 1.2 2000/10/25 08:57:45 rgbecker Exp $
-__version__=''' $Id: enums.py,v 1.2 2000/10/25 08:57:45 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/enums.py,v 1.3 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: enums.py,v 1.3 2002/07/24 19:56:37 andy_robinson Exp $ '''
 __doc__="""
 holder for all reportlab's enumerated types
 """
 TA_LEFT = 0
 TA_CENTER = 1
 TA_RIGHT = 2
-TA_JUSTIFY = 4
+TA_JUSTIFY = 4
\ No newline at end of file
--- a/reportlab/lib/fonts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/fonts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,8 +2,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/fonts.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/fonts.py,v 1.13 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: fonts.py,v 1.13 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/fonts.py,v 1.14 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: fonts.py,v 1.14 2002/07/24 19:56:37 andy_robinson Exp $ '''
 import string, sys, os
 ###############################################################################
 #   A place to put useful font stuff
@@ -34,13 +34,13 @@
             ('courier', 1, 0) :'Courier-Bold',
             ('courier', 0, 1) :'Courier-Oblique',
             ('courier', 1, 1) :'Courier-BoldOblique',
-            
+
             ('helvetica', 0, 0) :'Helvetica',
             ('helvetica', 1, 0) :'Helvetica-Bold',
             ('helvetica', 0, 1) :'Helvetica-Oblique',
             ('helvetica', 1, 1) :'Helvetica-BoldOblique',
 
-            # there is only one Symbol font         
+            # there is only one Symbol font
             ('symbol', 0, 0) :'Symbol',
             ('symbol', 1, 0) :'Symbol',
             ('symbol', 0, 1) :'Symbol',
@@ -87,4 +87,4 @@
             if not _ps2tt_map.has_key(k):
                 _ps2tt_map[string.lower(v)] = k
     elif _tt2ps_map[k]!=psname:
-        raise ValueError, "_tt2ps_map[%s]==%s already, not %s" % (repr(k), _tt2ps_map[k], psname)
+        raise ValueError, "_tt2ps_map[%s]==%s already, not %s" % (repr(k), _tt2ps_map[k], psname)
\ No newline at end of file
--- a/reportlab/lib/formatters.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/formatters.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,8 +2,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/formatters.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/formatters.py,v 1.6 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: formatters.py,v 1.6 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/formatters.py,v 1.7 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: formatters.py,v 1.7 2002/07/24 19:56:37 andy_robinson Exp $ '''
 __doc__="""
 These help format numbers and dates in a user friendly way.
 
@@ -71,7 +71,7 @@
         if self.suffix:
             strBody = strBody + self.suffix
         return strBody
-    
+
     def __repr__(self):
         return "%s(places=%d, decimalSep=%s, thousandSep=%s, prefix=%s, suffix=%s)" % (
                     self.__class__.__name__,
@@ -98,4 +98,4 @@
     t(1000.1,'1000.1',1)
     t(1000.55,'1000.6',1)
     t(1000.449,'1000.4',-1)
-    t(1000.45,'1000',0)
+    t(1000.45,'1000',0)
\ No newline at end of file
--- a/reportlab/lib/logger.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/logger.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,8 +2,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/logger.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/logger.py,v 1.4 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: logger.py,v 1.4 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/logger.py,v 1.5 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: logger.py,v 1.5 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 from sys import stderr
 class Logger:
@@ -59,4 +59,4 @@
         self.once(warning)
 
 warnOnce=WarnOnce()
-infoOnce=WarnOnce('Info')
+infoOnce=WarnOnce('Info')
\ No newline at end of file
--- a/reportlab/lib/normalDate.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/normalDate.py	Wed Jul 24 19:56:39 2002 +0000
@@ -10,7 +10,7 @@
 # derived from an original version created
 # by Jeff Bauer of Rubicon Research and used
 # with his kind permission
-__version__=''' $Id: normalDate.py,v 1.6 2002/07/17 22:46:23 andy_robinson Exp $ '''
+__version__=''' $Id: normalDate.py,v 1.7 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 
 
@@ -83,7 +83,7 @@
 
     1.0 - No changes, except the version number.  After 3 years of use
             by various parties I think we can consider it stable.
-    0.8 - added Prof. Stephen Walton's suggestion for a range method 
+    0.8 - added Prof. Stephen Walton's suggestion for a range method
             - module author resisted the temptation to use lambda <0.5 wink>
     0.7 - added Dan Winkler's suggestions for __add__, __sub__ methods
     0.6 - modifications suggested by Kevin Digweed to fix:
@@ -138,7 +138,7 @@
         return self.__class__(self.normalDate)
 
     def __cmp__(self, target):
-        if target is None: 
+        if target is None:
             return 1
         elif not hasattr(target, 'normalDate'):
             return 1
@@ -174,7 +174,7 @@
 
     def daysBetweenDates(self, normalDate):
         """
-        return value may be negative, since calculation is 
+        return value may be negative, since calculation is
         self.scalar() - arg
         """
         if type(normalDate) is _NDType:
@@ -253,8 +253,8 @@
         {MMMMM} --> first character of monthname
         {D}     --> day of month as digit
         {DD}    --> 2 digit day of month
-        {DDD}   --> abrreviated weekday name 
-        {DDDD}  --> weekday name 
+        {DDD}   --> abrreviated weekday name
+        {DDDD}  --> weekday name
         '''
         r = fmt[:]
         f = 0
@@ -280,7 +280,7 @@
 
     def isLeapYear(self):
         """
-        determine if specified year is leap year, returning true (1) or 
+        determine if specified year is leap year, returning true (1) or
         false (0)
         """
         return isLeapYear(self.year())
@@ -440,7 +440,7 @@
 
     def setNormalDate(self, normalDate):
         """
-        accepts date as scalar string/integer (yyyymmdd) or tuple 
+        accepts date as scalar string/integer (yyyymmdd) or tuple
         (year, month, day, ...)"""
         tn=type(normalDate)
         if tn is IntType:
@@ -600,4 +600,4 @@
     print today.formatMS('{d}/{mmmm}/{yy}')
     print today.formatMS('{d}/{m}/{yyyy}')
     b = BusinessDate('20010116')
-    print 'b=',b,'b.scalar()', b.scalar()
+    print 'b=',b,'b.scalar()', b.scalar()
\ No newline at end of file
--- a/reportlab/lib/pagesizes.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/pagesizes.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,12 +2,12 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/pagesizes.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/pagesizes.py,v 1.9 2002/07/17 22:46:23 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/lib/pagesizes.py,v 1.10 2002/07/24 19:56:37 andy_robinson Exp $
 
 """This module defines a few common page sizes in points (1/72 inch).
 To be expanded to include things like label sizes, envelope windows
 etc."""
-__version__=''' $Id: pagesizes.py,v 1.9 2002/07/17 22:46:23 andy_robinson Exp $ '''
+__version__=''' $Id: pagesizes.py,v 1.10 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 from reportlab.lib.units import cm, inch
 
@@ -53,4 +53,4 @@
     if a >= b:
         return (b, a)
     else:
-        return (a, b)
+        return (a, b)
\ No newline at end of file
--- a/reportlab/lib/randomtext.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/randomtext.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,9 +2,9 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/randomtext.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/randomtext.py,v 1.8 2002/07/17 22:46:23 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/lib/randomtext.py,v 1.9 2002/07/24 19:56:37 andy_robinson Exp $
 
-__version__=''' $Id: randomtext.py,v 1.8 2002/07/17 22:46:23 andy_robinson Exp $ '''
+__version__=''' $Id: randomtext.py,v 1.9 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 import string
 
@@ -32,7 +32,7 @@
 
     This prints a random number of random sentences (up to a limit
     of ten) using the theme 'PYTHON'.
-    
+
 """
 
 #theme one :-)
@@ -52,7 +52,7 @@
     'DOS', 'file system', 'FreeBSD', 'Freeware', 'GEOS', 'GNU',
     'Hurd', 'Linux', 'Mach', 'Macintosh OS', 'mailing lists', 'Minix',
     'Multics', 'NetWare', 'NextStep', 'OS/2', 'Plan 9', 'Realtime',
-    'UNIX', 'VMS', 'Windows', 'X Windows', 'Xinu', 'security', 'Intel', 
+    'UNIX', 'VMS', 'Windows', 'X Windows', 'Xinu', 'security', 'Intel',
     'encryption', 'PGP' , 'software', 'ActiveX', 'AppleScript', 'awk',
     'BETA', 'COBOL', 'Delphi', 'Dylan', 'Eiffel', 'extreme programming',
     'Forth', 'Fortran', 'functional languages', 'Guile', 'format your hard drive',
@@ -62,9 +62,9 @@
     'Pascal', 'Perl', 'PL/I', 'PostScript', 'Prolog', 'hardware', 'Blue Screen of Death',
     'Rexx', 'RPG', 'Scheme', 'scripting languages', 'Smalltalk', 'crash!', 'disc crash',
     'Spanner', 'SQL', 'Tcl/Tk', 'TeX', 'TOM', 'Visual', 'Visual Basic', '4GL',
-    'VRML', 'Virtual Reality Modeling Language', 'difference engine', '...went into "yo-yo mode"', 
+    'VRML', 'Virtual Reality Modeling Language', 'difference engine', '...went into "yo-yo mode"',
     'Sun', 'Sun Microsystems', 'Hewlett Packard', 'output device',
-    'CPU', 'memory', 'registers', 'monitor', 'TFT display', 'plasma screen', 
+    'CPU', 'memory', 'registers', 'monitor', 'TFT display', 'plasma screen',
     'bug report', '"mis-feature"', '...millions of bugs!', 'pizza',
     '"illiterate programming"','...lots of pizza!', 'pepperoni pizza',
     'coffee', 'Jolt Cola[TM]', 'beer', 'BEER!']
@@ -123,7 +123,7 @@
     'Red Alert!', 'warp-core breech', '"All hands abandon ship! This is not a drill!"']
 
 #theme six - print-related terms
-PRINTING = ['points', 'picas', 'leading', 'kerning', 'CMYK', 'offset litho', 
+PRINTING = ['points', 'picas', 'leading', 'kerning', 'CMYK', 'offset litho',
     'type', 'font family', 'typography', 'type designer',
     'baseline', 'white-out type', 'WOB', 'bicameral', 'bitmap',
     'blockletter', 'bleed', 'margin', 'body', 'widow', 'orphan',
@@ -163,7 +163,7 @@
           "You're a very silly man and I'm not going to interview you.", "No Mungo... never kill a customer."
           "And I'd like to conclude by putting my finger up my nose",
           "egg and Spam", "egg bacon and Spam", "egg bacon sausage and Spam", "Spam bacon sausage and Spam",
-          "Spam egg Spam Spam bacon and Spam", "Spam sausage Spam Spam Spam bacon Spam tomato and Spam", 
+          "Spam egg Spam Spam bacon and Spam", "Spam sausage Spam Spam Spam bacon Spam tomato and Spam",
           "Spam Spam Spam egg and Spam", "Spam Spam Spam Spam Spam Spam baked beans Spam Spam Spam",
           "Spam!!", "I don't like Spam!!!", "You can't have egg, bacon, Spam and sausage without the Spam!",
           "I'll have your Spam. I Love it!",
@@ -206,4 +206,3 @@
             output = output + ' ' +word
         output = output+'. '
     return output
-
--- a/reportlab/lib/sequencer.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/sequencer.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/sequencer.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/sequencer.py,v 1.11 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: sequencer.py,v 1.11 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/sequencer.py,v 1.12 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: sequencer.py,v 1.12 2002/07/24 19:56:37 andy_robinson Exp $ '''
 """This module defines a single public class, Sequencer, which aids in
 numbering and formatting lists."""
 #
@@ -279,4 +279,4 @@
 
 
 if __name__=='__main__':
-    test()
+    test()
\ No newline at end of file
--- a/reportlab/lib/setup.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/setup.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,7 +2,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/setup.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/setup.py,v 1.13 2002/07/17 22:46:23 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/lib/setup.py,v 1.14 2002/07/24 19:56:37 andy_robinson Exp $
 if __name__=='__main__': #NO RUNTESTS
     import os, sys
     from distutils.core import setup, Extension
@@ -54,4 +54,4 @@
                 if os.path.isfile(dstf):
                     os.remove(dstf)
                 os.rename(os.path.join(src,f),dstf)
-        MovePYDs('sgmlop.pyd','_rl_accel.pyd','pyHnj.pyd')
+        MovePYDs('sgmlop.pyd','_rl_accel.pyd','pyHnj.pyd')
\ No newline at end of file
--- a/reportlab/lib/styles.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/styles.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/styles.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/styles.py,v 1.14 2001/03/17 15:22:25 rgbecker Exp $
-__version__=''' $Id: styles.py,v 1.14 2001/03/17 15:22:25 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/styles.py,v 1.15 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: styles.py,v 1.15 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 from reportlab.lib.colors import white, black
 from reportlab.lib.enums import TA_LEFT, TA_CENTER
@@ -26,7 +26,7 @@
         if parent:
             assert parent.__class__ == self.__class__, "Parent style must have same class as new style"
 
-        #step two 
+        #step two
         self.name = name
         self.parent = parent
         self.__dict__.update(self.defaults)
@@ -35,8 +35,8 @@
         # very strict that only keys in class defaults are
         # allowed, so they cannot inherit
         self.refresh()
-        
-        #step three - copy keywords if any                    
+
+        #step three - copy keywords if any
         for (key, value) in kw.items():
              self.__dict__[key] = value
 
@@ -64,7 +64,7 @@
         for key in keylist:
             value = self.__dict__.get(key, None)
             print indent + '%s = %s' % (key, value)
-            
+
 class ParagraphStyle(PropertySet):
     defaults = {
         'fontName':'Times-Roman',
@@ -143,11 +143,11 @@
                 raise KeyError, "Style '%s' already defined in stylesheet" % alias
             if self.byAlias.has_key(alias):
                 raise KeyError, "Alias name '%s' is already an alias in stylesheet" % alias
-        #passed all tests?  OK, add it    
+        #passed all tests?  OK, add it
         self.byName[key] = style
         if alias:
             self.byAlias[alias] = style
-     
+
     def list(self):
         styles = self.byName.items()
         styles.sort()
@@ -159,8 +159,8 @@
             print name, alias
             style.listAttrs('    ')
             print
-            
-        
+
+
 
 
 def testStyles():
@@ -220,7 +220,7 @@
                                   spaceBefore=12,
                                   spaceAfter=6),
                    alias='h2')
-    
+
     stylesheet.add(ParagraphStyle(name='Heading3',
                                   parent=stylesheet['Normal'],
                                   fontName = 'Times-BoldItalic',
@@ -252,7 +252,6 @@
                                   leading=8.8,
                                   firstLineIndent=0,
                                   leftIndent=36))
-    
-    
+
+
     return stylesheet
-
--- a/reportlab/lib/tocindex.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/tocindex.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,8 +2,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/tocindex.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/tocindex.py,v 1.8 2001/11/26 21:49:01 andy_robinson Exp $
-__version__=''' $Id: tocindex.py,v 1.8 2001/11/26 21:49:01 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/tocindex.py,v 1.9 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: tocindex.py,v 1.9 2002/07/24 19:56:37 andy_robinson Exp $ '''
 __doc__=''
 """
 This module will contain standard Table of Contents and Index objects.
@@ -290,4 +290,4 @@
     #change this to depth=3 for a BIG document
     story = getSampleStory(depth=2)
 
-    doc.multiBuild(story, 'tocindex.pdf')
+    doc.multiBuild(story, 'tocindex.pdf')
\ No newline at end of file
--- a/reportlab/lib/units.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/units.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,8 +2,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/units.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/units.py,v 1.5 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: units.py,v 1.5 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/units.py,v 1.6 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: units.py,v 1.6 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 inch = 72.0
 cm = inch / 2.54
@@ -21,4 +21,4 @@
         if s[-4:]=='pica': return float(s[:-2])*pica
         return float(s)
     except:
-        raise ValueError, "Can't convert '%s' to length" % s
+        raise ValueError, "Can't convert '%s' to length" % s
\ No newline at end of file
--- a/reportlab/lib/utils.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/utils.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/utils.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/utils.py,v 1.35 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: utils.py,v 1.35 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/utils.py,v 1.36 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: utils.py,v 1.36 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 import string, os, sys
 from types import *
@@ -183,8 +183,8 @@
     '''Intended as a simple report back encapsulator
 
     Typical usages
-    1) To record error data     
-        dbg = DebugMemo(fn='dbgmemo.dbg',myVar=value)       
+    1) To record error data
+        dbg = DebugMemo(fn='dbgmemo.dbg',myVar=value)
         dbg.add(anotherPayload='aaaa',andagain='bbb')
         dbg.dump()
 
@@ -326,4 +326,4 @@
         self.store['__payload'][name] = value
 
     def __getitem__(self,name):
-        return self.store['__payload'][name]
+        return self.store['__payload'][name]
\ No newline at end of file
--- a/reportlab/lib/validators.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/validators.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/validators.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/validators.py,v 1.22 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: validators.py,v 1.22 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/lib/validators.py,v 1.23 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: validators.py,v 1.23 2002/07/24 19:56:37 andy_robinson Exp $ '''
 """
 This module contains some standard verifying functions which can be
 used in an attribute map.
@@ -77,7 +77,7 @@
 
     def normalize(self,x):
         return int(x)
-    
+
 class _isNumberOrNone(_isNumber):
     def test(self,x):
         return x is None or isNumber(x)
@@ -249,4 +249,4 @@
 isNoneOrListOfNoneOrNumbers=SequenceOf(isNumberOrNone,'isNoneOrListOfNoneOrNumbers',NoneOK=1)
 isCallable = _isCallable()
 isStringOrCallable=EitherOr((isString,isCallable),'isStringOrCallable')
-isStringOrCallableOrNone=NoneOr(isStringOrCallable,'isStringOrCallableNone')
+isStringOrCallableOrNone=NoneOr(isStringOrCallable,'isStringOrCallableNone')
\ No newline at end of file
--- a/reportlab/lib/xmllib.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/xmllib.py	Wed Jul 24 19:56:39 2002 +0000
@@ -768,4 +768,4 @@
 
 
 if __name__ == '__main__': #NO_REPORTLAB_TEST
-    test()
+    test()
\ No newline at end of file
--- a/reportlab/lib/yaml.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/lib/yaml.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/yaml.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/lib/yaml.py,v 1.3 2002/03/27 10:39:22 rgbecker Exp $
+#$Header: /tmp/reportlab/reportlab/lib/yaml.py,v 1.4 2002/07/24 19:56:37 andy_robinson Exp $
 # parses "Yet Another Markup Language" into a list of tuples.
 # Each tuple says what the data is e.g.
 # ('Paragraph', 'Heading1', 'Why Reportlab Rules')
@@ -15,7 +15,7 @@
 The general rule is that if a line begins with a '.',
 it requires special processing. Otherwise lines
 are concatenated to paragraphs, and blank lines
-separate paragraphs. 
+separate paragraphs.
 
 If the line ".foo bar bletch" is encountered,
 it immediately ends and writes out any current
@@ -38,7 +38,7 @@
 dot endPre
 - ends a preformatted object.
 """
-__version__=''' $Id: yaml.py,v 1.3 2002/03/27 10:39:22 rgbecker Exp $ '''
+__version__=''' $Id: yaml.py,v 1.4 2002/07/24 19:56:37 andy_robinson Exp $ '''
 
 
 import sys
@@ -56,21 +56,21 @@
     This defines the line-handling abilities and basic mechanism.
     The class YAMLParser includes capabilities for a fairly rich
     story."""
-    
+
     def __init__(self):
         self.reset()
-        
+
     def reset(self):
         self._lineNo = 0
         self._style = 'Normal'  # the default
         self._results = []
         self._buf = []
         self._mode = PLAIN
-        
+
     def parseFile(self, filename):
         #returns list of objects
         data = open(filename, 'r').readlines()
-        
+
         for line in data:
             #strip trailing newlines
             self.readLine(line[:-1])
@@ -84,8 +84,8 @@
             self.readLine(line)
         self.endPara()
         return self._results
-    
-    def readLine(self, line):    
+
+    def readLine(self, line):
         #this is the inner loop
         self._lineNo = self._lineNo + 1
         stripped = string.lstrip(line)
@@ -99,7 +99,7 @@
             self.endPara()
             words = string.split(stripped[1:])
             cmd, args = words[0], words[1:]
-    
+
             #is it a parser method?
             if hasattr(self.__class__, cmd):
                 method = eval('self.'+cmd)
@@ -121,11 +121,11 @@
                 self._buf.append(data)
         else:
             #we have data, add to para
-            self._buf.append(line)            
+            self._buf.append(line)
 
     def endPara(self):
         #ends the current paragraph, or preformatted block
-            
+
         text = string.join(self._buf, ' ')
         if text:
             if self._mode == PREFORMATTED:
@@ -140,7 +140,7 @@
     def beginPre(self, stylename):
         self._mode = PREFORMATTED
         self._style = stylename
-        
+
     def endPre(self):
         self.endPara()
         self._mode = PLAIN
@@ -158,7 +158,7 @@
     def vSpace(self, points):
         """Inserts a vertical spacer"""
         self._results.append(('VSpace', points))
-        
+
     def pageBreak(self):
         """Inserts a frame break"""
         self._results.append(('PageBreak','blah'))  # must be a tuple
@@ -179,11 +179,11 @@
     p = Parser()
     return p.parseText(textBlock)
 
-        
+
 if __name__=='__main__': #NORUNTESTS
     if len(sys.argv) <> 2:
         results = parseText(__doc__)
     else:
         results = parseFile(sys.argv[1])
     import pprint
-    pprint.pprint(results)
+    pprint.pprint(results)
\ No newline at end of file
--- a/reportlab/pdfbase/__init__.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfbase/__init__.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfbase/__init__.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfbase/__init__.py,v 1.5 2000/10/25 08:57:45 rgbecker Exp $
-__version__=''' $Id: __init__.py,v 1.5 2000/10/25 08:57:45 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/pdfbase/__init__.py,v 1.6 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: __init__.py,v 1.6 2002/07/24 19:56:37 andy_robinson Exp $ '''
 __doc__="""
-"""
+"""
\ No newline at end of file
--- a/reportlab/pdfbase/_cidfontdata.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfbase/_cidfontdata.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,7 +2,7 @@
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfbase/_cidfontdata.py?cvsroot=reportlab
 #$Header $
-__version__=''' $Id: _cidfontdata.py,v 1.8 2001/11/06 03:02:43 andy_robinson Exp $ '''
+__version__=''' $Id: _cidfontdata.py,v 1.9 2002/07/24 19:56:37 andy_robinson Exp $ '''
 __doc__="""
 This defines additional static data to support CID fonts.
 
@@ -80,7 +80,7 @@
                         #extensions, Script Manager Code 3
     'UniKS-UCS2-H',     #Unicode (UCS-2) encoding for the Adobe-Korea1 character collection
     'UniKS-UCS2-V'      #Vertical version of UniKS-UCS2-H
-    
+
     ]
 
 encodings_chs = [
@@ -138,7 +138,7 @@
 
             #there could be several descendant fonts if it is an old-style
             #type 0 compound font.  For CID fonts there is just one.
-            'DescendantFonts': [{  
+            'DescendantFonts': [{
                 'Type':'/Font',
                 'Subtype':'/CIDFontType0',
                 'BaseFont':'/HeiseiMin-W3',
@@ -435,7 +435,7 @@
             }
 
 
-            
+
 #shift-jis saying 'This is Heisei-Minchou'
 message1 =  '\202\261\202\352\202\315\225\275\220\254\226\276\222\251\202\305\202\267\201B'
 message2 = '\202\261\202\352\202\315\225\275\220\254\212p\203S\203V\203b\203N\202\305\202\267\201B'
@@ -449,4 +449,4 @@
 ##            out.append(word)
 ##        else:
 ##            out.append(word + ',')
-##    return eval(string.join(out, ''))
+##    return eval(string.join(out, ''))
\ No newline at end of file
--- a/reportlab/pdfbase/_fontdata.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfbase/_fontdata.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,8 +2,8 @@
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfbase/_fontdata.py?cvsroot=reportlab
 #$Header $
-__version__=''' $Id: _fontdata.py,v 1.11 2002/07/17 22:46:23 andy_robinson Exp $ '''
-__doc__=""" 
+__version__=''' $Id: _fontdata.py,v 1.12 2002/07/24 19:56:37 andy_robinson Exp $ '''
+__doc__="""
     database of font related things
     standardFonts       tuple of the 14 standard string font names
     standardEncodings   tuple of the known standard font names
@@ -2541,4 +2541,4 @@
  'a97': 392,
  'a98': 392,
  'a99': 668,
- 'space': 278}
+ 'space': 278}
\ No newline at end of file
--- a/reportlab/pdfbase/cidfonts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfbase/cidfonts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,7 +2,7 @@
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfbase/cidfonts?cvsroot=reportlab
 #$Header $
-__version__=''' $Id: cidfonts.py,v 1.9 2001/10/21 23:48:15 andy_robinson Exp $ '''
+__version__=''' $Id: cidfonts.py,v 1.10 2002/07/24 19:56:37 andy_robinson Exp $ '''
 __doc__="""CID (Asian multi-byte) font support.
 
 This defines classes to represent CID fonts.  They know how to calculate
@@ -30,7 +30,7 @@
         if os.path.isfile(cmapfile):
             return cmapfile
     raise IOError, 'CMAP file for encodings "%s" not found!' % name
-    
+
 def structToPDF(structure):
     "Converts deeply nested structure to PDFdoc dictionary/array objects"
     if type(structure) is DictType:
@@ -83,7 +83,7 @@
         hasher = md5.new()
         hasher.update(text)
         return hasher.digest()
-            
+
     def parseCMAPFile(self, name):
         """This is a tricky one as CMAP files are Postscript
         ones.  Some refer to others with a 'usecmap'
@@ -92,7 +92,7 @@
         cmapfile = findCMapFile(name)
         # this will CRAWL with the unicode encodings...
         rawdata = open(cmapfile, 'r').read()
-        
+
         self._mapFileHash = self._hash(rawdata)
         #if it contains the token 'usecmap', parse the other
         #cmap file first....
@@ -109,7 +109,7 @@
             # now continue parsing this, as it may
             # override some settings
 
-        
+
         words = split(rawdata)
         while words <> []:
             if words[0] == 'begincodespacerange':
@@ -143,7 +143,7 @@
                         self._cmap[start + offset] = value + offset
                         offset = offset + 1
                     words = words[3:]
-                
+
             else:
                 words = words[1:]
         finished = time.clock()
@@ -185,7 +185,7 @@
             else:
                 lastChar = char
         return output
-    
+
     def fastSave(self, directory):
         f = open(os.path.join(directory, self.name + '.fastmap'), 'wb')
         marshal.dump(self._mapFileHash, f)
@@ -193,7 +193,7 @@
         marshal.dump(self._notDefRanges, f)
         marshal.dump(self._cmap, f)
         f.close()
-        
+
     def fastLoad(self, directory):
         started = time.clock()
         f = open(os.path.join(directory, self.name + '.fastmap'), 'rb')
@@ -204,8 +204,8 @@
         f.close()
         finished = time.clock()
         #print 'loaded %s in %0.4f seconds' % (self.name, finished - started)
-        
-        
+
+
 class CIDTypeFace(pdfmetrics.TypeFace):
     """Multi-byte type face.
 
@@ -222,7 +222,7 @@
         try:
             fontDict = CIDFontInfo[name]
         except KeyError:
-            raise KeyError, ("Unable to find information on CID typeface '%s'" % name + 
+            raise KeyError, ("Unable to find information on CID typeface '%s'" % name +
                             "Only the following font names work:" + repr(allowedTypeFaces)
                              )
         descFont = fontDict['DescendantFonts'][0]
@@ -234,7 +234,7 @@
         # should really support self.glyphWidths, self.glyphNames
         # but not done yet.
 
-        
+
     def _expandWidths(self, compactWidthArray):
         """Expands Adobe nested list structure to get a dictionary of widths.
 
@@ -291,8 +291,8 @@
 
         # need to know if it is vertical or horizontal
         self.isVertical = (self.encodingName[-1] == 'V')
-        
-            
+
+
     def stringWidth(self, text, size):
         cidlist = self.encoding.translate(text)
         if self.isVertical:
@@ -319,12 +319,12 @@
         #convert to PDF dictionary/array objects
         cidObj = structToPDF(bigDict)
 
-        # link into document, and add to font map        
+        # link into document, and add to font map
         r = doc.Reference(cidObj, internalName)
         fontDict = doc.idToObject['BasicFonts'].dict
         fontDict[internalName] = r
         doc.fontMapping[self.name] = '/' + internalName
-        
+
 
 
 def precalculate(cmapdir):
@@ -341,7 +341,7 @@
             continue
         enc.fastSave(cmapdir)
         print 'saved %s.fastmap' % file
-    
+
 def test():
     # only works if you have cirrect encodings on your box!
     c = Canvas('test_japanese.pdf')
@@ -350,7 +350,7 @@
 
     pdfmetrics.registerFont(CIDFont('HeiseiMin-W3','90ms-RKSJ-H'))
     pdfmetrics.registerFont(CIDFont('HeiseiKakuGo-W5','90ms-RKSJ-H'))
-        
+
 
     # the two typefaces
     c.setFont('HeiseiMin-W3-90ms-RKSJ-H', 16)
@@ -373,7 +373,7 @@
     encName = '90ms-RKSJ-H'
     enc = CIDEncoding(encName)
     print message1, '->', enc.translate(message1)
-    
+
     f = CIDFont('HeiseiMin-W3','90ms-RKSJ-H')
     print 'width = %0.2f' % f.stringWidth(message1, 10)
 
@@ -391,11 +391,10 @@
 ##        print '    mapping size = %d' % len(enc._cmap)
 ##    finished = time.time()
 ##    print 'constructed all encodings in %0.2f seconds' % (finished - started)
-    
+
 if __name__=='__main__':
     test()
 
-    
 
 
 
--- a/reportlab/pdfbase/pdfdoc.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfbase/pdfdoc.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfbase/pdfdoc.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfbase/pdfdoc.py,v 1.68 2002/07/21 08:18:44 andy_robinson Exp $
-__version__=''' $Id: pdfdoc.py,v 1.68 2002/07/21 08:18:44 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/pdfbase/pdfdoc.py,v 1.69 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: pdfdoc.py,v 1.69 2002/07/24 19:56:37 andy_robinson Exp $ '''
 __doc__="""
 The module pdfdoc.py handles the 'outer structure' of PDF documents, ensuring that
 all objects are properly cross-referenced and indexed to the nearest byte.  The
@@ -31,7 +31,7 @@
     # version_info into a string
     version_info = (1,5,2,'unknown',0)
 
-    
+
 if platform[:4] == 'java' and version_info[:2] == (2, 1):
     # workaround for list()-bug in Jython 2.1 (should be fixed in 2.2)
     def list(sequence):
@@ -1776,4 +1776,4 @@
 
 
 if __name__=="__main__":
-    print "There is no script interpretation for pdfdoc."
+    print "There is no script interpretation for pdfdoc."
\ No newline at end of file
--- a/reportlab/pdfbase/pdfform.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfbase/pdfform.py	Wed Jul 24 19:56:39 2002 +0000
@@ -72,13 +72,13 @@
 
 def selectFieldAbsolute(canvas, title, value, options, x, y, width, height):
     """Place a select field (drop down list) on the current page
-        with name title and 
+        with name title and
         with options listed in the sequence options
         default value value (must be one of options)
         at ABSOLUTE position (x,y) with dimensions (width, height)."""
     theform = getForm(canvas)
     theform.selectField(canvas, title, value, options, x, y, x+width, y+height)
-    
+
 def selectFieldRelative(canvas, title, value, options, xR, yR, width, height):
     "same as textFieldAbsolute except the x and y are relative to the canvas coordinate transform"
     (xA, yA) = canvas.absolutePosition(xR,yR)
@@ -132,7 +132,7 @@
         cat = d._catalog
         cat.AcroForm = theform
         return theform
-    
+
 class AcroForm:
     def __init__(self):
         self.fields = []
@@ -620,7 +620,7 @@
     return result
 
 APDOFF = ButtonStream('0.749 g 0 0 16.7704 14.907 re f'+LINEEND)
-APDYES = ButtonStream( 
+APDYES = ButtonStream(
 '0.749 g 0 0 16.7704 14.907 re f q 1 1 14.7704 12.907 re W '+
 'n BT /ZaDb 11.3086 Tf 0 g  1 0 0 1 3.6017 3.3881 Tm (4) Tj ET'+LINEEND)
 APNYES = ButtonStream(
@@ -629,4 +629,4 @@
 #==== script interpretation
 
 if __name__=="__main__":
-    test1()
+    test1()
\ No newline at end of file
--- a/reportlab/pdfbase/pdfmetrics.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfbase/pdfmetrics.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,7 +2,7 @@
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfbase/pdfmetrics.py?cvsroot=reportlab
 #$Header $
-__version__=''' $Id: pdfmetrics.py,v 1.55 2002/07/17 22:46:23 andy_robinson Exp $ '''
+__version__=''' $Id: pdfmetrics.py,v 1.56 2002/07/24 19:56:37 andy_robinson Exp $ '''
 __doc__="""
 This provides a database of font metric information and
 efines Font, Encoding and TypeFace classes aimed at end users.
@@ -197,8 +197,8 @@
             if topDict['FontName'] == faceName:
                 return possible
     return None
-            
-        
+
+
 
 #for faceName in standardFonts:
 #    registerTypeFace(TypeFace(faceName))
@@ -331,7 +331,7 @@
 
         # multi byte fonts do their own stringwidth calculations.
         # signal this here.
-        self._multiByte = 0 
+        self._multiByte = 0
 
     def _calcWidths(self):
         """Vector of widths for stringWidth function"""
@@ -735,4 +735,4 @@
 
 if __name__=='__main__':
     test()
-    testStringWidthAlgorithms()
+    testStringWidthAlgorithms()
\ No newline at end of file
--- a/reportlab/pdfbase/pdfpattern.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfbase/pdfpattern.py	Wed Jul 24 19:56:39 2002 +0000
@@ -10,7 +10,7 @@
     def __init__(self, pattern_sequence, **keywordargs):
         """
         Description of a kind of PDF object using a pattern.
-        
+
         Pattern sequence should contain strings or singletons of form [string].
         Strings are literal strings to be used in the object.
         Singletons are names of keyword arguments to include.
@@ -56,5 +56,4 @@
                     L.append( str(value) )
         return string.join(L, "")
 
-    
-                
\ No newline at end of file
+
--- a/reportlab/pdfbase/pdfutils.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfbase/pdfutils.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfbase/pdfutils.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfbase/pdfutils.py,v 1.31 2002/05/23 16:24:43 rgbecker Exp $
-__version__=''' $Id: pdfutils.py,v 1.31 2002/05/23 16:24:43 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/pdfbase/pdfutils.py,v 1.32 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: pdfutils.py,v 1.32 2002/07/24 19:56:37 andy_robinson Exp $ '''
 __doc__=''
 # pdfutils.py - everything to do with images, streams,
 # compression, and some constants
@@ -47,14 +47,14 @@
         assert(len(raw) == imgwidth * imgheight, "Wrong amount of data for image")
         compressed = zlib.compress(raw)   #this bit is very fast...
         encoded = _AsciiBase85Encode(compressed) #...sadly this isn't
-        
+
         #write in blocks of 60 characters per line
         outstream = getStringIO(encoded)
         dataline = outstream.read(60)
         while dataline <> "":
             code.append(dataline)
             dataline = outstream.read(60)
-        
+
         code.append('EI')
         if returnInMemory: return code
 
@@ -87,7 +87,7 @@
                 print 'cached version of %s already exists' % filename
         else:
             cacheImageFile(filename)
-        
+
 
 def cachedImageExists(filename):
     """Determines if a cached image already exists for a given file.
@@ -105,7 +105,7 @@
             return 1
     else:
         return 0
-    
+
 
 ##############################################################
 #
@@ -202,28 +202,28 @@
         a PDF file.  Four bytes of binary data become five bytes of
         ASCII.  This is the default method used for encoding images."""
         outstream = getStringIO()
-        # special rules apply if not a multiple of four bytes.  
+        # special rules apply if not a multiple of four bytes.
         whole_word_count, remainder_size = divmod(len(input), 4)
         cut = 4 * whole_word_count
         body, lastbit = input[0:cut], input[cut:]
-        
+
         for i in range(whole_word_count):
             offset = i*4
             b1 = ord(body[offset])
             b2 = ord(body[offset+1])
             b3 = ord(body[offset+2])
             b4 = ord(body[offset+3])
-        
+
             if b1<128:
                 num = (((((b1<<8)|b2)<<8)|b3)<<8)|b4
             else:
                 num = 16777216L * b1 + 65536 * b2 + 256 * b3 + b4
-    
+
             if num == 0:
                 #special case
                 outstream.write('z')
             else:
-                #solve for five base-85 numbers                            
+                #solve for five base-85 numbers
                 temp, c5 = divmod(num, 85)
                 temp, c4 = divmod(temp, 85)
                 temp, c3 = divmod(temp, 85)
@@ -234,11 +234,11 @@
                 outstream.write(chr(c3+33))
                 outstream.write(chr(c4+33))
                 outstream.write(chr(c5+33))
-    
+
         # now we do the final bit at the end.  I repeated this separately as
         # the loop above is the time-critical part of a script, whereas this
         # happens only once at the end.
-    
+
         #encode however many bytes we have as usual
         if remainder_size > 0:
             while len(lastbit) < 4:
@@ -247,22 +247,22 @@
             b2 = ord(lastbit[1])
             b3 = ord(lastbit[2])
             b4 = ord(lastbit[3])
-    
+
             num = 16777216L * b1 + 65536 * b2 + 256 * b3 + b4
-    
+
             #solve for c1..c5
             temp, c5 = divmod(num, 85)
             temp, c4 = divmod(temp, 85)
             temp, c3 = divmod(temp, 85)
             c1, c2 = divmod(temp, 85)
-    
+
             #print 'encoding: %d %d %d %d -> %d -> %d %d %d %d %d' % (
             #    b1,b2,b3,b4,num,c1,c2,c3,c4,c5)
             lastword = chr(c1+33) + chr(c2+33) + chr(c3+33) + chr(c4+33) + chr(c5+33)
             #write out most of the bytes.
             outstream.write(lastword[0:remainder_size + 1])
-    
-        #terminator code for ascii 85    
+
+        #terminator code for ascii 85
         outstream.write('~>')
         return outstream.getvalue()
 
@@ -290,13 +290,13 @@
 
     #may have 'z' in it which complicates matters - expand them
     stripped = replace(stripped,'z','!!!!!')
-    # special rules apply if not a multiple of five bytes.  
+    # special rules apply if not a multiple of five bytes.
     whole_word_count, remainder_size = divmod(len(stripped), 5)
     #print '%d words, %d leftover' % (whole_word_count, remainder_size)
     #assert remainder_size <> 1, 'invalid Ascii 85 stream!'
     cut = 5 * whole_word_count
     body, lastbit = stripped[0:cut], stripped[cut:]
-    
+
     for i in range(whole_word_count):
         offset = i*5
         c1 = ord(body[offset]) - 33
@@ -305,7 +305,7 @@
         c4 = ord(body[offset+3]) - 33
         c5 = ord(body[offset+4]) - 33
 
-        num = ((85L**4) * c1) + ((85**3) * c2) + ((85**2) * c3) + (85*c4) + c5    
+        num = ((85L**4) * c1) + ((85**3) * c2) + ((85**2) * c3) + (85*c4) + c5
 
         temp, b4 = divmod(num,256)
         temp, b3 = divmod(temp,256)
@@ -316,7 +316,7 @@
         outstream.write(chr(b2))
         outstream.write(chr(b3))
         outstream.write(chr(b4))
-        
+
     #decode however many bytes we have as usual
     if remainder_size > 0:
         while len(lastbit) < 5:
@@ -348,7 +348,7 @@
             lastword = ''
         outstream.write(lastword)
 
-    #terminator code for ascii 85    
+    #terminator code for ascii 85
     return outstream.getvalue()
 
 
@@ -366,7 +366,7 @@
 
     return join(output, LINEEND)
 
-    
+
 #########################################################################
 #
 #  JPEG processing code - contributed by Eric Johnson
@@ -408,7 +408,7 @@
                 if x[0] != 8:
                     raise 'PDFError', ' JPEG must have 8 bits per component'
                 y = struct.unpack('BB', image.read(2))
-                height = (y[0] << 8) + y[1] 
+                height = (y[0] << 8) + y[1]
                 y = struct.unpack('BB', image.read(2))
                 width =  (y[0] << 8) + y[1]
                 y = struct.unpack('B', image.read(1))
@@ -421,4 +421,4 @@
                 #skip segments with parameters
                 #read length and skip the data
                 x = struct.unpack('BB', image.read(2))
-                image.seek( (x[0] << 8) + x[1] - 2, 1)
+                image.seek( (x[0] << 8) + x[1] - 2, 1)
\ No newline at end of file
--- a/reportlab/pdfbase/ttfonts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfbase/ttfonts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfbase/ttfonts.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfbase/ttfonts.py,v 1.3 2002/07/24 19:22:17 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/pdfbase/ttfonts.py,v 1.4 2002/07/24 19:56:37 andy_robinson Exp $
 """TrueType font support
 
 This defines classes to represent TrueType fonts.  They know how to calculate
@@ -56,7 +56,7 @@
 Canvas and TextObject have special support for dynamic fonts.
 """
 
-__version__ = '$Id: ttfonts.py,v 1.3 2002/07/24 19:22:17 andy_robinson Exp $'
+__version__ = '$Id: ttfonts.py,v 1.4 2002/07/24 19:56:37 andy_robinson Exp $'
 
 import string
 from types import StringType
@@ -107,7 +107,7 @@
     return result
 
 def makeToUnicodeCMap(fontname, subset):
-    """Creates a ToUnicode CMap for a given subset.  See Adobe 
+    """Creates a ToUnicode CMap for a given subset.  See Adobe
     _PDF_Reference (ISBN 0-201-75839-3) for more information."""
     cmap = [
         "/CIDInit /ProcSet findresource begin",
@@ -657,7 +657,7 @@
         # the original font.  Also build a mapping of UCS codes to
         # glyph values in the new font.
 
-        # Start with 0 -> 0: "missing character" 
+        # Start with 0 -> 0: "missing character"
         glyphMap = [0]                  # new glyph index -> old glyph index
         glyphSet = {0:0}                # old glyph index -> new glyph index
         codeToGlyph = {}                # unicode -> new glyph index
@@ -744,7 +744,7 @@
         cmap = apply(pack, [">%dH" % len(cmap)] + cmap)
         output.add('cmap', cmap)
 
-        # hmtx - Horizontal Metrics 
+        # hmtx - Horizontal Metrics
         hmtx = []
         for n in range(numGlyphs):
             originalGlyphIdx = glyphMap[n]
@@ -1007,4 +1007,4 @@
         self.nextCode = 0
         self.subsets = []
         self.internalName = None
-        self.frozen = 0
+        self.frozen = 0
\ No newline at end of file
--- a/reportlab/pdfgen/__init__.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfgen/__init__.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,6 +1,6 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfgen/__init__.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfgen/__init__.py,v 1.5 2000/10/25 08:57:45 rgbecker Exp $
-__version__=''' $Id: __init__.py,v 1.5 2000/10/25 08:57:45 rgbecker Exp $ '''
-__doc__=''
+#$Header: /tmp/reportlab/reportlab/pdfgen/__init__.py,v 1.6 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: __init__.py,v 1.6 2002/07/24 19:56:37 andy_robinson Exp $ '''
+__doc__=''
\ No newline at end of file
--- a/reportlab/pdfgen/canvas.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfgen/canvas.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,9 +1,9 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfgen/canvas.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfgen/canvas.py,v 1.103 2002/05/28 15:06:55 rgbecker Exp $
-__version__=''' $Id: canvas.py,v 1.103 2002/05/28 15:06:55 rgbecker Exp $ '''
-__doc__=""" 
+#$Header: /tmp/reportlab/reportlab/pdfgen/canvas.py,v 1.104 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: canvas.py,v 1.104 2002/07/24 19:56:37 andy_robinson Exp $ '''
+__doc__="""
 The Canvas object is the primary interface for creating PDF files. See
 doc/userguide.pdf for copious examples.
 """
@@ -66,33 +66,33 @@
 class Canvas:
     """This class is the programmer's interface to the PDF file format.  Methods
     are (or will be) provided here to do just about everything PDF can do.
-    
+
     The underlying model to the canvas concept is that of a graphics state machine
     that at any given point in time has a current font, fill color (for figure
     interiors), stroke color (for figure borders), line width and geometric transform, among
     many other characteristics.
-    
+
     Canvas methods generally either draw something (like canvas.line) using the
     current state of the canvas or change some component of the canvas
     state (like canvas.setFont).  The current state can be saved and restored
     using the saveState/restoreState methods.
-    
+
     Objects are "painted" in the order they are drawn so if, for example
     two rectangles overlap the last draw will appear "on top".  PDF form
     objects (supported here) are used to draw complex drawings only once,
     for possible repeated use.
-    
+
     There are other features of canvas which are not visible when printed,
     such as outlines and bookmarks which are used for navigating a document
     in a viewer.
-    
+
     Here is a very silly example usage which generates a Hello World pdf document.
-    
+
     from reportlab.pdfgen import canvas
     c = canvas.Canvas("hello.pdf")
     from reportlab.lib.units import inch
     # move the origin up and to the left
-    c.translate(inch,inch) 
+    c.translate(inch,inch)
     # define a large font
     c.setFont("Helvetica", 80)
     # choose some colors
@@ -109,7 +109,7 @@
     c.showPage()
     c.save()
     """
-    
+
     def __init__(self,filename,
                  pagesize=(595.27,841.89),
                  bottomup = 1,
@@ -128,7 +128,7 @@
 
         #this is called each time a page is output if non-null
         self._onPage = None
-        
+
         self._pagesize = pagesize
         #self._currentPageHasImages = 0
         self._pageTransition = None
@@ -143,7 +143,7 @@
         self._annotationCount = 0
 
         self._outlines = [] # list for a name tree
-        
+
         #PostScript has the origin at bottom left. It is easy to achieve a top-
         #down coord system by translating to the top of the page and setting y
         #scale to -1, but then text is inverted.  So self.bottomup is used
@@ -166,8 +166,8 @@
         self._leading = 14.4
         self._currentMatrix = (1., 0., 0., 1., 0., 0.)
         self._fillMode = 0   #even-odd
-        
-        #text state        
+
+        #text state
         self._charSpace = 0
         self._wordSpace = 0
         self._horizScale = 100
@@ -176,7 +176,7 @@
         self._textLineMatrix = (1., 0., 0., 1., 0., 0.)
         self._textMatrix = (1., 0., 0., 1., 0., 0.)
 
-        # line drawing        
+        # line drawing
         self._lineCap = 0
         self._lineJoin = 0
         self._lineDash = None  #not done
@@ -187,7 +187,7 @@
         self._strokeColorRGB = (0,0,0)
 
     def push_state_stack(self):
-        
+
         state = {}
         d = self.__dict__
         for name in self.STATE_ATTRIBUTES:
@@ -196,7 +196,7 @@
         #del state["state_stack"]
         self.state_stack.append(state)
         return
-        
+
         stateatts = self.STATE_ATTRIBUTES # list based alternative (not used)
         staterange = self.STATE_RANGE
         state = list(staterange)
@@ -206,7 +206,7 @@
         self.state_stack.append(state)
 
     def pop_state_stack(self):
-        
+
         state = self.state_stack[-1]
         del self.state_stack[-1]
         d = self.__dict__
@@ -214,7 +214,7 @@
         #    d[name] = state[name] #setattr(self, name, state[name])
         d.update(state)
         return
-        
+
         stateatts = self.STATE_ATTRIBUTES # list based alternative (not used)
         staterange = self.STATE_RANGE
         d = self.__dict__
@@ -229,7 +229,7 @@
     STATE_RANGE = range(len(STATE_ATTRIBUTES))
 
         #self._addStandardFonts()
-        
+
     def _make_preamble(self):
         # yuk
         iName = self._doc.getInternalFontName('Helvetica')
@@ -255,13 +255,13 @@
         """Adds a new entry to the outline at given level.  If LEVEL not specified,
         entry goes at the top level.  If level specified, it must be
         no more than 1 greater than the outline level in the last call.
-        
+
         The key must be the (unique) name of a bookmark.
         the title is the (non-unique) name to be displayed for the entry.
-        
+
         If closed is set then the entry should show no subsections by default
         when displayed.
-        
+
         Example
            c.addOutlineEntry("first section", "section1")
            c.addOutlineEntry("introduction", "s1s1", 1, closed=1)
@@ -277,7 +277,7 @@
            c.addOutlineEntry("detail2", "s2s2s2", 2)
            c.addOutlineEntry("conclusion", "s2s3", 1)
            c.addOutlineEntry("further reading", "s2s3s1", 2)
-           
+
         generated outline looks like
             - first section
             |- introduction
@@ -291,9 +291,9 @@
             |+ body
             |- conclusion
             |  |- further reading
-           
+
         Note that the second "body" is closed.
-        
+
         Note that you can jump from level 5 to level 3 but not
         from 3 to 5: instead you need to provide all intervening
         levels going down (4 in this case).  Note that titles can
@@ -302,7 +302,7 @@
         #to be completed
         #self._outlines.append(title)
         self._doc.outline.addOutlineEntry(key, level, title, closed=closed)
-        
+
     def setOutlineNames0(self, *nametree):   # keep this for now (?)
         """nametree should can be a recursive tree like so
            c.setOutlineNames(
@@ -320,27 +320,27 @@
         """
         #print nametree
         apply(self._doc.outline.setNames, (self,)+nametree)
-        
+
     def setTitle(self, title):
         """write a title into the PDF file that won't automatically display
            in the document itself."""
         self._doc.setTitle(title)
-        
+
     def setSubject(self, subject):
         """write a subject into the PDF file that won't automatically display
            in the document itself."""
         self._doc.setSubject(subject)
-        
+
     def pageHasData(self):
         "Info function - app can call it after showPage to see if it needs a save"
         return len(self._code) == 0
-        
+
     def showOutline(self):
         """Specify that Acrobat Reader should start with the outline tree visible.
         showFullScreen() and showOutline() conflict; the one called last
         wins."""
         self._doc._catalog.showOutline()
-    
+
     def showFullScreen0(self):
         """Specify that Acrobat Reader should start in full screen mode.
         showFullScreen() and showOutline() conflict; the one called last
@@ -375,14 +375,14 @@
 
     def setPageCallBack(self, func):
         """func(pageNum) will be called on each page end.
-        
+
        This is mainly a hook for progress monitoring.
         Call setPageCallback(None) to clear a callback."""
         self._onPage = func
-        
+
     def _setAnnotations(self,page):
         page.Annots = self._annotationrefs
-        
+
     def _setXObjects(self, thing):
         """for pages and forms, define the XObject dictionary for resources, if needed"""
         forms = self._formsinuse
@@ -391,7 +391,7 @@
             thing.XObjects = xobjectsdict
         else:
             thing.XObjects = None
-            
+
     def _bookmarkReference(self, name):
         """get a reference to a (possibly undefined, possibly unbound) bookmark"""
         d = self._destinations
@@ -400,7 +400,7 @@
         except:
             result = d[name] = pdfdoc.Destination(name) # newly defined, unbound
         return result
-        
+
     def bookmarkPage(self, key):
         """bind a bookmark (destination) to the current page"""
         # XXXX there are a lot of other ways a bookmark destination can be bound: should be implemented.
@@ -411,7 +411,7 @@
         dest.fit()
         dest.setPage(pageref) # formatter won't make a ref to a ref
         return dest
-        
+
     def bookmarkHorizontalAbsolute(self, key, yhorizontal):
         """Bind a bookmark (destination) to the current page at a horizontal position.
            Note that the yhorizontal of the book mark is with respect to the default
@@ -431,15 +431,15 @@
         """w.r.t. the current transformation, bookmark this horizontal."""
         (xt, yt) = self.absolutePosition(relativeX,relativeY)
         self.bookmarkHorizontalAbsolute(key, yt)
-        
+
     #def _inPage0(self):  disallowed!
     #    """declare a page, enable page features"""
     #    self._doc.inPage()
-        
+
     #def _inForm0(self):
     #    "deprecated in favore of beginForm...endForm"
     #    self._doc.inForm()
-            
+
     def doForm(self, name):
         """use a form XObj in current operation stream.
 
@@ -502,12 +502,12 @@
         self._currentPageHasImages = 1
 
         # first, generate a unique name/signature for the image.  If ANYTHING
-        # is different, even the mask, this should be different.  
+        # is different, even the mask, this should be different.
         if type(image) == type(''):
             #filename, use it
             name = _digester('%s%s' % (image, mask))
         else:
-            rawdata = image.convert('RGB').tostring()            
+            rawdata = image.convert('RGB').tostring()
             name = _digester(rawdata)
 
         # in the pdf document, this will be prefixed with something to
@@ -522,7 +522,7 @@
             self._doc.Reference(imgObj, regName)
             self._doc.addForm(name, imgObj)
 
-        # ensure we have a size, as PDF will make it 1x1 pixel otherwise!        
+        # ensure we have a size, as PDF will make it 1x1 pixel otherwise!
         if width is None:
             width = imgObj.width
         if height is None:
@@ -535,11 +535,11 @@
         self._code.append("/%s Do" % regName)
         self.restoreState()
 
-        # track what's been used on this page        
+        # track what's been used on this page
         self._formsinuse.append(name)
-        
+
         return (imgObj.width, imgObj.height)
-    
+
     def _restartAccumulators(self):
         if self._codeStack:
             # restore the saved code
@@ -562,7 +562,7 @@
         self._formsinuse = []
         self._annotationrefs = []
         self._formData = None
-        
+
     def beginForm(self, name, lowerx=0, lowery=0, upperx=None, uppery=None):
         """declare the current graphics stream to be a named form.
            A graphics stream can either be a page or a form, not both.
@@ -580,7 +580,7 @@
         self._formData = (name, lowerx, lowery, upperx, uppery)
         self._doc.inForm()
         #self._inForm0()
-        
+
     def endForm(self):
         """emit the current collection of graphics operations as a Form
            as declared previously in beginForm."""
@@ -606,7 +606,7 @@
     #def forceCodeInsert0(self, code):
     #    """I know a whole lot about PDF and I want to add a bunch of code I know will work..."""
     #    self._code.append(code)
-        
+
     def textAnnotation0(self, contents, Rect=None, addtopage=1, name=None, **kw):
         """Experimental.
         """
@@ -615,7 +615,7 @@
             Rect = (0,0,w,h)
         annotation = apply(pdfdoc.TextAnnotation, (Rect, contents), kw)
         self._addAnnotation(annotation, name, addtopage)
-        
+
     def inkAnnotation0(self, contents, InkList=None, Rect=None, addtopage=1, name=None, **kw):
         "Experimental"
         (w,h) = self._pagesize
@@ -625,20 +625,20 @@
             InkList = ( (100,100,100,h-100,w-100,h-100,w-100,100), )
         annotation = apply(pdfdoc.InkAnnotation, (Rect, contents, InkList), kw)
         self.addAnnotation(annotation, name, addtopage)
-    
+
     def linkAbsolute(self, contents, destinationname, Rect=None, addtopage=1, name=None, **kw):
         """rectangular link annotation positioned wrt the default user space.
            The identified rectangle on the page becomes a "hot link" which
            when clicked will send the viewer to the page and position identified
            by the destination.
-           
+
            Rect identifies (lowerx, lowery, upperx, uppery) for lower left
            and upperright points of the rectangle.  Translations and other transforms
            are IGNORED (the rectangular position is given with respect
            to the default user space.
            destinationname should be the name of a bookmark (which may be defined later
            but must be defined before the document is generated).
-           
+
            You may want to use the keyword argument Border='[0 0 0]' to
            suppress the visible rectangle around the during viewing link."""
         destination = self._bookmarkReference(destinationname) # permitted to be undefined... must bind later...
@@ -705,7 +705,7 @@
         ann["Subtype"] = PDFName("Link")
         ann["Rect"] = PDFArray(rect) # the whole page for testing
 
-        # the action is a separate dictionary            
+        # the action is a separate dictionary
         A = PDFDictionary()
         A["Type"] = PDFName("Action") # not needed?
         A["S"] = PDFName("URI")
@@ -730,7 +730,7 @@
         self._doc.addAnnotation(name, annotation)
         if addtopage:
             self._annotatePage(name)
-            
+
     def _annotatePage(self, name):
         ref = self._doc.refAnnotation(name)
         self._annotationrefs.append(ref)
@@ -738,12 +738,12 @@
     def getPageNumber(self):
         "get the page number for the current page being generated."
         return self._pageNumber
-        
+
     def save(self):
         """Saves and close the PDF document in the file.
            If there is current data a ShowPage is executed automatically.
            After this operation the canvas must not be used further."""
-        if len(self._code):  
+        if len(self._code):
             self.showPage()
 
         self._doc.SaveToFile(self._filename, self)
@@ -864,7 +864,7 @@
 
     def saveState(self):
         """Save the current graphics state to be restored later by restoreState.
-        
+
         For example:
             canvas.setFont("Helvetica", 20)
             canvas.saveState()
@@ -877,7 +877,7 @@
         #"""These need expanding to save/restore Python's state tracking too"""
         self.push_state_stack()
         self._code.append('q')
-        
+
     def restoreState(self):
         """restore the graphics state to the matching saved state (see saveState)."""
         #"""These need expanding to save/restore Python's state tracking too"""
@@ -906,7 +906,7 @@
 
     def line(self, x1,y1, x2,y2):
         """draw a line segment from (x1,y1) to (x2,y2) (with color, thickness and
-        other attributes determined by the current graphics state)."""     
+        other attributes determined by the current graphics state)."""
         self._code.append('n %s m %s l S' % (fp_str(x1, y1), fp_str(x2, y2)))
 
     def lines(self, linelist):
@@ -915,7 +915,7 @@
                |
              -- --
                |
-        
+
              crosshairs = [(20,0,20,10), (20,30,20,40), (0,20,10,20), (30,20,40,20)]
              canvas.lines(crosshairs)
         """
@@ -948,11 +948,11 @@
         starting at startAng degrees and covering extent degrees.   Angles
         start with 0 to the right (+x) and increase counter-clockwise.
         These should have x1<x2 and y1<y2.
-        
+
         Contributed to piddlePDF by Robert Kern, 28/7/99.
         Trimmed down by AR to remove color stuff for pdfgen.canvas and
         revert to positive coordinates.
-        
+
         The algorithm is an elliptical generalization of the formulae in
         Jim Fitzsimmon's TeX tutorial <URL: http://www.tinaja.com/bezarc1.pdf>."""
 
@@ -969,17 +969,17 @@
     def rect(self, x, y, width, height, stroke=1, fill=0):
         "draws a rectangle with lower left corner at (x,y) and width and height as given."
         self._code.append('n %s re ' % fp_str(x, y, width, height)
-                          + PATH_OPS[stroke, fill, self._fillMode])        
-    
+                          + PATH_OPS[stroke, fill, self._fillMode])
+
     def ellipse(self, x1, y1, x2, y2, stroke=1, fill=0):
         """Draw an ellipse defined by an enclosing rectangle.
 
         Note that (x1,y1) and (x2,y2) are the corner points of
         the enclosing rectangle.
-        
+
         Uses bezierArc, which conveniently handles 360 degrees.
         Special thanks to Robert Kern."""
-        
+
         pointList = pdfgeom.bezierArc(x1,y1, x2,y2, 0, 360)
         #move to first point
         self._code.append('n %s m' % fp_str(pointList[0][:2]))
@@ -987,7 +987,7 @@
             self._code.append('%s c' % fp_str(curve[2:]))
         #finish
         self._code.append(PATH_OPS[stroke, fill, self._fillMode])
-        
+
     def wedge(self, x1,y1, x2,y2, startAng, extent, stroke=1, fill=0):
         """Like arc, but connects to the centre of the ellipse.
         Most useful for pie charts and PacMan!"""
@@ -995,7 +995,7 @@
         x_cen  = (x1+x2)/2.
         y_cen  = (y1+y2)/2.
         pointList = pdfgeom.bezierArc(x1,y1, x2,y2, startAng, extent)
-  
+
         self._code.append('n %s m' % fp_str(x_cen, y_cen))
         # Move the pen to the center of the rectangle
         self._code.append('%s l' % fp_str(pointList[0][:2]))
@@ -1022,7 +1022,7 @@
         #to a circle. There are six relevant points on the x axis and y axis.
         #sketch them and it should all make sense!
         t = 0.4472 * radius
-        
+
         x0 = x
         x1 = x0 + t
         x2 = x0 + radius
@@ -1045,17 +1045,17 @@
         self._code.append('%s l' % fp_str(x5, y3))  # right edge
         self._code.append('%s c'
                          % fp_str(x5, y4, x4, y5, x3, y5)) # top right
-        
+
         self._code.append('%s l' % fp_str(x2, y5))  # top row
         self._code.append('%s c'
                          % fp_str(x1, y5, x0, y4, x0, y3)) # top left
-        
+
         self._code.append('%s l' % fp_str(x0, y2))  # left edge
         self._code.append('%s c'
                          % fp_str(x0, y1, x1, y0, x2, y0)) # bottom left
 
         self._code.append('h')  #close off, although it should be where it started anyway
-        
+
         self._code.append(PATH_OPS[stroke, fill, self._fillMode])
 
         ##################################################
@@ -1074,7 +1074,7 @@
          Takes 4 arguments between 0.0 and 1.0"""
          self._fillColorCMYK = (c, m, y, k)
          self._code.append('%s k' % fp_str(c, m, y, k))
-         
+
     def setStrokeColorCMYK(self, c, m, y, k):
          """set the stroke color useing negative color values
             (cyan, magenta, yellow and darkness value).
@@ -1102,10 +1102,10 @@
         t = self.beginText(x - 0.5*width, y)
         t.textLine(text)
         self.drawText(t)
-  
+
     def getAvailableFonts(self):
         """Returns the list of PostScript font names available.
-        
+
         Standard set now, but may grow in future with font embedding."""
         fontnames = self._doc.getAvailableFonts()
         fontnames.sort()
@@ -1114,7 +1114,7 @@
     def addFont(self, fontObj):
         "add a new font for subsequent use."
         self._doc.addFont(fontObj)
- 
+
     def _addStandardFonts(self):
         """Ensures the standard 14 fonts are available in the system encoding.
         Called by canvas on initialization"""
@@ -1151,7 +1151,7 @@
             logger.warnOnce('encoding argument to Canvas.stringWidth is deprecated and has no effect!')
         #if encoding is None: encoding = self._doc.encoding
         return pdfmetrics.stringWidth(text, fontName, fontSize)
-        
+
     # basic graphics modes
 
     def setLineWidth(self, width):
@@ -1163,13 +1163,13 @@
         assert mode in (0,1,2), "Line caps allowed: 0=butt,1=round,2=square"
         self._lineCap = mode
         self._code.append('%d J' % mode)
-        
+
     def setLineJoin(self, mode):
         """0=mitre, 1=round, 2=bevel"""
         assert mode in (0,1,2), "Line Joins allowed: 0=mitre, 1=round, 2=bevel"
         self._lineJoin = mode
         self._code.append('%d j' % mode)
-        
+
     def setMiterLimit(self, limit):
         self._miterLimit = limit
         self._code.append('%s M' % fp_str(limit))
@@ -1182,13 +1182,13 @@
             assert phase >= 0, "phase is a length in user space"
             textarray = join(map(str, array))
             self._code.append('[%s] %s d' % (textarray, phase))
-        
+
     def setFillColorRGB(self, r, g, b):
         """Set the fill color using positive color description
            (Red,Green,Blue).  Takes 3 arguments between 0.0 and 1.0"""
         self._fillColorRGB = (r, g, b)
         self._code.append('%s rg' % fp_str(r,g,b))
-        
+
     def setStrokeColorRGB(self, r, g, b):
         """Set the stroke color using positive color description
            (Red,Green,Blue).  Takes 3 arguments between 0.0 and 1.0"""
@@ -1202,7 +1202,7 @@
             c,m,y,k = (d*aColor.cyan, d*aColor.magenta, d*aColor.yellow, d*aColor.black)
             self._fillColorCMYK = (c, m, y, k)
             self._code.append('%s k' % fp_str(c, m, y, k))
-        elif isinstance(aColor, Color): 
+        elif isinstance(aColor, Color):
             rgb = (aColor.red, aColor.green, aColor.blue)
             self._fillColorRGB = rgb
             self._code.append('%s rg' % fp_str(rgb) )
@@ -1227,7 +1227,7 @@
             c,m,y,k = (d*aColor.cyan, d*aColor.magenta, d*aColor.yellow, d*aColor.black)
             self._strokeColorCMYK = (c, m, y, k)
             self._code.append('%s K' % fp_str(c, m, y, k))
-        elif isinstance(aColor, Color): 
+        elif isinstance(aColor, Color):
         #if type(aColor) == ColorType:
             rgb = (aColor.red, aColor.green, aColor.blue)
             self._strokeColorRGB = rgb
@@ -1250,20 +1250,20 @@
         """Sets the gray level; 0.0=black, 1.0=white"""
         self._fillColorRGB = (gray, gray, gray)
         self._code.append('%s g' % fp_str(gray))
-        
+
     def setStrokeGray(self, gray):
         """Sets the gray level; 0.0=black, 1.0=white"""
         self._strokeColorRGB = (gray, gray, gray)
         self._code.append('%s G' % fp_str(gray))
-        
-    # path stuff - the separate path object builds it    
+
+    # path stuff - the separate path object builds it
 
     def beginPath(self):
         """Returns a fresh path object.  Paths are used to draw
         complex figures.  The object returned follows the protocol
         for a pathobject.PDFPathObject instance"""
         return pathobject.PDFPathObject()
-    
+
     def drawPath(self, aPath, stroke=1, fill=0):
         "Draw the path object in the mode indicated"
         gc = aPath.getCode(); pathops = PATH_OPS[stroke, fill, self._fillMode]
@@ -1289,7 +1289,7 @@
     def drawText(self, aTextObject):
         """Draws a text object"""
         self._code.append(str(aTextObject.getCode()))
-        
+
     def setPageCompression(self, pageCompression=1):
         """Possible values None, 1 or 0
         If None the value from rl_config will be used.
@@ -1303,8 +1303,8 @@
         else:
             self._pageCompression = pageCompression
         self._doc.setCompression(self._pageCompression)
-        
-    def setPageTransition(self, effectname=None, duration=1, 
+
+    def setPageTransition(self, effectname=None, duration=1,
                         direction=0,dimension='H',motion='I'):
         """PDF allows page transition effects for use when giving
         presentations.  There are six possible effects.  You can
@@ -1314,7 +1314,7 @@
             direction_arg = [0,90,180,270]
             dimension_arg = ['H', 'V']
             motion_arg = ['I','O'] (start at inside or outside)
-            
+
         This table says which ones take which arguments:
 
         PageTransitionEffects = {
@@ -1335,18 +1335,18 @@
         self._pageTransition = {}
         if not effectname:
             return
-            
+
         #first check each optional argument has an allowed value
         if direction in [0,90,180,270]:
             direction_arg = ('Di', '/%d' % direction)
         else:
             raise 'PDFError', ' directions allowed are 0,90,180,270'
-        
+
         if dimension in ['H', 'V']:
             dimension_arg = ('Dm', '/' + dimension)
         else:
             raise'PDFError','dimension values allowed are H and V'
-        
+
         if motion in ['I','O']:
             motion_arg = ('M', '/' + motion)
         else:
@@ -1366,7 +1366,7 @@
             args = PageTransitionEffects[effectname]
         except KeyError:
             raise 'PDFError', 'Unknown Effect Name "%s"' % effectname
-        
+
         # now build the dictionary
         transDict = {}
         transDict['Type'] = '/Trans'
@@ -1382,4 +1382,4 @@
 
 
 if __name__ == '__main__':
-    print 'For test scripts, look in reportlab/test'
+    print 'For test scripts, look in reportlab/test'
\ No newline at end of file
--- a/reportlab/pdfgen/pathobject.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfgen/pathobject.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,9 +1,9 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfgen/pathobject.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfgen/pathobject.py,v 1.9 2001/05/25 13:52:34 rgbecker Exp $
-__version__=''' $Id: pathobject.py,v 1.9 2001/05/25 13:52:34 rgbecker Exp $ '''
-__doc__=""" 
+#$Header: /tmp/reportlab/reportlab/pdfgen/pathobject.py,v 1.10 2002/07/24 19:56:37 andy_robinson Exp $
+__version__=''' $Id: pathobject.py,v 1.10 2002/07/24 19:56:37 andy_robinson Exp $ '''
+__doc__="""
 PDFPathObject is an efficient way to draw paths on a Canvas. Do not
 instantiate directly, obtain one from the Canvas instead.
 
@@ -24,13 +24,13 @@
     the Canvas for a PDFPath with getNewPathObject(); moveto/lineto/
     curveto wherever you want; add whole shapes; and then add it back
     into the canvas with one of the relevant operators.
-    
+
     Path objects are probably not long, so we pack onto one line"""
 
     def __init__(self):
         self._code = []
         self._code.append('n')   #newpath
-        
+
     def getCode(self):
         "pack onto one line; used internally"
         return string.join(self._code, ' ')
@@ -43,7 +43,7 @@
 
     def curveTo(self, x1, y1, x2, y2, x3, y3):
         self._code.append('%s c' % fp_str(x1, y1, x2, y2, x3, y3))
-    
+
     def arc(self, x1,y1, x2,y2, startAng=0, extent=90):
         """Contributed to piddlePDF by Robert Kern, 28/7/99.
         Draw a partial ellipse inscribed within the rectangle x1,y1,x2,y2,
@@ -67,7 +67,7 @@
         self._code.append('%s l' % fp_str(pointList[0][:2]))
         for curve in pointList:
             self._code.append('%s c' % fp_str(curve[2:]))
-    
+
     def rect(self, x, y, width, height):
         """Adds a rectangle to the path"""
         self._code.append('%s re' % fp_str((x, y, width, height)))
@@ -78,7 +78,7 @@
         self._code.append('%s m' % fp_str(pointList[0][:2]))
         for curve in pointList:
             self._code.append('%s c' % fp_str(curve[2:]))
-       
+
     def circle(self, x_cen, y_cen, r):
         """adds a circle to the path"""
         x1 = x_cen - r
@@ -88,8 +88,7 @@
         width = height = 2*r
         #self.ellipse(x_cen - r, y_cen - r, x_cen + r, y_cen + r)
         self.ellipse(x1, y1, width, height)
-        
+
     def close(self):
         "draws a line back to where it started"
         self._code.append('h')
-
--- a/reportlab/pdfgen/pdfgeom.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfgen/pdfgeom.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfgen/pdfgeom.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfgen/pdfgeom.py,v 1.7 2001/01/12 21:36:57 dinu_gherman Exp $
-__version__=''' $Id: pdfgeom.py,v 1.7 2001/01/12 21:36:57 dinu_gherman Exp $ '''
+#$Header: /tmp/reportlab/reportlab/pdfgen/pdfgeom.py,v 1.8 2002/07/24 19:56:38 andy_robinson Exp $
+__version__=''' $Id: pdfgeom.py,v 1.8 2002/07/24 19:56:38 andy_robinson Exp $ '''
 __doc__="""
 This module includes any mathematical methods needed for PIDDLE.
 It should have no dependencies beyond the Python library.
@@ -50,7 +50,7 @@
         sign = -1
     else:
         sign = 1
-    
+
     pointList = []
 
     for i in range(Nfrag):
@@ -75,4 +75,4 @@
                               x_cen + rx * cos(theta1),
                               y_cen - ry * sin(theta1)))
 
-    return pointList
+    return pointList
\ No newline at end of file
--- a/reportlab/pdfgen/pdfimages.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfgen/pdfimages.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfgen/pdfimages.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfgen/pdfimages.py,v 1.15 2002/04/13 15:24:06 rgbecker Exp $
-__version__=''' $Id: pdfimages.py,v 1.15 2002/04/13 15:24:06 rgbecker Exp $ '''
+#$Header: /tmp/reportlab/reportlab/pdfgen/pdfimages.py,v 1.16 2002/07/24 19:56:38 andy_robinson Exp $
+__version__=''' $Id: pdfimages.py,v 1.16 2002/07/24 19:56:38 andy_robinson Exp $ '''
 __doc__="""
 Image functionality sliced out of canvas.py for generalization
 """
@@ -12,7 +12,7 @@
 from types import StringType
 import reportlab
 from reportlab.pdfbase import pdfutils
-from reportlab.pdfbase import pdfdoc 
+from reportlab.pdfbase import pdfdoc
 from reportlab.lib.utils import fp_str, getStringIO
 from reportlab.lib.utils import import_zlib, PIL_Image
 
@@ -34,7 +34,7 @@
 
 
         self.getImageData()
-        
+
     def jpg_imagedata(self):
         #directly process JPEG files
         #open file, needs some error handling!!
@@ -63,7 +63,7 @@
             dataline = outstream.read(60)
         imagedata.append('EI')
         return (imagedata, imgwidth, imgheight)
-    
+
     def cache_imagedata(self):
         image = self.image
         if not pdfutils.cachedImageExists(image):
@@ -105,13 +105,13 @@
             self.binaryData.append(dataline)
             dataline = outstream.read(60)
         imagedata.append('EI')
-        return (imagedata, imgwidth, imgheight) 
+        return (imagedata, imgwidth, imgheight)
 
     def getImageData(self):
         "Gets data, height, width - whatever type of image"
-        image = self.image 
+        image = self.image
         (width, height) = self.dimensions
-        
+
         if type(image) == StringType:
             self.filename = image
             if os.path.splitext(image)[1] in ['.jpg', '.JPG', '.jpeg', '.JPEG']:
@@ -143,7 +143,7 @@
         caching mechanism"""
 
         (x,y) = self.point
-        
+
         # this says where and how big to draw it
         if not canvas.bottomup: y = y+self.height
         canvas._code.append('q %s 0 0 %s cm' % (fp_str(self.width), fp_str(self.height, x, y)))
@@ -183,4 +183,4 @@
     print 'source=',img.source
     print img.format(doc)
     for row in img.binaryData:
-        print row
+        print row
\ No newline at end of file
--- a/reportlab/pdfgen/textobject.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/pdfgen/textobject.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,9 +1,9 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfgen/textobject.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/pdfgen/textobject.py,v 1.24 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: textobject.py,v 1.24 2002/07/17 22:46:23 andy_robinson Exp $ '''
-__doc__=""" 
+#$Header: /tmp/reportlab/reportlab/pdfgen/textobject.py,v 1.25 2002/07/24 19:56:38 andy_robinson Exp $
+__version__=''' $Id: textobject.py,v 1.25 2002/07/24 19:56:38 andy_robinson Exp $ '''
+__doc__="""
 PDFTextObject is an efficient way to add text to a Canvas. Do not
 instantiate directly, obtain one from the Canvas instead.
 
@@ -27,10 +27,10 @@
     operations need to be bracketed between BT (Begin text) and
     ET operators. This class ensures text operations are
     properly encapusalted. Ask the canvas for a text object
-    with beginText(x, y).  Do not construct one directly. 
+    with beginText(x, y).  Do not construct one directly.
     Do not use multiple text objects in parallel; PDF is
     not multi-threaded!
-    
+
     It keeps track of x and y coordinates relative to its origin."""
 
     def __init__(self, canvas, x=0,y=0):
@@ -44,13 +44,13 @@
         self._curSubset = -1
 
         self.setTextOrigin(x, y)
-            
+
     def getCode(self):
         "pack onto one line; used internally"
         self._code.append('ET')
         return string.join(self._code, ' ')
 
-    def setTextOrigin(self, x, y):    
+    def setTextOrigin(self, x, y):
         if self._canvas.bottomup:
             self._code.append('1 0 0 1 %s Tm' % fp_str(x, y)) #bottom up
         else:
@@ -82,7 +82,7 @@
             dx = dx + float(L[-3])
             dy = dy - float(L[-2])
         self._code.append('%s Td' % fp_str(dx, -dy))
- 
+
     def setXPos(self, dx):
         """Moves to a point dx away from the start of the
         current line - NOT from the current point! So if
@@ -167,7 +167,7 @@
         5 = Stroke text and add to clipping path
         6 = Fill then stroke and add to clipping path
         7 = Add to clipping path"""
-        
+
         assert mode in (0,1,2,3,4,5,6,7), "mode must be in (0,1,2,3,4,5,6,7)"
         self._textRenderMode = mode
         self._code.append('%d Tr' % mode)
@@ -185,12 +185,12 @@
     def setFillColorRGB(self, r, g, b):
         self._fillColorRGB = (r, g, b)
         self._code.append('%s rg' % fp_str(r,g,b))
- 
+
     def setFillColorCMYK(self, c, m, y, k):
         """Takes 4 arguments between 0.0 and 1.0"""
         self._fillColorCMYK = (c, m, y, k)
         self._code.append('%s k' % fp_str(c, m, y, k))
-        
+
     def setStrokeColorCMYK(self, c, m, y, k):
         """Takes 4 arguments between 0.0 and 1.0"""
         self._strokeColorCMYK = (c, m, y, k)
@@ -236,7 +236,7 @@
         """Sets the gray level; 0.0=black, 1.0=white"""
         self._fillColorRGB = (gray, gray, gray)
         self._code.append('%s g' % fp_str(gray))
-        
+
     def setStrokeGray(self, gray):
         """Sets the gray level; 0.0=black, 1.0=white"""
         self._strokeColorRGB = (gray, gray, gray)
@@ -294,7 +294,7 @@
             lines = stuff
         else:
             assert 1==0, "argument to textlines must be string,, list or tuple"
-        
+
         for line in lines:
             self._code.append('%s T*' % self._formatText(line))
             if self._canvas.bottomup:
@@ -305,4 +305,4 @@
 
     def __nonzero__(self):
         'PDFTextObject is true if it has something done after the init'
-        return self._code != ['BT']
+        return self._code != ['BT']
\ No newline at end of file
--- a/reportlab/platypus/__init__.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/platypus/__init__.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/platypus/__init__.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/platypus/__init__.py,v 1.14 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: __init__.py,v 1.14 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/platypus/__init__.py,v 1.15 2002/07/24 19:56:38 andy_robinson Exp $
+__version__=''' $Id: __init__.py,v 1.15 2002/07/24 19:56:38 andy_robinson Exp $ '''
 __doc__=''
 from reportlab.platypus.flowables import Flowable, Image, Macro, PageBreak, Preformatted, Spacer, XBox, \
                         CondPageBreak, KeepTogether
@@ -12,4 +12,4 @@
 from reportlab.platypus.frames import Frame
 from reportlab.platypus.doctemplate import BaseDocTemplate, NextPageTemplate, PageTemplate, ActionFlowable, \
                         SimpleDocTemplate, FrameBreak, PageBegin
-from xpreformatted import XPreformatted
+from xpreformatted import XPreformatted
\ No newline at end of file
--- a/reportlab/platypus/doctemplate.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/platypus/doctemplate.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,9 +1,9 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/platypus/doctemplate.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/platypus/doctemplate.py,v 1.56 2002/07/17 22:46:23 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/platypus/doctemplate.py,v 1.57 2002/07/24 19:56:38 andy_robinson Exp $
 
-__version__=''' $Id: doctemplate.py,v 1.56 2002/07/17 22:46:23 andy_robinson Exp $ '''
+__version__=''' $Id: doctemplate.py,v 1.57 2002/07/24 19:56:38 andy_robinson Exp $ '''
 
 __doc__="""
 This module contains the core structure of platypus.
@@ -289,7 +289,7 @@
         self._onProgress = None
         self._flowableCount = 0  # so we know how far to go
 
-        
+
         self._calc()
         self.afterInit()
 
@@ -617,7 +617,7 @@
                 self._indexingFlowables.append(thing)
         #print 'scanned story, found these indexing flowables:\n'
         #print self._indexingFlowables
-        
+
         passes = 0
         while 1:
             passes = passes + 1
@@ -760,7 +760,7 @@
         PROGRESS - called often
         PAGE - called often when page is emitted
         FINISHED - called when really, really finished
-    
+
     some juggling is needed to accurately estimate numbers of
     pages in pageDrawing mode.
 
@@ -846,4 +846,3 @@
             onFirstPage=myFirstPage,onLaterPages=myLaterPages)
 
     run()
-
--- a/reportlab/platypus/figures.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/platypus/figures.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,9 +1,9 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/docs/tools/platdemos.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/platypus/figures.py,v 1.3 2002/07/17 22:46:23 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/platypus/figures.py,v 1.4 2002/07/24 19:56:38 andy_robinson Exp $
 """This includes some demos of platypus for use in the API proposal"""
-__version__=''' $Id: figures.py,v 1.3 2002/07/17 22:46:23 andy_robinson Exp $ '''
+__version__=''' $Id: figures.py,v 1.4 2002/07/24 19:56:38 andy_robinson Exp $ '''
 
 from reportlab.lib import colors
 from reportlab.pdfgen.canvas import Canvas
@@ -138,4 +138,4 @@
 
 
 if __name__ == '__main__':
-    test1()
+    test1()
\ No newline at end of file
--- a/reportlab/platypus/flowables.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/platypus/flowables.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/platypus/flowables.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/platypus/flowables.py,v 1.30 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: flowables.py,v 1.30 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/platypus/flowables.py,v 1.31 2002/07/24 19:56:38 andy_robinson Exp $
+__version__=''' $Id: flowables.py,v 1.31 2002/07/24 19:56:38 andy_robinson Exp $ '''
 __doc__="""
 A flowable is a "floating element" in a document whose exact position is determined by the
 other elements that precede it, such as a paragraph, a diagram interspersed between paragraphs,
@@ -200,7 +200,7 @@
     return lines
 
 class Preformatted(Flowable):
-    """This is like the HTML <PRE> tag.  
+    """This is like the HTML <PRE> tag.
     It attempts to display text exactly as you typed it in a fixed width "typewriter" font.
     The line breaks are exactly where you put
     them, and it will not be wrapped."""
@@ -230,12 +230,12 @@
     def split(self, availWidth, availHeight):
         #returns two Preformatted objects
 
-        #not sure why they can be called with a negative height     
+        #not sure why they can be called with a negative height
         if availHeight < self.style.leading:
             return []
-        
+
         linesThatFit = int(availHeight * 1.0 / self.style.leading)
-        
+
         text1 = string.join(self.lines[0:linesThatFit], '\n')
         text2 = string.join(self.lines[linesThatFit:], '\n')
         style = self.style
@@ -243,7 +243,7 @@
             style = deepcopy(style)
             style.firstLineIndent = 0
         return [Preformatted(text1, self.style), Preformatted(text2, style)]
-        
+
 
     def draw(self):
         #call another method for historical reasons.  Besides, I
@@ -337,7 +337,7 @@
        This works by consuming all remaining space in the frame!"""
     def __init__(self):
         pass
-    
+
     def __repr__(self):
         return "PageBreak()"
 
@@ -350,7 +350,7 @@
     """Throw a page if not enough vertical space"""
     def __init__(self, height):
         self.height = height
-        
+
     def __repr__(self):
         return "CondPageBreak(%s)" %(self.height,)
 
@@ -406,4 +406,4 @@
     def wrap(self, availWidth, availHeight):
         return (0,0)
     def draw(self):
-        exec self.command in globals(), {'canvas':self.canv}
+        exec self.command in globals(), {'canvas':self.canv}
\ No newline at end of file
--- a/reportlab/platypus/frames.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/platypus/frames.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,9 +1,9 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/platypus/frames.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/platypus/frames.py,v 1.17 2002/07/17 22:46:23 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/platypus/frames.py,v 1.18 2002/07/24 19:56:38 andy_robinson Exp $
 
-__version__=''' $Id: frames.py,v 1.17 2002/07/17 22:46:23 andy_robinson Exp $ '''
+__version__=''' $Id: frames.py,v 1.18 2002/07/24 19:56:38 andy_robinson Exp $ '''
 
 __doc__="""
 """
@@ -21,10 +21,10 @@
     pages have the text paragraphs in one or two frames.  For generality
     a page might have several frames (for example for 3 column text or
     for text that wraps around a graphic).
-    
+
     After creation a Frame is not usually manipulated directly by the
     applications program -- it is used internally by the platypus modules.
-    
+
     Here is a diagramatid abstraction for the definitional part of a Frame
 
                 width                    x2,y2
@@ -42,7 +42,7 @@
         |    bottom padding               |
         +---------------------------------+
         (x1,y1) <-- lower left corner
-        
+
         NOTE!! Frames are stateful objects.  No single frame should be used in
         two documents at the same time (especially in the presence of multithreading.
     '''
@@ -163,7 +163,7 @@
                 self._y2 - self._y1
                 )
         if isColor: canv.restoreState()
-        
+
     def addFromList(self, drawlist, canv):
         """Consumes objects from the front of the list until the
         frame is full.  If it cannot fit one object, raises
@@ -178,4 +178,4 @@
                 del drawlist[0]
             else:
                 #leave it in the list for later
-                break
+                break
\ No newline at end of file
--- a/reportlab/platypus/paragraph.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/platypus/paragraph.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/platypus/paragraph.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/platypus/paragraph.py,v 1.61 2002/07/17 22:46:23 andy_robinson Exp $
-__version__=''' $Id: paragraph.py,v 1.61 2002/07/17 22:46:23 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/platypus/paragraph.py,v 1.62 2002/07/24 19:56:38 andy_robinson Exp $
+__version__=''' $Id: paragraph.py,v 1.62 2002/07/24 19:56:38 andy_robinson Exp $ '''
 from string import split, strip, join, whitespace, find
 from operator import truth
 from types import StringType, ListType
@@ -323,7 +323,7 @@
 
         This class is a flowable that can format a block of text
         into a paragraph with a given style.
-    
+
         The paragraph Text can contain XML-like markup including the tags:
         <b> ... </b> - bold
         <i> ... </i> - italics
@@ -355,7 +355,7 @@
             L.append(rk)
             L.append(rv)
         L.append(") #"+n)
-        return string.join(L, "\n")     
+        return string.join(L, "\n")
 
     def _setup(self, text, style, bulletText, frags, cleaner):
         if frags is None:
@@ -436,7 +436,7 @@
     def breakLines(self, width):
         """
         Returns a broken line structure. There are two cases
-        
+
         A) For the simple case of a single formatting input fragment the output is
             A fragment specifier with
                 kind = 0
@@ -564,7 +564,7 @@
                         g.text=i[1]
                         words.append(g)
                         maxSize = max(maxSize,g.fontSize)
-                        
+
                     currentWidth = newWidth
                 else:
                     if currentWidth>self.width: self.width = currentWidth
@@ -619,7 +619,7 @@
         if style.backColor:
             canvas.saveState()
             canvas.setFillColor(style.backColor)
-            canvas.rect(style.leftIndent, 
+            canvas.rect(style.leftIndent,
                         0,
                         self.width - style.rightIndent,
                         self.height,
@@ -759,7 +759,7 @@
         n =len(frags)
         for l in range(n):
             print "frag%d: '%s'" % (l, frags[l].text)
-    
+
         l = 0
         cum = 0
         for W in _getFragWords(frags):
@@ -850,4 +850,4 @@
         P=Paragraph(text, styleSheet['Code'])
         dumpParagraphFrags(P)
         w,h = P.wrap(6*72, 9.7*72)
-        dumpParagraphLines(P)
+        dumpParagraphLines(P)
\ No newline at end of file
--- a/reportlab/platypus/paraparser.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/platypus/paraparser.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/platypus/paraparser.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/platypus/paraparser.py,v 1.46 2002/07/17 22:46:24 andy_robinson Exp $
-__version__=''' $Id: paraparser.py,v 1.46 2002/07/17 22:46:24 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/platypus/paraparser.py,v 1.47 2002/07/24 19:56:38 andy_robinson Exp $
+__version__=''' $Id: paraparser.py,v 1.47 2002/07/24 19:56:38 andy_robinson Exp $ '''
 import string
 import re
 from types import TupleType
@@ -171,7 +171,7 @@
 #       <font name=fontfamily/fontname color=colorname size=float>
 #       < bullet > </bullet> - bullet text (at head of para only)
 #       <onDraw name=callable label="a label">
-#   
+#
 #       The whole may be surrounded by <para> </para> tags
 #
 # It will also be able to handle any MathML specified Greek characters.
@@ -308,7 +308,7 @@
 
 
     #---------------------------------------------------------------
-        
+
     def start_seqdefault(self, attr):
         try:
             default = attr['id']
@@ -318,7 +318,7 @@
 
     def end_seqdefault(self):
         pass
-    
+
     def start_seqreset(self, attr):
         try:
             id = attr['id']
@@ -340,14 +340,14 @@
 
     def end_seqDefault(self):
         self.end_seqdefault()
-        
+
     def start_seqReset(self, attr):
         self.start_seqreset(attr)
 
     def end_seqReset(self):
         self.end_seqreset()
 
-    
+
     def start_seq(self, attr):
         #if it has a template, use that; otherwise try for id;
         #otherwise take default sequence
@@ -357,11 +357,11 @@
             return
         elif attr.has_key('id'):
             id = attr['id']
-        else: 
+        else:
             id = None
         output = self._seq.nextf(id)
         self.handle_data(output)
-        
+
     def end_seq(self):
         pass
 
@@ -433,7 +433,7 @@
             for item in greeks.keys():
                 self.entitydefs[item] = '<%s/>' % item
 
-        
+
 
     def _iReset(self):
         self.fragList = []
@@ -637,4 +637,4 @@
 his lyre, while two tumblers went about performing in the midst of
 them when the man struck up with his tune.]''')
     check_text('''<onDraw name="myFunc" label="aaa   bbb">A paragraph''')
-    check_text('''<para><onDraw name="myFunc" label="aaa   bbb">B paragraph</para>''')
+    check_text('''<para><onDraw name="myFunc" label="aaa   bbb">B paragraph</para>''')
\ No newline at end of file
--- a/reportlab/platypus/tableofcontents.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/platypus/tableofcontents.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/platypus/tableofcontents.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/platypus/tableofcontents.py,v 1.6 2002/03/27 10:39:22 rgbecker Exp $
+#$Header: /tmp/reportlab/reportlab/platypus/tableofcontents.py,v 1.7 2002/07/24 19:56:38 andy_robinson Exp $
 """
 This module defines a single TableOfContents() class that can be used to
 create automatically a table of tontents for Platypus documents like
@@ -31,9 +31,9 @@
 is calculated like this: each entry starts at a multiple of some
 constant named delta. If one entry spans more than one line, all
 lines after the first are indented by the same constant named
-epsilon. 
+epsilon.
 """
-__version__=''' $Id: tableofcontents.py,v 1.6 2002/03/27 10:39:22 rgbecker Exp $ '''
+__version__=''' $Id: tableofcontents.py,v 1.7 2002/07/24 19:56:38 andy_robinson Exp $ '''
 import string
 
 from reportlab.lib import enums
@@ -161,7 +161,7 @@
 
         If you knew the titles but not the page numbers, you could
         supply them to get sensible output on the first run."""
-        
+
         for (level, text, pageNum) in listOfEntries:
             self.addEntry(level, text, pageNum)
 
@@ -235,7 +235,7 @@
 
     def isSatisfied(self):
         return (self._entries == self._lastEntries)
-        
+
     def beforeBuild(self):
         # keep track of the last run
         self._lastEntries = self._entries.copy()
@@ -323,9 +323,8 @@
         text = self.textPattern % self._lastPageNum
         self._para = Paragraph(text, self.paraStyle)
         return self._para.wrap(availWidth, availHeight)
-        
+
     def drawOn(self, canvas, x, y, _sW=0):
         self._para.drawOn(canvas, x, y, _sW)
-        
-    
-        
+
+
--- a/reportlab/platypus/tables.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/platypus/tables.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/platypus/tables.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/platypus/tables.py,v 1.60 2002/07/17 22:46:24 andy_robinson Exp $
-__version__=''' $Id: tables.py,v 1.60 2002/07/17 22:46:24 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/platypus/tables.py,v 1.61 2002/07/24 19:56:38 andy_robinson Exp $
+__version__=''' $Id: tables.py,v 1.61 2002/07/24 19:56:38 andy_robinson Exp $ '''
 __doc__="""
 Tables are created by passing the constructor a tuple of column widths, a tuple of row heights and the data in
 row order. Drawing of the table can be controlled by using a TableStyle instance. This allows control of the
@@ -225,7 +225,7 @@
             if H is not None: H.append(vh)
             w = max(w,vw)
             t = t + vh + v.getSpaceBefore()+v.getSpaceAfter()
-        return w, t - V[0].getSpaceBefore()-V[-1].getSpaceAfter() 
+        return w, t - V[0].getSpaceBefore()-V[-1].getSpaceAfter()
 
     def _calc_width(self):
 
@@ -263,7 +263,7 @@
             width = width + w
             self._colpositions.append(width)
         #print "final width", width
-        
+
         self._width = width
 
     def _calc_height(self):
@@ -526,8 +526,8 @@
         R0._cr_0(n,self._bkgrndcmds)
 
         if repeatRows:
-            #R1 = Table(data[:repeatRows]+data[n:],self._argW, 
-            R1 = Table(data[:repeatRows]+data[n:],self._colWidths, 
+            #R1 = Table(data[:repeatRows]+data[n:],self._argW,
+            R1 = Table(data[:repeatRows]+data[n:],self._colWidths,
                     self._argH[:repeatRows]+self._argH[n:],
                     repeatRows=repeatRows, repeatCols=repeatCols,
                     splitByRow=splitByRow)
@@ -652,7 +652,7 @@
             for v in vals:
                 draw(x, y, v)
                 y = y-leading
-        
+
 # for text,
 #   drawCentredString(self, x, y, text) where x is center
 #   drawRightString(self, x, y, text) where x is right
@@ -771,7 +771,7 @@
         ('Key Ring', 0,0,0,0,0,0,1,0,0,0,2,13),
         ('Hats', 893, 912, '1,212', 643, 789, 159,
              888, '1,298', 832, 453, '1,344','2,843')
-        )   
+        )
     t = Table(data, colwidths, rowheights)
     """, styleSheet['Code'], dedent=4))
     lst.append(Paragraph("""
@@ -825,7 +825,7 @@
     lst.append(PageBreak())
     lst.append(Paragraph("This is GRID_STYLE\n", styleSheet['BodyText']))
     lst.append(t)
-    
+
     t = Table(data, colwidths, rowheights)
     t.setStyle(BOX_STYLE)
     lst.append(Paragraph("This is BOX_STYLE\n", styleSheet['BodyText']))
@@ -839,7 +839,7 @@
      ('ALIGN', (1,1), (-1,-1), 'RIGHT')]
     )
     """, styleSheet['Code']))
-    
+
     t = Table(data, colwidths, rowheights)
     t.setStyle(LABELED_GRID_STYLE)
     lst.append(Paragraph("This is LABELED_GRID_STYLE\n", styleSheet['BodyText']))
@@ -861,7 +861,7 @@
     )
     """, styleSheet['Code']))
     lst.append(PageBreak())
-    
+
     t = Table(data, colwidths, rowheights)
     t.setStyle(COLORED_GRID_STYLE)
     lst.append(Paragraph("This is COLORED_GRID_STYLE\n", styleSheet['BodyText']))
@@ -878,7 +878,7 @@
      ('ALIGN', (1,1), (-1,-1), 'RIGHT')]
     )
     """, styleSheet['Code']))
-    
+
     t = Table(data, colwidths, rowheights)
     t.setStyle(LIST_STYLE)
     lst.append(Paragraph("This is LIST_STYLE\n", styleSheet['BodyText']))
@@ -894,7 +894,7 @@
      ('ALIGN', (1,1), (-1,-1), 'RIGHT')]
     )
     """, styleSheet['Code']))
-   
+
     t = Table(data, colwidths, rowheights)
     ts = TableStyle(
     [('LINEABOVE', (0,0), (-1,0), 2, colors.green),
@@ -1088,4 +1088,4 @@
     SimpleDocTemplate('tables.pdf', showBoundary=1).build(lst)
 
 if __name__ == '__main__':
-    test()
+    test()
\ No newline at end of file
--- a/reportlab/platypus/xpreformatted.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/platypus/xpreformatted.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/platypus/xpreformatted.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/platypus/xpreformatted.py,v 1.15 2002/07/17 22:46:24 andy_robinson Exp $
-__version__=''' $Id: xpreformatted.py,v 1.15 2002/07/17 22:46:24 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/platypus/xpreformatted.py,v 1.16 2002/07/24 19:56:38 andy_robinson Exp $
+__version__=''' $Id: xpreformatted.py,v 1.16 2002/07/24 19:56:38 andy_robinson Exp $ '''
 
 import string
 from types import StringType, ListType
@@ -68,7 +68,7 @@
 
         #s = s + _countSpaces(text)
         s = s + string.count(text, ' ') # much faster for many blanks
-        
+
         #del f.text # we can't do this until we sort out splitting
                     # of paragraphs
     return n, s, W
@@ -82,7 +82,7 @@
     def breakLines(self, width):
         """
         Returns a broken line structure. There are two cases
-        
+
         A) For the simple case of a single formatting input fragment the output is
             A fragment specifier with
                 kind = 0
@@ -183,7 +183,7 @@
 
 
 class PythonPreformatted(XPreformatted):
-    """Used for syntax-colored Python code, otherwise like XPreformatted.  
+    """Used for syntax-colored Python code, otherwise like XPreformatted.
     """
 
     formats = {
@@ -221,11 +221,11 @@
             s, e = self.formats[k]
             fontifiedCode = fontifiedCode + s + code[i:j] + e
             pos = j
-            
+
         fontifiedCode = fontifiedCode + code[pos:]
-        
+
         return fontifiedCode
-    
+
 
 if __name__=='__main__':    #NORUNTESTS
     def dumpXPreformattedLines(P):
@@ -247,7 +247,7 @@
         n =len(frags)
         for l in range(n):
             print "frag%d: '%s'" % (l, frags[l].text)
-    
+
         l = 0
         for L in _getFragLines(frags):
             n=0
@@ -313,4 +313,4 @@
             self.foo = 'bar'
 """,0, styleSheet['Code'], 456.0, 4.8, 1),
 ]:
-        if active: try_it(text,style,dedent,aW,aH)
+        if active: try_it(text,style,dedent,aW,aH)
\ No newline at end of file
--- a/reportlab/rl_config.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/rl_config.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,8 +1,8 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/rl_config.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/rl_config.py,v 1.33 2002/07/17 22:46:22 andy_robinson Exp $
-__version__=''' $Id: rl_config.py,v 1.33 2002/07/17 22:46:22 andy_robinson Exp $ '''
+#$Header: /tmp/reportlab/reportlab/rl_config.py,v 1.34 2002/07/24 19:56:34 andy_robinson Exp $
+__version__=''' $Id: rl_config.py,v 1.34 2002/07/24 19:56:34 andy_robinson Exp $ '''
 
 allowTableBoundsErrors = 1 # set to 0 to die on too large elements in tables in debug (recommend 1 for production use)
 shapeChecking =             1
@@ -11,7 +11,7 @@
 defaultPageSize =           'A4'                    #default page size
 defaultImageCaching =       0                       #set to zero to remove those annoying cached images
 PIL_WARNINGS =              1                       #set to zero to remove those annoying warnings
-ZLIB_WARNINGS =             1                       
+ZLIB_WARNINGS =             1
 warnOnMissingFontGlyphs =   0                       #if 1, warns of each missing glyph
 verbose =                   0
 showBoundary =              0                       # turns on and off boundary behaviour in Drawing
@@ -93,4 +93,4 @@
         else: conv = None
         _setOpt(k,v,conv)
 
-_startUp()
+_startUp()
\ No newline at end of file
--- a/reportlab/test/__init__.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/__init__.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,4 +1,4 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/__init__.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/__init__.py,v 1.2 2001/04/05 09:30:12 rgbecker Exp $
+#$Header: /tmp/reportlab/reportlab/test/__init__.py,v 1.3 2002/07/24 19:56:38 andy_robinson Exp $
\ No newline at end of file
--- a/reportlab/test/runAll.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/runAll.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,7 +2,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/runAll.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/runAll.py,v 1.8 2001/10/10 12:20:46 rgbecker Exp $
+#$Header: /tmp/reportlab/reportlab/test/runAll.py,v 1.9 2002/07/24 19:56:38 andy_robinson Exp $
 
 """Runs all test files in all subfolders.
 """
@@ -16,7 +16,7 @@
 
 def makeSuite(folder):
     "Build a test suite of all available test files."
-    
+
     allTests = unittest.TestSuite()
 
     sys.path.insert(0, folder)
@@ -28,14 +28,14 @@
         except ImportError:
             pass
     del sys.path[0]
-            
+
     return allTests
 
 
 #noruntests
 if __name__ == '__main__':
     folder = os.path.dirname(sys.argv[0]) or os.getcwd()
-    
+
     # special case for reportlab/test directory - clean up
     # all PDF & log files before starting run.  You don't
     # want this if reusing runAll anywhere else.
@@ -48,4 +48,4 @@
     testSuite = makeSuite(folder)
     unittest.TextTestRunner().run(testSuite)
     for filename in GlobDirectoryWalker(folder, '*.pyc'):
-        os.remove(filename)
+        os.remove(filename)
\ No newline at end of file
--- a/reportlab/test/test_charts_textlabels.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_charts_textlabels.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/test_charts_textlabels.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/test_charts_textlabels.py,v 1.3 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_charts_textlabels.py,v 1.4 2002/07/24 19:56:38 andy_robinson Exp $
 """
 Tests for the text Label class.
 """
@@ -28,7 +28,7 @@
 
 def myMainPageFrame(canvas, doc):
     "The page frame used for all PDF documents."
-    
+
     canvas.saveState()
 
     #canvas.rect(2.5*cm, 2.5*cm, 15*cm, 25*cm)
@@ -37,13 +37,13 @@
     canvas.drawString(10*cm, cm, str(pageNumber))
 
     canvas.restoreState()
-    
+
 
 class MyDocTemplate(BaseDocTemplate):
     "The document template used for all PDF documents."
-    
+
     _invalidInitArgs = ('pageTemplates',)
-    
+
     def __init__(self, filename, **kw):
         frame1 = Frame(2.5*cm, 2.5*cm, 15*cm, 25*cm, id='F1')
         self.allowSplitting = 0
@@ -70,7 +70,7 @@
 
     def _makeProtoLabel(self):
         "Return a label prototype for further modification."
-        
+
         protoLabel = Label()
         protoLabel.dx = 0
         protoLabel.dy = 0
@@ -87,10 +87,10 @@
         w, h = drawWidth, drawHeight = 400, 100
 
         drawings = []
-        
+
         for boxAnchors in ('sw se nw ne', 'w e n s', 'c'):
             boxAnchors = string.split(boxAnchors, ' ')
-            
+
             # Create drawing.
             d = Drawing(w, h)
             d.add(Line(0,h/2, w, h/2, strokeColor=colors.gray, strokeWidth=0.5))
@@ -101,18 +101,18 @@
                 # Modify label, put it on a drawing.
                 label = copy.deepcopy(protoLabel)
                 label.boxAnchor = boxAnchor
-                args = {'ba':boxAnchor, 'text':text or 'Hello World!'} 
+                args = {'ba':boxAnchor, 'text':text or 'Hello World!'}
                 label.setText('(%(ba)s) %(text)s (%(ba)s)' % args)
                 labels.append(label)
-                
+
             for label in labels:
                 d.add(label)
 
             drawings.append(d)
 
         return drawings
-    
-    
+
+
     def test1(self):
         "Test all different box anchors."
 
@@ -264,7 +264,7 @@
             story.append(d)
             story.append(Spacer(0, 1*cm))
 
-        story.append(PageBreak())        
+        story.append(PageBreak())
 
         pdfPath = 'test_charts_textlabels.pdf'
         tempfile.tempdir = os.curdir
@@ -279,4 +279,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_docs_build.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_docs_build.py	Wed Jul 24 19:56:39 2002 +0000
@@ -10,7 +10,7 @@
 
 class ManualTestCase(SecureTestCase):
     "Runs all 3 manual-builders from the top."
-    
+
     def test0(self):
         "Test if all manuals buildable from source."
 
@@ -27,14 +27,14 @@
             os.remove('reference.pdf')
         if os.path.isfile('graphics_reference.pdf'):
             os.remove('graphics_reference.pdf')
-        
+
         os.system("python genAll.py -s")
 
         assert os.path.isfile('userguide.pdf'), 'genAll.py failed to generate userguide.pdf!'
         assert os.path.isfile('graphguide.pdf'), 'genAll.py failed to generate graphguide.pdf!'
         assert os.path.isfile('reference.pdf'), 'genAll.py failed to generate reference.pdf!'
         assert os.path.isfile('graphics_reference.pdf'), 'genAll.py failed to generate graphics_reference.pdf!'
-        
+
 
 def makeSuite():
     suite = unittest.TestSuite()
@@ -47,4 +47,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_docstrings.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_docstrings.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,7 +2,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/test_docstrings.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/test_docstrings.py,v 1.9 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_docstrings.py,v 1.10 2002/07/24 19:56:38 andy_robinson Exp $
 
 """This is a test on a package level that find all modules,
 classes, methods and functions that do not have a doc string
@@ -30,7 +30,7 @@
     find = string.find
     split = string.split
     replace = string.replace
-    
+
     objects = []
     lookup = {}
     for file in GlobDirectoryWalker(folder, '*.py'):
@@ -46,7 +46,7 @@
         sys.path.insert(0, folder)
         cwd = os.getcwd()
         os.chdir(folder)
-        
+
         modName = os.path.splitext(os.path.basename(file))[0]
         prefix = folder[find(folder, rootName):]
         prefix = replace(prefix, os.sep, '.')
@@ -55,7 +55,7 @@
         try:
             module = __import__(mName)
         except ImportError:
-            # Restore sys.path and working directory.        
+            # Restore sys.path and working directory.
             os.chdir(cwd)
             del sys.path[0]
             continue
@@ -97,7 +97,7 @@
                                 objects.append((mName, a))
                                 lookup[a] = 1
 
-        # Restore sys.path and working directory.        
+        # Restore sys.path and working directory.
         os.chdir(cwd)
         del sys.path[0]
 
@@ -132,7 +132,7 @@
                 # Skip names with leading and trailing double underscores.
                 if p.match(n):
                     continue
-            
+
             if objType == FunctionType:
                 if not obj.__doc__ or len(obj.__doc__) == 0:
                     lines.append("%s.%s\n" % (name, obj.__name__))
@@ -187,4 +187,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_extra.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_extra.py	Wed Jul 24 19:56:39 2002 +0000
@@ -66,14 +66,14 @@
             f = os.path.expanduser(f)
             f = os.path.expandvars(f)
             f = os.path.abspath(f)
-            
+
             if os.path.exists(f):
                 # look for a makeSuite function and execute it if present
                 folder = os.path.abspath(os.path.dirname(f))
                 modname = os.path.splitext(os.path.basename(f))[0]
                 os.chdir(folder)
                 sys.path.insert(0, folder)
-                
+
                 module = __import__(modname) # seems to fail sometimes...
                 if 'makeSuite' in dir(module):
                     print "running", f
@@ -98,4 +98,4 @@
         EXTRA_FILE = sys.argv[1]
         assert os.path.isfile(EXTRA_FILE), 'file %s not found!' % EXTRA_FILE
     # otherwise, extra.txt will be used
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_graphics_charts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_graphics_charts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/test_graphics_charts.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/test_graphics_charts.py,v 1.13 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_graphics_charts.py,v 1.14 2002/07/24 19:56:38 andy_robinson Exp $
 """
 Tests for chart class.
 """
@@ -33,7 +33,7 @@
 
 def myMainPageFrame(canvas, doc):
     "The page frame used for all PDF documents."
-    
+
     canvas.saveState()
 
     #canvas.rect(2.5*cm, 2.5*cm, 15*cm, 25*cm)
@@ -42,13 +42,13 @@
     canvas.drawString(10*cm, cm, str(pageNumber))
 
     canvas.restoreState()
-    
+
 
 class MyDocTemplate(BaseDocTemplate):
     "The document template used for all PDF documents."
-    
+
     _invalidInitArgs = ('pageTemplates',)
-    
+
     def __init__(self, filename, **kw):
         frame1 = Frame(2.5*cm, 2.5*cm, 15*cm, 25*cm, id='F1')
         self.allowSplitting = 0
@@ -59,7 +59,7 @@
 
 def sample1bar(data=[(13, 5, 20, 22, 37, 45, 19, 4)]):
     drawing = Drawing(400, 200)
-    
+
     bc = VerticalBarChart()
     bc.x = 50
     bc.y = 50
@@ -72,7 +72,7 @@
     bc.valueAxis.valueMin = 0
     bc.valueAxis.valueMax = 60
     bc.valueAxis.valueStep = 15
-    
+
     bc.categoryAxis.labels.boxAnchor = 'ne'
     bc.categoryAxis.labels.dx = 8
     bc.categoryAxis.labels.dy = -2
@@ -83,7 +83,7 @@
     bc.categoryAxis.categoryNames = catNames
     drawing.add(bc)
 
-    return drawing    
+    return drawing
 
 
 def sample2bar(data=[(13, 5, 20, 22, 37, 45, 19, 4),
@@ -93,7 +93,7 @@
 
 def sample1line(data=[(13, 5, 20, 22, 37, 45, 19, 4)]):
     drawing = Drawing(400, 200)
-    
+
     bc = HorizontalLineChart()
     bc.x = 50
     bc.y = 50
@@ -106,7 +106,7 @@
     bc.valueAxis.valueMin = 0
     bc.valueAxis.valueMax = 60
     bc.valueAxis.valueStep = 15
-    
+
     bc.categoryAxis.labels.boxAnchor = 'ne'
     bc.categoryAxis.labels.dx = 8
     bc.categoryAxis.labels.dy = -2
@@ -117,7 +117,7 @@
     bc.categoryAxis.categoryNames = catNames
     drawing.add(bc)
 
-    return drawing    
+    return drawing
 
 
 def sample2line(data=[(13, 5, 20, 22, 37, 45, 19, 4),
@@ -129,7 +129,7 @@
     "Add sample swatches to a diagram."
 
     d = drawing or Drawing(400, 200)
-    
+
     swatches = Legend()
     swatches.alignment = 'right'
     swatches.x = 80
@@ -205,7 +205,7 @@
         drawing = sample1bar()
         story.append(drawing)
         story.append(Spacer(0, 1*cm))
-        
+
 
     def test1(self):
         "Test bar charts."
@@ -217,7 +217,7 @@
         drawing = sample2bar()
         story.append(drawing)
         story.append(Spacer(0, 1*cm))
-        
+
 
     def test2(self):
         "Test bar charts."
@@ -231,7 +231,7 @@
         story.append(drawing)
         story.append(Spacer(0, 1*cm))
 
-        
+
     def test3(self):
         "Test line charts."
 
@@ -242,7 +242,7 @@
         drawing = sample1line()
         story.append(drawing)
         story.append(Spacer(0, 1*cm))
-        
+
 
     def test4(self):
         "Test line charts."
@@ -254,7 +254,7 @@
         drawing = sample2line()
         story.append(drawing)
         story.append(Spacer(0, 1*cm))
-        
+
 
     def test5(self):
         "Test pie charts."
@@ -278,4 +278,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_graphics_images.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_graphics_images.py	Wed Jul 24 19:56:39 2002 +0000
@@ -85,4 +85,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_graphics_speed.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_graphics_speed.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/test_graphics_speed.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/test_graphics_speed.py,v 1.11 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_graphics_speed.py,v 1.12 2002/07/24 19:56:38 andy_robinson Exp $
 """
 This does a test drawing with lots of things in it, running
 with and without attribute checking.
@@ -26,7 +26,7 @@
 
 class GraphicsSpeedTestCase(unittest.TestCase):
     "Test speed of the graphics rendering process."
-    
+
     def test0(self, isFast=0):
         """Hello World, on a rectangular background.
 
@@ -34,7 +34,7 @@
         The string's fillColor is red.
         """
         reportlab.rl_config.shapeChecking = not isFast
-            
+
         pdfPath = 'test_graphics_speed_fast.pdf'
         c = Canvas(pdfPath)
         t0 = time.time()
@@ -57,8 +57,8 @@
         d.drawOn(c, 80, 500)
 
         t1 = time.time()
-        
-        result = 'drew %d pie charts in %0.4f' % (num, t1 - t0) 
+
+        result = 'drew %d pie charts in %0.4f' % (num, t1 - t0)
         open('test_graphics_speed_test%s.log' % (isFast+1), 'w').write(result)
 
 
@@ -67,7 +67,7 @@
 
         self.test0(isFast)
 
-        
+
     def test2(self):
         "This is a profiled version of test1()."
 
@@ -83,4 +83,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_hello.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_hello.py	Wed Jul 24 19:56:39 2002 +0000
@@ -2,7 +2,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfgen/test/test_hello.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/test_hello.py,v 1.2 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_hello.py,v 1.3 2002/07/24 19:56:38 andy_robinson Exp $
 __version__=''' $Id'''
 __doc__="""most basic test possible that makes a PDF.
 
@@ -30,4 +30,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_lib_colors.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_lib_colors.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/test_lib_colors.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/test_lib_colors.py,v 1.7 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_lib_colors.py,v 1.8 2002/07/24 19:56:38 andy_robinson Exp $
 """Tests for the reportlab.lib.colors module.
 """
 
@@ -20,11 +20,11 @@
 def framePage(canvas, title):
     canvas.setFont('Times-BoldItalic',20)
     canvas.drawString(inch, 10.5 * inch, title)
-                            
+
     canvas.setFont('Times-Roman',10)
     canvas.drawCentredString(4.135 * inch, 0.75 * inch,
                             'Page %d' % canvas.getPageNumber())
-    
+
     #draw a border
     canvas.setStrokeColorRGB(1,0,0)
     canvas.setLineWidth(5)
@@ -36,7 +36,7 @@
 
 class ColorTestCase(unittest.TestCase):
     ""
-    
+
     def test0(self):
         "Test color2bw function on all named colors."
 
@@ -45,7 +45,7 @@
             gray = colors.color2bw(col)
             r, g, b = gray.red, gray.green, gray.blue
             assert r == g == b
-    
+
 
     def test1(self):
         "Test colorDistance function."
@@ -61,7 +61,7 @@
 
         allRed = [colors.red, [1, 0, 0], (1, 0, 0),
                   'red', 'RED', '0xFF0000', '0xff0000']
-        
+
         for thing in allRed:
             assert colors.toColor(thing) == colors.red
 
@@ -80,7 +80,7 @@
             c, m, y, k = colors.rgb2cmyk(r1, g1, b1)
             r2, g2, b2 = colors.cmyk2rgb((c, m, y, k))
             rgbCol2 = colors.Color(r2, g2, b2)
-            
+
             # Make sure the differences for each RGB component
             # isreally small (< power(10, -N)!
             N = 16 # max. value found to work on Python2.0 and Win2K.
@@ -91,7 +91,7 @@
         "Construct CMYK instances and test round trip conversion"
 
         rgbCols = colors.getAllNamedColors().items()
-        
+
         # Make a roundtrip test (RGB > CMYK > RGB).
         for name, rgbCol in rgbCols:
             r1, g1, b1 = rgbCol.red, rgbCol.green, rgbCol.blue
@@ -99,7 +99,7 @@
             cmykCol = colors.CMYKColor(c,m,y,k)
             r2, g2, b2 = cmykCol.red, cmykCol.green, cmykCol.blue #colors.cmyk2rgb((c, m, y, k))
             rgbCol2 = colors.Color(r2, g2, b2)
-            
+
             # Make sure the differences for each RGB component
             # isreally small (< power(10, -N)!
             N = 16 # max. value found to work on Python2.0 and Win2K.
@@ -109,9 +109,9 @@
 
     def test5(self):
         "List and display all named colors and their gray equivalents."
-        
+
         canvas = reportlab.pdfgen.canvas.Canvas('test_lib_colors.pdf')
-        
+
         #do all named colors
         framePage(canvas, 'Color Demo - page %d' % canvas.getPageNumber())
 
@@ -124,7 +124,7 @@
         canvas.drawString(200,725,'Pure RGB')
         canvas.drawString(300,725,'B&W Approx')
         canvas.drawString(400,725,'CMYK Approx')
-        
+
         y = 700
         for (name, color) in all_colors:
             canvas.setFillColor(colors.black)
@@ -138,7 +138,7 @@
             CMYK = colors.CMYKColor(c,m,yel,k)
             canvas.setFillColor(CMYK)
             canvas.rect(400, y-10, 80, 30, fill=1)
-            
+
             y = y - 40
             if y < 100:
                 canvas.showPage()
@@ -150,7 +150,7 @@
                 canvas.drawString(400,725,'CMYK Approx')
 
         canvas.save()
-        
+
 
 def makeSuite():
     return makeSuiteForClasses(ColorTestCase)
@@ -158,4 +158,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_lib_sequencer.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_lib_sequencer.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/test_lib_sequencer.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/test_lib_sequencer.py,v 1.5 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_lib_sequencer.py,v 1.6 2002/07/24 19:56:38 andy_robinson Exp $
 """Tests for the reportlab.lib.sequencer module.
 """
 
@@ -15,7 +15,7 @@
 
 class SequencerTestCase(unittest.TestCase):
     "Test Sequencer usage."
-    
+
     def test0(self):
         "Test sequencer default counter."
 
@@ -40,7 +40,7 @@
 
         seq = Sequencer()
         start = seq.this()
-        
+
         for i in range(1, 101):
             n = seq.next()
 
@@ -66,7 +66,7 @@
 
         seq = Sequencer()
         start = seq.this('myCounter1')
-        
+
         for i in range(1, 101):
             n = seq.next('myCounter1')
 
@@ -120,4 +120,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_lib_validators.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_lib_validators.py	Wed Jul 24 19:56:39 2002 +0000
@@ -9,7 +9,7 @@
 
 class ValidatorTestCase(unittest.TestCase):
     "Test validating functions."
-    
+
     def test0(self):
         "Test isBoolean validator."
 
@@ -50,7 +50,7 @@
 
         msg = 'Validation failed for number %s!'
 
-        numbers = [None, 0, 1, 2, -1, -2, 0.0, 0.1, -0.1] #, 2L, -2L]        
+        numbers = [None, 0, 1, 2, -1, -2, 0.0, 0.1, -0.1] #, 2L, -2L]
         isNumberOrNone = validators.isNumberOrNone
         for n in numbers:
             assert isNumberOrNone(n) == 1, msg % str(n)
@@ -82,7 +82,7 @@
 
         msg = 'Validation failed for text anchor %s!'
 
-        strings = ['start', 'middle', 'end']        
+        strings = ['start', 'middle', 'end']
         isTextAnchor = validators.isTextAnchor
         for s in strings:
             assert isTextAnchor(s) == 1, msg % s
@@ -106,7 +106,7 @@
 
         msg = 'Validation failed for OneOf %s!'
 
-        choices = ('clockwise', 'anticlockwise')        
+        choices = ('clockwise', 'anticlockwise')
         OneOf = validators.OneOf(choices)
         for c in choices:
             assert OneOf(c) == 1, msg % c
@@ -161,4 +161,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_multibyte_chs.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_multibyte_chs.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history www.reportlab.co.uk/rl-cgi/viewcvs.cgi/rlextra/rlj/jpsupport.py
-#$Header: /tmp/reportlab/reportlab/test/test_multibyte_chs.py,v 1.3 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_multibyte_chs.py,v 1.4 2002/07/24 19:56:38 andy_robinson Exp $
 # Temporary japanese support for ReportLab.
 """
 The code in this module will disappear any day now and be replaced
@@ -24,7 +24,7 @@
 
 
 class CHSFontTests(unittest.TestCase):
-    
+
     def test0(self):
         "A basic document drawing some strings"
 
@@ -39,7 +39,7 @@
             #they don't have the font pack, return silently
             return
         pdfmetrics.registerFont(CIDFont('STSong-Light',enc))
-    
+
         c = Canvas('test_multibyte_chs.pdf')
         c.setFont('Helvetica', 30)
         c.drawString(100,700, 'Simplified Chinese Font Support')
@@ -55,7 +55,7 @@
                  660,
                  'STSong-Light',
                  enc)
-        
+
 
         c.setFont('Helvetica', 10)
         tx = c.beginText(100, 500)
@@ -83,11 +83,11 @@
             "GB-EUC-H".  This is the GB 2312-80 character set.
             """)
         c.drawText(tx)
-        
+
         c.setFont('Helvetica',10)
         c.drawCentredString(297, 36, 'Page %d' % c.getPageNumber())
         c.showPage()
-        
+
         # full kuten chart in EUC
         c.setFont('Helvetica', 18)
         c.drawString(72,750, 'Characters available in GB 2312-80, EUC encoding')
@@ -114,4 +114,3 @@
 if __name__ == "__main__":
     VERBOSE = 1
     unittest.TextTestRunner().run(makeSuite())
-
--- a/reportlab/test/test_multibyte_cht.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_multibyte_cht.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history www.reportlab.co.uk/rl-cgi/viewcvs.cgi/rlextra/rlj/jpsupport.py
-#$Header: /tmp/reportlab/reportlab/test/test_multibyte_cht.py,v 1.5 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_multibyte_cht.py,v 1.6 2002/07/24 19:56:38 andy_robinson Exp $
 # Temporary japanese support for ReportLab.
 """
 Test of traditional Chinese (as written in Taiwan)
@@ -29,7 +29,7 @@
         c.setFont(fnt, 16, 16)
         c.drawString(x, y, msg)
         c.rect(x,y,pdfmetrics.stringWidth(msg, fnt, 16),16,stroke=1,fill=0)
-        
+
 
     def test0(self):
         "A basic document drawing some strings"
@@ -37,7 +37,7 @@
         # if they do not have the Japanese font files, go away quietly
         from reportlab.pdfbase.cidfonts import CIDFont, findCMapFile
 
-        
+
         enc = 'ETenms-B5-H'
         try:
             findCMapFile(enc)
@@ -45,7 +45,7 @@
             #they don't have the font pack, return silently
             return
         pdfmetrics.registerFont(CIDFont('MSung-Light',enc))
-    
+
         c = Canvas('test_multibyte_cht.pdf')
         c.setFont('Helvetica', 24)
         c.drawString(100,700, 'Traditional Chinese Font Support')
@@ -58,13 +58,13 @@
         message2 = '\xa6n\xa1A\xa8\xc3\xaa\xed\xa5\xdc\xb2@\xb5L\xba\xc3\xb0\xdd\xa4\xa4\xb0\xea\xa6b\xb3o\xad\xd3\xa5i\xa9\xc6\xaa\xba\xae\xc9\xa8\xe8\xa1A\xb7|\xbbP\xac\xfc\xb0\xea\xa4H\xa5\xc1\xaf\xb8\xa6b\xa4@\xb0_\xa1C'
         message3 = '\xA7\x41\xA6\x6E\xB6\xDC'
 
-        
+
         c.drawString(100, 655, message1)
         c.drawString(100, 639, message2)
 
         hBoxText(message3 + ' MSung-Light' , c, 100, 600, 'MSung-Light', enc)
         #hBoxText(message3 + ' MHei-Medium', c, 100, 580, 'MHei-Medium', enc)
-        
+
 
 
         c.setFont('Helvetica', 10)
@@ -122,7 +122,7 @@
                 c.showPage()
                 y = 600
 
-        
+
         c.save()
         if VERBOSE:
             print 'saved test_multibyte_cht.pdf'
@@ -136,4 +136,3 @@
 if __name__ == "__main__":
     VERBOSE = 1
     unittest.TextTestRunner().run(makeSuite())
-
--- a/reportlab/test/test_multibyte_jpn.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_multibyte_jpn.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000
 #see license.txt for license details
 #history www.reportlab.co.uk/rl-cgi/viewcvs.cgi/rlextra/rlj/jpsupport.py
-#$Header: /tmp/reportlab/reportlab/test/test_multibyte_jpn.py,v 1.3 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_multibyte_jpn.py,v 1.4 2002/07/24 19:56:38 andy_robinson Exp $
 # Temporary japanese support for ReportLab.
 """
 The code in this module will disappear any day now and be replaced
@@ -29,7 +29,7 @@
         c.setFont(fnt, 16, 16)
         c.drawString(x, y, msg)
         c.rect(x,y,pdfmetrics.stringWidth(msg, fnt, 16),16,stroke=1,fill=0)
-        
+
     def test0(self):
         "A basic document drawing some strings"
 
@@ -46,7 +46,7 @@
 
         pdfmetrics.registerFont(CIDFont('HeiseiMin-W3','90ms-RKSJ-H'))
         pdfmetrics.registerFont(CIDFont('HeiseiKakuGo-W5','90ms-RKSJ-H'))
-    
+
         c = Canvas('test_multibyte_jpn.pdf')
         c.setFont('Helvetica', 30)
         c.drawString(100,700, 'Japanese Font Support')
@@ -66,18 +66,18 @@
         c.setFont('HeiseiKakuGo-W5-90ms-RKSJ-H', 16)
         # this says "This is HeiseiKakugo" in shift-JIS
         message2 = '\202\261\202\352\202\315\225\275\220\254\212p\203S\203V\203b\203N\202\305\202\267\201B'
-        c.drawString(100, 650, message2) 
+        c.drawString(100, 650, message2)
         wid = pdfmetrics.stringWidth(message2, 'HeiseiKakuGo-W5-90ms-RKSJ-H', 16)
         c.rect(100,650,wid,16,stroke=1,fill=0)
 
-        
+
 
         self.hDraw(c, '\223\214\213\236 says Tokyo in Shift-JIS', 'HeiseiMin-W3-90ms-RKSJ-H', 100, 600)
 
 
         pdfmetrics.registerFont(CIDFont('HeiseiMin-W3','90msp-RKSJ-H'))
         self.hDraw(c, '\223\214\213\236, but in proportional Shift-JIS.', 'HeiseiMin-W3-90msp-RKSJ-H', 100, 575)
-        
+
         pdfmetrics.registerFont(CIDFont('HeiseiMin-W3','EUC-H'))
         self.hDraw(c, '\xC5\xEC\xB5\xFE says Tokyo in EUC', 'HeiseiMin-W3-EUC-H', 100, 550)
 
@@ -91,7 +91,7 @@
                 return s
             self.hDraw(c, '\x67\x71\x4E\xAC' + asciiToUCS2(' says Tokyo in UCS2'),
                        'HeiseiMin-W3-UniJIS-UCS2-H', 100, 525)
-                    
+
 
         # now try verticals
         pdfmetrics.registerFont(CIDFont('HeiseiMin-W3','90ms-RKSJ-V'))
@@ -99,13 +99,13 @@
         c.drawString(400, 650, '\223\214\213\236 vertical Shift-JIS')
         height = c.stringWidth('\223\214\213\236 vertical Shift-JIS', 'HeiseiMin-W3-90ms-RKSJ-V', 16)
         c.rect(400-8,650,16,-height)
-        
+
         pdfmetrics.registerFont(CIDFont('HeiseiMin-W3','EUC-V'))
         c.setFont('HeiseiMin-W3-EUC-V', 16)
         c.drawString(425, 650, '\xC5\xEC\xB5\xFE vertical EUC')
         height = c.stringWidth('\xC5\xEC\xB5\xFE vertical EUC', 'HeiseiMin-W3-EUC-V', 16)
         c.rect(425-8,650,16,-height)
-        
+
         c.setFillColor(colors.purple)
         tx = c.beginText(100, 250)
         tx.setFont('Helvetica', 12)
@@ -208,7 +208,7 @@
                 ]
 
             The next few pages show the complete character set available in the encoding
-            "90ms-RKSJ-H" - Shift-JIS with the standard Microsoft extensions.  
+            "90ms-RKSJ-H" - Shift-JIS with the standard Microsoft extensions.
             """)
         c.drawText(tx)
 
@@ -228,14 +228,14 @@
                 c.drawCentredString(297, 36, 'Page %d' % c.getPageNumber())
                 c.showPage()
                 y = 700
-        
+
         c.save()
-        
+
 
         if VERBOSE:
             print 'saved test_multibyte_jpn.pdf'
 
-    
+
     def ___test2_all(self):
         """Dumps out ALl GLYPHS in a CID font.
 
@@ -249,11 +249,11 @@
             return
 
         pdfmetrics.registerFont(CIDFont('HeiseiMin-W3','Identity-H'))
-    
+
         c = Canvas('test_japanese_2.pdf')
         c.setFont('Helvetica', 30)
         c.drawString(100,800, 'All Glyphs in Adobe-Japan-1-2 collection!')
-        
+
         # the two typefaces
         c.setFont('HeiseiMin-W3-Identity-H', 2)
 
@@ -267,7 +267,7 @@
                 x = x0 + cell*dx
                 y = y0 - row*dy
                 c.drawString(x,y,s)
-                
+
         c.save()
         if VERBOSE:
             print 'saved test_multibyte_jpn.pdf'
@@ -282,4 +282,3 @@
     VERBOSE = 1
     unittest.TextTestRunner().run(makeSuite())
 
-
--- a/reportlab/test/test_multibyte_kor.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_multibyte_kor.py	Wed Jul 24 19:56:39 2002 +0000
@@ -86,7 +86,7 @@
             use UHC encoding or the Korean Unicode subset, for which the correct encoding
             names are also listed above.
             """)
-        
+
         c.drawText(tx)
 
         c.setFont('Helvetica',10)
@@ -107,10 +107,10 @@
                 y = 700
 
         c.save()
-        
+
         if VERBOSE:
-            print 'saved test_multibyte_kor.pdf'    
-        
+            print 'saved test_multibyte_kor.pdf'
+
 
 def makeSuite():
     return makeSuiteForClasses(KoreanFontTests)
@@ -120,4 +120,3 @@
 if __name__ == "__main__":
     VERBOSE = 1
     unittest.TextTestRunner().run(makeSuite())
-
--- a/reportlab/test/test_paragraphs.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_paragraphs.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/test_paragraphs.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/test_paragraphs.py,v 1.13 2002/07/17 22:46:24 andy_robinson Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_paragraphs.py,v 1.14 2002/07/24 19:56:38 andy_robinson Exp $
 # tests some paragraph styles
 
 from reportlab.test import unittest
@@ -41,7 +41,7 @@
 
 class ParagraphTestCase(unittest.TestCase):
     "Test Paragraph class (eyeball-test)."
-    
+
     def test0(self):
         """Test...
 
@@ -49,22 +49,22 @@
 
         Features to be visually confirmed by a human being are:
 
-            1. ... 
+            1. ...
             2. ...
             3. ...
         """
 
         story = []
-        
+
         #need a style
         styNormal = ParagraphStyle('normal')
-        
+
         # some to test
         stySpaced = ParagraphStyle('spaced',
                                    parent=styNormal,
                                    spaceBefore=12,
                                    spaceAfter=12)
-        
+
 
         story.append(
             Paragraph("This is a normal paragraph. "
@@ -94,7 +94,7 @@
                                        backColor=navy)
         story.append(
             Paragraph("This is a title with a background. ", styBackground))
-        
+
         story.append(
             Paragraph("""<para backcolor="pink">This got a background from the para tag</para>""", styNormal))
 
@@ -118,13 +118,13 @@
         #This one fails:
         #story.append(Paragraph("""This has a font change to <font name=Helvetica-Oblique>Helvetica-Oblique</font>.""", styNormal))
         story.append(Paragraph("""This has a font change to <font name=Helvetica><i>Helvetica in italics</i></font>.""", styNormal))
-        
+
 
         template = SimpleDocTemplate('test_paragraphs.pdf',
                                      showBoundary=1)
         template.build(story,
             onFirstPage=myFirstPage, onLaterPages=myLaterPages)
-        
+
 
 def makeSuite():
     return makeSuiteForClasses(ParagraphTestCase)
@@ -132,4 +132,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_pdfbase_encodings.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_pdfbase_encodings.py	Wed Jul 24 19:56:39 2002 +0000
@@ -24,7 +24,7 @@
         for ch in 'AEIOU':
             zenc[ord(ch)] = 'Z'
         pdfmetrics.registerEncoding(zenc)
-        
+
         # now we can make a font based on this encoding
         f = pdfmetrics.Font('FontWithoutVowels', 'Helvetica-Oblique', 'EncodingWithoutVowels')
         pdfmetrics.registerFont(f)
@@ -49,7 +49,7 @@
         euroMac = pdfmetrics.Encoding('MacWithEuro', 'MacRomanEncoding')
         euroMac[219] = 'Euro'
         pdfmetrics.registerEncoding(euroMac)
-        
+
         pdfmetrics.registerFont(pdfmetrics.Font('MacHelvWithEuro', 'Helvetica-Oblique', 'MacWithEuro'))
 
         c.setFont('MacHelvWithEuro', 12)
@@ -70,7 +70,7 @@
         narrowEnc[ord('m')] = 'i'
         narrowEnc[ord('M')] = 'I'
         pdfmetrics.registerEncoding(narrowEnc)
-        
+
         pdfmetrics.registerFont(pdfmetrics.Font('narrow', 'Helvetica-Oblique', 'm-to-i'))
         c.setFont('narrow', 12)
         c.drawString(125, 450, sample)
@@ -94,4 +94,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_pdfbase_fontembed.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_pdfbase_fontembed.py	Wed Jul 24 19:56:39 2002 +0000
@@ -19,9 +19,9 @@
         if you want to use it for real."""
 
         #LettError fonts should always be there.  The others are voluntary.
-        
+
         ok = 1
-        
+
         c = Canvas('test_pdfbase_fontembed.pdf')
         c.setPageCompression(0)
         c.setFont('Helvetica', 12)
@@ -38,7 +38,7 @@
 
             c.setFont('AGaramond-Bold', 12)
             c.drawString(100, 650, 'This should be in AGaramond-Bold')
-        
+
         if os.path.isfile('CR______.AFM') and os.path.isfile('CR______.PFB'):
 
             # one with a custom encoding
@@ -53,7 +53,7 @@
             c.setFont('Helvetica', 12)
             c.drawString(100, 600, text)
             w = c.stringWidth(text, 'Helvetica', 12)
-            
+
             c.setFont('Carta', 12)
             c.drawString(100+w, 600, ' Hello World')
 
@@ -87,4 +87,3 @@
 #noruntests
 if __name__ == "__main__":
     unittest.TextTestRunner().run(makeSuite())
-
--- a/reportlab/test/test_pdfbase_pdfmetrics.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_pdfbase_pdfmetrics.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/test_pdfbase_pdfmetrics.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/test_pdfbase_pdfmetrics.py,v 1.9 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_pdfbase_pdfmetrics.py,v 1.10 2002/07/24 19:56:38 andy_robinson Exp $
 #test_pdfbase_pdfmetrics_widths
 """
 Various tests for PDF metrics.
@@ -68,7 +68,7 @@
             except KeyError:
                 canv.drawString(200, y, 'Could not find glyph named "%s"' % glyphName)
             y = y - 12
-                
+
 
 def makeTestDoc(fontNames):
     filename = 'test_pdfbase_pdfmetrics.pdf'
@@ -81,7 +81,7 @@
     for fontName in fontNames:
         if verbose:
             print 'width test for', fontName
-    
+
         makeWidthTestForAllGlyphs(c, fontName)
         c.showPage()
     c.save()
@@ -95,7 +95,7 @@
 
     def test0(self):
         "Visual test for correct glyph widths"
-        makeTestDoc(fontNamesToTest)        
+        makeTestDoc(fontNamesToTest)
 
 
 def makeSuite():
@@ -116,7 +116,7 @@
                 print 'unknown font %s' % arg
                 print usage
                 sys.exit(0)
-                
+
         fontNamesToTest = sys.argv[1:]
 
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_pdfbase_pdfutils.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_pdfbase_pdfutils.py	Wed Jul 24 19:56:39 2002 +0000
@@ -1,7 +1,7 @@
 #copyright ReportLab Inc. 2000-2001
 #see license.txt for license details
 #history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/test/test_pdfbase_pdfutils.py?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/test/test_pdfbase_pdfutils.py,v 1.5 2002/07/04 09:24:49 dinu_gherman Exp $
+#$Header: /tmp/reportlab/reportlab/test/test_pdfbase_pdfutils.py,v 1.6 2002/07/24 19:56:38 andy_robinson Exp $
 """Tests for utility functions in reportlab.pdfbase.pdfutils.
 """
 
@@ -24,7 +24,7 @@
         plainText = 'What is the average velocity of a sparrow?'
         encoded = _AsciiHexEncode(plainText)
         decoded = _AsciiHexDecode(encoded)
-        
+
         msg = "Round-trip AsciiHex encoding failed."
         assert decoded == plainText, msg
 
@@ -49,4 +49,4 @@
 
 #noruntests
 if __name__ == "__main__":
-    unittest.TextTestRunner().run(makeSuite())
+    unittest.TextTestRunner().run(makeSuite())
\ No newline at end of file
--- a/reportlab/test/test_pdfbase_ttfonts.py	Wed Jul 24 19:22:17 2002 +0000
+++ b/reportlab/test/test_pdfbase_ttfonts.py	Wed Jul 24 19:56:39 2002 +0000
@@ -337,9 +337,9 @@
 
 def makeSuite():
     suite = makeSuiteForClasses(
-        TTFontsTestCase, 
+        TTFontsTestCase,
         TTFontFileTestCase,
-        TTFontFaceTestCase, 
+        TTFontFaceTestCase,
         TTFontTestCase)
     return suite