diff --git a/bin/reportlab/MANIFEST.in b/bin/reportlab/MANIFEST.in new file mode 100644 index 00000000000..86f3442fd92 --- /dev/null +++ b/bin/reportlab/MANIFEST.in @@ -0,0 +1,6 @@ +global-include *.dtd *.txt *.xml *.yml +global-include *.c *.h *.in *.mashed +global-include *.gif *.png *.jpg .a85 +global-include *.AFM *.PFB *.ttf +global-include README +include changes diff --git a/bin/reportlab/README b/bin/reportlab/README new file mode 100644 index 00000000000..40b00be75f6 --- /dev/null +++ b/bin/reportlab/README @@ -0,0 +1,35 @@ +#copyright ReportLab Inc. 2000-2001 +#see license.txt for license details +#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/README?cvsroot=reportlab +#$Header: /tmp/reportlab/reportlab/README,v 1.9 2002/03/05 17:21:44 rgbecker Exp $ + +This is the ReportLab PDF library. + +Licensing +========= +BSD license. See license.txt for details + +Installation +============ +Either unpack reportlab.zip or reportlab.tgz to some directory say +d:\ReportLab. If you can, ensure that the line terminator style is +correct for your OS (man zip programs have a text mode option eg -a). + +Create a .pth file, say reportlab.pth in your Python +home directory. It should have one line: +d:/ReportLab. + +Alternatively unpack the archive into a directory which is already on your +python path. + +Documentation +============= +Full documentation is included in PDF format in the docs directory. +If you are working with a CVS version, run the script genAll.py +in that directory to generate the documentation. + +Acknowledgements and Thanks +=========================== +lib/normalDate.py originally by Jeff Bauer +(please let us know of other acknowledgements - we just + started this section - 13/2/2002) diff --git a/bin/reportlab/changes b/bin/reportlab/changes new file mode 100644 index 00000000000..f22b174ddb8 --- /dev/null +++ b/bin/reportlab/changes @@ -0,0 +1,7788 @@ +################################################################################# +#################### RELEASE 2.0 at 15:00 GMT 23/May/2006 ################# +################################################################################# +r2905 | andy | 2006-05-23 15:49:28 +0100 (Tue, 23 May 2006) | 1 line + M /reportlab/trunk/reportlab/pdfbase/cidfonts.py + disable loading of CMAPS +r2904 | andy | 2006-05-23 15:19:54 +0100 (Tue, 23 May 2006) | 1 line + M /reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py + removed CMap references +r2903 | andy | 2006-05-23 15:04:08 +0100 (Tue, 23 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_multibyte_kor.py + M /reportlab/trunk/reportlab/test/test_multibyte_cht.py + M /reportlab/trunk/reportlab/test/test_multibyte_chs.py + proper samples added for CJK languages +r2902 | andy | 2006-05-23 14:08:04 +0100 (Tue, 23 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_multibyte_kor.py + M /reportlab/trunk/reportlab/test/test_multibyte_cht.py + M /reportlab/trunk/reportlab/test/test_multibyte_chs.py + M /reportlab/trunk/reportlab/lib/codecharts.py + partial silencing of cmap tests +r2901 | andy | 2006-05-23 00:02:22 +0100 (Tue, 23 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py + M /reportlab/trunk/reportlab/pdfbase/cidfonts.py + M /reportlab/trunk/reportlab/pdfbase/_cidfontdata.py + A /reportlab/trunk/reportlab/pdfbase/_can_cmap_data.py + added canned width data for CID fonts +r2900 | andy | 2006-05-22 22:49:00 +0100 (Mon, 22 May 2006) | 1 line + M /reportlab/trunk/reportlab/docs/userguide/genuserguide.py + M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py + D /reportlab/trunk/reportlab/docs/userguide/ch0_whatsnewinrl2.py + updated user guide +r2899 | rgbecker | 2006-05-22 13:42:07 +0100 (Mon, 22 May 2006) | 1 line + M /reportlab/trunk/reportlab/rl_config.py + rl_config.py: fix missing comma in CMap exemplars list +r2893 | rgbecker | 2006-05-21 10:12:50 +0100 (Sun, 21 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/runAll.py + runAll.py: add support for external running +r2892 | rgbecker | 2006-05-19 15:16:02 +0100 (Fri, 19 May 2006) | 1 line + M /reportlab/trunk/reportlab/lib/utils.py + A /reportlab/trunk/reportlab/lib/rltempfile.py + reportlab.lib: break out rltempfile.py to avoid rl_accel imports +r2883 | andy | 2006-05-19 12:34:32 +0100 (Fri, 19 May 2006) | 1 line + M /reportlab/trunk/reportlab/tools/docco/stylesheet.py + M /reportlab/trunk/reportlab/tools/docco/rltemplate.py + M /reportlab/trunk/reportlab/test/runAll.py + manual style changes +r2882 | andy | 2006-05-18 22:54:38 +0100 (Thu, 18 May 2006) | 1 line + M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py + manual introduction amendments +r2881 | andy | 2006-05-18 17:56:05 +0100 (Thu, 18 May 2006) | 1 line + M /reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py + amended John's encoding paragraph +r2880 | oualid | 2006-05-18 17:45:05 +0100 (Thu, 18 May 2006) | 1 line + M /reportlab/trunk/reportlab/tools/docco/stylesheet.py + added extra paragraphstyle +r2879 | oualid | 2006-05-18 17:43:07 +0100 (Thu, 18 May 2006) | 1 line + A /reportlab/trunk/reportlab/docs/userguide/ch0_whatsnewinrl2.py + chapter What's new in RL 2 of user guide +r2878 | andy | 2006-05-18 16:13:01 +0100 (Thu, 18 May 2006) | 1 line + M /reportlab/trunk/reportlab/lib/codecharts.py + M /reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py + updated codecharts and ch3 of user guide +r2877 | andy | 2006-05-18 16:11:23 +0100 (Thu, 18 May 2006) | 1 line + M /reportlab/trunk/reportlab/__init__.py + changed version and added warning for old Python users +r2875 | andy | 2006-05-18 08:00:16 +0100 (Thu, 18 May 2006) | 1 line + M /reportlab/trunk/reportlab/lib/validators.py + codec validator for diagra +r2874 | jjlee | 2006-05-17 14:07:13 +0100 (Wed, 17 May 2006) | 1 line + M /reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py + Correct docs in introduction re encoding for V2 +r2873 | rgbecker | 2006-05-17 11:59:59 +0100 (Wed, 17 May 2006) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + pdfmetrics.py: fix rl_accel --> _rl_accel typo +r2872 | rgbecker | 2006-05-17 11:58:04 +0100 (Wed, 17 May 2006) | 1 line + M /reportlab/trunk/reportlab/pdfbase/rl_codecs.py + rl_codecs: slight speedup +r2871 | rgbecker | 2006-05-17 10:39:29 +0100 (Wed, 17 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_rl_accel.py + test_rl_accel.py: fix ref count checks +r2868 | jjlee | 2006-05-16 15:58:47 +0100 (Tue, 16 May 2006) | 1 line + M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py + Fix typos +r2867 | rgbecker | 2006-05-16 14:19:40 +0100 (Tue, 16 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_rl_accel.py + test_rl_accel: added some testsi for new functionality +r2865 | rgbecker | 2006-05-15 17:37:44 +0100 (Mon, 15 May 2006) | 1 line + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + ttfonts.py: allow for _rl_accel._instanceStringWidthTTF +r2861 | rgbecker | 2006-05-15 08:44:00 +0100 (Mon, 15 May 2006) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + pdfmetrics.py: _rl_accel._instanceStringWidthU +r2860 | rgbecker | 2006-05-12 18:30:55 +0100 (Fri, 12 May 2006) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + pdfmetrics.py: more version2 accelerator stuff +r2857 | rgbecker | 2006-05-11 14:06:52 +0100 (Thu, 11 May 2006) | 1 line + M /reportlab/trunk/reportlab/platypus/paragraph.py + paragraph: fix misuse of style before setting in cjk breaklines +r2856 | rgbecker | 2006-05-11 10:48:13 +0100 (Thu, 11 May 2006) | 1 line + M /reportlab/trunk/reportlab/demos/odyssey/dodyssey.py + reportlab: add hotshot analysis to dodyssey.py +r2854 | rgbecker | 2006-05-10 13:57:21 +0100 (Wed, 10 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_hello.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + reportlab: PDFString vs Unicode changes +r2853 | rgbecker | 2006-05-10 13:56:39 +0100 (Wed, 10 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + M /reportlab/trunk/reportlab/platypus/paraparser.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + reportlab: fix up links in paragraphs +r2852 | rgbecker | 2006-05-08 16:04:15 +0100 (Mon, 08 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/utils.py + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + M /reportlab/trunk/reportlab/test/runAll.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + M /reportlab/trunk/reportlab/platypus/frames.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + reportlab: minor fixes to platypus, tests and fix jap splitting bug +r2851 | rgbecker | 2006-05-08 15:34:45 +0100 (Mon, 08 May 2006) | 1 line + M /reportlab/trunk/reportlab/graphics/barcode/widgets.py + M /reportlab/trunk/reportlab/graphics/barcode/test.py + barcode: fix to import from reportlab +r2850 | rgbecker | 2006-05-08 14:40:06 +0100 (Mon, 08 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/pythonpowered.gif + we shouldn't ever need to change this +r2849 | andy | 2006-05-06 09:25:23 +0100 (Sat, 06 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/utils.py + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + M /reportlab/trunk/reportlab/test/pythonpowered.gif + M /reportlab/trunk/reportlab/platypus/tables.py + friendlified way test suite runs +r2848 | andy | 2006-05-05 00:45:29 +0100 (Fri, 05 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py + M /reportlab/trunk/reportlab/platypus/tables.py + added japanese splitting test, and table preprocessor to convert unicode->utf8 +r2847 | andy | 2006-05-05 00:07:51 +0100 (Fri, 05 May 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py + expanded Japanese para tests +r2846 | rgbecker | 2006-05-04 11:48:36 +0100 (Thu, 04 May 2006) | 1 line + A /reportlab/trunk/reportlab/graphics/barcode/widgets.py + A /reportlab/trunk/reportlab/graphics/barcode/usps.py + A /reportlab/trunk/reportlab/graphics/barcode/test.py + A /reportlab/trunk/reportlab/graphics/barcode/fourstate.py + A /reportlab/trunk/reportlab/graphics/barcode/eanbc.py + A /reportlab/trunk/reportlab/graphics/barcode/common.py + A /reportlab/trunk/reportlab/graphics/barcode/code93.py + A /reportlab/trunk/reportlab/graphics/barcode/code39.py + A /reportlab/trunk/reportlab/graphics/barcode/code128.py + A /reportlab/trunk/reportlab/graphics/barcode/__init__.py + A /reportlab/trunk/reportlab/graphics/barcode/VERSION + A /reportlab/trunk/reportlab/graphics/barcode/TODO + A /reportlab/trunk/reportlab/graphics/barcode/README + A /reportlab/trunk/reportlab/graphics/barcode + reportlab: barcode moved to reportlab/graphics +r2845 | rgbecker | 2006-05-03 13:24:35 +0100 (Wed, 03 May 2006) | 1 line + M /reportlab/trunk/reportlab/graphics/shapes.py + shapes.py: merged stable 2843:2844 minor fix to outDir handling in Drawing.save +r2843 | rgbecker | 2006-04-28 18:33:32 +0100 (Fri, 28 Apr 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + M /reportlab/trunk/reportlab/platypus/paraparser.py + reportlab: added pound sign +r2842 | rgbecker | 2006-04-28 15:08:58 +0100 (Fri, 28 Apr 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + M /reportlab/trunk/reportlab/platypus/paraparser.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + reportlab: fixed added to paragraph +r2841 | rgbecker | 2006-04-27 18:42:12 +0100 (Thu, 27 Apr 2006) | 1 line + M /reportlab/trunk/reportlab/pdfbase/rl_codecs.py + rl_codecs: eliminate decorators +r2840 | rgbecker | 2006-04-20 15:37:13 +0100 (Thu, 20 Apr 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py + M /reportlab/trunk/reportlab/platypus/tables.py + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + reportlab: wastefully allow TTFont to use ttc files +r2839 | rgbecker | 2006-04-19 17:55:46 +0100 (Wed, 19 Apr 2006) | 1 line + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + ttfonts.py: fix up to use struct properly +r2838 | rgbecker | 2006-04-18 18:47:54 +0100 (Tue, 18 Apr 2006) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/axes.py + reportlab: minor fix to axes.py +r2834 | rgbecker | 2006-04-05 18:42:59 +0100 (Wed, 05 Apr 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_pdfgen_links.py + reportlab: fix bad test test_pdfgen_links.py +r2833 | rgbecker | 2006-04-05 17:01:20 +0100 (Wed, 05 Apr 2006) | 1 line + A /reportlab/trunk/reportlab/test/test_platypus_paraparser.py + A /reportlab/trunk/reportlab/pdfbase/rl_codecs.py + A /reportlab/trunk/reportlab/lib/textsplit.py + reportlab: add files from utf8 branch +r2830 | rgbecker | 2006-04-05 16:18:32 +0100 (Wed, 05 Apr 2006) | 1 line + M /reportlab/trunk/reportlab/tools/pythonpoint/stdparser.py + M /reportlab/trunk/reportlab/tools/pythonpoint/pythonpoint.py + M /reportlab/trunk/reportlab/tools/docco/rl_doc_utils.py + M /reportlab/trunk/reportlab/tools/docco/graphdocpy.py + M /reportlab/trunk/reportlab/test/test_tools_pythonpoint.py + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + M /reportlab/trunk/reportlab/test/test_pdfgen_links.py + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + M /reportlab/trunk/reportlab/test/test_pdfbase_pdfmetrics.py + M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py + M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py + M /reportlab/trunk/reportlab/test/test_graphics_charts.py + M /reportlab/trunk/reportlab/rl_config.py + M /reportlab/trunk/reportlab/platypus/tables.py + M /reportlab/trunk/reportlab/platypus/paraparser.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + M /reportlab/trunk/reportlab/platypus/para.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + M /reportlab/trunk/reportlab/pdfgen/textobject.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + M /reportlab/trunk/reportlab/pdfbase/cidfonts.py + M /reportlab/trunk/reportlab/pdfbase/_cidfontdata.py + M /reportlab/trunk/reportlab/lib/validators.py + M /reportlab/trunk/reportlab/lib/styles.py + M /reportlab/trunk/reportlab/lib/rparsexml.py + M /reportlab/trunk/reportlab/graphics/testshapes.py + M /reportlab/trunk/reportlab/graphics/shapes.py + M /reportlab/trunk/reportlab/graphics/renderPM.py + M /reportlab/trunk/reportlab/graphics/renderPDF.py + M /reportlab/trunk/reportlab/docs/userguide/ch5_paragraphs.py + M /reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py + M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py + M /reportlab/trunk/reportlab/demos/stdfonts/stdfonts.py + reportlab-utf8 moved to trunk +r2808 | rgbecker | 2006-03-15 16:47:27 +0000 (Wed, 15 Mar 2006) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + M /reportlab/trunk/reportlab/graphics/renderSVG.py + M /reportlab/trunk/reportlab/graphics/renderPS.py + M /reportlab/trunk/reportlab/graphics/renderPM.py + reportlab: changes to accomodate barcodes +r2807 | andy | 2006-03-15 12:22:10 +0000 (Wed, 15 Mar 2006) | 1 line + M /reportlab/trunk/reportlab/lib/validators.py + new pattern matcher - partially done +r2806 | andy | 2006-03-13 23:33:51 +0000 (Mon, 13 Mar 2006) | 1 line + M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py + updated _imaging import +r2803 | rgbecker | 2006-03-09 13:29:26 +0000 (Thu, 09 Mar 2006) | 1 line + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + reportlab: added FreeTextAnnotation and minor improvements to other annotations +r2802 | rgbecker | 2006-03-09 13:21:50 +0000 (Thu, 09 Mar 2006) | 1 line + M /reportlab/trunk/reportlab/graphics/shapes.py + M /reportlab/trunk/reportlab/graphics/renderbase.py + M /reportlab/trunk/reportlab/graphics/renderPS.py + reportlab/graphics cosmetics and adding drawImage to renderPS +r2799 | rgbecker | 2006-03-02 13:54:39 +0000 (Thu, 02 Mar 2006) | 1 line + M /reportlab/trunk/reportlab/platypus/flowables.py + flowables.py: attempt to fix up keepInFrame for one more case +r2794 | rgbecker | 2006-03-01 10:48:40 +0000 (Wed, 01 Mar 2006) | 1 line + A /reportlab/trunk/reportlab/tools/utils/dumpttf.py + reportlab/tools/utils: added dumpttf.py +r2792 | rgbecker | 2006-02-28 18:37:06 +0000 (Tue, 28 Feb 2006) | 1 line + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + ttfonts.py: fix index bug in name table read +r2789 | rgbecker | 2006-02-28 15:04:57 +0000 (Tue, 28 Feb 2006) | 1 line + M /reportlab/trunk/reportlab/pdfbase/cidfonts.py + M /reportlab/trunk/reportlab/lib/utils.py + reportlab: remove cidfonts print, fix get_rl_tempdir +r2786 | rgbecker | 2006-02-27 21:26:46 +0000 (Mon, 27 Feb 2006) | 1 line + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + reportlab: minor changes to annotation support +r2775 | rgbecker | 2006-02-15 12:17:24 +0000 (Wed, 15 Feb 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/__init__.py + platypus: ImagesAndFlowables in final form +r2774 | rgbecker | 2006-02-14 18:07:27 +0000 (Tue, 14 Feb 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/__init__.py + reportlab: added FlowablesAndImage +r2765 | rgbecker | 2006-02-02 18:48:12 +0000 (Thu, 02 Feb 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + M /reportlab/trunk/reportlab/pdfbase/pdfutils.py + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + pdfgen: fix badly drawn jpegs which are actually gifs +r2762 | rgbecker | 2006-01-30 16:29:07 +0000 (Mon, 30 Jan 2006) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + M /reportlab/trunk/reportlab/platypus/flowables.py + added _offsets handling to paragraph for flow around on left side +r2759 | rgbecker | 2006-01-25 11:25:29 +0000 (Wed, 25 Jan 2006) | 1 line + M /reportlab/trunk/reportlab/lib/utils.py + utils.py: annotate ImageReader read errors +r2755 | rgbecker | 2006-01-25 11:21:10 +0000 (Wed, 25 Jan 2006) | 1 line + M /reportlab/trunk/reportlab/platypus/para.py + para.py: minor layout changes to example etc +r2752 | rgbecker | 2006-01-09 13:29:53 +0000 (Mon, 09 Jan 2006) | 1 line + M /reportlab/trunk/reportlab/graphics/shapes.py + shapes.py: fix wrap for Drawings to take account of renderScale +r2749 | rgbecker | 2006-01-09 11:22:03 +0000 (Mon, 09 Jan 2006) | 1 line + M /reportlab/trunk/reportlab/graphics/shapes.py + M /reportlab/trunk/reportlab/graphics/renderSVG.py + M /reportlab/trunk/reportlab/graphics/renderPS.py + M /reportlab/trunk/reportlab/graphics/renderPM.py + M /reportlab/trunk/reportlab/graphics/renderPDF.py + reprotlab/graphics: fix so renderScale is used properly +r2746 | rgbecker | 2006-01-05 15:17:03 +0000 (Thu, 05 Jan 2006) | 1 line + M /reportlab/trunk/reportlab/graphics/shapes.py + shapes.py: make copy use derived class if not overridden +r2745 | rgbecker | 2005-12-20 12:43:24 +0000 (Tue, 20 Dec 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/shapes.py + shapes.py: allow override for CWD +r2744 | rgbecker | 2005-12-15 12:28:18 +0000 (Thu, 15 Dec 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_graphics_charts.py + M /reportlab/trunk/reportlab/pdfgen/pdfimages.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + reportlab: fix test_graphics_charts and eliminate 0 x 0 image bug in Acrobat 7.0 +r2743 | rgbecker | 2005-12-12 15:51:29 +0000 (Mon, 12 Dec 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/piecharts.py + piecharts: now have orderMode 'alternate' and proper vertical spreading +r2742 | oualid | 2005-12-12 11:58:08 +0000 (Mon, 12 Dec 2005) | 1 line + M /reportlab/trunk/reportlab/lib/normalDate.py + normalDate: add initialize support for datetime +r2741 | andy | 2005-12-07 21:52:33 +0000 (Wed, 07 Dec 2005) | 1 line + M /reportlab/trunk/reportlab/lib/validators.py + M /reportlab/trunk/reportlab/lib/attrmap.py + M /reportlab/trunk/reportlab/graphics/testshapes.py + M /reportlab/trunk/reportlab/graphics/shapes.py + M /reportlab/trunk/reportlab/graphics/renderbase.py + datacharts synchronised +r2740 | rgbecker | 2005-12-07 13:30:14 +0000 (Wed, 07 Dec 2005) | 1 line + M /reportlab/trunk/reportlab/rl_config.py + rl_config: fix typo +r2739 | rgbecker | 2005-12-07 13:25:25 +0000 (Wed, 07 Dec 2005) | 1 line + M /reportlab/trunk/reportlab/rl_config.py + M /reportlab/trunk/reportlab/graphics/shapes.py + reportlab: add defaultGraphicsFontName, svg saving +r2738 | rgbecker | 2005-12-07 11:39:53 +0000 (Wed, 07 Dec 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/shapes.py + M /reportlab/trunk/reportlab/graphics/renderbase.py + M /reportlab/trunk/reportlab/graphics/renderSVG.py + M /reportlab/trunk/reportlab/graphics/renderPS.py + M /reportlab/trunk/reportlab/graphics/renderPM.py + M /reportlab/trunk/reportlab/graphics/renderPDF.py + graphics: added Drawing.renderScale hack for renderer terminal drawing scales +r2737 | rgbecker | 2005-12-06 18:36:58 +0000 (Tue, 06 Dec 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_graphics_charts.py + M /reportlab/trunk/reportlab/graphics/charts/piecharts.py + piecharts: initial version of pointer labels +r2736 | andy | 2005-12-01 23:03:45 +0000 (Thu, 01 Dec 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/flowables.py + removed a 2.4-ism +r2733 | rgbecker | 2005-11-22 11:24:22 +0000 (Tue, 22 Nov 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + pdfdoc.py: more optimisations +r2732 | rgbecker | 2005-11-21 19:39:42 +0000 (Mon, 21 Nov 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + pdfdoc.py: speed improvements +r2727 | rgbecker | 2005-10-31 11:20:18 +0000 (Mon, 31 Oct 2005) | 1 line + M /reportlab/trunk/reportlab/pdfgen/textobject.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + pdfgen: abstract color setting ops to textobject._PDFColorSetter +r2724 | rgbecker | 2005-10-30 11:52:47 +0000 (Sun, 30 Oct 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/axes.py + axes.py: factor out _allInt +r2723 | rgbecker | 2005-10-30 11:52:10 +0000 (Sun, 30 Oct 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/piecharts.py + piecharts.py: fix checkLabelOverlap for 3d pie +r2719 | rgbecker | 2005-10-20 14:19:59 +0100 (Thu, 20 Oct 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_graphics_layout.py + M /reportlab/trunk/reportlab/graphics/shapes.py + reportlab: fix small angle addArc & Wedge.asPolygon +r2715 | rgbecker | 2005-10-10 12:56:30 +0100 (Mon, 10 Oct 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/flowables.py + flowables.py: fixes to PTOContainer +r2711 | rgbecker | 2005-10-06 11:04:37 +0100 (Thu, 06 Oct 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_pto.py + M /reportlab/trunk/reportlab/platypus/flowables.py + platypus: fixup KeepInFrame error handling +r2707 | rgbecker | 2005-10-04 13:59:21 +0100 (Tue, 04 Oct 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/flowables.py + flowables.py: make KeepInFrame wrapping more robust +r2699 | rgbecker | 2005-09-29 13:35:38 +0100 (Thu, 29 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/frames.py + frames.py: logger only when _debug +r2698 | rgbecker | 2005-09-29 12:49:23 +0100 (Thu, 29 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/frames.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + platypus: changes to make identity more useful +r2697 | rgbecker | 2005-09-28 18:22:53 +0100 (Wed, 28 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_pto.py + test_platypus_pto.py: changed FrameFlowable to KeepInFrame +r2696 | rgbecker | 2005-09-28 14:22:53 +0100 (Wed, 28 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/paragraph.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + flowables.py: keepInFrame now truncates etc properly, doctemplate.py: fix handle_frameEnd +r2695 | andy | 2005-09-27 22:12:08 +0100 (Tue, 27 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/flowables.py + renamed FrameFlowable to KeepInFrame +r2694 | rgbecker | 2005-09-27 18:31:51 +0100 (Tue, 27 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/flowables.py + flowablse.py: minor fix and hack to FrameFlowable +r2693 | rgbecker | 2005-09-27 16:29:16 +0100 (Tue, 27 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/flowables.py + flowables.py: minor fixes revealed by rml2pdf use +r2692 | rgbecker | 2005-09-27 14:26:12 +0100 (Tue, 27 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_pto.py + M /reportlab/trunk/reportlab/platypus/frames.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + platypus: initial FrameFlowable implementation +r2689 | rgbecker | 2005-09-22 17:53:18 +0100 (Thu, 22 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + merge stable 2687:2688 pdfdoc.py: attempt to robustify escape attribute access +r2680 | rgbecker | 2005-09-21 17:17:56 +0100 (Wed, 21 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + M /reportlab/trunk/reportlab/platypus/flowables.py + platypus: fix up None defaults for table line commands, add HRFlowable dash arg +r2679 | rgbecker | 2005-09-20 16:59:39 +0100 (Tue, 20 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/axes.py + axes.py: make YCategoryAxis accept less than n labels +r2676 | rgbecker | 2005-09-06 11:25:00 +0100 (Tue, 06 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/samples/radar.py + M /reportlab/trunk/reportlab/graphics/samples/filled_radar.py + M /reportlab/trunk/reportlab/graphics/charts/spider.py + merge stable 2674:2675 graphics: fix buglet in spider and non-conforming samples +r2674 | rgbecker | 2005-09-05 17:20:26 +0100 (Mon, 05 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/spider.py + M /reportlab/trunk/reportlab/graphics/charts/piecharts.py + merged utf8 2666:2671 improved spider plots +r2668 | rgbecker | 2005-09-05 11:23:51 +0100 (Mon, 05 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/widgetbase.py + merge utf8 2666:2667 widgetbase: make line[3] back up for line[(3,x)] +r2663 | rgbecker | 2005-09-02 10:44:17 +0100 (Fri, 02 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/utils3d.py + M /reportlab/trunk/reportlab/graphics/charts/piecharts.py + reportlab/graphics/charts: better piechart labels +r2662 | rgbecker | 2005-09-01 17:18:33 +0100 (Thu, 01 Sep 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + pdfdoc: allow special escaping in Annotations and PDFString +r2659 | rgbecker | 2005-08-18 11:28:12 +0100 (Thu, 18 Aug 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/lineplots.py + M /reportlab/trunk/reportlab/graphics/charts/axes.py + merge stable 2657:2658 axes/lineplots.py: fix inFill behaviour +r2655 | rgbecker | 2005-08-16 10:40:10 +0100 (Tue, 16 Aug 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_lib_utils.py + merge stable 2653:2654 test_lib_utils.py: ensure we get an incremented count +r2652 | rgbecker | 2005-08-15 12:21:53 +0100 (Mon, 15 Aug 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_lib_utils.py + nerge stable 2649:2650 test_lib_utils.py: fix race in temp creation +r2649 | andy | 2005-07-31 23:47:00 +0100 (Sun, 31 Jul 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/para.py + Chad Miller's table fix +r2648 | rgbecker | 2005-07-28 16:10:18 +0100 (Thu, 28 Jul 2005) | 1 line + M /reportlab/trunk/reportlab/pdfgen/canvas.py + canvas.py: fix probable bug in setdash +r2647 | rgbecker | 2005-07-26 14:47:51 +0100 (Tue, 26 Jul 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/textlabels.py + M /reportlab/trunk/reportlab/graphics/charts/barcharts.py + merge 2643:2644 from stable textlabels.py, barcharts.py: added boxTarget support +r2630 | rgbecker | 2005-07-08 10:18:22 +0100 (Fri, 08 Jul 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_pdfbase_ttfonts.py + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + merge 2628:2629: ttfonts: altered subset naming +r2623 | rgbecker | 2005-06-27 16:34:29 +0100 (Mon, 27 Jun 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + pdfbase.pdfmetrics: fix glob to be zip friendly +r2619 | rgbecker | 2005-06-24 15:49:15 +0100 (Fri, 24 Jun 2005) | 1 line + M /reportlab/trunk/reportlab/test/utils.py + M /reportlab/trunk/reportlab/test/test_widgets_grids.py + M /reportlab/trunk/reportlab/test/test_widgetbase_tpc.py + M /reportlab/trunk/reportlab/test/test_utils.py + M /reportlab/trunk/reportlab/test/test_tools_pythonpoint.py + M /reportlab/trunk/reportlab/test/test_table_layout.py + M /reportlab/trunk/reportlab/test/test_source_chars.py + M /reportlab/trunk/reportlab/test/test_rl_accel.py + M /reportlab/trunk/reportlab/test/test_renderSVG.py + M /reportlab/trunk/reportlab/test/test_pyfiles.py + M /reportlab/trunk/reportlab/test/test_platypus_xref.py + M /reportlab/trunk/reportlab/test/test_platypus_toc.py + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + M /reportlab/trunk/reportlab/test/test_platypus_pto.py + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + M /reportlab/trunk/reportlab/test/test_platypus_leftright.py + M /reportlab/trunk/reportlab/test/test_platypus_indents.py + M /reportlab/trunk/reportlab/test/test_platypus_general.py + M /reportlab/trunk/reportlab/test/test_platypus_breaking.py + M /reportlab/trunk/reportlab/test/test_pdfgen_pycanvas.py + M /reportlab/trunk/reportlab/test/test_pdfgen_pagemodes.py + M /reportlab/trunk/reportlab/test/test_pdfgen_links.py + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + M /reportlab/trunk/reportlab/test/test_pdfgen_callback.py + M /reportlab/trunk/reportlab/test/test_pdfbase_ttfonts.py + M /reportlab/trunk/reportlab/test/test_pdfbase_postscript.py + M /reportlab/trunk/reportlab/test/test_pdfbase_pdfutils.py + M /reportlab/trunk/reportlab/test/test_pdfbase_pdfmetrics.py + M /reportlab/trunk/reportlab/test/test_pdfbase_fontembed.py + M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py + M /reportlab/trunk/reportlab/test/test_paragraphs.py + M /reportlab/trunk/reportlab/test/test_multibyte_kor.py + M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py + M /reportlab/trunk/reportlab/test/test_multibyte_cht.py + M /reportlab/trunk/reportlab/test/test_multibyte_chs.py + M /reportlab/trunk/reportlab/test/test_lib_validators.py + M /reportlab/trunk/reportlab/test/test_lib_utils.py + M /reportlab/trunk/reportlab/test/test_lib_sequencer.py + M /reportlab/trunk/reportlab/test/test_lib_colors.py + M /reportlab/trunk/reportlab/test/test_invariant.py + M /reportlab/trunk/reportlab/test/test_images.py + M /reportlab/trunk/reportlab/test/test_hello.py + M /reportlab/trunk/reportlab/test/test_graphics_speed.py + M /reportlab/trunk/reportlab/test/test_graphics_layout.py + M /reportlab/trunk/reportlab/test/test_graphics_images.py + M /reportlab/trunk/reportlab/test/test_graphics_charts.py + M /reportlab/trunk/reportlab/test/test_extra.py + M /reportlab/trunk/reportlab/test/test_docstrings.py + M /reportlab/trunk/reportlab/test/test_docs_build.py + M /reportlab/trunk/reportlab/test/test_charts_textlabels.py + M /reportlab/trunk/reportlab/test/runAll.py + reportlab/test: fix so individual tests print output folder location +r2617 | andy | 2005-06-15 21:23:07 +0100 (Wed, 15 Jun 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/shapes.py + generalized a rarely-used error message handler which changed in 2.3 +r2613 | rgbecker | 2005-06-15 14:46:10 +0100 (Wed, 15 Jun 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/spider.py + spider.py: fix all zero bug (inspired by Max M) +r2611 | rgbecker | 2005-06-13 11:13:47 +0100 (Mon, 13 Jun 2005) | 1 line + M /reportlab/trunk/reportlab/lib/utils.py + utils.py: fix argument reference +r2608 | rgbecker | 2005-06-12 12:53:56 +0100 (Sun, 12 Jun 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_pdfbase_ttfonts.py + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + ttfonts.py: apply Albertas Agejevas' spaces patch to fix para splitting +r2606 | andy | 2005-06-09 23:07:02 +0100 (Thu, 09 Jun 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/frames.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + added a platypus logger +r2604 | rgbecker | 2005-06-08 11:12:46 +0100 (Wed, 08 Jun 2005) | 1 line + M /reportlab/trunk/reportlab/lib/utils.py + M /reportlab/trunk/reportlab/graphics/charts/legends.py + legends.py: fix 2.1 compatibility problem +r2599 | rgbecker | 2005-06-06 17:07:54 +0100 (Mon, 06 Jun 2005) | 1 line + M /reportlab/trunk/reportlab/lib/utils.py + utils.py: raise RuntimeError if no image handling available in ImageReader +r2595 | rgbecker | 2005-05-27 16:40:20 +0100 (Fri, 27 May 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/legends.py + fundsdemo: added support for special legending +r2592 | rgbecker | 2005-05-16 13:18:46 +0100 (Mon, 16 May 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: allow for h/vAlign constructor agruments to be used +r2591 | andy | 2005-05-13 20:22:10 +0100 (Fri, 13 May 2005) | 1 line + M /reportlab/trunk/reportlab/tools/pythonpoint/pythonpoint.py + added a check for missing files +r2590 | rgbecker | 2005-05-10 14:09:40 +0100 (Tue, 10 May 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/renderPS.py + renderPS.py: attempt to fix setFont error +r2589 | rgbecker | 2005-05-04 12:33:30 +0100 (Wed, 04 May 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/doctemplate.py + doctemplate.py: add rotation argument to BaseDocTemplate +r2588 | rgbecker | 2005-05-03 12:56:56 +0100 (Tue, 03 May 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/doctemplate.py + doctemplate.py: fix syntax error +r2587 | rgbecker | 2005-05-03 12:41:54 +0100 (Tue, 03 May 2005) | 1 line + M /reportlab/trunk/reportlab/lib/colors.py + colors.py: add a fidred +r2586 | rgbecker | 2005-05-03 12:41:17 +0100 (Tue, 03 May 2005) | 1 line + M /reportlab/trunk/reportlab/lib/attrmap.py + attrmap: fix initialization of _initial +r2585 | rgbecker | 2005-05-03 12:40:11 +0100 (Tue, 03 May 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/doctemplate.py + doctemplate.py: support for canvasmaker and rotation +r2584 | rgbecker | 2005-05-03 12:39:22 +0100 (Tue, 03 May 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + M /reportlab/trunk/reportlab/lib/utils.py + reportlab: better support for PIL image +r2583 | rgbecker | 2005-04-30 17:31:55 +0100 (Sat, 30 Apr 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + pdfdoc.py: fix misspelling of DeviceGray +r2581 | rgbecker | 2005-04-27 13:09:43 +0100 (Wed, 27 Apr 2005) | 1 line + M /reportlab/trunk/reportlab/lib/utils.py + utils.py: use normpath in _archive etc etc +r2579 | rgbecker | 2005-04-25 11:38:14 +0100 (Mon, 25 Apr 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfutils.py + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + M /reportlab/trunk/reportlab/lib/utils.py + CMYK image improvements +r2576 | rgbecker | 2005-04-20 11:39:42 +0100 (Wed, 20 Apr 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: fix vertical height bug +r2570 | jjlee | 2005-04-19 13:44:21 +0100 (Tue, 19 Apr 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_utils.py + Merge to trunk the fix to a FmtSelfDict test that I accidentally conmitted to a tag (svn merge -r 2568:2569 https://www.reportlab.co.uk/svn/public/reportlab/tags/fidreleases/fidelity-20050310T103800/reportlab) +r2566 | jjlee | 2005-04-18 14:25:25 +0100 (Mon, 18 Apr 2005) | 1 line + A /reportlab/trunk/reportlab/test/test_utils.py + M /reportlab/trunk/reportlab/lib/utils.py + Allow overriding parameters in _fmt utility method +r2561 | rgbecker | 2005-04-15 15:04:49 +0100 (Fri, 15 Apr 2005) | 1 line + M /reportlab/trunk/reportlab/pdfgen/canvas.py + canvas.py: minor changes to bring into line with TBlatter's early serializer version +r2560 | rgbecker | 2005-04-15 15:04:10 +0100 (Fri, 15 Apr 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + pdfdoc.py: minor changes to bring into line with TBlatter's early serializer version +r2551 | rgbecker | 2005-04-14 15:53:04 +0100 (Thu, 14 Apr 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + pdfdoc.py: minor changes to simplify PDFInfoL/U in other apps +r2550 | rgbecker | 2005-04-12 18:23:17 +0100 (Tue, 12 Apr 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: fixes to split + spans +r2549 | rgbecker | 2005-04-01 10:38:18 +0100 (Fri, 01 Apr 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: eliminate use of enumerate +r2548 | rgbecker | 2005-03-31 16:35:20 +0100 (Thu, 31 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + pdfmetrics.py: fix minor buglet discovered by Ron Peleg +r2547 | rgbecker | 2005-03-29 14:54:51 +0100 (Tue, 29 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_table_layout.py + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: added in Gary Poster's gary@zope.com latest patch +r2546 | rgbecker | 2005-03-23 13:35:58 +0000 (Wed, 23 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: be evn more robust about width/drawWidth etc +r2545 | rgbecker | 2005-03-23 11:35:10 +0000 (Wed, 23 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: fix for case when minWidth fails du eot attribute error +r2544 | rgbecker | 2005-03-18 18:51:22 +0000 (Fri, 18 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: improve join/cap conversion +r2543 | rptlab | 2005-03-18 15:15:23 +0000 (Fri, 18 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: 2.1 compatibility changes +r2542 | rgbecker | 2005-03-18 14:37:49 +0000 (Fri, 18 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + tables.py, paragraph.py: Gary Poster's layout improvement patch +r2541 | rgbecker | 2005-03-18 14:37:01 +0000 (Fri, 18 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/doctemplate.py + doctemplate.py: fix cgitb recursion problem +r2540 | rgbecker | 2005-03-17 12:01:27 +0000 (Thu, 17 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: fix Gary's patch (broken by Robin) +r2539 | rgbecker | 2005-03-16 18:46:16 +0000 (Wed, 16 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: fixes to join/cap/dash from Gary Poster +r2538 | rgbecker | 2005-03-16 09:47:07 +0000 (Wed, 16 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: empty cellval patch from Jean-Francois Gosset +r2537 | rgbecker | 2005-03-15 14:19:29 +0000 (Tue, 15 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/pdfgen/pathobject.py + pathobject: speed improvements and initial assertion +r2536 | andy | 2005-03-14 20:04:55 +0000 (Mon, 14 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + enhanced decimal alignment +r2535 | rgbecker | 2005-03-11 10:34:29 +0000 (Fri, 11 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/doctemplate.py + doctemplate.py: fix buglet reported by Steve Halasz +r2530 | jjlee | 2005-03-02 14:27:57 +0000 (Wed, 02 Mar 2005) | 1 line + M /reportlab/trunk/reportlab/lib/utils.py + Add process environment to logged traceback +r2528 | rgbecker | 2005-02-28 15:55:58 +0000 (Mon, 28 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + canvas.py: added in Andrew Mercer's linkURL fix +r2526 | rgbecker | 2005-02-21 15:40:08 +0000 (Mon, 21 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_paragraphs.py + test_paragraphs.py: added font size change test for underlining test +r2525 | rgbecker | 2005-02-21 14:55:11 +0000 (Mon, 21 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_paragraphs.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + paragraph.py: added proper undeerline color +r2524 | rgbecker | 2005-02-17 08:43:01 +0000 (Thu, 17 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/lib/units.py + units.py: fix pica conversion thanks to Paul McNett +r2523 | rgbecker | 2005-02-07 17:59:09 +0000 (Mon, 07 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/lib/utils.py + utils.py: added FmtSelfDict class +r2522 | rgbecker | 2005-02-07 11:26:31 +0000 (Mon, 07 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/shapes.py + shapes.py: added save renderer specific argument handling +r2521 | rgbecker | 2005-02-07 10:29:15 +0000 (Mon, 07 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/pdfgen/canvas.py + canvas.py: added setFontSize method +r2520 | rgbecker | 2005-02-05 10:19:05 +0000 (Sat, 05 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/flowables.py + flowables.py: fix 2.1 breakage +r2519 | rgbecker | 2005-02-03 17:14:58 +0000 (Thu, 03 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + platypus: make LCActionFlowable the bad ones +r2518 | rgbecker | 2005-02-03 11:30:21 +0000 (Thu, 03 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + platypus: attempt to make KeepTogether/keepWithNext more robust +r2517 | rgbecker | 2005-02-02 14:43:28 +0000 (Wed, 02 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/lib/utils.py + reportlab/lib/utils.py: remove bad checkin +r2516 | rgbecker | 2005-02-02 14:40:15 +0000 (Wed, 02 Feb 2005) | 1 line + M /reportlab/trunk/reportlab/lib/utils.py + fix reportlab_functional.txt +r2515 | andy | 2005-01-31 16:47:03 +0000 (Mon, 31 Jan 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/paraparser.py + allow solid para background +r2514 | andy | 2005-01-27 21:44:35 +0000 (Thu, 27 Jan 2005) | 1 line + M /reportlab/trunk/reportlab/platypus/paragraph.py + minor fix to allow getPlaintext on more paragraphs +r2512 | rgbecker | 2005-01-14 16:06:57 +0000 (Fri, 14 Jan 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: added span rows split handling & test contributed by Andre Reitz +r2511 | rgbecker | 2005-01-14 15:42:12 +0000 (Fri, 14 Jan 2005) | 1 line + M /reportlab/trunk/reportlab/setup.py + setup.py: fix missing comma, contributed by Andre Reitz +r2510 | rgbecker | 2005-01-13 11:50:57 +0000 (Thu, 13 Jan 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/axes.py + axes.py: finally make abf/rr work properly +r2509 | rgbecker | 2005-01-10 18:29:17 +0000 (Mon, 10 Jan 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/renderPS.py + renderPS.py: fix buglet in color setting +r2507 | rgbecker | 2005-01-10 10:04:09 +0000 (Mon, 10 Jan 2005) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/legends.py + legends.py: fix for empty legend prob +r2506 | rgbecker | 2005-01-06 12:21:25 +0000 (Thu, 06 Jan 2005) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_leftright.py + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + added canvas.textAnnotation and tests for it +r2504 | rgbecker | 2004-12-31 12:49:02 +0000 (Fri, 31 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/legends.py + legends.py: fix callout bug +r2502 | rgbecker | 2004-12-31 11:20:06 +0000 (Fri, 31 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/rl_config.py + M /reportlab/trunk/reportlab/platypus/tables.py + added longTableOptimize config variable +r2501 | rgbecker | 2004-12-31 11:13:44 +0000 (Fri, 31 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/test/test_graphics_charts.py + test_graphics_charts.py: added new legend testing +r2500 | rgbecker | 2004-12-30 09:51:30 +0000 (Thu, 30 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/barcharts.py + barcharts.py: fix missing getattr +r2499 | rgbecker | 2004-12-29 17:12:34 +0000 (Wed, 29 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/doughnut.py + Fix up missing initialization +r2498 | rgbecker | 2004-12-29 17:11:02 +0000 (Wed, 29 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/piecharts.py + M /reportlab/trunk/reportlab/graphics/charts/doughnut.py + M /reportlab/trunk/reportlab/graphics/charts/barcharts.py + barcharts.py: NoneOr was miscapitalized +r2497 | rgbecker | 2004-12-29 14:08:38 +0000 (Wed, 29 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/piecharts.py + M /reportlab/trunk/reportlab/graphics/charts/legends.py + M /reportlab/trunk/reportlab/graphics/charts/barcharts.py + charts: minor adjustments to legends/swatches for pies/barcharts +r2496 | rgbecker | 2004-12-23 15:38:16 +0000 (Thu, 23 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/legends.py + legends.py: added variColumn attribute +r2495 | rgbecker | 2004-12-22 18:25:37 +0000 (Wed, 22 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/test/test_graphics_charts.py + M /reportlab/trunk/reportlab/graphics/charts/legends.py + graphics: minor legend tweaks +r2494 | rgbecker | 2004-12-22 16:50:08 +0000 (Wed, 22 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/axes.py + axes.py: added categegorAxis tickShift +r2493 | rgbecker | 2004-12-22 16:14:25 +0000 (Wed, 22 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/test/test_graphics_charts.py + M /reportlab/trunk/reportlab/graphics/charts/spider.py + M /reportlab/trunk/reportlab/graphics/charts/piecharts.py + M /reportlab/trunk/reportlab/graphics/charts/lineplots.py + M /reportlab/trunk/reportlab/graphics/charts/linecharts.py + M /reportlab/trunk/reportlab/graphics/charts/legends.py + M /reportlab/trunk/reportlab/graphics/charts/barcharts.py + charts: autolegending in place, legend now has boxAnchor +r2492 | rgbecker | 2004-12-21 18:02:28 +0000 (Tue, 21 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/lib/validators.py + M /reportlab/trunk/reportlab/graphics/charts/lineplots.py + M /reportlab/trunk/reportlab/graphics/charts/linecharts.py + M /reportlab/trunk/reportlab/graphics/charts/legends.py + M /reportlab/trunk/reportlab/graphics/charts/barcharts.py + M /reportlab/trunk/reportlab/graphics/charts/axes.py + Auto Legends +r2491 | andy | 2004-12-21 05:29:55 +0000 (Tue, 21 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/barcharts.py + missing isString import +r2490 | rgbecker | 2004-12-20 19:00:02 +0000 (Mon, 20 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/lib/validators.py + validators.py: better auto support +r2489 | rgbecker | 2004-12-20 18:59:35 +0000 (Mon, 20 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/legends.py + M /reportlab/trunk/reportlab/graphics/charts/barcharts.py + legends.py: more smart changes +r2488 | rgbecker | 2004-12-19 09:19:07 +0000 (Sun, 19 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/legends.py + legends.py: fix missing import +r2487 | rgbecker | 2004-12-19 09:15:56 +0000 (Sun, 19 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/lib/validators.py + validators.py: forgot to check in with AutoOr +r2486 | rgbecker | 2004-12-17 16:58:32 +0000 (Fri, 17 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/widgetbase.py + M /reportlab/trunk/reportlab/graphics/charts/spider.py + M /reportlab/trunk/reportlab/graphics/charts/piecharts.py + M /reportlab/trunk/reportlab/graphics/charts/legends.py + M /reportlab/trunk/reportlab/graphics/charts/doughnut.py + graphics: changes for SmartLegend +r2485 | rgbecker | 2004-12-16 16:42:12 +0000 (Thu, 16 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/graphics/charts/lineplots.py + lineplots.py: allow filled/unfilled plotting +r2484 | andy | 2004-12-10 07:27:50 +0000 (Fri, 10 Dec 2004) | 1 line + A /reportlab/trunk/reportlab/test/test_platypus_leftright.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + M /reportlab/trunk/reportlab/lib/corp.py + left/right template support +r2483 | rgbecker | 2004-12-06 17:00:44 +0000 (Mon, 06 Dec 2004) | 1 line + M /reportlab/trunk/reportlab/test/runAll.py + reportlab.test.utils.py: fix 2.4 problem +r2480 | rgbecker | 2004-11-25 14:27:07 +0000 (Thu, 25 Nov 2004) | 1 line + M /reportlab/trunk/reportlab/changes + reportlab: prparing for 1.20 re-release +r2478 | rgbecker | 2004-11-25 14:18:03 +0000 (Thu, 25 Nov 2004) | 1 line + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: extend span line blocking to multi lines +################################################################################# +#################### RELEASE 1.20 at 18:00 GMT 25/Nov/2004 ################# +################################################################################# +r2478 | rgbecker | 2004-11-25 14:18:03 +0000 (Thu, 25 Nov 2004) + tables.py: extend span line blocking to multi lines +r2477 | rgbecker | 2004-11-24 18:29:57 +0000 (Wed, 24 Nov 2004) + setup.py: add backin the missing sub-packages +r2476 | rgbecker | 2004-11-24 16:42:12 +0000 (Wed, 24 Nov 2004) + reportlab: table improvments and better documentation +r2475 | rgbecker | 2004-11-23 17:08:33 +0000 (Tue, 23 Nov 2004) + reportlab.setup.py: now works with and without rl_accel +r2462 | rgbecker | 2004-11-03 20:48:51 +0000 (Wed, 03 Nov 2004) + M /reportlab/trunk/reportlab/lib/utils.py + reportlab lib utils.py: add find_locals +r2461 | rgbecker | 2004-11-03 15:38:07 +0000 (Wed, 03 Nov 2004) + M /reportlab/trunk/reportlab/graphics/renderPM.py + M /reportlab/trunk/reportlab/graphics/renderPS.py + reportlab graphics: changes for canvasadapter +r2460 | rgbecker | 2004-11-02 10:18:55 +0000 (Tue, 02 Nov 2004) + M /reportlab/trunk/reportlab/platypus/flowables.py + flowables.py: fix no PIL jpg problem reported by Martin.Zohlhuber@tttech.com +r2459 | rgbecker | 2004-10-23 16:46:56 +0100 (Sat, 23 Oct 2004) + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/platypus/flowables.py + canvasadapter.py fixes +r2458 | rgbecker | 2004-10-22 17:37:01 +0100 (Fri, 22 Oct 2004) + M /reportlab/trunk/reportlab/graphics/renderPM.py + M /reportlab/trunk/reportlab/lib/colors.py + minor changes for pdf canvas compatibility and tests +r2457 | rgbecker | 2004-10-20 20:27:07 +0100 (Wed, 20 Oct 2004) + M /reportlab/trunk/reportlab/graphics/renderPM.py + M /reportlab/trunk/reportlab/graphics/renderbase.py + M /reportlab/trunk/reportlab/platypus/tables.py + CanvasAdapter related changes +r2456 | rgbecker | 2004-10-19 18:52:20 +0100 (Tue, 19 Oct 2004) + M /reportlab/trunk/reportlab/platypus/paragraph.py + paragraph.py: use canvas.setFillColor +r2455 | rgbecker | 2004-10-07 18:51:31 +0100 (Thu, 07 Oct 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfutils.py + pdfutils.py: added _fusc +r2454 | rgbecker | 2004-10-07 10:36:36 +0100 (Thu, 07 Oct 2004) + M /reportlab/trunk/reportlab/tools/pythonpoint/stdparser.py + stdparser.py: fix 2.1 brokenness +r2453 | andy | 2004-10-05 23:34:14 +0100 (Tue, 05 Oct 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + fixed col/row shading bug where last row or col never got shaded - reported R Revill +r2452 | andy | 2004-10-04 21:52:20 +0100 (Mon, 04 Oct 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + Tim Roberts' fix to vertical table cell alignment +r2451 | andy | 2004-10-04 08:03:42 +0100 (Mon, 04 Oct 2004) + M /reportlab/trunk/reportlab/tools/pythonpoint/stdparser.py + Francesco Pierfederici [fpierfed@noao.edu] fix to incorrect path argument +r2450 | rgbecker | 2004-10-01 13:28:12 +0100 (Fri, 01 Oct 2004) + M /reportlab/trunk/reportlab/rl_config.py + rl_config.py: use import for local_rl_config +r2449 | rgbecker | 2004-10-01 11:40:15 +0100 (Fri, 01 Oct 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: fix buglet in command adding +r2448 | andy | 2004-09-29 11:18:32 +0100 (Wed, 29 Sep 2004) + M /reportlab/trunk/reportlab/lib/colors.py + M /reportlab/trunk/reportlab/lib/corp.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/tables.py + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + table color cycle changes +r2447 | andy | 2004-09-29 10:17:52 +0100 (Wed, 29 Sep 2004) + M /reportlab/trunk/reportlab/license.txt + Updated to 2004 +r2446 | rgbecker | 2004-09-23 17:52:19 +0100 (Thu, 23 Sep 2004) + D /reportlab/trunk/reportlab/lib/Makefile.pre.in + D /reportlab/trunk/reportlab/lib/README.extensions + D /reportlab/trunk/reportlab/lib/Setup.in + D /reportlab/trunk/reportlab/lib/__BUILD.dsw + D /reportlab/trunk/reportlab/lib/_rl_accel.c + D /reportlab/trunk/reportlab/lib/_rl_accel.dsp + D /reportlab/trunk/reportlab/lib/_rl_accel.java + D /reportlab/trunk/reportlab/lib/hnjalloc.c + D /reportlab/trunk/reportlab/lib/hnjalloc.h + D /reportlab/trunk/reportlab/lib/hyphen.c + D /reportlab/trunk/reportlab/lib/hyphen.h + D /reportlab/trunk/reportlab/lib/hyphen.mashed + D /reportlab/trunk/reportlab/lib/pyHnj.dsp + D /reportlab/trunk/reportlab/lib/pyHnjmodule.c + D /reportlab/trunk/reportlab/lib/setup.py + D /reportlab/trunk/reportlab/lib/sgmlop.c + D /reportlab/trunk/reportlab/lib/sgmlop.dsp + M /reportlab/trunk/reportlab/setup.py + A /reportlab/trunk/rl_addons/rl_accel + A /reportlab/trunk/rl_addons/rl_accel/Makefile.pre.in (from /reportlab/trunk/reportlab/lib/Makefile.pre.in:2444) + A /reportlab/trunk/rl_addons/rl_accel/README.extensions (from /reportlab/trunk/reportlab/lib/README.extensions:2444) + A /reportlab/trunk/rl_addons/rl_accel/Setup.in (from /reportlab/trunk/reportlab/lib/Setup.in:2444) + A /reportlab/trunk/rl_addons/rl_accel/__BUILD.dsw (from /reportlab/trunk/reportlab/lib/__BUILD.dsw:2444) + A /reportlab/trunk/rl_addons/rl_accel/_rl_accel.c (from /reportlab/trunk/reportlab/lib/_rl_accel.c:2444) + A /reportlab/trunk/rl_addons/rl_accel/_rl_accel.dsp (from /reportlab/trunk/reportlab/lib/_rl_accel.dsp:2444) + A /reportlab/trunk/rl_addons/rl_accel/_rl_accel.java (from /reportlab/trunk/reportlab/lib/_rl_accel.java:2444) + A /reportlab/trunk/rl_addons/rl_accel/hnjalloc.c (from /reportlab/trunk/reportlab/lib/hnjalloc.c:2444) + A /reportlab/trunk/rl_addons/rl_accel/hnjalloc.h (from /reportlab/trunk/reportlab/lib/hnjalloc.h:2444) + A /reportlab/trunk/rl_addons/rl_accel/hyphen.c (from /reportlab/trunk/reportlab/lib/hyphen.c:2444) + A /reportlab/trunk/rl_addons/rl_accel/hyphen.h (from /reportlab/trunk/reportlab/lib/hyphen.h:2444) + A /reportlab/trunk/rl_addons/rl_accel/hyphen.mashed (from /reportlab/trunk/reportlab/lib/hyphen.mashed:2444) + A /reportlab/trunk/rl_addons/rl_accel/pyHnj.dsp (from /reportlab/trunk/reportlab/lib/pyHnj.dsp:2444) + A /reportlab/trunk/rl_addons/rl_accel/pyHnjmodule.c (from /reportlab/trunk/reportlab/lib/pyHnjmodule.c:2444) + A /reportlab/trunk/rl_addons/rl_accel/setup.py (from /reportlab/trunk/reportlab/lib/setup.py:2444) + A /reportlab/trunk/rl_addons/rl_accel/sgmlop.c (from /reportlab/trunk/reportlab/lib/sgmlop.c:2444) + A /reportlab/trunk/rl_addons/rl_accel/sgmlop.dsp (from /reportlab/trunk/reportlab/lib/sgmlop.dsp:2444) + reportlab/lib: moved _rl_accel and friends to rl_addons/rl_accel +r2445 | rgbecker | 2004-09-23 13:36:41 +0100 (Thu, 23 Sep 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: robustify repr +r2443 | rgbecker | 2004-09-22 09:57:45 +0100 (Wed, 22 Sep 2004) + M /reportlab/trunk/reportlab/platypus/flowables.py + flowables.py: remove 2.1 incompatibility +r2442 | rgbecker | 2004-09-20 17:31:22 +0100 (Mon, 20 Sep 2004) + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/test/test_platypus_pto.py + platypus/test: working pto (& inner pto) +r2441 | rgbecker | 2004-09-17 11:46:56 +0100 (Fri, 17 Sep 2004) + M /reportlab/trunk/reportlab/graphics/renderPM.py + renderPM.py: backward compatibility fix for _renderPM version <=0.98 +r2440 | rgbecker | 2004-09-15 10:40:03 +0100 (Wed, 15 Sep 2004) + M /reportlab/trunk/reportlab/setup.py + setup.py: fix get_version using patch from michael@stroeder.com +r2439 | rgbecker | 2004-09-14 12:08:13 +0100 (Tue, 14 Sep 2004) + M /reportlab/trunk/reportlab/platypus/__init__.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/tables.py + A /reportlab/trunk/reportlab/test/test_platypus_pto.py + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + platypus: added ptocontainer, moved tables test +r2438 | rgbecker | 2004-09-13 09:41:41 +0100 (Mon, 13 Sep 2004) + M /reportlab/trunk/reportlab/test/test_platypus_general.py + test_platypus_general.py: remove another 2.1 scope problem +r2437 | rgbecker | 2004-09-12 11:06:45 +0100 (Sun, 12 Sep 2004) + M /reportlab/trunk/reportlab/test/test_platypus_general.py + test_platypus_general.py: eliminate 2.1 scope problem +r2436 | rgbecker | 2004-09-11 15:18:33 +0100 (Sat, 11 Sep 2004) + M /reportlab/trunk/reportlab/lib/randomtext.py + randomtext.py: robustify textwrap import +r2435 | rgbecker | 2004-09-10 10:54:15 +0100 (Fri, 10 Sep 2004) + M /reportlab/trunk/reportlab/lib/randomtext.py + randomtext.py: fix argument handling +r2434 | rgbecker | 2004-09-09 18:42:18 +0100 (Thu, 09 Sep 2004) + M /reportlab/trunk/reportlab/platypus/frames.py + M /reportlab/trunk/reportlab/rl_config.py + move _FUZZ to rl_config +r2433 | rgbecker | 2004-09-09 18:01:57 +0100 (Thu, 09 Sep 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + pdfdoc.py: improve image masking given by Colors +r2432 | rgbecker | 2004-09-09 12:56:24 +0100 (Thu, 09 Sep 2004) + M /reportlab/trunk/reportlab/lib/randomtext.py + randomtext.py: some improvements +r2431 | rgbecker | 2004-09-08 18:41:10 +0100 (Wed, 08 Sep 2004) + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/paraparser.py + flowables.py: minor change to PTOContainer +r2430 | rgbecker | 2004-09-08 18:37:26 +0100 (Wed, 08 Sep 2004) + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/frames.py + platypus: almost finished PTOContainer +r2429 | rgbecker | 2004-09-08 12:02:58 +0100 (Wed, 08 Sep 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + tables.py: implement Eric Stephen's border drawing suggestion +r2428 | rgbecker | 2004-09-08 11:47:55 +0100 (Wed, 08 Sep 2004) + M /reportlab/trunk/reportlab/test/test_platypus_general.py + test_platypus_general.py: fix so all output seen +r2427 | rgbecker | 2004-09-03 10:53:17 +0100 (Fri, 03 Sep 2004) + M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/xmlparser.c + pyRXP: fix buf bug in xmlparser.c -->1.05 +r2426 | rgbecker | 2004-09-02 12:52:56 +0100 (Thu, 02 Sep 2004) + M /reportlab/trunk/reportlab/platypus/xpreformatted.py + XPreformatted: make __init__ lead args same as for paragraph +r2425 | rgbecker | 2004-08-27 17:08:32 +0100 (Fri, 27 Aug 2004) + M /reportlab/trunk/reportlab/graphics/charts/axes.py + axes.py: fix format bug +r2424 | rgbecker | 2004-08-25 15:38:48 +0100 (Wed, 25 Aug 2004) + M /reportlab/trunk/reportlab/platypus/paraparser.py + paraparser.py: minor speedup +r2423 | rgbecker | 2004-08-24 12:36:22 +0100 (Tue, 24 Aug 2004) + M /reportlab/trunk/reportlab/lib/sequencer.py + M /reportlab/trunk/reportlab/platypus/paraparser.py + M /reportlab/trunk/reportlab/test/test_paragraphs.py + added seqchain/format tags +r2422 | rgbecker | 2004-08-23 16:54:25 +0100 (Mon, 23 Aug 2004) + M /reportlab/trunk/reportlab/platypus/paragraph.py + M /reportlab/trunk/reportlab/test/test_paragraphs.py + fix backcolour bug +r2421 | rgbecker | 2004-08-20 17:12:33 +0100 (Fri, 20 Aug 2004) + M /reportlab/trunk/reportlab/platypus/__init__.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + M /reportlab/trunk/reportlab/test/test_paragraphs.py + minor twitching on Indenter +r2420 | rgbecker | 2004-08-19 23:17:05 +0100 (Thu, 19 Aug 2004) + M /reportlab/trunk/reportlab/lib/utils.py + reportlab/lib/utils.py: added flatten utility function +r2419 | rgbecker | 2004-08-19 10:58:05 +0100 (Thu, 19 Aug 2004) + M /reportlab/trunk/reportlab/lib/_rl_accel.c + _rl_accel.c: patch from Yves Bastide +r2418 | rgbecker | 2004-08-18 14:11:15 +0100 (Wed, 18 Aug 2004) + M /reportlab/trunk/reportlab/graphics/charts/textlabels.py + M /reportlab/trunk/reportlab/graphics/widgetbase.py + remove 2.2 isms +r2417 | rgbecker | 2004-08-18 12:17:54 +0100 (Wed, 18 Aug 2004) + M /reportlab/trunk/reportlab/graphics/charts/textlabels.py + textlabels.py: added keyword arguments +r2416 | rgbecker | 2004-08-17 14:52:21 +0100 (Tue, 17 Aug 2004) + M /reportlab/trunk/reportlab/graphics/charts/lineplots.py + lineplots.py: added filler handling +r2415 | rgbecker | 2004-08-07 16:00:28 +0100 (Sat, 07 Aug 2004) + M /reportlab/trunk/reportlab/graphics/renderPDF.py + M /reportlab/trunk/reportlab/graphics/renderPM.py + M /reportlab/trunk/reportlab/graphics/renderPS.py + M /reportlab/trunk/reportlab/graphics/renderSVG.py + M /reportlab/trunk/reportlab/graphics/renderbase.py + M /reportlab/trunk/reportlab/rl_config.py + rl_config add _unset_, graphics.renderxxx refactoring +r2414 | rgbecker | 2004-07-28 08:53:41 +0100 (Wed, 28 Jul 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + pdfdoc: fix rare bug (exposed in tinyrml) +r2413 | rgbecker | 2004-07-26 09:56:04 +0100 (Mon, 26 Jul 2004) + M /reportlab/trunk/rl_addons/pyRXP/rxp/system.h + Attempt to fix LONG_LONG defn problem +r2412 | rgbecker | 2004-07-23 17:57:11 +0100 (Fri, 23 Jul 2004) + M /reportlab/trunk/reportlab/graphics/renderPM.py + M /reportlab/trunk/rl_addons/renderPM/_renderPM.c + M /reportlab/trunk/rl_addons/renderPM/gt1/gt1-parset1.c + M /reportlab/trunk/rl_addons/renderPM/gt1/gt1-parset1.h + Add reader callback arg to _renderPM.makeT1Font +r2411 | rgbecker | 2004-07-23 14:48:21 +0100 (Fri, 23 Jul 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Minor fixes to lib.utils.rl_get_module +r2410 | rgbecker | 2004-07-23 10:43:00 +0100 (Fri, 23 Jul 2004) + M /reportlab/trunk/reportlab/test/test_pdfbase_ttfonts.py + test_pdfbase_ttfonts.py add multipage check +r2409 | rgbecker | 2004-07-22 11:59:29 +0100 (Thu, 22 Jul 2004) + M /reportlab/trunk/reportlab/lib/utils.py + reportlab.lib.utils fix rl_isdir +r2408 | rgbecker | 2004-07-17 20:43:44 +0100 (Sat, 17 Jul 2004) + M /reportlab/trunk/rl_addons/pyRXP/patches/differ.bat + D /reportlab/trunk/rl_addons/pyRXP/patches/rl-1.2.5.patch + A /reportlab/trunk/rl_addons/pyRXP/patches/rl-1.4.0-patch + M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/COPYRIGHT + M /reportlab/trunk/rl_addons/pyRXP/rxp/Makefile + M /reportlab/trunk/rl_addons/pyRXP/rxp/Manual + A /reportlab/trunk/rl_addons/pyRXP/rxp/catalog.c + A /reportlab/trunk/rl_addons/pyRXP/rxp/catalog.h + A /reportlab/trunk/rl_addons/pyRXP/rxp/catalog_dtd.c + A /reportlab/trunk/rl_addons/pyRXP/rxp/catutil.c + A /reportlab/trunk/rl_addons/pyRXP/rxp/catutil.h + M /reportlab/trunk/rl_addons/pyRXP/rxp/ctype16.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/ctype16.h + M /reportlab/trunk/rl_addons/pyRXP/rxp/dtd.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/dtd.h + A /reportlab/trunk/rl_addons/pyRXP/rxp/entityopener.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/infoset-print.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/input.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/input.h + M /reportlab/trunk/rl_addons/pyRXP/rxp/namespaces.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/namespaces.h + A /reportlab/trunk/rl_addons/pyRXP/rxp/nf16check.c + A /reportlab/trunk/rl_addons/pyRXP/rxp/nf16check.h + A /reportlab/trunk/rl_addons/pyRXP/rxp/nf16data.c + A /reportlab/trunk/rl_addons/pyRXP/rxp/nf16data.h + A /reportlab/trunk/rl_addons/pyRXP/rxp/resolve.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/rxp.1 + M /reportlab/trunk/rl_addons/pyRXP/rxp/rxp.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/rxputil.h + M /reportlab/trunk/rl_addons/pyRXP/rxp/stdio16.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/system.h + M /reportlab/trunk/rl_addons/pyRXP/rxp/url.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/version.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/xmlparser.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/xmlparser.h + M /reportlab/trunk/rl_addons/pyRXP/setup.py + Synchronize with rxp-1.4.0 --> version 1.04 +r2407 | rgbecker | 2004-07-15 11:22:38 +0100 (Thu, 15 Jul 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Another know location +r2406 | rgbecker | 2004-07-09 17:29:34 +0100 (Fri, 09 Jul 2004) + M /reportlab/trunk/reportlab/rl_config.py + Add user home to search paths +r2405 | kirpal | 2004-07-09 15:34:52 +0100 (Fri, 09 Jul 2004) + M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py + changes to refrences of CVS +r2404 | rgbecker | 2004-07-02 14:37:32 +0100 (Fri, 02 Jul 2004) + A /reportlab/trunk/reportlab/tools/utils + A /reportlab/trunk/reportlab/tools/utils/add_bleed.py + Initial checkin +r2402 | kirpal | 2004-06-29 14:28:59 +0100 (Tue, 29 Jun 2004) + D /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml + moved to users/kirpals +r2401 | kirpal | 2004-06-29 13:04:15 +0100 (Tue, 29 Jun 2004) + M /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml + changes to presentation +r2400 | kirpal | 2004-06-29 10:52:08 +0100 (Tue, 29 Jun 2004) + M /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml +r2399 | kirpal | 2004-06-29 10:37:59 +0100 (Tue, 29 Jun 2004) + M /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml + modified presentation +r2398 | kirpal | 2004-06-29 10:19:21 +0100 (Tue, 29 Jun 2004) + M /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml + modified presentation +r2397 | kirpal | 2004-06-28 17:09:41 +0100 (Mon, 28 Jun 2004) + M /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml + changes to presentation +r2396 | kirpal | 2004-06-28 15:40:16 +0100 (Mon, 28 Jun 2004) + A /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml + python point presentation for Confkit +r2395 | rgbecker | 2004-06-25 19:10:50 +0100 (Fri, 25 Jun 2004) + M /reportlab/trunk/reportlab/demos/stdfonts/stdfonts.py + M /reportlab/trunk/reportlab/graphics/renderPDF.py + M /reportlab/trunk/reportlab/graphics/shapes.py + M /reportlab/trunk/reportlab/lib/validators.py + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + D /reportlab/trunk/reportlab/pdfbase/rl_codecs.py + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfgen/textobject.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + M /reportlab/trunk/reportlab/platypus/paraparser.py + M /reportlab/trunk/reportlab/rl_config.py + M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + D /reportlab/trunk/reportlab/test/test_platypus_paraparser.py + Removed unicode changes +r2393 | rgbecker | 2004-06-23 15:56:24 +0100 (Wed, 23 Jun 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Fix 2.2 mktemp argument mismatch +r2392 | rgbecker | 2004-06-23 14:56:44 +0100 (Wed, 23 Jun 2004) + M /reportlab/trunk/reportlab/lib/utils.py + M /reportlab/trunk/reportlab/pdfbase/_fontdata.py + M /reportlab/trunk/reportlab/rl_config.py + More changes related to compact distro path recognition +r2391 | rgbecker | 2004-06-23 09:52:43 +0100 (Wed, 23 Jun 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + Changes to bruteforce search, non-invasive changes to rl_accel stuff +r2390 | rgbecker | 2004-06-23 09:49:10 +0100 (Wed, 23 Jun 2004) + M /reportlab/trunk/reportlab/lib/codecharts.py + Fix for unicode difficulties +r2389 | rgbecker | 2004-06-22 18:00:41 +0100 (Tue, 22 Jun 2004) + A /reportlab/trunk/reportlab/pdfbase/rl_codecs.py + First try at Adobe T1 encodings +r2388 | rgbecker | 2004-06-21 15:07:46 +0100 (Mon, 21 Jun 2004) + M /reportlab/trunk/reportlab/demos/stdfonts/stdfonts.py + Attempt to fix up for unicode +r2387 | jjlee | 2004-06-18 11:39:08 +0100 (Fri, 18 Jun 2004) + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + Fixed zero-length string case in stringWidth +r2386 | rgbecker | 2004-06-17 16:26:26 +0100 (Thu, 17 Jun 2004) + M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c + M /reportlab/trunk/rl_addons/pyRXP/rxp/url.h + M /reportlab/trunk/rl_addons/pyRXP/setup.py + Remove $Header:, fix CopyRight & history +r2385 | rgbecker | 2004-06-17 16:26:05 +0100 (Thu, 17 Jun 2004) + M /reportlab/trunk/reportlab/__init__.py + M /reportlab/trunk/reportlab/demos/colors/colortest.py + M /reportlab/trunk/reportlab/demos/gadflypaper/gfe.py + M /reportlab/trunk/reportlab/demos/odyssey/dodyssey.py + M /reportlab/trunk/reportlab/demos/odyssey/fodyssey.py + M /reportlab/trunk/reportlab/demos/odyssey/odyssey.py + M /reportlab/trunk/reportlab/demos/rlzope/rlzope.py + M /reportlab/trunk/reportlab/demos/stdfonts/stdfonts.py + M /reportlab/trunk/reportlab/demos/tests/testdemos.py + M /reportlab/trunk/reportlab/docs/graphguide/ch1_intro.py + M /reportlab/trunk/reportlab/docs/graphguide/ch2_concepts.py + M /reportlab/trunk/reportlab/docs/graphguide/ch3_shapes.py + M /reportlab/trunk/reportlab/docs/graphguide/ch4_widgets.py + M /reportlab/trunk/reportlab/docs/graphguide/ch5_charts.py + M /reportlab/trunk/reportlab/docs/graphguide/gengraphguide.py + M /reportlab/trunk/reportlab/docs/reference/genreference.py + M /reportlab/trunk/reportlab/docs/userguide/app_demos.py + M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py + M /reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py + M /reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py + M /reportlab/trunk/reportlab/docs/userguide/ch3_pdffeatures.py + M /reportlab/trunk/reportlab/docs/userguide/ch4_platypus_concepts.py + M /reportlab/trunk/reportlab/docs/userguide/ch5_paragraphs.py + M /reportlab/trunk/reportlab/docs/userguide/ch6_tables.py + M /reportlab/trunk/reportlab/docs/userguide/ch7_custom.py + M /reportlab/trunk/reportlab/docs/userguide/ch9_future.py + M /reportlab/trunk/reportlab/docs/userguide/genuserguide.py + M /reportlab/trunk/reportlab/extensions/__init__.py + M /reportlab/trunk/reportlab/graphics/__init__.py + M /reportlab/trunk/reportlab/graphics/charts/__init__.py + M /reportlab/trunk/reportlab/graphics/charts/areas.py + M /reportlab/trunk/reportlab/graphics/charts/axes.py + M /reportlab/trunk/reportlab/graphics/charts/barcharts.py + M /reportlab/trunk/reportlab/graphics/charts/doughnut.py + M /reportlab/trunk/reportlab/graphics/charts/legends.py + M /reportlab/trunk/reportlab/graphics/charts/linecharts.py + M /reportlab/trunk/reportlab/graphics/charts/lineplots.py + M /reportlab/trunk/reportlab/graphics/charts/markers.py + M /reportlab/trunk/reportlab/graphics/charts/piecharts.py + M /reportlab/trunk/reportlab/graphics/charts/spider.py + M /reportlab/trunk/reportlab/graphics/charts/textlabels.py + M /reportlab/trunk/reportlab/graphics/charts/utils.py + M /reportlab/trunk/reportlab/graphics/renderPDF.py + M /reportlab/trunk/reportlab/graphics/renderPM.py + M /reportlab/trunk/reportlab/graphics/renderPS.py + M /reportlab/trunk/reportlab/graphics/renderbase.py + M /reportlab/trunk/reportlab/graphics/samples/__init__.py + M /reportlab/trunk/reportlab/graphics/shapes.py + M /reportlab/trunk/reportlab/graphics/testdrawings.py + M /reportlab/trunk/reportlab/graphics/testshapes.py + M /reportlab/trunk/reportlab/graphics/widgetbase.py + M /reportlab/trunk/reportlab/graphics/widgets/__init__.py + M /reportlab/trunk/reportlab/graphics/widgets/eventcal.py + M /reportlab/trunk/reportlab/graphics/widgets/flags.py + M /reportlab/trunk/reportlab/graphics/widgets/grids.py + M /reportlab/trunk/reportlab/graphics/widgets/markers.py + M /reportlab/trunk/reportlab/graphics/widgets/signsandsymbols.py + M /reportlab/trunk/reportlab/lib/__init__.py + M /reportlab/trunk/reportlab/lib/_rl_accel.c + M /reportlab/trunk/reportlab/lib/abag.py + M /reportlab/trunk/reportlab/lib/attrmap.py + M /reportlab/trunk/reportlab/lib/codecharts.py + M /reportlab/trunk/reportlab/lib/colors.py + M /reportlab/trunk/reportlab/lib/corp.py + M /reportlab/trunk/reportlab/lib/enums.py + M /reportlab/trunk/reportlab/lib/extformat.py + M /reportlab/trunk/reportlab/lib/fonts.py + M /reportlab/trunk/reportlab/lib/formatters.py + M /reportlab/trunk/reportlab/lib/logger.py + M /reportlab/trunk/reportlab/lib/pagesizes.py + M /reportlab/trunk/reportlab/lib/randomtext.py + M /reportlab/trunk/reportlab/lib/sequencer.py + M /reportlab/trunk/reportlab/lib/set_ops.py + M /reportlab/trunk/reportlab/lib/setup.py + M /reportlab/trunk/reportlab/lib/styles.py + M /reportlab/trunk/reportlab/lib/tocindex.py + M /reportlab/trunk/reportlab/lib/units.py + M /reportlab/trunk/reportlab/lib/utils.py + M /reportlab/trunk/reportlab/lib/validators.py + M /reportlab/trunk/reportlab/lib/yaml.py + M /reportlab/trunk/reportlab/pdfbase/__init__.py + M /reportlab/trunk/reportlab/pdfbase/_cidfontdata.py + M /reportlab/trunk/reportlab/pdfbase/_fontdata.py + M /reportlab/trunk/reportlab/pdfbase/cidfonts.py + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + M /reportlab/trunk/reportlab/pdfbase/pdfutils.py + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + M /reportlab/trunk/reportlab/pdfgen/__init__.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfgen/pathobject.py + M /reportlab/trunk/reportlab/pdfgen/pdfgeom.py + M /reportlab/trunk/reportlab/pdfgen/pdfimages.py + M /reportlab/trunk/reportlab/pdfgen/textobject.py + M /reportlab/trunk/reportlab/platypus/__init__.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + M /reportlab/trunk/reportlab/platypus/figures.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/frames.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + M /reportlab/trunk/reportlab/platypus/paraparser.py + M /reportlab/trunk/reportlab/platypus/tableofcontents.py + M /reportlab/trunk/reportlab/platypus/tables.py + M /reportlab/trunk/reportlab/platypus/xpreformatted.py + M /reportlab/trunk/reportlab/rl_config.py + M /reportlab/trunk/reportlab/setup.py + M /reportlab/trunk/reportlab/test/__init__.py + M /reportlab/trunk/reportlab/test/runAll.py + M /reportlab/trunk/reportlab/test/test_charts_textlabels.py + M /reportlab/trunk/reportlab/test/test_docstrings.py + M /reportlab/trunk/reportlab/test/test_graphics_charts.py + M /reportlab/trunk/reportlab/test/test_graphics_images.py + M /reportlab/trunk/reportlab/test/test_graphics_layout.py + M /reportlab/trunk/reportlab/test/test_graphics_speed.py + M /reportlab/trunk/reportlab/test/test_hello.py + M /reportlab/trunk/reportlab/test/test_images.py + M /reportlab/trunk/reportlab/test/test_invariant.py + M /reportlab/trunk/reportlab/test/test_lib_colors.py + M /reportlab/trunk/reportlab/test/test_lib_sequencer.py + M /reportlab/trunk/reportlab/test/test_multibyte_chs.py + M /reportlab/trunk/reportlab/test/test_multibyte_cht.py + M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py + M /reportlab/trunk/reportlab/test/test_paragraphs.py + M /reportlab/trunk/reportlab/test/test_pdfbase_pdfmetrics.py + M /reportlab/trunk/reportlab/test/test_pdfbase_pdfutils.py + M /reportlab/trunk/reportlab/test/test_pdfbase_postscript.py + M /reportlab/trunk/reportlab/test/test_pdfgen_callback.py + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + M /reportlab/trunk/reportlab/test/test_pdfgen_links.py + M /reportlab/trunk/reportlab/test/test_pdfgen_pagemodes.py + M /reportlab/trunk/reportlab/test/test_pdfgen_pycanvas.py + M /reportlab/trunk/reportlab/test/test_platypus_breaking.py + M /reportlab/trunk/reportlab/test/test_platypus_general.py + M /reportlab/trunk/reportlab/test/test_platypus_indents.py + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + M /reportlab/trunk/reportlab/test/test_platypus_paraparser.py + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + M /reportlab/trunk/reportlab/test/test_platypus_toc.py + M /reportlab/trunk/reportlab/test/test_platypus_xref.py + M /reportlab/trunk/reportlab/test/test_pyfiles.py + M /reportlab/trunk/reportlab/test/test_source_chars.py + M /reportlab/trunk/reportlab/test/test_widgetbase_tpc.py + M /reportlab/trunk/reportlab/tools/__init__.py + M /reportlab/trunk/reportlab/tools/docco/__init__.py + M /reportlab/trunk/reportlab/tools/docco/codegrab.py + M /reportlab/trunk/reportlab/tools/docco/docpy.py + M /reportlab/trunk/reportlab/tools/docco/examples.py + M /reportlab/trunk/reportlab/tools/docco/graphdocpy.py + M /reportlab/trunk/reportlab/tools/docco/rl_doc_utils.py + M /reportlab/trunk/reportlab/tools/docco/rltemplate.py + M /reportlab/trunk/reportlab/tools/docco/stylesheet.py + M /reportlab/trunk/reportlab/tools/docco/t_parse.py + M /reportlab/trunk/reportlab/tools/docco/yaml.py + M /reportlab/trunk/reportlab/tools/docco/yaml2pdf.py + M /reportlab/trunk/reportlab/tools/py2pdf/__init__.py + M /reportlab/trunk/reportlab/tools/py2pdf/idle_print.py + M /reportlab/trunk/reportlab/tools/pythonpoint/__init__.py + M /reportlab/trunk/reportlab/tools/pythonpoint/customshapes.py + M /reportlab/trunk/reportlab/tools/pythonpoint/styles/__init__.py + M /reportlab/trunk/reportlab/tools/pythonpoint/styles/horrible.py + M /reportlab/trunk/reportlab/tools/pythonpoint/styles/modern.py + Remove $Header:, fix CopyRight & history +r2384 | mike | 2004-06-17 15:50:51 +0100 (Thu, 17 Jun 2004) + M /reportlab/trunk/reportlab/test/test_pdfgen_links.py + Change back to native eol to fix line endings +r2383 | mike | 2004-06-17 15:44:11 +0100 (Thu, 17 Jun 2004) + M /reportlab/trunk/reportlab/test/test_pdfgen_links.py + Temporary change to binary to fix line endings +r2382 | rgbecker | 2004-06-17 15:23:21 +0100 (Thu, 17 Jun 2004) + M /reportlab/trunk/reportlab/test/test_pdfgen_links.py + Attempt to fix lineendings +r2381 | rgbecker | 2004-06-17 13:01:26 +0100 (Thu, 17 Jun 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + Fix encoding for zap & symbol +r2380 | rgbecker | 2004-06-16 12:45:56 +0100 (Wed, 16 Jun 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Forgot to check the exactly equal case for _startswith_rl +r2379 | rgbecker | 2004-06-15 14:10:37 +0100 (Tue, 15 Jun 2004) + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + M /reportlab/trunk/reportlab/pdfgen/textobject.py + Moved encoding checks into splitString +r2378 | rgbecker | 2004-06-15 12:34:47 +0100 (Tue, 15 Jun 2004) + M /reportlab/trunk/reportlab/test/test_platypus_paraparser.py + Fix properties and possibly line-endings +r2377 | rgbecker | 2004-06-15 11:33:32 +0100 (Tue, 15 Jun 2004) + M /reportlab/trunk/reportlab/graphics/charts/axes.py + remove use of False (invalid in 2.2) +r2376 | andy | 2004-06-14 23:13:04 +0100 (Mon, 14 Jun 2004) + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + fixed widths bug for tt fonts +r2375 | rgbecker | 2004-06-14 18:51:15 +0100 (Mon, 14 Jun 2004) + M /reportlab/trunk/reportlab/graphics/charts/axes.py +r2374 | andy | 2004-06-14 17:41:25 +0100 (Mon, 14 Jun 2004) + M /reportlab/trunk/reportlab/graphics/renderPDF.py + M /reportlab/trunk/reportlab/graphics/shapes.py + M /reportlab/trunk/reportlab/lib/validators.py + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfgen/textobject.py + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/paragraph.py + M /reportlab/trunk/reportlab/platypus/paraparser.py + M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py + A /reportlab/trunk/reportlab/test/test_platypus_paraparser.py + Unicode and UTF8 support changes +r2373 | rgbecker | 2004-06-14 17:29:04 +0100 (Mon, 14 Jun 2004) + M /reportlab/trunk/reportlab/pdfgen/canvas.py + Fix import of logger +r2372 | mike | 2004-06-11 18:11:22 +0100 (Fri, 11 Jun 2004) + M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py + Added more accurate checking of UTF8 output +r2371 | mike | 2004-06-11 17:15:45 +0100 (Fri, 11 Jun 2004) + M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py + Made some corrections and got all TextEncodingTestCase tests working +r2370 | mike | 2004-06-11 16:25:50 +0100 (Fri, 11 Jun 2004) + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfgen/textobject.py + Added support for mac_roman encoding and changed to always convert unicode strings to font encoding +r2369 | robin | 2004-06-11 11:17:18 +0100 (Fri, 11 Jun 2004) + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py + Early 2.x has no UnicodeDecodeError and no ''.decode +r2368 | andy_robinson | 2004-06-10 01:43:21 +0100 (Thu, 10 Jun 2004) + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfgen/textobject.py + M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + Now has runnable encoding-conversion +r2367 | rgbecker | 2004-06-07 17:30:37 +0100 (Mon, 07 Jun 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + Add xpre example +r2366 | rgbecker | 2004-06-03 12:26:44 +0100 (Thu, 03 Jun 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Another rework of the open for read code +r2365 | rgbecker | 2004-06-03 11:38:25 +0100 (Thu, 03 Jun 2004) + M /reportlab/trunk/reportlab/test/test_platypus_general.py + Attempt to fix the file: form +r2364 | andy_robinson | 2004-05-29 00:41:18 +0100 (Sat, 29 May 2004) + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfgen/textobject.py + M /reportlab/trunk/reportlab/platypus/figures.py + M /reportlab/trunk/reportlab/rl_config.py + M /reportlab/trunk/reportlab/tools/pythonpoint/pythonpoint.dtd + M /reportlab/trunk/reportlab/tools/pythonpoint/pythonpoint.py + M /reportlab/trunk/reportlab/tools/pythonpoint/stdparser.py + Prelim support for unicode conversion (disabled by + rl_config.autoConvertEncodings at first); + borders to drawings in pythonpoint and for figure + objects; +r2363 | rgbecker | 2004-05-28 15:39:42 +0100 (Fri, 28 May 2004) + M /reportlab/trunk/reportlab/test/test_platypus_general.py + Attempt to test http urls for images +r2362 | rgbecker | 2004-05-28 15:04:25 +0100 (Fri, 28 May 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Attempt to fix open_for_read again +r2361 | rgbecker | 2004-05-28 15:02:14 +0100 (Fri, 28 May 2004) + M /reportlab/trunk/reportlab/test/test_lib_utils.py + Added open_and_read tests +r2360 | rgbecker | 2004-05-26 19:44:55 +0100 (Wed, 26 May 2004) + M /reportlab/trunk/reportlab/lib/utils.py + More compact distro changes +r2359 | jjlee | 2004-05-26 10:37:07 +0100 (Wed, 26 May 2004) + M /reportlab/trunk/reportlab/graphics/charts/lineplots.py + M /reportlab/trunk/reportlab/graphics/shapes.py + Make a couple of files emacs font-lock friendly +r2358 | rgbecker | 2004-05-25 22:12:31 +0100 (Tue, 25 May 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Use more advanced __loader__ friendly code +r2357 | rgbecker | 2004-05-25 17:33:56 +0100 (Tue, 25 May 2004) + M /reportlab/trunk/reportlab/docs/reference/genreference.py + Fix missing module +r2356 | rgbecker | 2004-05-24 13:19:53 +0100 (Mon, 24 May 2004) + M /reportlab/trunk/reportlab/lib/_rl_accel.c + Attempt to fix 1.5 problems +r2355 | rgbecker | 2004-05-23 11:39:30 +0100 (Sun, 23 May 2004) + M /reportlab/trunk/reportlab/lib/utils.py + rl_get_module now seems to work as intended +r2354 | rgbecker | 2004-05-23 10:27:52 +0100 (Sun, 23 May 2004) + M /reportlab/trunk/reportlab/lib/utils.py + rl_get_module added +r2353 | rgbecker | 2004-05-20 11:10:27 +0100 (Thu, 20 May 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Attempt to robustify the memo +r2352 | rgbecker | 2004-05-18 18:16:55 +0100 (Tue, 18 May 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + Fix proposed by Derik Barclay +r2351 | rgbecker | 2004-05-08 18:19:54 +0100 (Sat, 08 May 2004) + M /reportlab/trunk/reportlab/tools/docco/docpy.py + M /reportlab/trunk/reportlab/tools/docco/graphdocpy.py + D /reportlab/trunk/reportlab/tools/docco/inspect.py + Removed private version of inspect +r2350 | rgbecker | 2004-05-07 17:56:29 +0100 (Fri, 07 May 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Added some more stuff and script name to DebugMemo output +r2349 | rgbecker | 2004-05-07 16:28:33 +0100 (Fri, 07 May 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Added capture_traceback=1 to DebugMemo init +r2348 | rgbecker | 2004-05-03 09:13:37 +0100 (Mon, 03 May 2004) + M /reportlab/trunk/reportlab/graphics/widgets/grids.py + Make stripe strokeColor same as fill +r2347 | rgbecker | 2004-05-03 09:11:48 +0100 (Mon, 03 May 2004) + M /reportlab/trunk/reportlab/test/test_docstrings.py + Minor changes +r2346 | rgbecker | 2004-05-03 09:09:52 +0100 (Mon, 03 May 2004) + M /reportlab/trunk/reportlab/lib/_rl_accel.c + Fix flagged and penalty values +r2345 | rgbecker | 2004-04-28 16:27:31 +0100 (Wed, 28 Apr 2004) + M /reportlab/trunk/reportlab/tools/docco/graphdocpy.py + Move to using inspect for getsource (actually works) +r2344 | rgbecker | 2004-04-28 15:41:56 +0100 (Wed, 28 Apr 2004) + M /reportlab/trunk/reportlab/tools/docco/rl_doc_utils.py + Added setStory +r2343 | rgbecker | 2004-04-28 15:40:21 +0100 (Wed, 28 Apr 2004) + M /reportlab/trunk/reportlab/docs/graphguide/gengraphguide.py + M /reportlab/trunk/reportlab/docs/reference/genreference.py + M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py + M /reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py + M /reportlab/trunk/reportlab/docs/userguide/ch6_tables.py + M /reportlab/trunk/reportlab/docs/userguide/genuserguide.py + Fixing up to not use folder relative import +r2342 | rgbecker | 2004-04-22 18:36:41 +0100 (Thu, 22 Apr 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + Attempt to fix the Mike Spanning example +r2341 | rgbecker | 2004-04-21 17:39:36 +0100 (Wed, 21 Apr 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + Added Mike's counter span example +r2340 | rgbecker | 2004-04-14 14:10:51 +0100 (Wed, 14 Apr 2004) + M /reportlab/trunk/reportlab/graphics/shapes.py + Fix problem with empty charts +r2339 | rgbecker | 2004-04-08 17:02:52 +0100 (Thu, 08 Apr 2004) + M /reportlab/trunk/reportlab/lib/_rl_accel.c + remove Box stuff prior to 2.3 +r2338 | rgbecker | 2004-04-08 15:17:42 +0100 (Thu, 08 Apr 2004) + M /reportlab/trunk/reportlab/lib/_rl_accel.c + removed PyDoc_STR for now; changed to do hex version checks +r2337 | rgbecker | 2004-04-05 19:07:42 +0100 (Mon, 05 Apr 2004) + M /reportlab/trunk/reportlab/platypus/flowables.py + M /reportlab/trunk/reportlab/platypus/tables.py + Minor changes +r2336 | rgbecker | 2004-04-05 15:17:29 +0100 (Mon, 05 Apr 2004) + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + Another attempt to fix up wanrings +r2335 | rgbecker | 2004-04-05 13:59:56 +0100 (Mon, 05 Apr 2004) + M /reportlab/trunk/reportlab/lib/_rl_accel.c + Forgot to bump the version +r2334 | rgbecker | 2004-04-05 08:47:18 +0100 (Mon, 05 Apr 2004) + M /reportlab/trunk/reportlab/lib/_rl_accel.c + Added in BoxList, removed AttrDict +r2333 | rgbecker | 2004-04-01 18:00:33 +0100 (Thu, 01 Apr 2004) + M /reportlab/trunk/reportlab/lib/extformat.py + Added header lines +r2332 | rgbecker | 2004-04-01 17:59:22 +0100 (Thu, 01 Apr 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Added get_rl_tempfile +r2331 | rgbecker | 2004-04-01 17:58:02 +0100 (Thu, 01 Apr 2004) + A /reportlab/trunk/reportlab/lib/extformat.py + Added for better formatting +r2330 | rgbecker | 2004-04-01 12:17:02 +0100 (Thu, 01 Apr 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + Ensure _colWidths is defined +r2329 | rgbecker | 2004-03-30 15:58:35 +0100 (Tue, 30 Mar 2004) + M /reportlab/trunk/reportlab/platypus/flowables.py + Added HRFlowable +r2328 | rgbecker | 2004-03-27 09:42:24 +0000 (Sat, 27 Mar 2004) + M /reportlab/trunk/reportlab/test/runAll.py + Indicate output folder +r2327 | rgbecker | 2004-03-27 09:41:37 +0000 (Sat, 27 Mar 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + Ensure external mask gets through in a85 cases +r2326 | rgbecker | 2004-03-26 21:34:03 +0000 (Fri, 26 Mar 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + M /reportlab/trunk/reportlab/pdfbase/pdfutils.py + Fix bug introduced during transparency/ImageReader changes +r2325 | rgbecker | 2004-03-26 16:54:37 +0000 (Fri, 26 Mar 2004) + M /reportlab/trunk/reportlab/test/test_tools_pythonpoint.py + Fix buglet in compact testing +r2324 | rgbecker | 2004-03-26 15:44:24 +0000 (Fri, 26 Mar 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + Added percentages +r2323 | rgbecker | 2004-03-26 14:27:24 +0000 (Fri, 26 Mar 2004) + M /reportlab/trunk/reportlab/test/test_pyfiles.py + Move to having all test output in a temp folder +r2322 | rgbecker | 2004-03-26 14:26:50 +0000 (Fri, 26 Mar 2004) + M /reportlab/trunk/reportlab/test/runAll.py + Add test_*.txt cleanup +r2321 | rgbecker | 2004-03-26 14:20:44 +0000 (Fri, 26 Mar 2004) + M /reportlab/trunk/reportlab/test/runAll.py + M /reportlab/trunk/reportlab/test/test_charts_textlabels.py + M /reportlab/trunk/reportlab/test/test_docstrings.py + M /reportlab/trunk/reportlab/test/test_graphics_charts.py + M /reportlab/trunk/reportlab/test/test_graphics_images.py + M /reportlab/trunk/reportlab/test/test_graphics_speed.py + M /reportlab/trunk/reportlab/test/test_hello.py + M /reportlab/trunk/reportlab/test/test_invariant.py + M /reportlab/trunk/reportlab/test/test_lib_colors.py + M /reportlab/trunk/reportlab/test/test_multibyte_chs.py + M /reportlab/trunk/reportlab/test/test_multibyte_cht.py + M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py + M /reportlab/trunk/reportlab/test/test_multibyte_kor.py + M /reportlab/trunk/reportlab/test/test_paragraphs.py + M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py + M /reportlab/trunk/reportlab/test/test_pdfbase_fontembed.py + M /reportlab/trunk/reportlab/test/test_pdfbase_pdfmetrics.py + M /reportlab/trunk/reportlab/test/test_pdfbase_postscript.py + M /reportlab/trunk/reportlab/test/test_pdfbase_ttfonts.py + M /reportlab/trunk/reportlab/test/test_pdfgen_callback.py + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + M /reportlab/trunk/reportlab/test/test_pdfgen_links.py + M /reportlab/trunk/reportlab/test/test_pdfgen_pagemodes.py + M /reportlab/trunk/reportlab/test/test_pdfgen_pycanvas.py + M /reportlab/trunk/reportlab/test/test_platypus_breaking.py + M /reportlab/trunk/reportlab/test/test_platypus_general.py + M /reportlab/trunk/reportlab/test/test_platypus_indents.py + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + M /reportlab/trunk/reportlab/test/test_platypus_tables.py + M /reportlab/trunk/reportlab/test/test_platypus_toc.py + M /reportlab/trunk/reportlab/test/test_platypus_xref.py + M /reportlab/trunk/reportlab/test/test_renderSVG.py + M /reportlab/trunk/reportlab/test/test_source_chars.py + M /reportlab/trunk/reportlab/test/test_table_layout.py + M /reportlab/trunk/reportlab/test/test_tools_pythonpoint.py + M /reportlab/trunk/reportlab/test/test_widgets_grids.py + M /reportlab/trunk/reportlab/test/utils.py + Move to having all test output in a temp folder +r2320 | rgbecker | 2004-03-26 11:37:09 +0000 (Fri, 26 Mar 2004) + M /reportlab/trunk/reportlab/test/test_platypus_indents.py + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + M /reportlab/trunk/reportlab/test/test_widgetbase_tpc.py + Remove unwanted import +r2319 | rgbecker | 2004-03-26 11:34:11 +0000 (Fri, 26 Mar 2004) + M /reportlab/trunk/reportlab/test/test_charts_textlabels.py + M /reportlab/trunk/reportlab/test/test_graphics_charts.py + M /reportlab/trunk/reportlab/test/test_lib_utils.py + M /reportlab/trunk/reportlab/test/test_platypus_toc.py + Eliminate bad tempdir setting +r2318 | rgbecker | 2004-03-26 10:48:43 +0000 (Fri, 26 Mar 2004) + M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c + Fix up bug introduced with new CB API +r2317 | rgbecker | 2004-03-24 17:17:05 +0000 (Wed, 24 Mar 2004) + M /reportlab/trunk/reportlab/tools/pythonpoint/pythonpoint.py + Add eoCB for compactdistro +r2316 | rgbecker | 2004-03-24 17:16:22 +0000 (Wed, 24 Mar 2004) + M /reportlab/trunk/reportlab/test/test_tools_pythonpoint.py + Fix test_tools_pythonpoint for compact distro +r2315 | rgbecker | 2004-03-24 17:14:53 +0000 (Wed, 24 Mar 2004) + M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c + Allow eoCB to return (URI,contents) for compact distro +r2314 | rgbecker | 2004-03-24 14:04:51 +0000 (Wed, 24 Mar 2004) + M /reportlab/trunk/reportlab/pdfbase/cidfonts.py + Switch to using get_rl_tempdir +r2313 | rgbecker | 2004-03-24 14:03:31 +0000 (Wed, 24 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Added get_rl_tempdir +r2312 | rgbecker | 2004-03-24 09:42:22 +0000 (Wed, 24 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + True/False aren't defined for Python < 2.3 +r2311 | rgbecker | 2004-03-23 18:57:33 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + M /reportlab/trunk/reportlab/test/utils.py + Remove things that python 2.1 fails on +r2310 | rgbecker | 2004-03-23 17:35:42 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + Compact distro friendly +r2309 | rgbecker | 2004-03-23 17:34:11 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Added rl_glob +r2308 | rgbecker | 2004-03-23 17:32:20 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/rl_config.py + Use rl_isdir +r2307 | rgbecker | 2004-03-23 16:18:29 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + Now works in compact distro +r2306 | rgbecker | 2004-03-23 15:43:13 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/test/test_invariant.py + Now works in compact distro +r2305 | rgbecker | 2004-03-23 15:37:53 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + Fix for compact distro +r2304 | rgbecker | 2004-03-23 15:20:50 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + We prefer absolute RL DIR +r2303 | rgbecker | 2004-03-23 15:19:21 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py + Now works in compact distro +r2302 | rgbecker | 2004-03-23 15:18:34 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/test/utils.py + Switch to using rl_isdir +r2301 | rgbecker | 2004-03-23 14:46:35 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/test/runAll.py + Allow specifying the pattern +r2300 | rgbecker | 2004-03-23 14:30:01 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Added open_and_readlines +r2299 | rgbecker | 2004-03-23 14:28:47 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/test/test_lib_utils.py + M /reportlab/trunk/reportlab/test/test_pyfiles.py + Fix up for compact distro +r2298 | rgbecker | 2004-03-23 14:15:47 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/test/test_source_chars.py + Fix up for compact distro (leave Zapping alone) +r2297 | rgbecker | 2004-03-23 13:54:42 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Improvements for compact running +r2296 | rgbecker | 2004-03-23 13:50:40 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/test/test_platypus_general.py + Ensure runnable in compact distro +r2295 | rgbecker | 2004-03-23 12:55:44 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/test/test_lib_utils.py + Allow to run in a compact distro +r2294 | rgbecker | 2004-03-23 12:20:08 +0000 (Tue, 23 Mar 2004) + M /reportlab/trunk/reportlab/platypus/flowables.py + Make Image to use open_for_read +r2293 | rgbecker | 2004-03-22 18:09:51 +0000 (Mon, 22 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Added rl_isfile +r2292 | rgbecker | 2004-03-22 18:08:50 +0000 (Mon, 22 Mar 2004) + M /reportlab/trunk/reportlab/test/runAll.py + M /reportlab/trunk/reportlab/test/test_images.py + M /reportlab/trunk/reportlab/test/test_pdfgen_pycanvas.py + M /reportlab/trunk/reportlab/test/test_platypus_general.py + Small changes to make tests work compactly +r2291 | rgbecker | 2004-03-22 15:59:22 +0000 (Mon, 22 Mar 2004) + M /reportlab/trunk/reportlab/test/utils.py + Remove spurious print +r2290 | rgbecker | 2004-03-22 14:06:12 +0000 (Mon, 22 Mar 2004) + M /reportlab/trunk/reportlab/platypus/flowables.py + Fix up more Image cases +r2289 | rgbecker | 2004-03-22 14:01:09 +0000 (Mon, 22 Mar 2004) + M /reportlab/trunk/reportlab/test/test_platypus_general.py + Add new Image flowable exemplars +r2288 | rgbecker | 2004-03-22 13:21:06 +0000 (Mon, 22 Mar 2004) + M /reportlab/trunk/reportlab/test/runAll.py + M /reportlab/trunk/reportlab/test/test_pyfiles.py + M /reportlab/trunk/reportlab/test/utils.py + Minor changes preparing for zip comapct distros +r2287 | rgbecker | 2004-03-22 13:02:43 +0000 (Mon, 22 Mar 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + Get the right fp +r2286 | rgbecker | 2004-03-22 12:54:30 +0000 (Mon, 22 Mar 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + Attempt to fix the epc bug +r2285 | andy_robinson | 2004-03-19 22:18:37 +0000 (Fri, 19 Mar 2004) + M /reportlab/trunk/reportlab/docs/userguide/ch4_platypus_concepts.py + Documentation about hAlign +r2284 | rgbecker | 2004-03-19 18:00:56 +0000 (Fri, 19 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + First attempt at reading from the zip archive +r2283 | rgbecker | 2004-03-19 10:55:55 +0000 (Fri, 19 Mar 2004) + M /reportlab/trunk/reportlab/rl_config.py + Sys_version was being used in older python +r2282 | rgbecker | 2004-03-18 15:55:50 +0000 (Thu, 18 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py + M /reportlab/trunk/reportlab/pdfbase/pdfutils.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/pdfgen/pdfimages.py + Fix transparency & jpeg behaviour +r2281 | rgbecker | 2004-03-18 12:05:22 +0000 (Thu, 18 Mar 2004) + M /reportlab/trunk/reportlab/pdfgen/textobject.py + TextObject fixes from Ian Millington +r2280 | rgbecker | 2004-03-17 18:54:06 +0000 (Wed, 17 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Move ImageReader open wrapper to where it should be +r2279 | rgbecker | 2004-03-17 16:29:30 +0000 (Wed, 17 Mar 2004) + M /reportlab/trunk/reportlab/demos/rlzope/rlzope.py + Attempt to fix to match ImageReader +r2278 | rgbecker | 2004-03-17 14:35:51 +0000 (Wed, 17 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Improve the fs distro check +r2277 | rgbecker | 2004-03-17 14:34:41 +0000 (Wed, 17 Mar 2004) + M /reportlab/trunk/reportlab/rl_config.py + Added rlhome/../fonts +r2276 | rgbecker | 2004-03-17 00:21:39 +0000 (Wed, 17 Mar 2004) + M /reportlab/trunk/reportlab/pdfgen/pdfimages.py + Remove spurious print reported by Joel Pearson +r2275 | rgbecker | 2004-03-16 15:28:26 +0000 (Tue, 16 Mar 2004) + M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c + Fix BOM removal buglet & valid/ext-sa/014 +r2274 | andy_robinson | 2004-03-15 23:49:48 +0000 (Mon, 15 Mar 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + corrected erroneous comment +r2273 | rgbecker | 2004-03-14 09:47:14 +0000 (Sun, 14 Mar 2004) + M /reportlab/trunk/reportlab/platypus/tables.py + Slightly more efficient linedrawing +r2272 | andy_robinson | 2004-03-12 23:54:11 +0000 (Fri, 12 Mar 2004) + M /reportlab/trunk/reportlab/lib/corp.py + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/platypus/tables.py + M /reportlab/trunk/reportlab/test/test_pdfgen_general.py + Multiple lines and decimal alignments now supported +r2271 | rgbecker | 2004-03-11 10:57:59 +0000 (Thu, 11 Mar 2004) + M /reportlab/trunk/utils/README + Fix missing command instruction +r2270 | andy_robinson | 2004-03-09 23:24:34 +0000 (Tue, 09 Mar 2004) + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + M /reportlab/trunk/reportlab/pdfgen/textobject.py + Truetype fonts now convert latin-1 to utf8 if fed non-utf8 +r2269 | andy_robinson | 2004-03-09 22:22:26 +0000 (Tue, 09 Mar 2004) + M /reportlab/trunk/reportlab/__init__.py + M /reportlab/trunk/reportlab/lib/fonts.py + M /reportlab/trunk/reportlab/pdfbase/_fontdata.py + M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py + M /reportlab/trunk/reportlab/pdfbase/ttfonts.py + M /reportlab/trunk/reportlab/platypus/doctemplate.py + Font reregistration cleanup +r2268 | rgbecker | 2004-03-08 18:36:05 +0000 (Mon, 08 Mar 2004) + M /reportlab/trunk/reportlab/lib/utils.py + Added _findFiles & CIDict +r2267 | rgbecker | 2004-02-22 17:35:43 +0000 (Sun, 22 Feb 2004) + M /reportlab/trunk/reportlab/graphics/renderPM.py + URL change from Aleksander Piotrowski +r2266 | rgbecker | 2004-02-17 16:10:18 +0000 (Tue, 17 Feb 2004) + M /reportlab/trunk/reportlab/platypus/frames.py + M /reportlab/trunk/reportlab/rl_config.py + Added overlapAttachedSpace +r2265 | andy_robinson | 2004-02-10 00:12:21 +0000 (Tue, 10 Feb 2004) + M /reportlab/trunk/reportlab/pdfgen/canvas.py + M /reportlab/trunk/reportlab/test/test_pdfbase_postscript.py + Added finegrained control of where postscript commands appear +r2264 | rgbecker | 2004-02-05 18:31:35 +0000 (Thu, 05 Feb 2004) + M /reportlab/trunk/reportlab/platypus/paragraph.py + Fix to from Ulrich Screiner +r2263 | rgbecker | 2004-02-05 18:21:50 +0000 (Thu, 05 Feb 2004) + M /reportlab/trunk/reportlab/pdfgen/pdfimages.py + Fix missing import found by Ulrich Schreiner +r2262 | rgbecker | 2004-02-02 08:43:51 +0000 (Mon, 02 Feb 2004) + M /reportlab/trunk/reportlab/lib/_rl_accel.c + Start on tex lib in C +r2261 | rgbecker | 2004-01-29 17:06:24 +0000 (Thu, 29 Jan 2004) + M /reportlab/trunk/reportlab/graphics/renderPS.py + Attempt to get delayed font setting and proper psNames +r2260 | rgbecker | 2004-01-28 13:03:47 +0000 (Wed, 28 Jan 2004) + M /reportlab/trunk/reportlab/graphics/testshapes.py + Allow for bad fonts in getDrawing13 +r2259 | rgbecker | 2004-01-28 13:03:19 +0000 (Wed, 28 Jan 2004) + M /reportlab/trunk/reportlab/graphics/renderPM.py + Allow for no eps preview in tests +r2258 | rgbecker | 2004-01-23 00:04:40 +0000 (Fri, 23 Jan 2004) + M /reportlab/trunk/rl_addons/pyRXP/rxp/url.c + Attempt to fix UNC opening +r2257 | rgbecker | 2004-01-21 18:04:05 +0000 (Wed, 21 Jan 2004) + M /reportlab/trunk/utils/README +################################################################################# +#################### RELEASE 1.19 at 18:00 GMT 21/Jan/2004 ################# +################################################################################# +##### 2004/01/21 ##### + pdfbase/ttfonts.py 1.18 rgbecker Improve error handling & naming +##### 2004/01/14 ##### + rl_addons/renderPM/pfm.py 1.3 rgbecker Changes for 2.3 compatibility +##### 2004/01/13 ##### + pdfgen/canvas.py 1.118 rgbecker Allow for possible restarts + platypus/doctemplate.py 1.71 rgbecker Allow for simple loop detection +##### 2004/01/10 ##### + platypus/figures.py 1.16 rgbecker Added optional memory caching +##### 2004/01/09 ##### + platypus/tables.py 1.71 rgbecker Modified version of Henning von Bargen's LongTables optimisation +##### 2004/01/08 ##### + platypus/doctemplate.py 1.70 andy_robinson Upped empty page limit to 10 +##### 2004/01/07 ##### + platypus/flowables.py 1.44 andy_robinson Candidate fix for infinite looping + platypus/doctemplate.py 1.69 andy_robinson Candidate fix for infinite looping + lib/codecharts.py 1.8 andy_robinson Candidate fix for infinite looping + platypus/figures.py 1.15 rgbecker Fix up caption and split methods etc + platypus/tables.py 1.70 dragan1 merging Jython-branch + platypus/tables.py 1.69 rgbecker Make _listCellGeom more specific + platypus/__init__.py 1.16.2.2 dragan1 added conditional import linee for jython compatilibity + platypus/figures.py 1.14 rgbecker Improved FlexFigure scaling, in memory PageCatcherFigures +##### 2004/01/05 ##### + rl_addons/renderPM/_renderPM.c 1.31 rgbecker Fix bad long field value +##### 2003/12/23 ##### + lib/_rl_accel.c 1.37 rgbecker Added hex32 +##### 2003/12/19 ##### + platypus/tables.py 1.68 rgbecker Added splitfirst/last handling +##### 2003/12/18 ##### + tools/pythonpoint/styles/standard.py 1.3.4.1 dragan1 Platypus import structure changes + tools/pythonpoint/styles/htu.py 1.1.4.1 dragan1 Platypus import structure changes + tools/pythonpoint/pythonpoint.py 1.27.2.1 dragan1 Platypus import structure changes + tools/pythonpoint/demos/examples.py 1.3.4.1 dragan1 Platypus import structure changes + tools/docco/yaml2pdf.py 1.2.4.1 dragan1 Platypus import structure changes + tools/docco/rltemplate.py 1.3.4.1 dragan1 Platypus import structure changes + tools/docco/rl_doc_utils.py 1.6.4.1 dragan1 Platypus import structure changes + tools/docco/examples.py 1.4.4.1 dragan1 Platypus import structure changes + test/test_table_layout.py 1.1.4.1 dragan1 Platypus import structure changes + test/test_rl_accel.py 1.3.2.1 dragan1 Platypus import structure changes + test/test_platypus_xref.py 1.3.4.1 dragan1 Platypus import structure changes + test/test_platypus_tables.py 1.3.4.1 dragan1 Platypus import structure changes + test/test_platypus_paragraphs.py 1.11.4.1 dragan1 Platypus import structure changes + test/test_platypus_indents.py 1.1.4.1 dragan1 Platypus import structure changes + test/test_platypus_general.py 1.13.2.1 dragan1 Platypus import structure changes + test/test_platypus_breaking.py 1.6.4.1 dragan1 Platypus import structure changes + test/test_paragraphs.py 1.17.2.1 dragan1 Platypus import structure changes + test/test_graphics_speed.py 1.12.4.1 dragan1 Platypus import structure changes + test/test_graphics_charts.py 1.14.4.1 dragan1 Platypus import structure changes + platypus/tables.py 1.67.2.1 dragan1 Platypus import structure changes + platypus/paraparser.py 1.53.2.1 dragan1 Platypus import structure changes + platypus/figures.py 1.13.2.1 dragan1 Platypus import structure changes + platypus/__init__.py 1.16.2.1 dragan1 Platypus import structure changes + lib/tocindex.py 1.10.2.1 dragan1 Platypus import structure changes + lib/codecharts.py 1.7.4.1 dragan1 Platypus import structure changes + graphics/shapes.py 1.100.2.1 dragan1 Platypus import structure changes + graphics/renderPDF.py 1.24.2.1 dragan1 Platypus import structure changes + docs/userguide/ch7_custom.py 1.4.4.1 dragan1 Platypus import structure changes + docs/userguide/ch6_tables.py 1.6.4.1 dragan1 Platypus import structure changes + docs/userguide/ch4_platypus_concepts.py 1.4.4.1 dragan1 Platypus import structure changes + docs/userguide/ch2a_fonts.py 1.10.2.1 dragan1 Platypus import structure changes + demos/rlzope/rlzope.py 1.5.4.1 dragan1 Platypus import structure changes + demos/odyssey/fodyssey.py 1.17.4.1 dragan1 Platypus import structure changes + demos/gadflypaper/gfe.py 1.15.4.1 dragan1 Platypus import structure changes +##### 2003/12/17 ##### + graphics/testshapes.py 1.20 rgbecker Attempt to control ttf usage + graphics/renderPM.py 1.44 rgbecker Attempt to control ttf usage + platypus/paragraph.py 1.71 rgbecker Fix missing return +##### 2003/12/16 ##### + platypus/paragraph.py 1.70 rgbecker Underline alignment fix from Marc Stober +##### 2003/12/15 ##### + test/test_lib_sequencer.py 1.7 dragan1 changed method call from this to _this - java keyword + lib/sequencer.py 1.14 dragan1 renamed methid this to _this - java keyword +##### 2003/12/14 ##### + tools/pythonpoint/styles/modern.py 1.4 andy_robinson Permits style file to live in local directory + tools/pythonpoint/stdparser.py 1.20 andy_robinson Permits style file to live in local directory +##### 2003/12/12 ##### + lib/rparsexml.py 1.6 rgbecker Allow for both to have the fake entityReplacer thing + rl_addons/pyRXP/examples/benchmarks.py 1.2 rgbecker -->reportlab.lib.rparsexml +##### 2003/12/11 ##### + lib/rparsexml.py 1.5 rgbecker Add some support for slices etc +################################################################################# +#################### RELEASE 1.08 at 12:00 BST 19/June/2001 ##################### +################################################################################# +##### 2001/06/19 ##### + test/test_graphics_speed.py 1.10 dinu_gherman + Renamed chart attribute names to bars/lines/slices. + test/test_graphics_charts.py 1.12 dinu_gherman + Renamed chart attribute names to bars/lines/slices. + graphics/charts/piecharts.py 1.17 dinu_gherman + Renamed chart attribute names to bars/lines/slices. + graphics/charts/lineplots.py 1.17 dinu_gherman + Renamed chart attribute names to bars/lines/slices. + graphics/charts/linecharts.py 1.12 dinu_gherman + Renamed chart attribute names to bars/lines/slices. + graphics/charts/barcharts.py 1.18 dinu_gherman + Renamed chart attribute names to bars/lines/slices. +##### 2001/06/18 ##### + docs/graphguide/ch2_graphics.py 1.21 rgbecker + Changed from defaultStyles to pieStyles + graphics/widgetbase.py 1.25 rgbecker + Added recur arg to allow non-recurring + graphics/shapes.py 1.32 rgbecker + Added recur arg to allow non-recurring + test/test_graphics_speed.py 1.9 dinu_gherman + Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles. + test/test_graphics_charts.py 1.11 dinu_gherman + Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles. + graphics/charts/piecharts.py 1.16 dinu_gherman + Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles. + graphics/charts/lineplots.py 1.16 dinu_gherman + Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles. + graphics/charts/linecharts.py 1.11 dinu_gherman + Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles. + graphics/charts/barcharts.py 1.17 dinu_gherman + Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles. +##### 2001/06/16 ##### + graphics/shapes.py 1.31 rgbecker + Added Null _DrawingEditorMixin class +##### 2001/06/15 ##### + pdfbase/pdfdoc.py 1.45 aaron_watters + added missing PDFText() function for consistency (needed by pagecatcher) +##### 2001/06/13 ##### + rl_addons/renderPM/setup.py 1.4 jvr + some changes to make it potentially work under MacOS with the CodeWarrior compiler. Unfortunately it still doesn't :-( + lib/setup.py 1.8 jvr + minor patch: building the sgmlop, _rl_accel and pyHnj now simply *works* with distutils under MacOS with codeWarrior. Good Stuff. (haven't added any install smartness yet) + graphics/renderPM.py 1.8 jvr + Test program: use os.path.join() for path manipulation instead of things like 'pmout%s%s'%(os.sep,filename) as this gets it wrong under MacOS. + rl_addons/renderPM/libart_lgpl/art_misc.c 1.2 jvr + extended #ifndef _WIN32 to also check for undefined-ness of 'macintosh' + rl_addons/renderPM/gt1/gt1-parset1.c 1.2 jvr + change to make it compile under MacOS: added strdup() hack for Mac + rl_addons/renderPM/_renderPM.c 1.3 jvr + changes to make it compile under MacOS: - added strdup() hack for Mac - changed size_t fields in gstateObject to int -- otherwise I'd have to add casts to each and every bpath_add_point() call (can't implicitly go from size_t to int) - repaired "illegal constant expression" in gstate like Robin suggested + lib/_rl_accel.c 1.18 rgbecker + Just's Mac patch + graphics/widgetbase.py 1.24 andy_robinson + Changes to support customer project: allow nulls in bar charts, and added some missing but obvious properties e.g. strokeColor for bar and legend borders. + graphics/charts/piecharts.py 1.15 andy_robinson + Changes to support customer project: allow nulls in bar charts, and added some missing but obvious properties e.g. strokeColor for bar and legend borders. + graphics/charts/legends.py 1.9 andy_robinson + Changes to support customer project: allow nulls in bar charts, and added some missing but obvious properties e.g. strokeColor for bar and legend borders. + graphics/charts/barcharts.py 1.16 andy_robinson + Changes to support customer project: allow nulls in bar charts, and added some missing but obvious properties e.g. strokeColor for bar and legend borders. + graphics/charts/axes.py 1.27 andy_robinson + Changes to support customer project: allow nulls in bar charts, and added some missing but obvious properties e.g. strokeColor for bar and legend borders. +##### 2001/06/11 ##### + pdfgen/canvas.py 1.80 rgbecker + Made canvas default to rl_config.pageCompression + rl_config.py 1.9 rgbecker + Added pageCompression + graphics/renderPDF.py 1.9 andy_robinson + Added autoSize option to rendderPDF, and allowed "no border" around bars in bar charts. To support QIR project. + graphics/charts/barcharts.py 1.15 andy_robinson + Added autoSize option to rendderPDF, and allowed "no border" around bars in bar charts. To support QIR project. +##### 2001/06/09 ##### + platypus/frames.py 1.13 rgbecker + added _FUZZ and changed frame add test +##### 2001/06/07 ##### + platypus/paragraph.py 1.55 rgbecker + Remove explicit £ character to stop Dinu moaning + test/test_pdfgen_pagemodes.py 1.5 rgbecker + Try to shorten filenames + test/test_widgetbase_tpc.py 1.1 rgbecker + Shortened names + test/test_graphics_widgetbase_tpc.py 1.2 rgbecker + Shortened names + test/test_graphics_charts_textlabels.py 1.4 rgbecker + Shortened names + test/test_charts_textlabels.py 1.1 rgbecker + Shortened names + lib/utils.py 1.16 rgbecker + Imported PIL_WARNINGS + graphics/widgetbase.py 1.23 rgbecker + Allow TypedPropertyCollection exemplar class to have getattr etc +##### 2001/06/06 ##### + graphics/widgetbase.py 1.22 rgbecker + Fbot's suggested fix + lib/setup.py 1.7 rgbecker + Fixed up MovePYDs + rl_addons/renderPM/setup.py 1.3 rgbecker + Fixed up MovePYDs + rl_addons/renderPM/_renderPM.c 1.2 rgbecker + Niki Spahiev's PyMem_New patch for 1.5.2 +##### 2001/05/30 ##### + test/test_pdfbase_pdfmetrics.py 1.7 rgbecker + Fixes for 2.1 whining + test/runAll.py 1.6 rgbecker + Fixes for 2.1 whining + rl_addons/renderPM/setup.py 1.2 rgbecker + Moved pyds to DLLs + lib/setup.py 1.6 rgbecker + Moved pyds to DLLs +##### 2001/05/29 ##### + docs/graphguide/ch2_graphics.py 1.20 johnprecedo + A number of small changes made - mainly changing import statements in the examples so that they actually work as given without producing an errors. Done up to page 15. + pdfgen/canvas.py 1.79 rgbecker + Fix the 2.1 _escape fix + rl_config.py 1.8 rgbecker + Changes for 2.1 escape fix + pdfgen/canvas.py 1.78 rgbecker + Changes for 2.1 escape fix + lib/_rl_accel.c 1.17 rgbecker + Changes for 2.1 escape fix + test/test_pyfiles.py 1.6 dinu_gherman + Added a test for first lines containing #!...python... +##### 2001/05/28 ##### + platypus/paragraph.py 1.54 rgbecker + Add some pound signs to test 5 +##### 2001/05/26 ##### + utils/daily.py 1.43 rgbecker + Fixed precedence + utils/daily.py 1.42 rgbecker + Fixed error print' daily.py +##### 2001/05/25 ##### + graphics/charts/legends.py 1.8 dinu_gherman + Added font attributes for text in legends. + lib/_rl_accel.c 1.16 rgbecker + Fix special case ',' + lib/_rl_accel.c 1.15 rgbecker + Added fix for comma decimal point + lib/utils.py 1.15 rgbecker + Attempt to fix the locale mismatch problem + lib/graphdocpy.py 1.8 rgbecker + removed use of renderGD + pdfgen/pathobject.py 1.9 rgbecker + Changed a few %f formats to use %s and fp_str + pdfgen/canvas.py 1.77 rgbecker + Changed a few %f formats to use %s and fp_str +##### 2001/05/23 ##### + graphics/charts/textlabels.py 1.7 rgbecker + Standardize nattribute names + graphics/renderPS.py 1.7 rgbecker + Synchronize backend to PDF standard + graphics/renderPM.py 1.7 rgbecker + Synchronize backend to PDF standard + graphics/renderPDF.py 1.8 rgbecker + Synchronize backend to PDF standard + graphics/widgetbase.py 1.21 rgbecker + Correct names and factorise some behaviour + graphics/shapes.py 1.30 rgbecker + Correct names and factorise some behaviour +##### 2001/05/22 ##### + graphics/charts/barcharts.py 1.14 dinu_gherman + Made strokeColor attribute for the bars be really used. + graphics/charts/textlabels.py 1.6 dinu_gherman + Added missing fillColor attribute for the string itself. + graphics/charts/piecharts.py 1.14 rgbecker + Fixes to piechart label handling + lib/__BUILD.dsw 1.4 rgbecker + Indicated usage of setup.py + lib/README.extensions 1.3 rgbecker + Indicated usage of setup.py +##### 2001/05/21 ##### + graphics/widgetbase.py 1.20 rgbecker + Fixed _ItemWrapper name and made it really cache + graphics/widgetbase.py 1.19 rgbecker + Improved element wrapping seems to work + test/test_graphics_widgetbase_tpc.py 1.1 dinu_gherman + Initial checkin. + graphics/widgetbase.py 1.18 rgbecker + Added element wrapper and fixed getitem so collections work better + test/test_docstrings.py 1.7 dinu_gherman + Substantial rewrite. +##### 2001/05/20 ##### + pdfbase/_fontdata.py 1.10 rgbecker + Fix typo + rl_config.py 1.7 rgbecker + Better Font handling for linux2 + pdfbase/_fontdata.py 1.9 rgbecker + Better Font handling for linux2 + rl_config.py 1.6 rgbecker + Font handling patches for linux2 from L Catucci + pdfbase/_fontdata.py 1.8 rgbecker + Font handling patches for linux2 from L Catucci + test/unittest.py 1.4 rgbecker + Fix linesep for non-JPython + rl_config.py 1.5 rgbecker + Added PIL_WARNINGS/ZLIB_WARNINGS + lib/utils.py 1.14 rgbecker + Added PIL_WARNINGS/ZLIB_WARNINGS +##### 2001/05/18 ##### + test/test_docstrings.py 1.6 dinu_gherman + Applied Robin's patch. + graphics/testshapes.py 1.12 rgbecker + Added locals & globals to the eval + graphics/charts/piecharts.py 1.13 rgbecker + Need some real strokeWidths + rl_addons/renderPM/pfm.py 1.2 rgbecker + Remove above 127 characters + test/runAll.py 1.5 dinu_gherman + Sorted order in which test module are executed (using sort()). + test/test_docstrings.py 1.5 dinu_gherman + Fixed bug where files got written everywhere by using new SecureTestCase. + test/utils.py 1.1 dinu_gherman + Initial checkin. + platypus/paragraph.py 1.53 rgbecker + added minWidth method to Flowable, Paragraph + platypus/flowables.py 1.19 rgbecker + added minWidth method to Flowable, Paragraph + graphics/widgetbase.py 1.17 rgbecker + Make setVector more friendly + graphics/shapes.py 1.29 rgbecker + Fixed expandUserNode method + graphics/widgetbase.py 1.16 rgbecker + Added TypedPropertyCollection.setVector +##### 2001/05/17 ##### + docs/graphguide/ch2_graphics.py 1.19 rgbecker + Pies don't seem to have a wedges collection any longer + graphics/shapes.py 1.28 rgbecker + Use canned routine validateSetattr + lib/validators.py 1.6 rgbecker + New AttrMap emplacement + lib/attrmap.py 1.2 rgbecker + New AttrMap emplacement + graphics/widgets/signsandsymbols.py 1.12 rgbecker + New AttrMap emplacement + graphics/widgets/flags.py 1.5 rgbecker + New AttrMap emplacement + graphics/charts/textlabels.py 1.5 rgbecker + New AttrMap emplacement + graphics/charts/piecharts.py 1.12 rgbecker + New AttrMap emplacement + graphics/charts/lineplots.py 1.15 rgbecker + New AttrMap emplacement + graphics/charts/linecharts.py 1.10 rgbecker + New AttrMap emplacement + graphics/charts/legends.py 1.7 rgbecker + New AttrMap emplacement + graphics/charts/barcharts.py 1.13 rgbecker + New AttrMap emplacement + graphics/charts/axes.py 1.26 rgbecker + New AttrMap emplacement + graphics/widgetbase.py 1.15 rgbecker + New AttrMap emplacement + graphics/shapes.py 1.27 rgbecker + New AttrMap emplacement + graphics/shapes.py 1.26 rgbecker + Removal of the Auto Thing + graphics/charts/linecharts.py 1.9 rgbecker + Removal of the Auto Thing + graphics/charts/barcharts.py 1.12 rgbecker + Removal of the Auto Thing + graphics/charts/axes.py 1.25 rgbecker + Removal of the Auto Thing + docs/graphguide/ch2_graphics.py 1.18 rgbecker + Removal of the Auto Thing + lib/attrmap.py 1.1 rgbecker + Initial version + lib/validators.py 1.5 rgbecker + New Scheme Validators + test/test_lib_validators.py 1.4 rgbecker + New Scheme Validators +##### 2001/05/16 ##### + graphics/renderPM.py 1.6 rgbecker + Added drawToString + test/test_graphics_charts.py 1.10 rgbecker + Renamed Legend0 to Legend, fixed _attrmap typo + graphics/charts/legends.py 1.6 rgbecker + Renamed Legend0 to Legend, fixed _attrmap typo +##### 2001/05/15 ##### + graphics/charts/lineplots.py 1.14 dinu_gherman + Added strokeDashArray attribute to LinePlotProperties class. + test/test_lib_validators.py 1.3 dinu_gherman + Removed isNumberOrAuto validator. + lib/validators.py 1.4 dinu_gherman + Removed isNumberOrAuto validator. + graphics/charts/axes.py 1.24 dinu_gherman + Removed isNumberOrAuto validator. + graphics/widgetbase.py 1.14 dinu_gherman + Adapted to use Validator instances in validators.py. + graphics/shapes.py 1.25 dinu_gherman + Adapted to use Validator instances in validators.py. + graphics/testshapes.py 1.11 rgbecker + Improvements to testshapse.py + graphics/renderPM.py 1.5 rgbecker + Improvements to testshapse.py + platypus/paragraph.py 1.52 rgbecker + Added find to imports + test/test_paragraphs.py 1.10 rgbecker + Added in line font changes +##### 2001/05/11 ##### + platypus/doctemplate.py 1.40 rgbecker + Dynamic page sizes + lib/graphdocpy.py 1.7 dinu_gherman + Fixed buglet. + graphics/widgets/signsandsymbols.py 1.11 dinu_gherman + Adapted to using vlaidator classes. + graphics/widgets/flags.py 1.4 dinu_gherman + Adapted to using vlaidator classes. + lib/graphdocpy.py 1.6 dinu_gherman + Added display of documented public widget attributes. + graphics/charts/textlabels.py 1.4 dinu_gherman + Adapted to using validator classes in attribute maps. + graphics/charts/piecharts.py 1.11 dinu_gherman + Adapted to using validator classes in attribute maps. + graphics/charts/lineplots.py 1.13 dinu_gherman + Adapted to using validator classes in attribute maps. + graphics/charts/linecharts.py 1.8 dinu_gherman + Adapted to using validator classes in attribute maps. + graphics/charts/legends.py 1.5 dinu_gherman + Adapted to using validator classes in attribute maps. + graphics/charts/barcharts.py 1.11 dinu_gherman + Adapted to using validator classes in attribute maps. + graphics/charts/axes.py 1.23 dinu_gherman + Adapted to using validator classes in attribute maps. + test/test_lib_validators.py 1.2 dinu_gherman + Changed validator functions into classes. Adapted test cases. Added a tiny change to widgetbase.py. + lib/validators.py 1.3 dinu_gherman + Changed validator functions into classes. Adapted test cases. Added a tiny change to widgetbase.py. + graphics/widgetbase.py 1.13 dinu_gherman + Changed validator functions into classes. Adapted test cases. Added a tiny change to widgetbase.py. + test/test_coordtracking.py 1.2 rgbecker + Removed for for later correction +##### 2001/05/10 ##### + test/test_coordtracking.py 1.1 aaron_watters + test file for coordinate tracking and links + pdfgen/canvas.py 1.76 aaron_watters + canvas coordinate matrix tracking and related linkage support + graphics/widgetbase.py 1.12 dinu_gherman + Switched to using lib.validators module. + graphics/widgets/signsandsymbols.py 1.10 dinu_gherman + Switched to using lib.validators module. + graphics/widgets/flags.py 1.3 dinu_gherman + Switched to using lib.validators module. +##### 2001/05/09 ##### + lib/setup.py 1.5 rgbecker + Compatibility fixes + lib/_rl_accel.c 1.14 rgbecker + Compatibility fixes + graphics/widgetbase.py 1.11 dinu_gherman + Code and docstring enhancements. + test/test_graphics_speed.py 1.8 dinu_gherman + Switched to using defaultStyles attribute. + test/test_graphics_charts.py 1.9 dinu_gherman + Switched to using defaultStyles attribute. + graphics/charts/axes.py 1.22 dinu_gherman + Added visibleAxis/visibleTicks attributes. + graphics/charts/piecharts.py 1.10 dinu_gherman + Broken draw method apart (well...). + graphics/charts/piecharts.py 1.9 dinu_gherman + Done some slight code enhancements. + graphics/charts/lineplots.py 1.12 dinu_gherman + Switched to using PropHolder superclass for LinePlotProperties. Added strokeWidth attribute to LinePlotProperties. + test/test_lib_validators.py 1.1 dinu_gherman + Initial checkin. +##### 2001/05/08 ##### + graphics/charts/barcharts.py 1.10 dinu_gherman + Switched to using defaultStyles attribute. + graphics/charts/linecharts.py 1.7 dinu_gherman + Switched to using typed collection styles. + graphics/charts/piecharts.py 1.8 dinu_gherman + Made more consistent use of typed collections. + graphics/charts/lineplots.py 1.11 dinu_gherman + Removed dead code. Removed references to usedSymbol attribute. Made defaultStyles attribute a typed collection. + graphics/widgetbase.py 1.10 dinu_gherman + Added a __len__ method to TypedPropertyCOllection. + graphics/charts/lineplots.py 1.10 dinu_gherman + Removed references to defaultColors. + lib/graphdocpy.py 1.5 dinu_gherman + Opening now showing PDF outline (with closed function sections). Minor fixes. +##### 2001/05/07 ##### + graphics/renderPDF.py 1.7 aaron_watters + get rid of automatic boundary box option + graphics/charts/axes.py 1.21 dinu_gherman + Reduced number of arguments for joinToAxis() methods. + lib/validators.py 1.2 dinu_gherman + Extracted validator functions into lib.validators. Modified import statements. + graphics/shapes.py 1.24 dinu_gherman + Extracted validator functions into lib.validators. Modified import statements. + graphics/charts/textlabels.py 1.3 dinu_gherman + Extracted validator functions into lib.validators. Modified import statements. + graphics/charts/piecharts.py 1.7 dinu_gherman + Extracted validator functions into lib.validators. Modified import statements. + graphics/charts/lineplots.py 1.9 dinu_gherman + Extracted validator functions into lib.validators. Modified import statements. + graphics/charts/linecharts.py 1.6 dinu_gherman + Extracted validator functions into lib.validators. Modified import statements. + graphics/charts/legends.py 1.4 dinu_gherman + Extracted validator functions into lib.validators. Modified import statements. + graphics/charts/barcharts.py 1.9 dinu_gherman + Extracted validator functions into lib.validators. Modified import statements. + graphics/charts/axes.py 1.20 dinu_gherman + Extracted validator functions into lib.validators. Modified import statements. + lib/validators.py 1.1 dinu_gherman + Added future validators module (stripped off from shapes.py). + graphics/charts/piecharts.py 1.6 dinu_gherman + Various minor changes. + graphics/charts/lineplots.py 1.8 dinu_gherman + Various minor changes. + graphics/charts/linecharts.py 1.5 dinu_gherman + Various minor changes. + graphics/charts/legends.py 1.3 dinu_gherman + Various minor changes. + graphics/charts/barcharts.py 1.8 dinu_gherman + Various minor changes. + graphics/charts/axes.py 1.19 dinu_gherman + Various minor changes. +##### 2001/05/05 ##### + platypus/tables.py 1.39 aaron_watters + hacky fix to nudge bug + pdfgen/canvas.py 1.75 aaron_watters + fix for major font metrics state tracking bug +##### 2001/05/04 ##### + platypus/tables.py 1.38 aaron_watters + use round caps for miter limit + graphics/renderPM.py 1.4 rgbecker + Readded import checks and improved messages + graphics/renderPM.py 1.3 rgbecker + Added fix for png files +##### 2001/05/03 ##### + graphics/renderPM.py 1.2 rgbecker + ImportError checks for _renderPM + graphics/renderPM.py 1.1 rgbecker + Moved from rlextra/graphics/Csrc/renderPM +################################################################################# +#################### RELEASE 1.07 at 11:54 BST ################################## +################################################################################# +##### 2001/05/02 ##### + lib/units.py 1.3 rgbecker + Added toLength function +##### 2001/05/01 ##### + lib/colors.py 1.18 johnprecedo + Added special color - ReportLabBlue. + graphics/charts/axes.py 1.18 rgbecker + makeLabels/Ticks changed + graphics/testshapes.py 1.10 rgbecker + strokeDashArray fixes + graphics/shapes.py 1.23 rgbecker + strokeDashArray fixes + graphics/charts/axes.py 1.17 rgbecker + strokeDashArray fixes +##### 2001/04/30 ##### + pdfbase/pdfmetrics.py 1.37 rgbecker + Added some imports for compatibility/efficiency +##### 2001/04/28 ##### + graphics/widgets/signsandsymbols.py 1.9 rgbecker + try and ensure float division +##### 2001/04/26 ##### + graphics/charts/lineplots.py 1.7 dinu_gherman + Changed defaultColors to defaultStyles. + pdfgen/pdfimages.py 1.12 rgbecker + Fixed typo zlib (not lib) + lib/randomtext.py 1.7 johnprecedo + Minor changes. Now allows you to specify the maximum number of sentences for the randomtext as an argument. Also added an example usage to the docstring. +##### 2001/04/25 ##### + license.txt 1.2 andy_robinson + Trivial change to test CVS write access + graphics/charts/piecharts.py 1.5 dinu_gherman + Added more samples. + graphics/charts/piecharts.py 1.4 johnprecedo + Added a new example. + graphics/charts/piecharts.py 1.3 dinu_gherman + Removed sector line for single sliced pie charts. +##### 2001/04/24 ##### + graphics/charts/axes.py 1.16 dinu_gherman + Made joining of axes possible via axes attributes. +##### 2001/04/23 ##### + pdfbase/pdfmetrics.py 1.36 rgbecker + Added findT1File to base Face, and _fontdata + pdfbase/_fontdata.py 1.7 rgbecker + Added findT1File to base Face, and _fontdata + lib/fonts.py 1.7 rgbecker + Moved T1 search stuff into pdfbase.fontdata + pdfbase/pdfmetrics.py 1.35 rgbecker + Remove debug prints +##### 2001/04/20 ##### + test/test_pdfbase_fontembed.py 1.2 rgbecker + Merged pdfgen.fonts into pdfmetrics again + test/test_pdfbase_encodings.py 1.2 rgbecker + Merged pdfgen.fonts into pdfmetrics again + pdfgen/fonts.py 1.2 rgbecker + Merged pdfgen.fonts into pdfmetrics again + pdfbase/pdfmetrics.py 1.34 rgbecker + Merged pdfgen.fonts into pdfmetrics again + pdfbase/_fontdata.py 1.6 rgbecker + Merged pdfgen.fonts into pdfmetrics again + lib/_rl_accel.c 1.13 rgbecker + Merged pdfgen.fonts into pdfmetrics again + utils/daily.py 1.41 rgbecker + Fix graphguide generation + utils/daily.py 1.40 rgbecker + Add graphguide generation + pdfgen/canvas.py 1.74 rgbecker + pageCompression fix from Mark Charlebois (was undefined if zlib not present); removed stray print statements on font registration. + pdfbase/pdfmetrics.py 1.33 rgbecker + pageCompression fix from Mark Charlebois (was undefined if zlib not present); removed stray print statements on font registration. +##### 2001/04/18 ##### + test/test_pdfbase_fontembed.py 1.1 rgbecker + New font embedding mechanism + test/test_pdfbase_encodings.py 1.1 rgbecker + New font embedding mechanism + pdfgen/fonts.py 1.1 rgbecker + New font embedding mechanism + test/test_pdfgen_general.py 1.4 rgbecker + New font embedding stuff. + test/test_pdfbase_pdfmetrics.py 1.6 rgbecker + New font embedding stuff. + pdfgen/canvas.py 1.73 rgbecker + New font embedding stuff. + pdfbase/pdfmetrics.py 1.32 rgbecker + New font embedding stuff. + pdfbase/pdfdoc.py 1.44 rgbecker + New font embedding stuff. + README 1.5 rgbecker + Testing write access to CVS, only whitespace changed + testfile.txt 1.2 johnprecedo + removed test file + testfile.txt 1.1 johnprecedo + nitial checkin to test CVS write access +##### 2001/04/17 ##### + rl_config.py 1.4 rgbecker + Fix typo in T1SearchPath name + pdfbase/afm2w.py 1.2 rgbecker + Removed file added for test + pdfbase/afm2w.py 1.1 rgbecker + Adding afm2w as a test + docs/userguide/testfile.txt 1.1 andy_robinson + Testing checkin rights + docs/userguide/ch9_future.py 1.3 andy_robinson + Testing SF commit ability +##### 2001/04/16 ##### + __init__.py 1.13 rgbecker + Changed copyright dates + README 1.4 andy_robinson + Whitespace change to test CVS write access +##### 2001/04/13 ##### + test/test_pdfgen_general.py 1.3 rgbecker + Added sausages + test/test_pdfgen_general.py 1.2 andy_robinson + filename case change for an embedded GIF + test/test_platypus_general.py 1.2 andy_robinson + General pdfgen test moved to here + test/test_pdfgen_general.py 1.1 andy_robinson + General pdfgen test moved to here + test/test_platypus_tables.py 1.1 andy_robinson + Added tests formerly under platypus/test + test/test_platypus_general.py 1.1 andy_robinson + Added tests formerly under platypus/test + test/pythonpowered.gif 1.1 andy_robinson + Added tests formerly under platypus/test +##### 2001/04/12 ##### + graphics/charts/barcharts.py 1.7 rgbecker + Moved functionality into the base Barchart class + graphics/renderPDF.py 1.6 rgbecker + Added showBoundary arg +##### 2001/04/11 ##### + graphics/charts/axes.py 1.15 rgbecker + Move common value axis bits into base class + graphics/charts/axes.py 1.14 rgbecker + Try and make min/max finding as complicated as possible + graphics/charts/axes.py 1.13 rgbecker + Moved some common stuff into ValueAxis, added maximumTicks + graphics/shapes.py 1.22 rgbecker + Improved comment somewhat + graphics/charts/axes.py 1.12 rgbecker + Added _findMax/Min funcs + graphics/charts/axes.py 1.11 rgbecker + Added _calcValueStep and _rangeAdjust methods + graphics/widgetbase.py 1.9 rgbecker + Added StyleProeprties class +##### 2001/04/10 ##### + graphics/widgetbase.py 1.8 andy_robinson + Robin's refactoring to separate propholder and Widget + demos/pythonpoint/pythonpoint.py 1.32 andy_robinson + Removing pingo dependency + graphics/charts/markers.py 1.2 dinu_gherman + Added two funcions and tidied-up. + lib/normalDate.py 1.1 dinu_gherman + Initial checkin. + lib/pagesizes.py 1.7 andy_robinson + Fixed size of legal +##### 2001/04/09 ##### + graphics/charts/lineplots.py 1.6 dinu_gherman + Fixed import buglet. + test/test_graphics_charts.py 1.8 dinu_gherman + Adapted to new LineChart class names. + graphics/charts/markers.py 1.1 dinu_gherman + Initial checkin. + graphics/charts/lineplots.py 1.5 dinu_gherman + Splitted draw() method. Removed marker functions. Removed usage of XTimeSeriesAxis. Lots of tiny changes. + graphics/charts/linecharts.py 1.4 dinu_gherman + Aplitted draw method. Moved marker functions into markers.py. Many tiny modifications. + graphics/charts/barcharts.py 1.6 dinu_gherman + Minimal doc string changes. + graphics/charts/axes.py 1.10 dinu_gherman + Added attribute valueSteps to X- and YValueAxis. Commented XTimeSeriesAxes. + graphics/charts/barcharts.py 1.5 dinu_gherman + Added abstract BarChart base class. Applied various code simplifications. Removed 'import *'. + graphics/charts/barcharts.py 1.4 dinu_gherman + Tiny changes (to verify CVS works). + graphics/charts/barcharts.py 1.3 dinu_gherman + Split draw() methods into makeBars() and makeBackground(). Fixed one possible bug (reverted order of configure and setPosition()). + graphics/charts/utils.py 1.2 dinu_gherman + Added Robin's stuff from rgb_ticks.py. + graphics/charts/axes.py 1.9 dinu_gherman + Factorized two more methods into ValueAxis. + graphics/charts/axes.py 1.8 dinu_gherman + Factorized some more methods into abstract base classes. + graphics/charts/axes.py 1.7 dinu_gherman + Added new abstract base classes CategoryAxis and ValueAxis. Factorized some methods in X/Y axes and moved to these base classes. Split draw methods into three new methods. + graphics/charts/lineplots.py 1.4 dinu_gherman + Removed commented code. + graphics/charts/utils.py 1.1 dinu_gherman + Moved utility functions into new module utils.py. + graphics/charts/lineplots.py 1.3 dinu_gherman + Moved utility functions into new module utils.py. + graphics/charts/axes.py 1.6 dinu_gherman + Moved utility functions into new module utils.py. + graphics/charts/axes.py 1.5 dinu_gherman + Removed 'import *'. +##### 2001/04/06 ##### + lib/graphdocpy.py 1.4 andy_robinson + Now adds the current directory to the path; makes it easier to run it over other modules. + graphics/charts/axes.py 1.4 andy_robinson + Changes received from Dinu - required for demo, not sure what's in it (Andy) + graphics/shapes.py 1.21 rgbecker + Fix indent + graphics/shapes.py 1.20 rgbecker + _updater was silly + lib/utils.py 1.13 rgbecker + _updater was silly + lib/utils.py 1.12 rgbecker + Added dict _updater func + graphics/shapes.py 1.19 rgbecker + Group/Drawing slightly cleaner python +##### 2001/04/05 ##### + graphics/shapes.py 1.18 rgbecker + Added Group insert method + graphics/shapes.py 1.17 rgbecker + Added stringWidth import + utils/cvs_status.py 1.2 rgbecker + License text changes + test/test_pyfiles.py 1.5 rgbecker + License text changes + test/test_platypus_toc.py 1.6 rgbecker + License text changes + test/test_platypus_paragraphs.py 1.6 rgbecker + License text changes + test/test_pdfgen_pagemodes.py 1.4 rgbecker + License text changes + test/test_pdfbase_pdfutils.py 1.3 rgbecker + License text changes + test/test_pdfbase_pdfmetrics.py 1.5 rgbecker + License text changes + test/test_paragraphs.py 1.9 rgbecker + License text changes + test/test_lib_sequencer.py 1.4 rgbecker + License text changes + test/test_lib_colors.py 1.6 rgbecker + License text changes + test/test_graphics_speed.py 1.7 rgbecker + License text changes + test/test_graphics_charts_textlabels.py 1.3 rgbecker + License text changes + test/test_graphics_charts.py 1.7 rgbecker + License text changes + test/test_docstrings.py 1.4 rgbecker + License text changes + test/runAll.py 1.4 rgbecker + License text changes + test/__init__.py 1.2 rgbecker + License text changes + platypus/tableofcontents.py 1.2 rgbecker + License text changes + pdfbase/pdfmetrics.py 1.31 rgbecker + License text changes + pdfbase/_fontdata.py 1.5 rgbecker + License text changes + lib/yaml.py 1.2 rgbecker + License text changes + lib/setup.py 1.4 rgbecker + License text changes + lib/graphdocpy.py 1.3 rgbecker + License text changes + rl_config.py 1.3 rgbecker + License text changes + lib/docpy.py 1.4 rgbecker + License text changes + graphics/widgets/signsandsymbols.py 1.8 rgbecker + License text changes + graphics/widgets/flags.py 1.2 rgbecker + License text changes + graphics/widgets/__init__.py 1.2 rgbecker + License text changes + graphics/widgetbase.py 1.7 rgbecker + License text changes + graphics/testshapes.py 1.9 rgbecker + License text changes + graphics/testdrawings.py 1.2 rgbecker + License text changes + graphics/renderbase.py 1.9 rgbecker + License text changes + graphics/renderPS.py 1.6 rgbecker + License text changes + graphics/renderPDF.py 1.5 rgbecker + License text changes + graphics/charts/textlabels.py 1.2 rgbecker + License text changes + graphics/charts/piecharts.py 1.2 rgbecker + License text changes + graphics/charts/lineplots.py 1.2 rgbecker + License text changes + graphics/charts/linecharts.py 1.3 rgbecker + License text changes + graphics/charts/legends.py 1.2 rgbecker + License text changes + graphics/charts/barcharts.py 1.2 rgbecker + License text changes + graphics/charts/axes.py 1.3 rgbecker + License text changes + graphics/charts/__init__.py 1.2 rgbecker + License text changes + graphics/__init__.py 1.2 rgbecker + License text changes + docs/userguide/ch9_future.py 1.2 rgbecker + License text changes + docs/graphguide/t_parse.py 1.2 rgbecker + License text changes + docs/graphguide/platdemos.py 1.2 rgbecker + License text changes + docs/graphguide/gengraphguide.py 1.2 rgbecker + License text changes + docs/graphguide/examples.py 1.2 rgbecker + License text changes + docs/graphguide/ch2_graphics.py 1.17 rgbecker + License text changes + docs/graphguide/ch1_intro.py 1.7 rgbecker + License text changes + graphics/shapes.py 1.16 rgbecker + Fixed indentation + graphics/shapes.py 1.15 rgbecker + Added missing comment + graphics/shapes.py 1.14 rgbecker + Made Drawings inherit from Group + utils/copyr.txt 1.2 rgbecker + Changed copyright period + utils/copyrite.py 1.2 rgbecker + Removed spurious assignnments +##### 2001/04/04 ##### + lib/logger.py 1.3 rgbecker + Added enable attribute to the WarnOnce class + graphics/shapes.py 1.13 rgbecker + Added _textBoxLimits +##### 2001/04/03 ##### + docs/graphguide/ch2_graphics.py 1.16 johnprecedo + Spellchecked - fixed 15 typos. + docs/graphguide/ch2_graphics.py 1.15 johnprecedo + Minor changes - resolved a conflict. + docs/graphguide/ch2_graphics.py 1.14 johnprecedo + Added another sample Pie. +##### 2001/04/02 ##### + docs/graphguide/ch1_intro.py 1.6 johnprecedo + Corrected a couple of typoes. + docs/graphguide/ch2_graphics.py 1.13 johnprecedo + Corrected a couple of typoes. +################################################################################# +#################### RELEASE 1.06 at 14:00 BST ################################## +################################################################################# +##### 2001/03/30 ##### + docs/graphguide/ch2_graphics.py 1.11 dinu_gherman + Minor changes. + docs/graphguide/ch2_graphics.py 1.10 dinu_gherman + Updated text. + docs/graphguide/ch2_graphics.py 1.9 dinu_gherman + Added two bar charts. + docs/graphguide/ch2_graphics.py 1.8 dinu_gherman + Added samples for signsandsymbols. + docs/graphguide/ch2_graphics.py 1.7 dinu_gherman + Added minor changes. + docs/graphguide/ch1_intro.py 1.5 dinu_gherman + Added minor changes. + docs/graphguide/ch1_intro.py 1.4 dinu_gherman + Retrofitted a few changes to the content. + docs/userguide/genuserguide.py 1.46 dinu_gherman + Removed two commented imports (to see if CVS works). + utils/daily.py 1.39 rgbecker + Changed to account for graphdocpy and dos/graphguide + docs/userguide/genuserguide.py 1.45 rgbecker + Cross-refrenced to graphics guide, removed spurious ch8 + docs/userguide/ch8_graphics.py 1.15 rgbecker + Cross-refrenced to graphics guide, removed spurious ch8 + docs/userguide/ch2_graphics.py 1.12 rgbecker + Cross-refrenced to graphics guide, removed spurious ch8 + docs/userguide/ch1_intro.py 1.13 rgbecker + Cross-refrenced to graphics guide, removed spurious ch8 + README 1.3 rgbecker + Touch Test +##### 2001/03/29 ##### + docs/userguide/ch8_graphics.py 1.14 dinu_gherman + Added further minor corrections. + docs/graphguide/ch2_graphics.py 1.6 dinu_gherman + Further changes. + docs/graphguide/ch2_graphics.py 1.5 dinu_gherman + Added a table. + docs/graphguide/ch2_graphics.py 1.4 dinu_gherman + Further changes. + docs/userguide/ch8_graphics.py 1.13 dinu_gherman + Shortened even further. + docs/graphguide/ch2_graphics.py 1.3 dinu_gherman + Minor changes. + docs/graphguide/ch1_intro.py 1.3 dinu_gherman + Minor changes. + docs/graphguide/ch2_graphics.py 1.2 dinu_gherman + Changed granularity of chapters. + docs/graphguide/ch1_intro.py 1.2 dinu_gherman + Changed granularity of chapters. + docs/userguide/genuserguide.py 1.44 dinu_gherman + Removed reference to original graphics chapter. + docs/userguide/ch8_graphics_long.py 1.2 dinu_gherman + Removed graphics chapter into graphics guide. + docs/graphguide/t_parse.py 1.1 dinu_gherman + Initial checkin, mostly copied from user guide. + docs/graphguide/platdemos.py 1.1 dinu_gherman + Initial checkin, mostly copied from user guide. + docs/graphguide/gengraphguide.py 1.1 dinu_gherman + Initial checkin, mostly copied from user guide. + docs/graphguide/examples.py 1.1 dinu_gherman + Initial checkin, mostly copied from user guide. + docs/graphguide/ch2_graphics.py 1.1 dinu_gherman + Initial checkin, mostly copied from user guide. + docs/graphguide/ch1_intro.py 1.1 dinu_gherman + Initial checkin, mostly copied from user guide. +##### 2001/03/28 ##### + docs/userguide/ch8_graphics.py 1.12 dinu_gherman + Further changes. + docs/userguide/ch8_graphics.py 1.11 dinu_gherman + Shortened from previous version. + docs/userguide/genuserguide.py 1.43 dinu_gherman + Added import of short graphics chapter. + docs/userguide/ch8_graphics_long.py 1.1 dinu_gherman + Copyied graphics chapter file (to be extracted into a seperate document). + docs/userguide/ch8_graphics.py 1.10 johnprecedo + More images. + docs/userguide/ch8_graphics.py 1.9 johnprecedo + Added more illustrations. + graphics/charts/linecharts.py 1.2 dinu_gherman + Added to docstrings and tidied-up a bit. +##### 2001/03/27 ##### + docs/userguide/ch8_graphics.py 1.8 andy_robinson + Drawings and tables bug fixed. + docs/tools/rltemplate.py 1.11 andy_robinson + Drawings and tables bug fixed. + docs/userguide/ch8_graphics.py 1.7 johnprecedo + More markup. Added todo comments for missing images + docs/userguide/genuserguide.py 1.42 johnprecedo + Added Andy's changes to include illustrations (from code snippets). + docs/userguide/ch8_graphics.py 1.6 johnprecedo + Added Andy's changes to include illustrations (from code snippets). + docs/userguide/ch8_graphics.py 1.5 johnprecedo + More markup changes. Code snippets changed so that they match with current code. + docs/userguide/ch8_graphics.py 1.4 johnprecedo + Lots of small markup changes. Removed reference to paths - they aren't implemented yet in reportlab\graphics. changed references to 'widgets.py' to 'widgetbase.py'. + docs/userguide/genuserguide.py 1.41 johnprecedo + Moved chapter 8 to chapter 9 - new chapter 8 inserted for reportlab\graphics. +##### 2001/03/26 ##### + docs/userguide/ch8_graphics.py 1.3 johnprecedo + Finished markup of reportlab\graphics tutorial. Only one table inserted so far. Any markup other that split into headings/paragraphs/code examples is also missing. + docs/userguide/ch8_graphics.py 1.2 johnprecedo + First partial checkin on new chapter on "Platform Independent Graphics". Little markup done. Later part is still commented out (awaiting markup). + utils/runtests.py 1.16 rgbecker + Improved pattern searches and added better inhibiting + test/unittest.py 1.3 rgbecker + Added utils\runtests.py inhibitor comment + test/test_pyfiles.py 1.4 rgbecker + Added utils\runtests.py inhibitor comment + test/test_platypus_toc.py 1.5 rgbecker + Added utils\runtests.py inhibitor comment + test/test_platypus_paragraphs.py 1.5 rgbecker + Added utils\runtests.py inhibitor comment + test/test_pdfgen_pagemodes.py 1.3 rgbecker + Added utils\runtests.py inhibitor comment + test/test_pdfbase_pdfutils.py 1.2 rgbecker + Added utils\runtests.py inhibitor comment + test/test_pdfbase_pdfmetrics.py 1.4 rgbecker + Added utils\runtests.py inhibitor comment + test/test_paragraphs.py 1.8 rgbecker + Added utils\runtests.py inhibitor comment + test/test_lib_sequencer.py 1.3 rgbecker + Added utils\runtests.py inhibitor comment + test/test_lib_colors.py 1.5 rgbecker + Added utils\runtests.py inhibitor comment + test/test_graphics_speed.py 1.6 rgbecker + Added utils\runtests.py inhibitor comment + test/test_graphics_charts_textlabels.py 1.2 rgbecker + Added utils\runtests.py inhibitor comment + test/test_graphics_charts.py 1.6 rgbecker + Added utils\runtests.py inhibitor comment + test/test_docstrings.py 1.3 rgbecker + Added utils\runtests.py inhibitor comment + test/runAll.py 1.3 rgbecker + Added utils\runtests.py inhibitor comment + docs/userguide/ch9_future.py 1.1 johnprecedo + Existing chapter 8 renamed to chapter 9. Stub for new chapter 8 on graphics added. + docs/userguide/ch8_graphics.py 1.1 johnprecedo + Existing chapter 8 renamed to chapter 9. Stub for new chapter 8 on graphics added. + docs/userguide/ch8_future.py 1.4 johnprecedo + Existing chapter 8 renamed to chapter 9. Stub for new chapter 8 on graphics added. + lib/utils.py 1.11 rgbecker + Changed to prefer PIL as package + platypus/flowables.py 1.18 rgbecker + Changed to PIL_Image + pdfgen/test/testpdfgen.py 1.17 rgbecker + Changed to PIL_Image + pdfgen/pdfimages.py 1.11 rgbecker + Changed to PIL_Image + pdfgen/canvas.py 1.72 rgbecker + Changed to PIL_Image + pdfbase/pdfutils.py 1.21 rgbecker + Changed to PIL_Image + lib/utils.py 1.10 rgbecker + Changed to PIL_Image + graphics/renderPS.py 1.5 rgbecker + Changed to PIL_Image +##### 2001/03/25 ##### + graphics/shapes.py 1.12 dinu_gherman + Improved Auto class. Changed formatting slightly. + test/test_graphics_charts.py 1.5 dinu_gherman + Fixed a buglet with graphdocpy.py running over this file. + lib/docpy.py 1.3 dinu_gherman + Fixed argument bug for UmlPdfDocumentBuilder.begin(). Added bullets to 'imported modules' section. Added cosmetic changes to MyTemplate.afterFlowable(). +##### 2001/03/23 ##### + test/test_pyfiles.py 1.3 dinu_gherman + Changed trailing digit test to really fail. + graphics/widgets/flags0.py 1.5 dinu_gherman + Replaced trailing digit filename. + graphics/widgets/flags.py 1.1 dinu_gherman + Replaced trailing digit filename. + platypus/tableofcontents0.py 1.3 dinu_gherman + Replaced trailing digit file. + platypus/tableofcontents.py 1.1 dinu_gherman + Replaced trailing digit file. + test/test_platypus_toc.py 1.4 dinu_gherman + Fixed imports for non-trailing digit modules. + test/test_platypus_paragraphs.py 1.4 dinu_gherman + Fixed imports for non-trailing digit modules. + test/test_pyfiles.py 1.2 dinu_gherman + Added test for trailing digits in filenames. + lib/graphdocpy.py 1.2 dinu_gherman + Fixed doc strings and imports. + lib/docpy.py 1.2 dinu_gherman + Fixed doc strings and imports. + lib/graphdocpy.py 1.1 dinu_gherman + Initial checkin of non-trailing digit files replacing previous ones. + lib/docpy.py 1.1 dinu_gherman + Initial checkin of non-trailing digit files replacing previous ones. + lib/graphicsdoc0.py 1.12 dinu_gherman + Removed trailing digit file to be replaced with others. + lib/docpy1.py 1.2 dinu_gherman + Removed trailing digit files to be replaced with others. + lib/docpy0.py 1.8 dinu_gherman + Removed trailing digit files to be replaced with others. + graphics/shapes.py 1.11 dinu_gherman + Added isNumberOrAuto() function. + graphics/charts/axes.py 1.2 dinu_gherman + Added missing attribute maps. +##### 2001/03/22 ##### + lib/_rl_accel.c 1.12 rgbecker + Fixed up a better lookup for _AttrDict + platypus/paraparser.py 1.41 andy_robinson + Accepts seqdefault/seqDefault and seqreset/seqReset + lib/_rl_accel.c 1.11 rgbecker + Renamed AttrDict to _AttrDict +##### 2001/03/21 ##### + pdfbase/pdfdoc.py 1.43 aaron_watters + fixed minor bug in forms handling + lib/_rl_accel.c 1.10 rgbecker + AttrDict improvements not yet primetime + lib/setup.py 1.3 rgbecker + avoid import errors for Dinu, no runtests for Robin + lib/_rl_accel.c 1.9 rgbecker + avoid import errors for Dinu, no runtests for Robin + test/test_graphics_charts_textlabel0.py 1.4 dinu_gherman + Removed trailing digit filename to be replaced. + test/test_graphics_speed.py 1.5 dinu_gherman + Replaced one file with a non-trailing digit filename. Modified files using previous trailing digit modules. + test/test_graphics_charts_textlabels.py 1.1 dinu_gherman + Replaced one file with a non-trailing digit filename. Modified files using previous trailing digit modules. + test/test_graphics_charts.py 1.4 dinu_gherman + Replaced one file with a non-trailing digit filename. Modified files using previous trailing digit modules. + graphics/charts/textlabels.py 1.1 dinu_gherman + Initial checkin, replacing previous trailing digit filenames. + graphics/charts/piecharts.py 1.1 dinu_gherman + Initial checkin, replacing previous trailing digit filenames. + graphics/charts/lineplots.py 1.1 dinu_gherman + Initial checkin, replacing previous trailing digit filenames. + graphics/charts/linecharts.py 1.1 dinu_gherman + Initial checkin, replacing previous trailing digit filenames. + graphics/charts/legends.py 1.1 dinu_gherman + Initial checkin, replacing previous trailing digit filenames. + graphics/charts/barcharts.py 1.1 dinu_gherman + Initial checkin, replacing previous trailing digit filenames. + graphics/charts/axes.py 1.1 dinu_gherman + Initial checkin, replacing previous trailing digit filenames. + graphics/charts/textlabel0.py 1.7 dinu_gherman + Removed file names to be replaced with non-trailing digit ones. + graphics/charts/piechart0.py 1.6 dinu_gherman + Removed file names to be replaced with non-trailing digit ones. + graphics/charts/lineplot.py 1.2 dinu_gherman + Removed file names to be replaced with non-trailing digit ones. + graphics/charts/linechart0.py 1.3 dinu_gherman + Removed file names to be replaced with non-trailing digit ones. + graphics/charts/legends0.py 1.9 dinu_gherman + Removed file names to be replaced with non-trailing digit ones. + graphics/charts/barchart1.py 1.19 dinu_gherman + Removed file names to be replaced with non-trailing digit ones. + graphics/charts/axes0.py 1.18 dinu_gherman + Removed file names to be replaced with non-trailing digit ones. + rl_config.py 1.2 rgbecker + Made imageCaching a positive quantity and proeprty of the canvas + platypus/tables.py 1.37 rgbecker + Made imageCaching a positive quantity and proeprty of the canvas + pdfgen/pdfimages.py 1.10 rgbecker + Made imageCaching a positive quantity and proeprty of the canvas + pdfgen/canvas.py 1.71 rgbecker + Made imageCaching a positive quantity and proeprty of the canvas + docs/userguide/ch7_custom.py 1.7 rgbecker + Made imageCaching a positive quantity and proeprty of the canvas + docs/userguide/ch6_tables.py 1.17 rgbecker + Made imageCaching a positive quantity and proeprty of the canvas +##### 2001/03/20 ##### + graphics/charts/lineplot.py 1.1 dinu_gherman + Initial checkin. Added new experimental time series x value axis. + graphics/charts/axes0.py 1.17 dinu_gherman + Initial checkin. Added new experimental time series x value axis. + graphics/charts/legends0.py 1.8 dinu_gherman + Fixed import buglet. + graphics/charts/axes0.py 1.16 dinu_gherman + Fixed buglet when used with bar charts. + graphics/charts/barchart1.py 1.18 dinu_gherman + Added horizontal bar charts plus samples. +##### 2001/03/19 ##### + platypus/tables.py 1.36 aaron_watters + changed handling of table element styles for better space/time. old code left commented + test/test_paragraphs.py 1.7 andy_robinson + Proving you get leading whitespace in print if you have leading whitespace inside the para tag. +##### 2001/03/17 ##### + lib/styles.py 1.14 rgbecker + Removed spurious CellStyle + pdfbase/pdfmetrics.py 1.29 rgbecker + Fixed up self test +##### 2001/03/16 ##### + graphics/charts/barchart1.py 1.17 dinu_gherman + Fixed bug for bar charts using attribute 'useAbsolute'. + pdfbase/pdfmetrics.py 1.28 rgbecker + Fix bad name error(s) + pdfbase/_fontdata.py 1.4 rgbecker + Fix bad name error(s) + test/test_paragraphs.py 1.6 rgbecker + Renamed config.py to rl_config.py + test/test_graphics_speed.py 1.4 rgbecker + Renamed config.py to rl_config.py + platypus/test/testplatypus.py 1.23 rgbecker + Renamed config.py to rl_config.py + platypus/flowables.py 1.17 rgbecker + Renamed config.py to rl_config.py + platypus/doctemplate.py 1.39 rgbecker + Renamed config.py to rl_config.py + pdfgen/canvas.py 1.70 rgbecker + Renamed config.py to rl_config.py + pdfbase/pdfdoc.py 1.42 rgbecker + Renamed config.py to rl_config.py + lib/tocindex.py 1.7 rgbecker + Renamed config.py to rl_config.py + lib/fonts.py 1.6 rgbecker + Renamed config.py to rl_config.py + graphics/widgetbase.py 1.6 rgbecker + Renamed config.py to rl_config.py + graphics/shapes.py 1.10 rgbecker + Renamed config.py to rl_config.py + docs/userguide/genuserguide.py 1.40 rgbecker + Renamed config.py to rl_config.py + docs/userguide/examples.py 1.18 rgbecker + Renamed config.py to rl_config.py + docs/userguide/ch2_graphics.py 1.11 rgbecker + Renamed config.py to rl_config.py + docs/tools/rltemplate.py 1.10 rgbecker + Renamed config.py to rl_config.py + demos/pythonpoint/pythonpoint.py 1.31 rgbecker + Renamed config.py to rl_config.py + demos/gadflypaper/gfe.py 1.14 rgbecker + Renamed config.py to rl_config.py + utils/simpledoc.py 1.6 rgbecker + Fixed typo added point 8 (upload to SF) + utils/README 1.7 rgbecker + Fixed typo added point 8 (upload to SF) + pdfgen/pdfimages.py 1.9 rgbecker + fixed noImageCaching + pdfbase/_fontdata.py 1.3 rgbecker + Changed in line with _rl_accel 0.3 + rl_config.py 1.1 rgbecker + Renamed config.py to rl_config.py + config.py 1.4 rgbecker + Renamed config.py to rl_config.py + pdfbase/pdfmetrics.py 1.27 rgbecker + Added support for _rl_accel 0.3 + lib/_rl_accel.c 1.8 rgbecker + Added _instanceStringWidth, imroved fontSize arg handling +##### 2001/03/15 ##### + graphics/charts/barchart1.py 1.16 dinu_gherman + Fixed baseline bug and added test sample. + pdfbase/pdfmetrics.py 1.26 rgbecker + addStandardFonts was spurious + pdfgen/canvas.py 1.69 rgbecker + pdfmetrics.addStandardFonts was spurious + pdfbase/pdfmetrics.py 1.25 rgbecker + Stuff for adding standardFonts + pdfgen/canvas.py 1.68 rgbecker + Use pdfmetrics addFonts +##### 2001/03/14 ##### + graphics/charts/barchart1.py 1.15 dinu_gherman + Added more samples. +##### 2001/03/13 ##### + changes 1.7 dinu_gherman + New release 1.05. + __init__.py 1.11 dinu_gherman + New release 1.05. + test/test_graphics_charts.py 1.3 dinu_gherman + Changed to use Legend0 instead of Swatches0. + graphics/charts/legends0.py 1.7 dinu_gherman + Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily. + graphics/charts/barchart1.py 1.14 dinu_gherman + Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily. + graphics/charts/axes0.py 1.15 dinu_gherman + Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily. + lib/setup.py 1.2 rgbecker + Added sgmlop pyHnj extensions + lib/_rl_accel.c 1.7 rgbecker + Fixed up the defaultEncoding thing and added a version number + lib/setup.py 1.1 rgbecker + Initial version of distutils script + lib/_rl_accel.c 1.6 rgbecker + Initial version of distutils script + graphics/charts/barchart1.py 1.13 dinu_gherman + Enabled mono-bar charts and no-bar charts(!) plus more samples. + graphics/charts/axes0.py 1.14 dinu_gherman + Enabled mono-bar charts and no-bar charts(!) plus more samples. + graphics/charts/barchart1.py 1.12 dinu_gherman + Added new samples. + graphics/charts/axes0.py 1.13 dinu_gherman + Set minimum number of items for X/Y axes to 1 instead of 2. + graphics/charts/axes0.py 1.12 dinu_gherman + Fixed bug refusing exactly two data items. + graphics/charts/axes0.py 1.11 dinu_gherman + Improved axes. + graphics/charts/axes0.py 1.10 dinu_gherman + Improved X/Y axes. + graphics/charts/axes0.py 1.9 dinu_gherman + Improved YCategoryAxis slightly. + test/test_graphics_charts.py 1.2 dinu_gherman + Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks. + platypus/doctemplate.py 1.38 dinu_gherman + Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks. + graphics/shapes.py 1.9 dinu_gherman + Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks. + graphics/charts/legends0.py 1.6 andy_robinson + Fixed broken cross reference to another example + test/test_lib_colors.py 1.4 andy_robinson + Added CMYK support to core + pdfgen/canvas.py 1.67 andy_robinson + Added CMYK support to core + lib/colors.py 1.17 andy_robinson + Added CMYK support to core +##### 2001/03/12 ##### + test/test_lib_colors.py 1.3 andy_robinson + Initial checkin of CMYKColor class + lib/colors.py 1.16 andy_robinson + Initial checkin of CMYKColor class + graphics/charts/barchart1.py 1.11 dinu_gherman + Added initial crude version of HorizontalBarChart class. + graphics/charts/axes0.py 1.8 dinu_gherman + Added dual versions for category and value axes. (not all tested) + graphics/charts/piechart0.py 1.5 andy_robinson + Fixed bug with defaultColors changes being erroneouslty banned + graphics/charts/legends0.py 1.5 andy_robinson + Fixed bug with defaultColors changes being erroneouslty banned + test/test_graphics_charts.py 1.1 dinu_gherman + Initial checkin. + graphics/charts/legends0.py 1.4 dinu_gherman + Fixed import error. + test/test_pdfbase_pdfmetrics.py 1.3 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + test/test_paragraphs.py 1.5 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + pdfgen/canvas.py 1.66 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + pdfbase/pdfmetrics.py 1.24 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + pdfbase/pdfdoc.py 1.41 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + pdfbase/_fontdata.py 1.2 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + pdfgen/fonts0.py 1.4 rgbecker + Removed fonts0 stuff to pdfbase.pdfmetrics +##### 2001/03/08 ##### + test/test_pdfbase_pdfmetrics.py 1.2 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + pdfgen/fonts0.py 1.3 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + pdfgen/canvas.py 1.65 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + pdfbase/pdfmetrics.py 1.23 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + pdfbase/_fontdata.py 1.1 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + demos/stdfonts/stdfonts.py 1.10 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + test/test_platypus_paragraphs.py 1.3 dinu_gherman + Added a multi-page paragraph test. + docs/userguide/ch1_intro.py 1.12 rgbecker + Changed bad character +##### 2001/03/07 ##### + utils/simpledoc.py 1.5 rgbecker + Changed things to use config.py for defaults + test/test_paragraphs.py 1.4 rgbecker + Changed things to use config.py for defaults + platypus/test/testplatypus.py 1.22 rgbecker + Changed things to use config.py for defaults + platypus/tables.py 1.35 rgbecker + Changed things to use config.py for defaults + platypus/flowables.py 1.16 rgbecker + Changed things to use config.py for defaults + platypus/doctemplate.py 1.37 rgbecker + Changed things to use config.py for defaults + pdfgen/fonts0.py 1.2 rgbecker + Changed things to use config.py for defaults + pdfgen/canvas.py 1.64 rgbecker + Changed things to use config.py for defaults + pdfbase/pdfdoc.py 1.40 rgbecker + Changed things to use config.py for defaults + lib/tocindex.py 1.6 rgbecker + Changed things to use config.py for defaults + lib/pagesizes.py 1.6 rgbecker + Changed things to use config.py for defaults + lib/fonts.py 1.5 rgbecker + Changed things to use config.py for defaults + docs/userguide/genuserguide.py 1.39 rgbecker + Changed things to use config.py for defaults + docs/userguide/examples.py 1.17 rgbecker + Changed things to use config.py for defaults + docs/userguide/ch4_platypus_concepts.py 1.10 rgbecker + Changed things to use config.py for defaults + docs/userguide/ch2_graphics.py 1.10 rgbecker + Changed things to use config.py for defaults + docs/tools/rltemplate.py 1.9 rgbecker + Changed things to use config.py for defaults + demos/pythonpoint/pythonpoint.py 1.30 rgbecker + Changed things to use config.py for defaults + demos/odyssey/fodyssey.py 1.15 rgbecker + Changed things to use config.py for defaults + demos/gadflypaper/gfe.py 1.13 rgbecker + Changed things to use config.py for defaults + config.py 1.3 rgbecker + Changed things to use config.py for defaults + platypus/paragraph.py 1.51 rgbecker + Added test 5 +##### 2001/03/06 ##### + lib/yaml.py 1.1 andy_robinson + Added + test/test_pdfbase_pdfmetrics.py 1.1 andy_robinson + Added explicit font and encoding support + platypus/paragraph.py 1.50 andy_robinson + Added explicit font and encoding support + platypus/doctemplate.py 1.36 andy_robinson + Added explicit font and encoding support + pdfgen/fonts0.py 1.1 andy_robinson + Added explicit font and encoding support + pdfgen/canvas.py 1.63 andy_robinson + Added explicit font and encoding support + pdfbase/pdfmetrics.py 1.22 andy_robinson + Added explicit font and encoding support + pdfbase/pdfdoc.py 1.39 andy_robinson + Added explicit font and encoding support + lib/graphicsdoc0.py 1.11 andy_robinson + Added explicit font and encoding support + demos/stdfonts/stdfonts.py 1.9 andy_robinson + Added explicit font and encoding support + config.py 1.2 andy_robinson + Added explicit font and encoding support + __init__.py 1.10 andy_robinson + Added explicit font and encoding support +##### 2001/03/02 ##### + lib/fonts.py 1.4 rgbecker + Removed spurious import + lib/fonts.py 1.3 rgbecker + Added standard filename roots and findPFB +##### 2001/03/01 ##### + pdfbase/pdfmetrics.py 1.21 rgbecker + Fixed _rl_accel import +##### 2001/02/28 ##### + platypus/paraparser.py 1.40 rgbecker + Exception tests need str() + pdfbase/pdfutils.py 1.20 rgbecker + Exception tests need str() + pdfbase/pdfmetrics.py 1.20 rgbecker + Exception tests need str() + lib/xmllib.py 1.6 rgbecker + Exception tests need str() + lib/utils.py 1.9 rgbecker + Exception tests need str() + lib/graphicsdoc0.py 1.10 rgbecker + Exception tests need str() + demos/odyssey/dodyssey.py 1.10 rgbecker + slight twitch to onDraw test + pdfbase/pdfutils.py 1.19 rgbecker + Fixed typos + graphics/renderPS.py 1.4 rgbecker + Improved ImportError handling + lib/xmllib.py 1.5 rgbecker + Improved ImportError handling + lib/utils.py 1.8 rgbecker + Improved ImportError handling + lib/graphicsdoc0.py 1.9 rgbecker + Improved ImportError handling + lib/_rl_accel.dsp 1.3 rgbecker + Improved ImportError handling + pdfbase/pdfutils.py 1.18 rgbecker + Improved ImportError handling + pdfbase/pdfmetrics.py 1.19 rgbecker + Improved ImportError handling + pdfbase/pdfdoc.py 1.38 rgbecker + Improved ImportError handling + pdfgen/pdfimages.py 1.8 rgbecker + Imporved ImportError handling + pdfgen/canvas.py 1.62 rgbecker + Imporved ImportError handling + platypus/paraparser.py 1.39 rgbecker + Imporved ImportError handling + graphics/charts/barchart1.py 1.10 dinu_gherman + Changed bar chart labels to have always a boxAttribute of 'c'. + test/test_graphics_charts_textlabel0.py 1.3 dinu_gherman + Added meaningful tests for textAnchor attribute. +##### 2001/02/27 ##### + graphics/charts/textlabel0.py 1.6 rgbecker + Added auto height, width and leading + test/test_graphics_charts_textlabel0.py 1.2 dinu_gherman + Thoroughly changed test file. + graphics/charts/barchart1.py 1.9 dinu_gherman + Splitted function sample2 in sample2a and sample2b. + test/test_graphics_charts_textlabel0.py 1.1 dinu_gherman + Initial checkin. + graphics/charts/textlabel0.py 1.5 dinu_gherman + Removed commented test function. +##### 2001/02/26 ##### + lib/docpy1.py 1.1 andy_robinson + Initial checkin of new experiments +##### 2001/02/24 ##### + graphics/widgets/signsandsymbols.py 1.7 dinu_gherman + Added color attribute to SmileyFace0. + graphics/charts/linechart0.py 1.2 dinu_gherman + General improvements. + graphics/charts/linechart0.py 1.1 dinu_gherman + Initial checkin. +##### 2001/02/23 ##### + test/test_pyfiles.py 1.1 dinu_gherman + Initial checkin. +##### 2001/02/22 ##### + pdfbase/pdfutils.py 1.17 dinu_gherman + Removed commented encoding test functions. + test/test_pdfbase_pdfutils.py 1.1 dinu_gherman + Initial checkin. + pdfbase/pdfutils.py 1.16 dinu_gherman + Commented another test function. + pdfbase/pdfutils.py 1.15 dinu_gherman + Commented one test function. + graphics/charts/textlabel0.py 1.4 dinu_gherman + Minor corrections. + graphics/charts/axes0.py 1.7 dinu_gherman + Minor corrections. +##### 2001/02/21 ##### + pdfgen/canvas.py 1.61 aaron_watters + bugfix: code before of begin/end form should not appear in the form but in page +##### 2001/02/19 ##### + graphics/charts/axes0.py 1.6 dinu_gherman + Added different modes for joined x- and y-axes. + graphics/charts/barchart1.py 1.8 dinu_gherman + Added attribute mappings. + graphics/charts/axes0.py 1.5 dinu_gherman + Added attribute mappings. + graphics/charts/axes0.py 1.4 dinu_gherman + Changed test function to sample function. + graphics/charts/legends0.py 1.3 dinu_gherman + Added combined barchart sample. + graphics/charts/legends0.py 1.2 dinu_gherman + Minor changes. + graphics/charts/legends0.py 1.1 dinu_gherman + Initial checkin. + test/test_pdfgen_pagemodes.py 1.2 dinu_gherman + Added doc string. + test/test_platypus_paragraphs.py 1.2 dinu_gherman + Added doc strings. + test/test_lib_sequencer.py 1.2 dinu_gherman + Added doc strings. + test/test_lib_colors.py 1.2 dinu_gherman + Added doc strings. + test/test_docstrings.py 1.2 dinu_gherman + Fixed filename bug. + test/test_docstrings.py 1.1 dinu_gherman + Initial checkin. +##### 2001/02/18 ##### + test/unittest.py 1.2 andy_robinson + Resynched graphics test with Pie class; runAll now deletes previous PDF files incorporated latest unittest.py + test/test_graphics_speed.py 1.3 andy_robinson + Resynched graphics test with Pie class; runAll now deletes previous PDF files incorporated latest unittest.py + test/runAll.py 1.2 andy_robinson + Resynched graphics test with Pie class; runAll now deletes previous PDF files incorporated latest unittest.py + test/00readme.txt 1.4 andy_robinson + Resynched graphics test with Pie class; runAll now deletes previous PDF files incorporated latest unittest.py +##### 2001/02/16 ##### + test/test_lib_colors.py 1.1 dinu_gherman + Initil checkin. + lib/colors.py 1.15 dinu_gherman + Added color2bw function. +##### 2001/02/15 ##### + graphics/charts/piechart0.py 1.4 andy_robinson + Slimmed down and added demo methods + graphics/charts/barchart1.py 1.7 andy_robinson + Slimmed down and added demo methods + graphics/charts/axes0.py 1.3 andy_robinson + Slimmed down and added demo methods + test/test_platypus_paragraphs.py 1.1 dinu_gherman + Initial checkin. +##### 2001/02/14 ##### + graphics/charts/barchart.py 1.4 dinu_gherman + File has become obsolete. See barchart1.py. + lib/graphicsdoc0.py 1.8 dinu_gherman + Improved displaying widget properties (using pprint). + pdfgen/test/testPageMode.py 1.3 dinu_gherman + Moved to reportlab.test. + test/test_pdfgen_pagemodes.py 1.1 dinu_gherman + Initial checkin, moved from reportlab.pdfgen.test. + test/test_lib_sequencer.py 1.1 dinu_gherman + Initial checkin. + test/runAll.py 1.1 dinu_gherman + Initial checkin. + test/test_platypus_toc.py 1.3 dinu_gherman + Restructured entire test suite to make clean use of the unittest module. + test/test_paragraphs.py 1.3 dinu_gherman + Restructured entire test suite to make clean use of the unittest module. + test/test_graphics_speed.py 1.2 dinu_gherman + Restructured entire test suite to make clean use of the unittest module. + test/00readme.txt 1.3 dinu_gherman + Restructured entire test suite to make clean use of the unittest module. +##### 2001/02/13 ##### + graphics/widgets/flags0.py 1.4 johnprecedo + - Removed white borders from inside edges of flags. - added the word "sample" to the demo flag produced by Flag0 - dummy __init__ and demo methods added for Portugal0 - no example flag or properties are produced. +##### 2001/03/13 ##### + test/test_graphics_charts.py 1.3 dinu_gherman + Changed to use Legend0 instead of Swatches0. + graphics/charts/legends0.py 1.7 dinu_gherman + Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily. + graphics/charts/barchart1.py 1.14 dinu_gherman + Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily. + graphics/charts/axes0.py 1.15 dinu_gherman + Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily. + lib/setup.py 1.2 rgbecker + Added sgmlop pyHnj extensions + lib/_rl_accel.c 1.7 rgbecker + Fixed up the defaultEncoding thing and added a version number + lib/setup.py 1.1 rgbecker + Initial version of distutils script + lib/_rl_accel.c 1.6 rgbecker + Initial version of distutils script + graphics/charts/barchart1.py 1.13 dinu_gherman + Enabled mono-bar charts and no-bar charts(!) plus more samples. + graphics/charts/axes0.py 1.14 dinu_gherman + Enabled mono-bar charts and no-bar charts(!) plus more samples. + graphics/charts/barchart1.py 1.12 dinu_gherman + Added new samples. + graphics/charts/axes0.py 1.13 dinu_gherman + Set minimum number of items for X/Y axes to 1 instead of 2. + graphics/charts/axes0.py 1.12 dinu_gherman + Fixed bug refusing exactly two data items. + graphics/charts/axes0.py 1.11 dinu_gherman + Improved axes. + graphics/charts/axes0.py 1.10 dinu_gherman + Improved X/Y axes. + graphics/charts/axes0.py 1.9 dinu_gherman + Improved YCategoryAxis slightly. + test/test_graphics_charts.py 1.2 dinu_gherman + Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks. + platypus/doctemplate.py 1.38 dinu_gherman + Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks. + graphics/shapes.py 1.9 dinu_gherman + Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks. + graphics/charts/legends0.py 1.6 andy_robinson + Fixed broken cross reference to another example + test/test_lib_colors.py 1.4 andy_robinson + Added CMYK support to core + pdfgen/canvas.py 1.67 andy_robinson + Added CMYK support to core + lib/colors.py 1.17 andy_robinson + Added CMYK support to core +##### 2001/03/12 ##### + test/test_lib_colors.py 1.3 andy_robinson + Initial checkin of CMYKColor class + lib/colors.py 1.16 andy_robinson + Initial checkin of CMYKColor class + graphics/charts/barchart1.py 1.11 dinu_gherman + Added initial crude version of HorizontalBarChart class. + graphics/charts/axes0.py 1.8 dinu_gherman + Added dual versions for category and value axes. (not all tested) + graphics/charts/piechart0.py 1.5 andy_robinson + Fixed bug with defaultColors changes being erroneouslty banned + graphics/charts/legends0.py 1.5 andy_robinson + Fixed bug with defaultColors changes being erroneouslty banned + test/test_graphics_charts.py 1.1 dinu_gherman + Initial checkin. + graphics/charts/legends0.py 1.4 dinu_gherman + Fixed import error. + test/test_pdfbase_pdfmetrics.py 1.3 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + test/test_paragraphs.py 1.5 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + pdfgen/canvas.py 1.66 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + pdfbase/pdfmetrics.py 1.24 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + pdfbase/pdfdoc.py 1.41 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + pdfbase/_fontdata.py 1.2 rgbecker + Changes to basic Font stuff, moved it to pdfmetrics + pdfgen/fonts0.py 1.4 rgbecker + Removed fonts0 stuff to pdfbase.pdfmetrics +##### 2001/03/08 ##### + test/test_pdfbase_pdfmetrics.py 1.2 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + pdfgen/fonts0.py 1.3 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + pdfgen/canvas.py 1.65 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + pdfbase/pdfmetrics.py 1.23 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + pdfbase/_fontdata.py 1.1 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + demos/stdfonts/stdfonts.py 1.10 rgbecker + Initial split of pdfmetrics into code + database; some minor name adjustments + test/test_platypus_paragraphs.py 1.3 dinu_gherman + Added a multi-page paragraph test. +##### 2001/03/07 ##### + test/test_paragraphs.py 1.4 rgbecker + Changed things to use config.py for defaults + platypus/test/testplatypus.py 1.22 rgbecker + Changed things to use config.py for defaults + platypus/tables.py 1.35 rgbecker + Changed things to use config.py for defaults + platypus/flowables.py 1.16 rgbecker + Changed things to use config.py for defaults + platypus/doctemplate.py 1.37 rgbecker + Changed things to use config.py for defaults + pdfgen/fonts0.py 1.2 rgbecker + Changed things to use config.py for defaults + pdfgen/canvas.py 1.64 rgbecker + Changed things to use config.py for defaults + pdfbase/pdfdoc.py 1.40 rgbecker + Changed things to use config.py for defaults + lib/tocindex.py 1.6 rgbecker + Changed things to use config.py for defaults + lib/pagesizes.py 1.6 rgbecker + Changed things to use config.py for defaults + lib/fonts.py 1.5 rgbecker + Changed things to use config.py for defaults + demos/pythonpoint/pythonpoint.py 1.30 rgbecker + Changed things to use config.py for defaults + demos/odyssey/fodyssey.py 1.15 rgbecker + Changed things to use config.py for defaults + demos/gadflypaper/gfe.py 1.13 rgbecker + Changed things to use config.py for defaults + config.py 1.3 rgbecker + Changed things to use config.py for defaults + platypus/paragraph.py 1.51 rgbecker + Added test 5 +##### 2001/03/06 ##### + lib/yaml.py 1.1 andy_robinson + Added + test/test_pdfbase_pdfmetrics.py 1.1 andy_robinson + Added explicit font and encoding support + platypus/paragraph.py 1.50 andy_robinson + Added explicit font and encoding support + platypus/doctemplate.py 1.36 andy_robinson + Added explicit font and encoding support + pdfgen/fonts0.py 1.1 andy_robinson + Added explicit font and encoding support + pdfgen/canvas.py 1.63 andy_robinson + Added explicit font and encoding support + pdfbase/pdfmetrics.py 1.22 andy_robinson + Added explicit font and encoding support + pdfbase/pdfdoc.py 1.39 andy_robinson + Added explicit font and encoding support + lib/graphicsdoc0.py 1.11 andy_robinson + Added explicit font and encoding support + demos/stdfonts/stdfonts.py 1.9 andy_robinson + Added explicit font and encoding support + config.py 1.2 andy_robinson + Added explicit font and encoding support + __init__.py 1.10 andy_robinson + Added explicit font and encoding support +##### 2001/feb/09 release 1.03 +##### 2001/02/09 ##### + platypus/tableofcontents0.py 1.2 dinu_gherman + Fixed wrapped line indentation. + lib/graphicsdoc0.py 1.7 dinu_gherman + Entirely reworked PDF and HTML doc builders. + lib/docpy0.py 1.7 dinu_gherman + Entirely reworked PDF and HTML doc builders. + graphics/widgetbase.py 1.5 dinu_gherman + Shortened two lines that might appear in doc tools. + platypus/tableofcontents0.py 1.1 dinu_gherman + Initial checkin. +##### 2001/02/08 ##### + platypus/doctemplate.py 1.35 dinu_gherman + Commented some disturbing print statements. + lib/graphicsdoc0.py 1.6 dinu_gherman + UmlPdfDocBuilder moved to docpy0.py. Changed some defaults and variable names. Fixed handling of packages with dotted names. Changed output of GraphPdfDocBuilder0. + lib/docpy0.py 1.6 dinu_gherman + UmlPdfDocBuilder moved here from graphicsdoc0.py. Changed some defaults and variable names. Fixed handling of packages with dotted names. + graphics/charts/barchart1.py 1.6 dinu_gherman + One long line reduced in length. +##### 2001/02/07 ##### + lib/randomtext.py 1.6 johnprecedo + fixed a typo + lib/randomtext.py 1.5 johnprecedo + Added a PYTHON theme (it had to be done...). + lib/graphicsdoc0.py 1.5 dinu_gherman + Added displaying drawings returned by functions. + graphics/widgets/signsandsymbols.py 1.5 johnprecedo + Corrected mistake in the doctsring for flags0.py and signsandsymbols.py. + graphics/widgets/flags0.py 1.3 johnprecedo + Corrected mistake in the doctsring for flags0.py and signsandsymbols.py. + lib/graphicsdoc0.py 1.4 dinu_gherman + Fixed import error. + lib/graphicsdoc0.py 1.3 dinu_gherman + Added an experimental PlatypusDocBuilder0. Uncommented UmlPdfDocBuilder0. + lib/graphicsdoc0.py 1.2 dinu_gherman + Moved utility functions from docpy0.py to graphicsdoc0.py. + lib/docpy0.py 1.5 dinu_gherman + Moved utility functions from docpy0.py to graphicsdoc0.py. +##### 2001/02/06 ##### + lib/graphicsdoc0.py 1.1 dinu_gherman + Initial checkin. + lib/docpy0.py 1.4 dinu_gherman + Stripped-off everything widget/graphics-specific. + graphics/charts/barchart1.py 1.5 andy_robinson + Added barLabelBudge property to support a customer + graphics/renderbase.py 1.8 andy_robinson + Fixes for QIR barchart presentation + graphics/renderPS.py 1.3 andy_robinson + Fixes for QIR barchart presentation + graphics/charts/barchart1.py 1.4 andy_robinson + Fixes for QIR barchart presentation +##### 2001/02/05 ##### + pdfbase/pdfdoc.py 1.36 aaron_watters + forms in forms now work + graphics/widgets/signsandsymbols.py 1.4 johnprecedo + bugfixes for the various demo() methods for widgets. + lib/docpy0.py 1.3 dinu_gherman + Fixed string joining for base class names. + graphics/widgets/signsandsymbols.py 1.3 johnprecedo + changes all demo() methods to centre graphics in boxes 200x100 boxes.. + lib/docpy0.py 1.2 dinu_gherman + Modified inspect import. + lib/docpy0.py 1.1 dinu_gherman + Initial checkin. + graphics/widgets/flags0.py 1.2 johnprecedo + tightened up code for stripes in US and Greek flags. + graphics/widgets/flags0.py 1.1 johnprecedo + First checkin of file that used to be users/john/fwidgets.py. 20 flags as widgets - inlcuding UK, US, most EU members and a few non-EU European countries. + pdfbase/pdfdoc.py 1.35 aaron_watters + pdfdictionary has no has_key method bugfix. sorry. +##### 2001/02/04 ##### + graphics/renderbase.py 1.7 andy_robinson + Continued work on bar charts and support + graphics/charts/textlabel0.py 1.3 andy_robinson + Continued work on bar charts and support + graphics/charts/barchart1.py 1.3 andy_robinson + Continued work on bar charts and support + graphics/charts/axes0.py 1.2 andy_robinson + Continued work on bar charts and support + graphics/charts/axes0.py 1.1 andy_robinson + Broke out axes to separate module + graphics/widgetbase.py 1.4 andy_robinson + Fixed user node rendering bug, added barchart1 + graphics/shapes.py 1.8 andy_robinson + Fixed user node rendering bug, added barchart1 + graphics/renderbase.py 1.6 andy_robinson + Fixed user node rendering bug, added barchart1 + graphics/charts/textlabel0.py 1.2 andy_robinson + Fixed user node rendering bug, added barchart1 + graphics/charts/barchart1.py 1.2 andy_robinson + Fixed user node rendering bug, added barchart1 +##### 2001/02/02 ##### + pdfbase/pdfdoc.py 1.34 aaron_watters + minor changes to support pdfparse +##### 2001/02/01 ##### + graphics/testshapes.py 1.8 andy_robinson + Working on chart framework + graphics/shapes.py 1.7 andy_robinson + Working on chart framework + graphics/renderbase.py 1.5 andy_robinson + Working on chart framework + graphics/charts/textlabel0.py 1.1 andy_robinson + Working on chart framework + graphics/charts/barchart1.py 1.1 andy_robinson + Working on chart framework +##### 2001/01/30 ##### + lib/inspect.py 1.1 dinu_gherman + Initial checkin. + graphics/charts/barchart.py 1.3 aaron_watters + more stuff, bug fixes etcetera.... + graphics/testshapes.py 1.7 andy_robinson + Fixed group transform bug and added tests + graphics/renderbase.py 1.4 andy_robinson + Fixed group transform bug and added tests + graphics/renderPS.py 1.2 andy_robinson + Fixed group transform bug and added tests + graphics/renderPDF.py 1.4 andy_robinson + Fixed group transform bug and added tests +##### 2001/01/29 ##### + graphics/widgets/signsandsymbols.py 1.2 johnprecedo + Changed classnames to use the '0' convention for experimental. Changed way test print out is carried out. (all calls to classes wrapped up in a new function 'test()') some tidying up. +##### 2001/01/28 ##### + graphics/testshapes.py 1.6 andy_robinson + Fixes to CTM to support bitmap renderer; extra string rotation and group tests. + graphics/renderbase.py 1.3 andy_robinson + Fixes to CTM to support bitmap renderer; extra string rotation and group tests. +##### 2001/01/26 ##### + graphics/widgetbase.py 1.3 andy_robinson + Added barchart compatibility + graphics/shapes.py 1.6 andy_robinson + Added barchart compatibility + graphics/charts/piechart0.py 1.3 andy_robinson + Added barchart compatibility + graphics/charts/barchart.py 1.2 aaron_watters + added scales +##### 2001/01/25 ##### + graphics/widgets/signsandsymbols.py 1.1 johnprecedo + First checkin of file that used to be users/john/jwidgets.py. 12 new widgets. + graphics/charts/barchart.py 1.1 aaron_watters + A initial go at Aarons last rewrite of chart widgets :) + graphics/testshapes.py 1.5 andy_robinson + Added postscript renderer and tests, fixed renderer bugs + graphics/shapes.py 1.5 andy_robinson + Added postscript renderer and tests, fixed renderer bugs + graphics/renderbase.py 1.2 andy_robinson + Added postscript renderer and tests, fixed renderer bugs + graphics/renderPS.py 1.1 andy_robinson + Added postscript renderer and tests, fixed renderer bugs + test/test_graphics_speed.py 1.1 andy_robinson + added a crude benchmarking script +##### 2001/01/24 ##### + graphics/testshapes.py 1.4 andy_robinson + Added group tests, fixed font bug, resynched with Dinu + graphics/shapes.py 1.4 andy_robinson + Added group tests, fixed font bug, resynched with Dinu + graphics/renderPDF.py 1.3 andy_robinson + Added group tests, fixed font bug, resynched with Dinu + graphics/testshapes.py 1.3 dinu_gherman + Added unit testing plus error drawing. + graphics/testshapes.py 1.2 dinu_gherman + Added some String shapes. + graphics/testshapes.py 1.1 dinu_gherman + Initial checkin. + graphics/widgetbase.py 1.2 andy_robinson + Collection based piechart amd support for it. + graphics/shapes.py 1.3 andy_robinson + Collection based piechart amd support for it. + graphics/renderPDF.py 1.2 andy_robinson + Collection based piechart amd support for it. + graphics/charts/piechart0.py 1.2 andy_robinson + Collection based piechart amd support for it. +##### 2001/01/23 ##### + config.py 1.1 johnprecedo + Whoops, forgot + graphics/shapes.py 1.2 johnprecedo + typos fixed +##### 2001/01/22 ##### + graphics/charts/piechart0.py 1.1 andy_robinson + Experimental pie module + graphics/widgets/__init__.py 1.1 andy_robinson + Added widgets subpackage + graphics/charts/__init__.py 1.1 andy_robinson + Added charts package + graphics/widgetbase.py 1.1 andy_robinson + Added graphics module + graphics/testdrawings.py 1.1 andy_robinson + Added graphics module + graphics/shapes.py 1.1 andy_robinson + Added graphics module + graphics/renderbase.py 1.1 andy_robinson + Added graphics module + graphics/renderPDF.py 1.1 andy_robinson + Added graphics module + graphics/__init__.py 1.1 andy_robinson + Added graphics module + pdfbase/pdfutils.py 1.14 dinu_gherman + Modified docstrings. +##### 2001/01/19 ##### + lib/abag.py 1.4 rgbecker + Changed comment to be slightly more meaningful + platypus/frames.py 1.12 dinu_gherman + Minor changes. + platypus/doctemplate.py 1.34 dinu_gherman + Minor changes. + lib/randomtext.py 1.4 dinu_gherman + Minor changes. +##### 2001/01/18 ##### + lib/colors.py 1.14 rgbecker + Syncing with pingo +##### 2001/01/12 ##### + pdfgen/textobject.py 1.22 dinu_gherman + Minor neglectable changes. + pdfgen/pdfimages.py 1.7 dinu_gherman + Minor neglectable changes. + pdfgen/pdfgeom.py 1.7 dinu_gherman + Minor neglectable changes. + pdfgen/pathobject.py 1.8 dinu_gherman + Minor neglectable changes. + pdfgen/canvas.py 1.60 dinu_gherman + Minor neglectable changes. + lib/utils.py 1.7 dinu_gherman + Minor neglectable changes. + lib/sequencer.py 1.10 dinu_gherman + Minor neglectable changes. +##### 2001/01/10 ##### + lib/abag.py 1.3 dinu_gherman + Docstring modified. +##### 2001/01/02 ##### + lib/randomtext.py 1.3 johnprecedo + Minor tweaks (removing unneccesary capital letters etc). + lib/randomtext.py 1.2 johnprecedo + Added 5 new themes. +##### 2000/12/29 ##### + test/test_paragraphs.py 1.2 andy_robinson + Added a random text module + platypus/flowables.py 1.15 andy_robinson + Added a random text module + lib/randomtext.py 1.1 andy_robinson + Added a random text module +##### 2000/12/25 ##### + platypus/flowables.py 1.14 rgbecker + Allow for non string file names in Image.__init__ +##### 2000/12/20 ##### + pdfgen/pdfimages.py 1.6 andy_robinson + death to two tabs! +##### 2000/12/19 ##### + pdfgen/pdfimages.py 1.5 rgbecker + Fix typo + pdfgen/pdfimages.py 1.4 rgbecker + Fix to PIL_image, changed to warnOnce +##### 2000/12/18 ##### + platypus/paragraph.py 1.49 rgbecker + More Dinu related fixes/edits + pdfgen/canvas.py 1.59 andy_robinson + Stripped a couple of tabs in an otherwise-space-delimited module +##### 2000/12/17 ##### + platypus/paragraph.py 1.48 rgbecker + Hack to fix Dinu's problem + platypus/doctemplate.py 1.33 rgbecker + Hack to fix Dinu's problem +##### 2000/12/15 ##### + platypus/doctemplate.py 1.32 rgbecker + Better error message + platypus/paragraph.py 1.47 rgbecker + Start on new simpler line splitter + lib/abag.py 1.2 aaron_watters + added a __repr__ for debug purposes + platypus/paragraph.py 1.46 rgbecker + Further Dinuistic fixes for rare cbDefn bugs +##### 2000/12/14 ##### + platypus/test/testplatypus.py 1.21 rgbecker + relativisation of firstLineIndent related code + lib/tocindex.py 1.5 rgbecker + relativisation of firstLineIndent related code + lib/styles.py 1.13 rgbecker + relativisation of firstLineIndent related code + demos/pythonpoint/styles_modern.py 1.8 rgbecker + relativisation of firstLineIndent related code + demos/pythonpoint/styles_horrible.py 1.7 rgbecker + relativisation of firstLineIndent related code + demos/pythonpoint/pythonpoint.py 1.29 rgbecker + relativisation of firstLineIndent related code + lib/__init__.py 1.3 rgbecker + Added RL_DEBUG environ flag + lib/__BUILD.dsw 1.3 rgbecker + Added RL_DEBUG environ flag + pdfbase/pdfmetrics.py 1.18 rgbecker + Added extension debug code + platypus/paragraph.py 1.45 rgbecker + Delete fix + platypus/paragraph.py 1.44 rgbecker + Fixed Dinu's tagmadness4 problem +##### 2000/12/13 ##### + platypus/tables.py 1.34 aaron_watters + added __repr__s and enhanced exception messages for debugging + platypus/paragraph.py 1.43 aaron_watters + added __repr__s and enhanced exception messages for debugging + platypus/frames.py 1.11 aaron_watters + added __repr__s and enhanced exception messages for debugging + platypus/flowables.py 1.13 aaron_watters + added __repr__s and enhanced exception messages for debugging + platypus/test/testplatypus.py 1.20 rgbecker + Try harder than ever for line cleaning and add bg alias + platypus/paraparser.py 1.38 rgbecker + Try harder than ever for line cleaning and add bg alias + platypus/paragraph.py 1.42 rgbecker + Try harder than ever for line cleaning and add bg alias + platypus/paragraph.py 1.41 rgbecker + Layout fixes; the text objects needed moves before & after and the bullet width was calculated after maxWidth was set. Try harder for space/tab removal. + pdfgen/textobject.py 1.21 rgbecker + Layout fixes; Td was absolute not relative to the beginning of the line + platypus/tables.py 1.33 rgbecker + Fixed confusing error message +########### 1.02 Released 2000/12/11 +##### 2000/12/11 ##### + utils/README 1.5 rgbecker + z7-->z9 + platypus/paraparser.py 1.37 rgbecker + Comments and cosmetic changes + platypus/paragraph.py 1.40 rgbecker + Comments and cosmetic changes +##### 2000/12/10 ##### + pdfgen/textobject.py 1.20 andy_robinson + Fixed obscure stringwidth bugs in textobject and bullets + pdfgen/canvas.py 1.58 andy_robinson + Fixed obscure stringwidth bugs in textobject and bullets + pdfbase/pdfmetrics.py 1.17 andy_robinson + Fixed obscure stringwidth bugs in textobject and bullets + lib/styles.py 1.12 andy_robinson + Fixed obscure stringwidth bugs in textobject and bullets + platypus/paraparser.py 1.36 andy_robinson + Added a text background color attribute + platypus/paragraph.py 1.39 andy_robinson + Added a text background color attribute + lib/styles.py 1.11 andy_robinson + Added a text background color attribute + test/test_paragraphs.py 1.1 andy_robinson + Added some paragraph style tests + lib/styles.py 1.10 andy_robinson + Added a title style to support rml2pdf +##### 2000/12/08 ##### + platypus/paragraph.py 1.38 rgbecker + Clean up one word justified paragraph fix. +##### 2000/12/07 ##### + platypus/paragraph.py 1.37 aaron_watters + divide by zero problem for one word paragraphs +##### 2000/12/06 ##### + docs/userguide/ch4_platypus_concepts.py 1.9 aaron_watters + less than should be less than or equal in example + platypus/paragraph.py 1.36 rgbecker + Fixed line wrap problem +##### 2000/12/05 ##### + demos/pythonpoint/pythonpoint.xml 1.12 andy_robinson + Changed link to Michael Wiedmann's DTD + platypus/paraparser.py 1.35 rgbecker + Fixed typo +##### 2000/12/04 ##### + extensions/README 1.2 rgbecker + Spelling corrections + platypus/paraparser.py 1.34 rgbecker + More cosmetic changes + platypus/paragraph.py 1.35 rgbecker + Cosmetic changes + lib/tocindex.py 1.4 rgbecker + Minor fixes to appends +##### 2000/12/01 ##### + platypus/paragraph.py 1.34 aaron_watters + mods permitting late string conversions + pdfgen/canvas.py 1.57 aaron_watters + mods permitting late string conversions + lib/utils.py 1.6 aaron_watters + mods permitting late string conversions +##### 2000/11/29 ##### + platypus/xpreformatted.py 1.12 rgbecker + Semantic Name changes + platypus/paraparser.py 1.33 rgbecker + Semantic Name changes + platypus/paragraph.py 1.33 rgbecker + Semantic Name changes + platypus/__init__.py 1.12 rgbecker + Semantic Name changes + lib/abag.py 1.1 rgbecker + Initial version split from paraparser.py +##### 2000/11/24 ##### + platypus/paragraph.py 1.32 rgbecker + Fixed missing linefeed bug for cbDefn frag at end of line + lib/_rl_accel.c 1.5 rgbecker + Fixed non-working cast, added getInfo +##### 2000/11/23 ##### + platypus/paraparser.py 1.32 rgbecker + Slight optimisation in handle_data for cbdefn frags + platypus/paragraph.py 1.31 rgbecker + Force cbDefn frags to be not Same + platypus/flowables.py 1.12 andy_robinson + Added working table of contents framework + platypus/doctemplate.py 1.31 andy_robinson + Added working table of contents framework + lib/tocindex.py 1.3 andy_robinson + Added working table of contents framework + lib/styles.py 1.9 andy_robinson + Added working table of contents framework +##### 2000/11/21 ##### + platypus/paragraph.py 1.30 rgbecker + Fixed call back handling in _getFragWords + lib/tocindex.py 1.2 andy_robinson + Now formats correctly, no dynamic build stuff yet. + lib/tocindex.py 1.1 andy_robinson + Initial checkin +##### 2000/11/13 ##### + platypus/paraparser.py 1.31 rgbecker + More hacks + platypus/paragraph.py 1.29 rgbecker + More hacks + platypus/paraparser.py 1.30 rgbecker + Fixes to stupid parser + platypus/paraparser.py 1.29 rgbecker + Added onDraw tag to paragraphs + platypus/paragraph.py 1.28 rgbecker + Added onDraw tag to paragraphs + pdfbase/pdfmetrics.py 1.16 rgbecker + Added onDraw tag to paragraphs + demos/odyssey/dodyssey.py 1.9 rgbecker + Added onDraw tag to paragraphs +##### 2000/11/08 ##### + test/unittest.py 1.1 andy_robinson + Added unittest.py and packagized + test/__init__.py 1.1 andy_robinson + Added unittest.py and packagized + pdfbase/pdfdoc.py 1.33 andy_robinson + Changes to fix font encodings + demos/stdfonts/stdfonts.py 1.8 andy_robinson + Changes to fix font encodings + utils/runtests.py 1.15 andy_robinson + Added an exclusion for 'test/unittest.py' in the test suite. + test/00readme.txt 1.2 andy_robinson + Fixed font encoding lookup, metrics for JPython, created test directory + pdfbase/pdfmetrics.py 1.15 andy_robinson + Fixed font encoding lookup, metrics for JPython, created test directory + pdfbase/pdfdoc.py 1.32 andy_robinson + Fixed font encoding lookup, metrics for JPython, created test directory +##### 2000/11/06 ##### + demos/pythonpoint/pythonpoint.xml 1.11 andy_robinson + compression on by default. + demos/pythonpoint/pythonpoint.py 1.28 andy_robinson + compression on by default. +##### 2000/11/05 ##### + platypus/doctemplate.py 1.30 andy_robinson + Fixed page transitions; extended Pythonpoint + pdfgen/canvas.py 1.56 andy_robinson + Fixed page transitions; extended Pythonpoint + pdfbase/pdfdoc.py 1.31 andy_robinson + Fixed page transitions; extended Pythonpoint + demos/pythonpoint/stdparser.py 1.13 andy_robinson + Fixed page transitions; extended Pythonpoint + demos/pythonpoint/pythonpoint.xml 1.10 andy_robinson + Fixed page transitions; extended Pythonpoint + demos/pythonpoint/pythonpoint.py 1.27 andy_robinson + Fixed page transitions; extended Pythonpoint + test/00readme.txt 1.1 andy_robinson + initial checkin + docs/userguide/genuserguide.py 1.38 andy_robinson + UserGuide now resizes template header to fit page size + docs/tools/rltemplate.py 1.8 andy_robinson + UserGuide now resizes template header to fit page size +##### 2000/11/01 ##### + platypus/paragraph.py 1.27 andy_robinson + Added experimental method getActualLineWidths0 +##### 2000/10/26 ##### + platypus/tables.py 1.32 rgbecker + Layout error fixes + platypus/paragraph.py 1.26 rgbecker + Layout error fixes + platypus/flowables.py 1.11 rgbecker + Layout error fixes + docs/userguide/genuserguide.py 1.37 rgbecker + Make page size an optional argument +##### 2000/10/25 ##### + utils/simpledoc.py 1.4 rgbecker + Changed to indirect copyright + utils/runtests.py 1.14 rgbecker + Changed to indirect copyright + utils/license.py 1.4 rgbecker + Changed to indirect copyright + utils/license.c 1.4 rgbecker + Changed to indirect copyright + utils/daily.py 1.38 rgbecker + Changed to indirect copyright + utils/cvslh.py 1.4 rgbecker + Changed to indirect copyright + utils/cvs_check.py 1.7 rgbecker + Changed to indirect copyright + utils/compress_images.py 1.2 rgbecker + Changed to indirect copyright + platypus/test/testtables.py 1.12 rgbecker + Changed to indirect copyright + platypus/xpreformatted.py 1.11 rgbecker + Changed to indirect copyright + platypus/test/testplatypus.py 1.19 rgbecker + Changed to indirect copyright + platypus/tables.py 1.31 rgbecker + Changed to indirect copyright + platypus/paraparser.py 1.28 rgbecker + Changed to indirect copyright + platypus/paragraph.py 1.25 rgbecker + Changed to indirect copyright + platypus/frames.py 1.10 rgbecker + Changed to indirect copyright + platypus/flowables.py 1.10 rgbecker + Changed to indirect copyright + platypus/doctemplate.py 1.29 rgbecker + Changed to indirect copyright + platypus/__init__.py 1.11 rgbecker + Changed to indirect copyright + pdfgen/textobject.py 1.19 rgbecker + Changed to indirect copyright + pdfgen/test/testpdfgen.py 1.16 rgbecker + Changed to indirect copyright + pdfgen/test/testPageMode.py 1.2 rgbecker + Changed to indirect copyright + pdfgen/pdfimages.py 1.3 rgbecker + Changed to indirect copyright + pdfgen/pdfgeom.py 1.6 rgbecker + Changed to indirect copyright + pdfgen/pathobject.py 1.7 rgbecker + Changed to indirect copyright + pdfgen/canvas.py 1.55 rgbecker + Changed to indirect copyright + pdfgen/__init__.py 1.5 rgbecker + Changed to indirect copyright + pdfbase/pdfutils.py 1.13 rgbecker + Changed to indirect copyright + pdfbase/pdfmetrics.py 1.14 rgbecker + Changed to indirect copyright + pdfbase/pdfdoc.py 1.30 rgbecker + Changed to indirect copyright + pdfbase/__init__.py 1.5 rgbecker + Changed to indirect copyright + lib/utils.py 1.5 rgbecker + Changed to indirect copyright + lib/units.py 1.2 rgbecker + Changed to indirect copyright + lib/styles.py 1.8 rgbecker + Changed to indirect copyright + lib/sequencer.py 1.9 rgbecker + Changed to indirect copyright + lib/pagesizes.py 1.5 rgbecker + Changed to indirect copyright + lib/logger.py 1.2 rgbecker + Changed to indirect copyright + lib/fonts.py 1.2 rgbecker + Changed to indirect copyright + lib/enums.py 1.2 rgbecker + Changed to indirect copyright + lib/corp.py 1.2 rgbecker + Changed to indirect copyright + lib/colors.py 1.13 rgbecker + Changed to indirect copyright + lib/_rl_accel.c 1.4 rgbecker + Changed to indirect copyright + lib/__init__.py 1.2 rgbecker + Changed to indirect copyright + extensions/__init__.py 1.2 rgbecker + Changed to indirect copyright + docs/userguide/t_parse.py 1.2 rgbecker + Changed to indirect copyright + docs/userguide/platdemos.py 1.4 rgbecker + Changed to indirect copyright + docs/userguide/genuserguide.py 1.36 rgbecker + Changed to indirect copyright + docs/userguide/examples.py 1.16 rgbecker + Changed to indirect copyright + docs/userguide/ch8_future.py 1.3 rgbecker + Changed to indirect copyright + docs/userguide/ch7_custom.py 1.6 rgbecker + Changed to indirect copyright + docs/userguide/ch6_tables.py 1.16 rgbecker + Changed to indirect copyright + docs/userguide/ch5_paragraphs.py 1.6 rgbecker + Changed to indirect copyright + docs/userguide/ch4_platypus_concepts.py 1.8 rgbecker + Changed to indirect copyright + docs/userguide/ch3_pdffeatures.py 1.7 rgbecker + Changed to indirect copyright + docs/userguide/ch2_graphics.py 1.9 rgbecker + Changed to indirect copyright + docs/userguide/ch1_intro.py 1.11 rgbecker + Changed to indirect copyright + docs/userguide/app_demos.py 1.7 rgbecker + Changed to indirect copyright + docs/tools/yaml2pdf.py 1.8 rgbecker + Changed to indirect copyright + docs/tools/yaml.py 1.9 rgbecker + Changed to indirect copyright + docs/tools/stylesheet.py 1.7 rgbecker + Changed to indirect copyright + docs/tools/rltemplate.py 1.7 rgbecker + Changed to indirect copyright + docs/tools/codegrab.py 1.5 rgbecker + Changed to indirect copyright + demos/tests/testdemos.py 1.5 rgbecker + Changed to indirect copyright + demos/stdfonts/stdfonts.py 1.7 rgbecker + Changed to indirect copyright + demos/pythonpoint/styles_modern.py 1.7 rgbecker + Changed to indirect copyright + demos/pythonpoint/styles_horrible.py 1.6 rgbecker + Changed to indirect copyright + demos/pythonpoint/stdparser.py 1.12 rgbecker + Changed to indirect copyright + demos/pythonpoint/pythonpoint.py 1.26 rgbecker + Changed to indirect copyright + demos/pythonpoint/customshapes.py 1.3 rgbecker + Changed to indirect copyright + demos/py2pdf/idle_print.py 1.7 rgbecker + Changed to indirect copyright + demos/odyssey/odyssey.py 1.9 rgbecker + Changed to indirect copyright + demos/odyssey/fodyssey.py 1.14 rgbecker + Changed to indirect copyright + demos/odyssey/dodyssey.py 1.8 rgbecker + Changed to indirect copyright + demos/gadflypaper/gfe.py 1.12 rgbecker + Changed to indirect copyright + demos/colors/colortest.py 1.2 rgbecker + Changed to indirect copyright + __init__.py 1.7 rgbecker + Changed to indirect copyright + README 1.2 rgbecker + Changed to indirect copyright +##### 2000/10/24 ##### + license.txt 1.1 rgbecker + Initial separate license file + utils/copyrite.py 1.1 rgbecker + Copyright changes + utils/copyr.txt 1.1 rgbecker + Copyright changes + pdfgen/pdfimages.py 1.2 rgbecker + Fix zlib import bug + pdfgen/pdfimages.py 1.1 aaron_watters + image functionality factored out of canvas.py initial checkin. tests pass + pdfgen/canvas.py 1.54 aaron_watters + sliced out image functionality (oops adding in pdfimages.py next) tests pass +##### 2000/10/23 ##### + platypus/paragraph.py 1.24 rgbecker + Added J Alet's bug case + demos/pythonpoint/pythonpoint.xml 1.9 andy_robinson + Corrected bad end tags and added links to Michael Wiedmann's DTD +##### 2000/10/22 ##### + demos/pythonpoint/pythonpoint.xml 1.8 andy_robinson + Modified the documentation to correct Michael Wiedmann's error reports. +##### 2000/10/21 ##### + lib/sgmlop.dsp 1.2 rgbecker + hyphen.c includes substrings.pl in comment + lib/pyHnj.dsp 1.2 rgbecker + hyphen.c includes substrings.pl in comment + lib/hyphen.c 1.2 rgbecker + hyphen.c includes substrings.pl in comment + lib/_rl_accel.dsp 1.2 rgbecker + hyphen.c includes substrings.pl in comment + lib/README.extensions 1.2 rgbecker + hyphen.c includes substrings.pl in comment +##### 2000/10/19 ##### + pdfbase/pdfdoc.py 1.29 rgbecker + Aaron's latest update from the newslist +##### 2000/10/18 ##### + pdfbase/pdfdoc.py 1.28 aaron_watters + undid last checkin and added an option for a default outline (different fix) + pdfbase/pdfdoc.py 1.27 aaron_watters + moved the outline preprocessing step into the format method (fixes testing error) + pdfgen/canvas.py 1.53 aaron_watters + complete revision of pdfdoc. Not finished (compression missing, testing needed) I got Robin's last change in at the last moment :) + pdfbase/pdfdoc.py 1.26 aaron_watters + complete revision of pdfdoc. Not finished (compression missing, testing needed) I got Robin's last change in at the last moment :) +##### 2000/10/15 ##### + pdfgen/test/testPageMode.py 1.1 andy_robinson + Test of pageMode functions. + pdfgen/canvas.py 1.52 andy_robinson + Added showFullScreen0 + pdfbase/pdfdoc.py 1.25 andy_robinson + Added showFullScreen0 +########### 1.01 Released 2000/10/10 +##### 2000/10/05 ##### + pdfbase/pdfutils.py 1.12 rgbecker + Fix indentation + pdfbase/pdfutils.py 1.11 rgbecker + Changes to make freezing easier + pdfbase/pdfmetrics.py 1.13 rgbecker + Changes to make freezing easier + lib/xmllib.py 1.4 rgbecker + Changes to make freezing easier + lib/utils.py 1.4 rgbecker + Changes to make freezing easier +##### 2000/10/04 ##### + platypus/xpreformatted.py 1.10 rgbecker + Fixed copying bug +##### 2000/10/03 ##### + lib/styles.py 1.7 rgbecker + Code needs a firstLineIndent same as normal lineIndent + platypus/paragraph.py 1.23 rgbecker + Justified XPreformatteds are OK +##### 2000/10/02 ##### + platypus/frames.py 1.9 rgbecker + Fixed the atTop test again + platypus/frames.py 1.8 rgbecker + Fixed the atTop test + platypus/xpreformatted.py 1.9 rgbecker + Added license + platypus/xpreformatted.py 1.8 rgbecker + Splitting fixes. Mostly caused by XPreformatted not doing it right. + platypus/paragraph.py 1.22 rgbecker + Splitting fixes. Mostly caused by XPreformatted not doing it right. +##### 2000/10/01 ##### + platypus/frames.py 1.7 rgbecker + Fixed atTop bugs thanks to the effbot + platypus/xpreformatted.py 1.7 rgbecker + Cleaning up XPreformatted + platypus/xpreformatted.py 1.6 rgbecker + Removed space split and readding +##### 2000/09/27 ##### + pdfbase/pdfmetrics.py 1.12 andy_robinson + more work on metrics and encodings for custom fonts + pdfbase/pdfmetrics.py 1.11 andy_robinson + Begun work on loading new AFM files + lib/colors.py 1.12 rgbecker + Fix for sun compiler + lib/_rl_accel.c 1.3 rgbecker + Fix for sun compiler +##### 2000/09/25 ##### + lib/styles.py 1.6 andy_robinson + added has_key method to stylesheet1 + demos/stdfonts/stdfonts.py 1.6 andy_robinson + Allows you to generate hex, decimal or octal labels +##### 2000/09/08 ##### + pdfbase/pdfdoc.py 1.24 rgbecker + Paul Eddington's unix tell() returns a LongIntType bugfix +##### 2000/09/04 ##### + pdfgen/canvas.py 1.51 rgbecker + Fix spurious comment reference to layout +##### 2000/09/01 ##### + docs/userguide/ch2_graphics.py 1.8 rgbecker + Correct size setting thanks to Werner Louche + pdfgen/textobject.py 1.18 rgbecker + Improved optimisation checks + pdfgen/canvas.py 1.50 rgbecker + Improved optimisation checks + pdfgen/textobject.py 1.17 rgbecker + Fixed potential 'Td' bug +##### 2000/08/31 ##### + pdfgen/canvas.py 1.49 rgbecker + Fix transform optimisation +##### 2000/08/29 ##### + lib/pyHnj.dsp 1.1 rgbecker + Initial version of D Yoo's pyHnj + lib/utils.py 1.3 rgbecker + Initial version of D Yoo's pyHnj + lib/pyHnjmodule.c 1.1 rgbecker + Initial version of D Yoo's pyHnj + lib/hyphen.mashed 1.1 rgbecker + Initial version of D Yoo's pyHnj + lib/hyphen.h 1.1 rgbecker + Initial version of D Yoo's pyHnj + lib/hyphen.c 1.1 rgbecker + Initial version of D Yoo's pyHnj + lib/hnjalloc.h 1.1 rgbecker + Initial version of D Yoo's pyHnj + lib/hnjalloc.c 1.1 rgbecker + Initial version of D Yoo's pyHnj + lib/__BUILD.dsw 1.2 rgbecker + Initial version of D Yoo's pyHnj + lib/Setup.in 1.2 rgbecker + Initial version of D Yoo's pyHnj + lib/Makefile.pre.in 1.3 rgbecker + Initial version of D Yoo's pyHnj + extensions/__init__.py 1.1 rgbecker + Initial version + extensions/README 1.1 rgbecker + Initial version +##### 2000/08/25 ##### + platypus/xpreformatted.py 1.5 rgbecker + Further tweaks of XPreformatted + platypus/paragraph.py 1.21 rgbecker + Further tweaks of XPreformatted + docs/userguide/ch6_tables.py 1.15 rgbecker + Further tweaks of XPreformatted +##### 2000/08/24 ##### + platypus/xpreformatted.py 1.4 rgbecker + XPreformatted fixed empty lines and leading space + platypus/paragraph.py 1.20 rgbecker + XPreformatted fixed empty lines and leading space + lib/utils.py 1.2 rgbecker + Added _className func + docs/userguide/ch6_tables.py 1.14 rgbecker + harder test of XPreformatted + docs/userguide/ch6_tables.py 1.13 rgbecker + Added blank lines to XPreformatted sample + platypus/xpreformatted.py 1.3 rgbecker + Fixes to _dedenter + platypus/flowables.py 1.9 rgbecker + Fixes to _dedenter + docs/userguide/genuserguide.py 1.35 rgbecker + Added Mac Intro + docs/userguide/ch1_intro.py 1.10 rgbecker + Added Mac Intro + docs/images/Python_1.6a2_HINT.gif 1.1 rgbecker + Initial versions for Mac intro + docs/images/Python_1.6a2.gif 1.1 rgbecker + Initial versions for Mac intro + docs/images/Edit_Prefs.gif 1.1 rgbecker + Initial versions for Mac intro + platypus/xpreformatted.py 1.2 rgbecker + XPreformatted first fixes; now runs + platypus/flowables.py 1.8 rgbecker + XPreformatted first fixes; now runs + platypus/__init__.py 1.10 rgbecker + XPreformatted first fixes; now runs + docs/userguide/genuserguide.py 1.34 rgbecker + Preformatted docco added + docs/userguide/ch6_tables.py 1.12 rgbecker + Preformatted docco added + pdfbase/pdfdoc.py 1.23 aaron_watters + change to PDFLiteral to support "lazy string conversions" (to support lazy crosslinks) +##### 2000/08/23 ##### + platypus/xpreformatted.py 1.1 rgbecker + Initial semi working version + platypus/paragraph.py 1.19 rgbecker + Preparing for cleanup +##### 2000/08/20 ##### + pdfgen/canvas.py 1.48 andy_robinson + Changed an argument syntax for clarity + demos/pythonpoint/leftlogo.a85 1.3 andy_robinson + Added as binary file + demos/pythonpoint/leftlogo.a85 1.2 andy_robinson + Removed ASCII file as Mac was corrupting it +##### 2000/08/17 ##### + platypus/paragraph.py 1.18 rgbecker + Various brutal changes to paragraph, canvas and textobject for speed/size + pdfgen/textobject.py 1.16 rgbecker + Various brutal changes to paragraph, canvas and textobject for speed/size + pdfgen/canvas.py 1.47 rgbecker + Various brutal changes to paragraph, canvas and textobject for speed/size + demos/odyssey/odyssey.txt 1.8 rgbecker + Various brutal changes to paragraph, canvas and textobject for speed/size + platypus/paraparser.py 1.27 rgbecker + Changed test formatting +##### 2000/08/16 ##### + pdfbase/pdfmetrics.py 1.10 rgbecker + Start using _rl_accel +##### 2000/08/12 ##### + lib/colors.py 1.11 rgbecker + Fix missing parens +##### 2000/08/11 ##### + lib/colors.py 1.10 rgbecker + added rgb2cmyk + docs/userguide/ch7_custom.py 1.5 rgbecker + Added rotated image derived class example +##### 2000/08/09 ##### + pdfbase/pdfdoc.py 1.22 rgbecker + Andy's Symbol/Zapf font fix +##### 2000/08/03 ##### + pdfbase/pdfutils.py 1.10 rgbecker + Robin's take on Bernhard Herzog's fix to A85 decode + platypus/frames.py 1.6 rgbecker + Changing to packer led positioning + platypus/flowables.py 1.7 rgbecker + Changing to packer led positioning + lib/_rl_accel.c 1.2 rgbecker + Linux/GnuC fixes + lib/Makefile.pre.in 1.2 rgbecker + Linux/GnuC fixes +##### 2000/08/02 ##### + docs/userguide/genuserguide.py 1.33 rgbecker + Table cell updates + docs/userguide/ch6_tables.py 1.11 rgbecker + Table cell updates + docs/images/replogo.gif 1.3 rgbecker + Readded with -kb flag + docs/images/replogo.gif 1.2 rgbecker + Removed bad replogo.gif + platypus/tables.py 1.30 rgbecker + Flowable cell fixes/changes +##### 2000/08/01 ##### + platypus/tables.py 1.29 rgbecker + Fixed flowable valign bottom/top middle maybe + platypus/tables.py 1.28 rgbecker + Additions/Improvements to LINE CMD Splitting + pdfgen/textobject.py 1.15 rgbecker + Converted to using fp_str + pdfgen/canvas.py 1.46 rgbecker + Converted to using fp_str + utils/runtests.py 1.13 rgbecker + Added -time flag + lib/README.extensions 1.1 rgbecker + Initial version + lib/Makefile.pre.in 1.1 rgbecker + Initial version + pdfbase/pdfutils.py 1.9 rgbecker + moved accelerators to lib + pdfbase/pdfmetrics.py 1.9 rgbecker + moved accelerators to lib + pdfbase/_streams.c 1.2 rgbecker + moved accelerators to lib + pdfbase/_pdfmetrics.c 1.3 rgbecker + moved accelerators to lib + pdfbase/Setup.in 1.2 rgbecker + moved accelerators to lib + lib/Setup.in 1.1 rgbecker + Initial version + lib/utils.py 1.1 rgbecker + Initial version + lib/sgmlop.dsp 1.1 rgbecker + Initial version + lib/sgmlop.c 1.1 rgbecker + Initial version + lib/_rl_accel.dsp 1.1 rgbecker + Initial version + lib/_rl_accel.c 1.1 rgbecker + Initial version + lib/__BUILD.dsw 1.1 rgbecker + Initial version + pdfgen/textobject.py 1.14 andy_robinson + Updated old doc string +##### 2000/07/31 ##### + pdfgen/canvas.py 1.45 rgbecker + B Herzog fix to dimension formats +##### 2000/07/30 ##### + platypus/frames.py 1.5 rgbecker + geometry changing attributes now work +##### 2000/07/28 ##### + pdfgen/textobject.py 1.13 rgbecker + Bernhard herzog inspired fixes + pdfgen/canvas.py 1.44 rgbecker + Bernhard herzog inspired fixes +##### 2000/07/26 ##### + pdfbase/pdfmetrics.py 1.8 rgbecker + Accelerator rearrangements + pdfbase/_pdfmetrics.c 1.2 rgbecker + Accelerator rearrangements + lib/logger.py 1.1 rgbecker + Initial version +##### 2000/07/25 ##### + docs/userguide/ch3_pdffeatures.py 1.6 rgbecker + Bruce Eckel spotted these typos. + docs/userguide/ch2_graphics.py 1.7 rgbecker + Bruce Eckel spotted these typos. + docs/userguide/ch1_intro.py 1.9 rgbecker + Bruce Eckel spotted these typos. +##### 2000/07/20 ##### + platypus/doctemplate.py 1.28 rgbecker + Added pagesize to canvasmaker call + README.pdfgen.txt 1.8 rgbecker + Release 1.00 Administration + README 1.1 rgbecker + Release 1.00 Administration +########### 1.00 Released 2000/07/20 +demos/pythonpoint/pythonpoint.py + 1.25 2000/07/15 21:13:29 Minor additions to styles etc. andy_robinson +docs/userguide/app_demos.py + 1.6 2000/07/18 13:27:47 fixed typos. dinu_gherman + 1.5 2000/07/18 10:03:45 fixed typos, minimal changes to py2pdf. dinu_gherman +docs/userguide/ch1_intro.py + 1.8 2000/07/18 09:58:11 fixed typos. dinu_gherman +docs/userguide/ch2_graphics.py + 1.6 2000/07/18 09:59:25 fixed typos. dinu_gherman +docs/userguide/ch3_pdffeatures.py + 1.5 2000/07/18 10:00:43 fixed typos. dinu_gherman +docs/userguide/ch4_platypus_concepts.py + 1.7 2000/07/18 10:02:06 fixed typos. dinu_gherman +docs/userguide/ch5_paragraphs.py + 1.5 2000/07/18 13:24:38 fixed typos. dinu_gherman +docs/userguide/ch5_tables.py + 1.2 2000/07/16 14:01:44 ch5_tables.py was a hangover and should have been deleted before. Note to AR if and when we do this again never give the chapters numbers as that is extremely confusing. rgbecker +docs/userguide/ch6_tables.py + 1.10 2000/07/18 13:25:38 fixed typos. dinu_gherman + 1.9 2000/07/14 14:07:48 Image probs again rgbecker +docs/userguide/ch7_custom.py + 1.4 2000/07/18 13:26:17 fixed typos. dinu_gherman + 1.3 2000/07/16 14:07:56 most_chapters.py was also irrelevant rgbecker +docs/userguide/genuserguide.py + 1.32 2000/07/18 13:29:19 removed header dashes. dinu_gherman +docs/userguide/lj8100.jpg + 1.2 2000/07/14 14:07:48 Image probs again rgbecker +docs/userguide/most_chapters.py + 1.6 2000/07/16 14:07:56 most_chapters.py was also irrelevant rgbecker + 1.5 2000/07/16 14:01:44 ch5_tables.py was a hangover and should have been deleted before. Note to AR if and when we do this again never give the chapters numbers as that is extremely confusing. rgbecker +lib/xmllib.py + 1.3 2000/07/18 09:31:53 Uncommented methods in fast parser rgbecker +pdfbase/Setup.in + 1.1 2000/07/19 19:06:39 Added _pdfmetrics.c rgbecker +pdfbase/_pdfmetrics.c + 1.1 2000/07/19 19:06:39 Added _pdfmetrics.c rgbecker +pdfbase/pdfmetrics.py + 1.7 2000/07/19 19:06:39 Added _pdfmetrics.c rgbecker +platypus/tables.py + 1.27 2000/07/20 13:32:33 Started debugging Table split rgbecker +utils/daily.py + 1.37 2000/07/14 14:27:26 Wasn't doing docs for releases rgbecker +utils/runtests.py + 1.12 2000/07/19 13:44:54 Added -prof option rgbecker +########### 0.95 Released 2000/07/14 +demos/py2pdf/demo.py + 1.5 2000/06/27 08:58:19 Try to ensure test file removal rgbecker +demos/py2pdf/py2pdf.py + 1.10 2000/06/28 11:12:40 Stop auto testing rgbecker +demos/pythonpoint/pythonpoint.py + 1.24 2000/07/12 14:23:12 Table argument order changed rgbecker + 1.23 2000/07/12 06:33:43 Added Speaker Notes facility andy_robinson + 1.22 2000/07/10 15:25:47 Added tables to PythonPoint andy_robinson +demos/pythonpoint/pythonpoint.xml + 1.7 2000/07/12 06:33:43 Added Speaker Notes facility andy_robinson + 1.6 2000/07/10 15:25:47 Added tables to PythonPoint andy_robinson +demos/pythonpoint/stdparser.py + 1.10 2000/07/11 15:00:39 Added end_spacer rgbecker + 1.9 2000/07/10 15:25:47 Added tables to PythonPoint andy_robinson +lib/sequencer.py + 1.8 2000/07/10 11:58:35 Pre-incrementing bug fixed andy_robinson + 1.7 2000/07/08 07:11:21 Changed to pre-increment andy_robinson + 1.6 2000/06/21 19:46:43 Added Roman formatters rgbecker +pdfbase/_streams.c + 1.1 2000/07/05 12:20:27 Ascii85 fixes/additions rgbecker +pdfbase/pdfdoc.py + 1.21 2000/06/26 15:58:22 Simple fix to widths problem rgbecker + 1.20 2000/06/23 17:51:22 /Producer (ReportLab http://www.reportlab.com) in document aaron_watters +pdfbase/pdfmetrics.py + 1.6 2000/06/26 15:58:22 Simple fix to widths problem rgbecker +pdfbase/pdfutils.py + 1.8 2000/07/05 12:20:27 Ascii85 fixes/additions rgbecker + 1.7 2000/06/30 15:29:59 Allow for non-caching of images rgbecker +pdfgen/canvas.py + 1.43 2000/06/30 15:27:55 Allow for non-caching of images rgbecker + 1.42 2000/06/26 15:58:22 Simple fix to widths problem rgbecker +pdfgen/pathobject.py + 1.6 2000/07/12 16:07:09 fixed nameerror and path.circle bug aaron_watters +platypus/__init__.py + 1.9 2000/07/13 11:41:00 Added KeepTogether rgbecker + 1.8 2000/06/27 10:07:55 Added CondPageBreak rgbecker + 1.7 2000/06/21 12:27:42 remove UserDocTemplate, but add Andy's hook methods rgbecker +platypus/doctemplate.py + 1.27 2000/07/10 11:58:35 Pre-incrementing bug fixed andy_robinson + 1.26 2000/07/07 16:21:12 Cosmetics rgbecker + 1.25 2000/07/06 12:40:37 Push canvas into flowables during wrap/split rgbecker + 1.24 2000/07/05 12:22:21 Force _calc in SimpleDocTemplae.build rgbecker + 1.23 2000/07/03 15:39:51 Documentation fixes rgbecker + 1.22 2000/06/28 14:52:43 Documentation changes rgbecker + 1.21 2000/06/26 15:58:22 Simple fix to widths problem rgbecker + 1.20 2000/06/21 12:27:42 remove UserDocTemplate, but add Andy's hook methods rgbecker + 1.19 2000/06/20 21:56:17 re-synching after sourceforge went weird andy_robinson +platypus/flowables.py + 1.6 2000/07/13 11:42:10 removed debug prints rgbecker + 1.5 2000/07/13 11:41:00 Added KeepTogether rgbecker + 1.4 2000/06/27 10:07:55 Added CondPageBreak rgbecker +platypus/frames.py + 1.4 2000/07/07 16:21:12 Cosmetics rgbecker + 1.3 2000/07/06 12:40:38 Push canvas into flowables during wrap/split rgbecker +platypus/paragraph.py + 1.17 2000/07/14 10:29:50 The Paragraph.split method was wrongly assuming that the firstLineIndent should reset to zero. It should always reset to leftIndent! rgbecker + 1.16 2000/07/03 15:39:51 Documentation fixes rgbecker + 1.15 2000/06/23 13:13:54 Fixes to splitting code rgbecker +platypus/paraparser.py + 1.26 2000/07/10 23:53:46 Changed base of seqdefault tag to 0 andy_robinson + 1.25 2000/07/04 10:50:33 Sequencer fixes rgbecker +platypus/tables.py + 1.26 2000/07/12 15:36:56 Allow automatic leading in FONT command rgbecker + 1.25 2000/07/12 15:26:46 INNERGRID was dumb rgbecker + 1.24 2000/07/12 15:25:42 INNERGRID was dumb rgbecker + 1.23 2000/07/12 15:18:16 Leading changes fixed rgbecker + 1.22 2000/07/12 14:23:12 Table argument order changed rgbecker + 1.21 2000/07/12 09:05:17 Fixed tuple size bug rgbecker + 1.20 2000/07/11 14:29:45 Table splitting start rgbecker + 1.19 2000/07/10 15:25:47 Added tables to PythonPoint andy_robinson + 1.18 2000/07/08 15:30:04 Cosmetics and error testing rgbecker + 1.17 2000/07/07 16:22:10 Fix auto hieght stuff rgbecker + 1.16 2000/07/07 10:23:36 First attempt at VALIGN rgbecker + 1.15 2000/07/06 14:05:55 Adjusted doc string rgbecker + 1.14 2000/07/06 12:41:47 First try at auto sizing rgbecker + 1.13 2000/06/29 17:55:19 support explicit \n line splitting in cells aaron_watters +platypus/test/testplatypus.py + 1.18 2000/07/12 14:23:12 Table argument order changed rgbecker +platypus/test/testtables.py + 1.11 2000/07/12 14:23:12 Table argument order changed rgbecker +utils/README + 1.2 2000/07/13 14:55:30 Added detailed release rgbecker +########### 0.94 Released 2000/06/20 +demos/gadflypaper/gfe.py + 1.11 2000/06/01 16:27:56 pageSize is wrong at present rgbecker + 1.10 2000/06/01 15:23:06 Platypus re-organisation rgbecker +demos/odyssey/dodyssey.py + 1.7 2000/06/01 15:23:06 Platypus re-organisation rgbecker + 1.6 2000/06/01 09:41:11 test filename case fix rgbecker +demos/odyssey/fodyssey.py + 1.13 2000/06/01 16:27:56 pageSize is wrong at present rgbecker + 1.12 2000/06/01 15:23:06 Platypus re-organisation rgbecker + 1.11 2000/06/01 09:41:12 test filename case fix rgbecker +demos/odyssey/odyssey.py + 1.8 2000/06/01 09:41:12 test filename case fix rgbecker +demos/odyssey/odyssey.txt + 1.7 2000/05/31 10:12:45 xml tag added rgbecker +demos/py2pdf/demo.py + 1.4 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson +demos/py2pdf/py2pdf.py + 1.9 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson +demos/pythonpoint/pythonpoint.py + 1.21 2000/06/01 15:23:06 Platypus re-organisation rgbecker + 1.20 2000/05/23 14:06:45 Preformatted objects now know how to split themselves. andy_robinson +demos/pythonpoint/stdparser.py + 1.8 2000/06/01 15:23:06 Platypus re-organisation rgbecker +demos/pythonpoint/styles_horrible.py + 1.5 2000/06/01 15:23:06 Platypus re-organisation rgbecker +demos/pythonpoint/styles_modern.py + 1.6 2000/06/01 15:23:06 Platypus re-organisation rgbecker +docs/00readme.txt + 1.1 2000/06/05 16:38:54 Initial revision andy_robinson + 1.1.1.1 2000/06/05 16:38:54 initial import andy_robinson +docs/images/replogo.a85 + 1.1 2000/06/05 16:39:04 Initial revision andy_robinson + 1.1.1.1 2000/06/05 16:39:04 initial import andy_robinson +docs/images/replogo.gif + 1.1 2000/06/05 16:39:04 Initial revision andy_robinson + 1.1.1.1 2000/06/05 16:39:04 initial import andy_robinson +docs/reference/build.bat + 1.4 2000/06/19 23:52:31 rltemplate now simple, based on UserDocTemplate andy_robinson + 1.3 2000/06/17 07:46:45 Small text changes andy_robinson + 1.2 2000/06/12 11:13:09 Added sequencer tags to paragraph parser andy_robinson + 1.1 2000/06/07 13:39:22 Added some text to the first page of reference, and a build batch file andy_robinson +docs/reference/reference.yml + 1.8 2000/06/19 23:52:31 rltemplate now simple, based on UserDocTemplate andy_robinson + 1.7 2000/06/17 07:46:45 Small text changes andy_robinson + 1.6 2000/06/14 21:22:52 Added docs for library andy_robinson + 1.5 2000/06/12 11:26:34 Numbered list added andy_robinson + 1.4 2000/06/12 11:13:09 Added sequencer tags to paragraph parser andy_robinson + 1.3 2000/06/09 01:44:24 added automatic generation for pathobject and textobject modules. aaron_watters + 1.2 2000/06/07 13:39:22 Added some text to the first page of reference, and a build batch file andy_robinson + 1.1 2000/06/05 16:39:04 Initial revision andy_robinson + 1.1.1.1 2000/06/05 16:39:04 initial import andy_robinson +docs/tools/codegrab.py + 1.3 2000/06/20 11:35:08 Python 1.5.1 compatibility fixes rgbecker + 1.2 2000/06/14 21:22:52 Added docs for library andy_robinson + 1.1 2000/06/05 16:38:57 Initial revision andy_robinson + 1.1.1.1 2000/06/05 16:38:57 initial import andy_robinson +docs/tools/rltemplate.py + 1.2 2000/06/19 23:52:31 rltemplate now simple, based on UserDocTemplate andy_robinson + 1.1 2000/06/17 07:48:41 Added a separate rltemplate.py file to contain our standard document template. andy_robinson +docs/tools/stylesheet.py + 1.2 2000/06/14 21:22:52 Added docs for library andy_robinson + 1.1 2000/06/13 20:03:30 Docs is now a package; stylesheet separated out andy_robinson +docs/tools/yaml.py + 1.5 2000/06/20 11:34:47 Python 1.5.1 compatibility fixes rgbecker + 1.4 2000/06/19 15:54:21 Changes to imports again sigh mumble rgbecker + 1.3 2000/06/14 21:22:52 Added docs for library andy_robinson + 1.2 2000/06/13 20:03:30 Docs is now a package; stylesheet separated out andy_robinson + 1.1 2000/06/05 16:38:56 Initial revision andy_robinson + 1.1.1.1 2000/06/05 16:38:56 initial import andy_robinson +docs/tools/yaml2pdf.py + 1.6 2000/06/19 15:54:21 Changes to imports again sigh mumble rgbecker + 1.5 2000/06/17 07:47:20 Factored out rltemplate andy_robinson + 1.4 2000/06/13 20:03:30 Docs is now a package; stylesheet separated out andy_robinson + 1.3 2000/06/12 11:26:34 Numbered list added andy_robinson + 1.2 2000/06/07 21:08:12 Change to style for definition lists andy_robinson + 1.1 2000/06/05 16:38:55 Initial revision andy_robinson + 1.1.1.1 2000/06/05 16:38:55 initial import andy_robinson +docs/userguide/examples.py + 1.3 2000/06/19 21:13:02 2nd try. more text aaron_watters + 1.2 2000/06/17 06:54:54 Example had a reference to layout.py, removed andy_robinson + 1.1 2000/06/17 02:59:05 initial checkin. examples file for userguide generation aaron_watters +docs/userguide/genuserguide.py + 1.2 2000/06/19 21:13:02 2nd try. more text aaron_watters + 1.1 2000/06/17 02:57:56 initial checkin. user guide generation framework. aaron_watters +docs/userguide/platdemos.py + 1.1 2000/06/05 16:39:04 Initial revision andy_robinson + 1.1.1.1 2000/06/05 16:39:04 initial import andy_robinson +lib/colors.py + 1.9 2000/06/14 21:17:30 Some relative imports fixed andy_robinson + 1.8 2000/05/26 09:43:44 stringToColor-->toColor rgbecker +lib/pagesizes.py + 1.4 2000/06/14 21:17:30 Some relative imports fixed andy_robinson +lib/sequencer.py + 1.5 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson + 1.4 2000/06/12 11:27:17 Added Sequencer and associated XML tags andy_robinson + 1.3 2000/06/11 21:34:01 Largely complete class for numbering lists, figures and chapters andy_robinson + 1.2 2000/06/09 16:18:19 Doc strings, sequencer andy_robinson + 1.1 2000/06/01 15:23:06 Platypus re-organisation rgbecker +pdfbase/pdfdoc.py + 1.19 2000/06/01 09:44:26 SaveToFile: only close the file if we opened it. Aggregated from types imports to module level. rgbecker +pdfgen/canvas.py + 1.41 2000/06/09 16:18:19 Doc strings, sequencer andy_robinson + 1.40 2000/06/09 01:45:22 Lots of documentation additions and changes. aaron_watters + 1.39 2000/06/01 15:23:06 Platypus re-organisation rgbecker + 1.38 2000/05/26 09:44:40 generalised colors slightly rgbecker + 1.37 2000/05/23 14:06:45 Preformatted objects now know how to split themselves. andy_robinson +pdfgen/pathobject.py + 1.5 2000/06/09 08:17:43 Full qualified a local import in pdfgen package andy_robinson +platypus/__init__.py + 1.6 2000/06/19 23:51:23 Added UserDocTemplate class, and paragraph.getPlainText() andy_robinson + 1.5 2000/06/01 15:23:06 Platypus re-organisation rgbecker +platypus/doctemplate.py + 1.18 2000/06/19 23:51:23 Added UserDocTemplate class, and paragraph.getPlainText() andy_robinson + 1.17 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson + 1.16 2000/06/16 13:49:20 new build parameters to allow alternate filename and canvas implementation (in order to support slideshow summary mode, for example, or embedding one document in another). aaron_watters + 1.15 2000/06/13 13:03:31 more documentation changes aaron_watters + 1.14 2000/06/01 16:27:56 pageSize is wrong at present rgbecker + 1.13 2000/06/01 15:23:06 Platypus re-organisation rgbecker + 1.12 2000/05/26 10:27:37 Fixed infinite recursion bug rgbecker +platypus/flowables.py + 1.3 2000/06/13 13:03:31 more documentation changes aaron_watters + 1.2 2000/06/01 16:27:56 pageSize is wrong at present rgbecker + 1.1 2000/06/01 15:23:06 Platypus re-organisation rgbecker +platypus/frames.py + 1.2 2000/06/13 13:03:31 more documentation changes aaron_watters + 1.1 2000/06/01 15:23:06 Platypus re-organisation rgbecker +platypus/layout.py + 1.31 2000/06/01 15:23:06 Platypus re-organisation rgbecker + 1.30 2000/05/23 14:08:02 Preformatted objects now splitting andy_robinson +platypus/paragraph.py + 1.14 2000/06/19 23:51:23 Added UserDocTemplate class, and paragraph.getPlainText() andy_robinson + 1.13 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson + 1.12 2000/06/13 13:03:31 more documentation changes aaron_watters + 1.11 2000/06/01 15:23:06 Platypus re-organisation rgbecker + 1.10 2000/05/31 10:12:20 xml tag added rgbecker +platypus/paraparser.py + 1.24 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson + 1.23 2000/06/13 04:11:49 noted replication of XML markup comment between paraparser.py and paragraph.py aaron_watters + 1.22 2000/06/12 11:27:17 Added Sequencer and associated XML tags andy_robinson + 1.21 2000/06/01 15:23:06 Platypus re-organisation rgbecker + 1.20 2000/05/31 10:12:20 xml tag added rgbecker + 1.19 2000/05/26 09:49:23 Color fixes; thanks to J Alet rgbecker + 1.18 2000/05/20 15:36:42 Removed 1.5.2-style getattr call andy_robinson +platypus/tables.py + 1.12 2000/06/13 13:03:31 more documentation changes aaron_watters + 1.11 2000/06/01 15:23:06 Platypus re-organisation rgbecker + 1.10 2000/05/26 09:49:23 Color fixes; thanks to J Alet rgbecker +platypus/test/testplatypus.py + 1.17 2000/06/01 15:23:06 Platypus re-organisation rgbecker +platypus/test/testtables.py + 1.10 2000/06/01 16:27:56 pageSize is wrong at present rgbecker + 1.9 2000/06/01 15:23:06 Platypus re-organisation rgbecker diff --git a/bin/reportlab/docs/00readme.txt b/bin/reportlab/docs/00readme.txt new file mode 100644 index 00000000000..d1810ae46d0 --- /dev/null +++ b/bin/reportlab/docs/00readme.txt @@ -0,0 +1,7 @@ +Thid directory holds documentation. For end users, +it should contain a number of PDF manuals. For +people working with the source, this directory will +be the destination for any manuals built. + +If you don't see the pdf manual you expected or you wich to +ensure an up to date copy run the script tools/genAll.py! diff --git a/bin/reportlab/docs/genAll.py b/bin/reportlab/docs/genAll.py new file mode 100644 index 00000000000..0776903c9a2 --- /dev/null +++ b/bin/reportlab/docs/genAll.py @@ -0,0 +1,37 @@ +#!/bin/env python +import os, sys +def _genAll(d=None,verbose=1): + if not d: d = '.' + if not os.path.isabs(d): + d = os.path.normpath(os.path.join(os.getcwd(),d)) + L = ['reference/genreference.py', + 'userguide/genuserguide.py', + 'graphguide/gengraphguide.py', + '../tools/docco/graphdocpy.py', + ] + if os.path.isdir('../rl_addons'): + L = L + ['../rl_addons/pyRXP/docs/PyRXP_Documentation.rml'] + elif os.path.isdir('../../rl_addons'): + L = L + ['../../rl_addons/pyRXP/docs/PyRXP_Documentation.rml'] + for p in L: + os.chdir(d) + os.chdir(os.path.dirname(p)) + if p[-4:]=='.rml': + try: + from rlextra.rml2pdf.rml2pdf import main + main(exe=0,fn=[os.path.basename(p)], quiet=not verbose, outDir=d) + except: + pass + else: + cmd = '%s %s %s' % (sys.executable,os.path.basename(p), not verbose and '-s' or '') + if verbose: print cmd + os.system(cmd) + +"""Runs the manual-building scripts""" +if __name__=='__main__': + #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) \ No newline at end of file diff --git a/bin/reportlab/docs/graphguide/ch1_intro.py b/bin/reportlab/docs/graphguide/ch1_intro.py new file mode 100644 index 00000000000..794f4a769fc --- /dev/null +++ b/bin/reportlab/docs/graphguide/ch1_intro.py @@ -0,0 +1,105 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/ch1_intro.py +from reportlab.tools.docco.rl_doc_utils import * +import reportlab + +title("Graphics Guide") +centred('ReportLab Version ' + reportlab.Version) + +nextTemplate("Normal") + +######################################################################## +# +# Chapter 1 +# +######################################################################## + + +heading1("Introduction") + + +heading2("About this document") +disc(""" +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 +powerful and flexible chart library. You will see examples of using +reportlab/graphics to make bar charts, line charts, line plots, pie +charts... and a smiley face. +""") + +disc(""" +We presume that you have already installed both the Python programming +language and the core ReportLab library. If you have not done either +of these, look in the ReportLab User Guide where chapter one +talks you through all the required steps. +""") + +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 +you start getting to grips with ReportLab Graphics. +""") + +disc("") +todo(""" +Be warned! This document is in a very preliminary form. We need +your help to make sure it is complete and helpful. Please send any +feedback to our user mailing list, reportlab-users@reportlab.com. +""") + +heading2("What is ReportLab?") +disc("""ReportLab is a software library that lets you directly +create documents in Adobe's Portable Document Format (PDF) using +the Python programming language. """) + +disc("""The ReportLab library directly creates PDF based on +your graphics commands. There are no intervening steps. Your applications +can generate reports extremely fast - sometimes orders +of magnitude faster than traditional report-writing +tools.""") + +heading2("What is ReportLab Graphics?") +disc(""" +ReportLab Graphics is one of the sub-packages to the ReportLab +library. It started off as a stand-alone set of programs, but is now a +fully integrated part of the ReportLab toolkit that allows you to use +its powerful charting and graphics features to improve your PDF forms +and reports. +""") + +heading2("Getting Involved") +disc("""ReportLab is an Open Source project. Although we are +a commercial company we provide the core PDF generation +sources freely, even for commercial purposes, and we make no income directly +from these modules. We also welcome help from the community +as much as any other Open Source project. There are many +ways in which you can help:""") + +bullet("""General feedback on the core API. Does it work for you? +Are there any rough edges? Does anything feel clunky and awkward?""") + +bullet("""New objects to put in reports, or useful utilities for the library. +We have an open standard for report objects, so if you have written a nice +chart or table class, why not contribute it?""") + +bullet("""Demonstrations and Case Studies: If you have produced some nice +output, send it to us (with or without scripts). If ReportLab solved a +problem for you at work, write a little 'case study' and send it in. +And if your web site uses our tools to make reports, let us link to it. +We will be happy to display your work (and credit it with your name +and company) on our site!""") + +bullet("""Working on the core code: we have a long list of things +to refine or to implement. If you are missing some features or +just want to help out, let us know!""") + +disc("""The first step for anyone wanting to learn more or +get involved is to join the mailing list. To Subscribe visit +$http://two.pairlist.net/mailman/listinfo/reportlab-users$. +From there you can also browse through the group's archives +and contributions. The mailing list is +the place to report bugs and get support. """) + diff --git a/bin/reportlab/docs/graphguide/ch2_concepts.py b/bin/reportlab/docs/graphguide/ch2_concepts.py new file mode 100644 index 00000000000..28dab45fece --- /dev/null +++ b/bin/reportlab/docs/graphguide/ch2_concepts.py @@ -0,0 +1,376 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/ch2_concepts.py +from reportlab.tools.docco.rl_doc_utils import * + +heading1("General Concepts") + +disc(""" +In this chapter we will present some of the more fundamental principles of +the graphics library, which will show-up later in various places. +""") + + +heading2("Drawings and Renderers") + +disc(""" +A Drawing is a platform-independent description of a collection of +shapes. +It is not directly associated with PDF, Postscript or any other output +format. +Fortunately, most vector graphics systems have followed the Postscript +model and it is possible to describe shapes unambiguously. +""") + +disc(""" +A drawing contains a number of primitive Shapes. +Normal shapes are those widely known as rectangles, circles, lines, +etc. +One special (logic) shape is a Group, which can hold other +shapes and apply a transformation to them. +Groups represent composites of shapes and allow to treat the +composite as if it were a single shape. +Just about anything can be built up from a small number of basic +shapes. +""") + +disc(""" +The package provides several Renderers 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 libart rasterizer +and Fredrik Lundh's Python Imaging Library (PIL). +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, +and get "identical output". +""") + +disc(""" +The PDF renderer has special "privileges" - a Drawing object is also +a Flowable and, hence, can be placed directly in the story +of any Platypus document, or drawn directly on a Canvas with +one line of code. +In addition, the PDF renderer has a utility function to make +a one-page PDF document quickly. +""") + +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 +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 +shapes. +So, be careful, and please report any bugs you find! +""") + +disc(""" +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. +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. +""") + + +heading2("Coordinate System") + +disc(""" +The Y-direction in our X-Y coordinate system points from the +bottom up. +This is consistent with PDF, Postscript and mathematical notation. +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 down. +For the SVG renderer this is actually no problem as it will take +your drawings and flip things as needed, so your SVG output looks +just as expected. +""") + +disc(""" +The X-coordinate points, as usual, from left to right. +So far there doesn't seem to be any model advocating the opposite +direction - at least not yet (with interesting exceptions, as it +seems, for Arabs looking at time series charts...). +""") + + +heading2("Getting Started") + +disc(""" +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 * + + 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') +""") + +disc("This will produce a PDF file containing the following graphic:") + +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, +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. +Let's save the same drawing in Encapsulated Postscript format: +""") + +##eg(""" +## from reportlab.graphics import renderPS +## renderPS.drawToFile(D, 'example1.eps', 'My First Drawing') +##""") +eg(""" + from reportlab.graphics import renderPS + renderPS.drawToFile(d, 'example1.eps') +""") + +disc(""" +This will produce an EPS file with the identical drawing, which +may be imported into publishing tools such as Quark Express. +If we wanted to generate the same drawing as a bitmap file for +a website, say, all we need to do is write code like this: +""") + +eg(""" + from reportlab.graphics import renderPM + renderPM.saveToFile(d, 'example1.png', 'PNG') +""") + +disc(""" +Many other bitmap formats, like GIF, JPG, TIFF, BMP and PPN are +genuinely available, making it unlikely you'll need to add external +postprocessing steps to convert to the final format you need. +""") + +disc(""" +To produce an SVG file containing the identical drawing, which +may be imported into graphical editing tools such as Illustrator +all we need to do is write code like this: +""") + +eg(""" + from reportlab.graphics import renderSVG + renderSVG.drawToFile(d, 'example1.svg') +""") + + +heading2("Attribute Verification") + +disc(""" +Python is very dynamic and lets us execute statements at run time that +can easily be the source for unexpected behaviour. +One subtle 'error' is when assigning to an attribute that the framework +doesn't know about because the used attribute's name contains a typo. +Python lets you get away with it (adding a new attribute to an object, +say), but the graphics framework will not detect this 'typo' without +taking special counter-measures. +""") + +disc(""" +There are two verification techniques to avoid this situation. +The default is for every object to check every assignment at run +time, such that you can only assign to 'legal' attributes. +This is what happens by default. +As this imposes a small performance penalty, this behaviour can +be turned off when you need it to be. +""") + +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 +>>> del r.width # that should confuse it +""") + +disc(""" +These statements would be caught by the compiler in a statically +typed language, but Python lets you get away with it. +The first error could leave you staring at the picture trying to +figure out why the colors were wrong. +The second error would probably become clear only later, when +some back-end tries to draw the rectangle. +The third, though less likely, results in an invalid object that +would not know how to draw itself. +""") + +eg(""" +>>> r = shapes.Rect(10,10,200,80) +>>> r.fullColor = colors.green +Traceback (most recent call last): + File "", 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(""" +This imposes a performance penalty, so this behaviour can be turned +off when you need it to be. +To do this, you should use the following lines of code before you +first import reportlab.graphics.shapes: +""") + +eg(""" +>>> 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 +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. +However, if we move the renderers to C in future (which is eminently +possible), the remaining 75% would shrink to almost nothing and +the saving from verification would be significant. +""") + +disc(""" +Each object, including the drawing itself, has a $verify()$ method. +This either succeeds, or raises an exception. +If you turn off automatic verification, then you should explicitly +call $verify()$ in testing when developing the code, or perhaps +once in a batch process. +""") + + +heading2("Property Editing") + +disc(""" +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 +drawings. +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 +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$ +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. +This will make much more sense when we look at Widgets 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() +fillColor = Color(0.00,0.00,0.00) +height = 100 +rx = 0 +ry = 0 +strokeColor = Color(1.00,0.00,0.00) +strokeDashArray = None +strokeLineCap = 0 +strokeLineJoin = 0 +strokeMiterLimit = 0 +strokeWidth = 1 +width = 200 +x = 20 +y = 30 +>>> """) + +disc(""" +Note: $pprint$ is the standard Python library module that allows +you to 'pretty print' output over multiple lines rather than having +one very long line. +""") + +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 +non-primitive objects. +""") + + +heading2("Naming Children") + +disc(""" +You can add objects to the $Drawing$ and $Group$ objects. +These normally go into a list of contents. +However, you may also give objects a name when adding them. +This allows you to refer to and possibly change any element +of a drawing after constructing it. +""") + +eg(""" +>>> d = shapes.Drawing(400, 200) +>>> s = shapes.String(10, 10, 'Hello World') +>>> d.add(s, 'caption') +>>> s.caption.text +'Hello World' +>>> +""") + +disc(""" +Note that you can use the same shape instance in several contexts +in a drawing; if you choose to use the same $Circle$ object in many +locations (e.g. a scatter plot) and use different names to access +it, it will still be a shared object and the changes will be +global. +""") + +disc(""" +This provides one paradigm for creating and modifying interactive +drawings. +""") \ No newline at end of file diff --git a/bin/reportlab/docs/graphguide/ch3_shapes.py b/bin/reportlab/docs/graphguide/ch3_shapes.py new file mode 100644 index 00000000000..375513a037e --- /dev/null +++ b/bin/reportlab/docs/graphguide/ch3_shapes.py @@ -0,0 +1,416 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/ch3_shapes.py + +from reportlab.tools.docco.rl_doc_utils import * +from reportlab.graphics.shapes import * + +heading1("Shapes") + +disc(""" +This chapter describes the concept of shapes and their importance +as building blocks for all output generated by the graphics library. +Some properties of existing shapes and their relationship to +diagrams are presented and the notion of having different renderers +for different output formats is briefly introduced. +""") + +heading2("Available Shapes") + +disc(""" +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 +constructs which can be added to a drawing. +They are: +""") + +bullet("Rect") +bullet("Circle") +bullet("Ellipse") +bullet("Wedge (a pie slice)") +bullet("Polygon") +bullet("Line") +bullet("PolyLine") +bullet("String") +bullet("Group") +bullet("Path (not implemented yet, but will be added in the future)") + +disc(""" +The following drawing, taken from our test suite, shows most of the +basic shapes (except for groups). +Those with a filled green surface are also called solid shapes +(these are $Rect$, $Circle$, $Ellipse$, $Wedge$ and $Polygon$). +""") + +from reportlab.graphics import testshapes + +t = testshapes.getDrawing06() +draw(t, "Basic shapes") + + +heading2("Shape Properties") + +disc(""" +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: +""") + +eg(""" +>>> from reportlab.graphics.shapes import Rect +>>> from reportlab.lib.colors import red, green +>>> r = Rect(5, 5, 200, 100) +>>> r.fillColor = red +>>> r.strokeColor = green +>>> r.strokeWidth = 3 +>>> +""") + +from reportlab.graphics.shapes import Rect +from reportlab.lib.colors import red, green +d = Drawing(220, 120) +r = Rect(5, 5, 200, 100) +r.fillColor = red +r.strokeColor = green +r.strokeWidth = 3 +d.add(r) +draw(d, "red rectangle with green border") + +disc(""" +Note: In future examples we will omit the import statements. +""") + +disc(""" +All shapes have a number of properties which can be set. +At an interactive prompt, we can use their dumpProperties() +method to list these. +Here's what you can use to configure a Rect: +""") + +eg(""" +>>> r.dumpProperties() +fillColor = Color(1.00,0.00,0.00) +height = 100 +rx = 0 +ry = 0 +strokeColor = Color(0.00,0.50,0.00) +strokeDashArray = None +strokeLineCap = 0 +strokeLineJoin = 0 +strokeMiterLimit = 0 +strokeWidth = 3 +width = 200 +x = 5 +y = 5 +>>> +""") + +disc(""" +Shapes generally have style properties and geometry +properties. +$x$, $y$, $width$ and $height$ are part of the geometry and must +be provided when creating the rectangle, since it does not make +much sense without those properties. +The others are optional and come with sensible defaults. +""") + +disc(""" +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) +""") + +disc(""" +Let's run through the style properties. $fillColor$ is obvious. +$stroke$ is publishing terminology for the edge of a shape; +the stroke has a color, width, possibly a dash pattern, and +some (rarely used) features for what happens when a line turns +a corner. +$rx$ and $ry$ are optional geometric properties and are used to +define the corner radius for a rounded rectangle. +""") + +disc("All the other solid shapes share the same style properties.") + + +heading2("Lines") + +disc(""" +We provide single straight lines, PolyLines and curves. +Lines have all the $stroke*$ properties, but no $fillColor$. +Here are a few Line and PolyLine examples and the corresponding +graphics output: +""") + +eg(""" + Line(50,50, 300,100, + strokeColor=colors.blue, strokeWidth=5) + Line(50,100, 300,50, + strokeColor=colors.red, + strokeWidth=10, + strokeDashArray=[10, 20]) + PolyLine([120,110, 130,150, 140,110, 150,150, 160,110, + 170,150, 180,110, 190,150, 200,110], + strokeWidth=2, + strokeColor=colors.purple) +""") + +d = Drawing(400, 200) +d.add(Line(50,50, 300,100,strokeColor=colors.blue, strokeWidth=5)) +d.add(Line(50,100, 300,50, + strokeColor=colors.red, + strokeWidth=10, + strokeDashArray=[10, 20])) +d.add(PolyLine([120,110, 130,150, 140,110, 150,150, 160,110, + 170,150, 180,110, 190,150, 200,110], + strokeWidth=2, + strokeColor=colors.purple)) +draw(d, "Line and PolyLine examples") + + +heading2("Strings") + +disc(""" +The ReportLab Graphics package is not designed for fancy text +layout, but it can place strings at desired locations and with +left/right/center alignment. +Let's specify a $String$ object and look at its properties: +""") + +eg(""" +>>> s = String(10, 50, 'Hello World') +>>> s.dumpProperties() +fillColor = Color(0.00,0.00,0.00) +fontName = Times-Roman +fontSize = 10 +text = Hello World +textAnchor = start +x = 10 +y = 50 +>>> +""") + +disc(""" +Strings have a textAnchor property, which may have one of the +values 'start', 'middle', 'end'. +If this is set to 'start', x and y relate to the start of the +string, and so on. +This provides an easy way to align text. +""") + +disc(""" +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. +We have recently also added support for extra Type 1 fonts +and the renderers all know how to render Type 1 fonts. +""") + +##Until now we have worked with bitmap renderers which have to use +##TrueType fonts and which make some substitutions; this could lead +##to differences in text wrapping or even the number of labels on +##a chart between renderers. + +disc(""" +Here is a more fancy example using the code snippet below. +Please consult the ReportLab User Guide to see how non-standard +like 'LettErrorRobot-Chrome' fonts are being registered! +""") + +eg(""" + d = Drawing(400, 200) + for size in range(12, 36, 4): + d.add(String(10+size*2, 10+size*2, 'Hello World', + fontName='Times-Roman', + fontSize=size)) + + d.add(String(130, 120, 'Hello World', + fontName='Courier', + fontSize=36)) + + d.add(String(150, 160, 'Hello World', + fontName='LettErrorRobot-Chrome', + fontSize=36)) +""") + +from reportlab.pdfbase import pdfmetrics +from reportlab import rl_config +rl_config.warnOnMissingFontGlyphs = 0 +afmFile, pfbFile = getJustFontPaths() +T1face = pdfmetrics.EmbeddedType1Face(afmFile, pfbFile) +T1faceName = 'LettErrorRobot-Chrome' +pdfmetrics.registerTypeFace(T1face) +T1font = pdfmetrics.Font(T1faceName, T1faceName, 'WinAnsiEncoding') +pdfmetrics.registerFont(T1font) + +d = Drawing(400, 200) +for size in range(12, 36, 4): + d.add(String(10+size*2, 10+size*2, 'Hello World', + fontName='Times-Roman', + fontSize=size)) + +d.add(String(130, 120, 'Hello World', + fontName='Courier', + fontSize=36)) + +d.add(String(150, 160, 'Hello World', + fontName='LettErrorRobot-Chrome', + fontSize=36)) + +draw(d, 'fancy font example') + + +heading2("""Paths""") + +disc(""" +Postscript paths are a widely understood concept in graphics. +They are not implemented in $reportlab/graphics$ as yet, but they +will be, soon. +""") + +# 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 + ## 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 + ## 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) + ##>>> + ##""") + + ##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("""Note that our current path implementation is an approximation; it + ## should be finished off accurately for PDF and PS.""") + + +heading2("Groups") + +disc(""" +Finally, we have Group objects. +A group has a list of contents, which are other nodes. +It can also apply a transformation - its contents can be rotated, +scaled or shifted. +If you know the math, you can set the transform directly. +Otherwise it provides methods to rotate, scale and so on. +Here we make a group which is rotated and translated: +""") + +eg(""" +>>> g =Group(shape1, shape2, shape3) +>>> g.rotate(30) +>>> g.translate(50, 200) +""") + +disc(""" +Groups provide a tool for reuse. +You can make a bunch of shapes to represent some component - say, +a coordinate system - and put them in one group called "Axis". +You can then put that group into other groups, each with a different +translation and rotation, and you get a bunch of axis. +It is still the same group, being drawn in different places. +""") + +disc("""Let's do this with some only slightly more code:""") + +eg(""" + d = Drawing(400, 200) + + Axis = Group( + Line(0,0,100,0), # x axis + Line(0,0,0,50), # y axis + Line(0,10,10,10), # ticks on y axis + Line(0,20,10,20), + 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(90,0,90,10), + String(20, 35, 'Axes', fill=colors.black) + ) + + 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) +""") + +d = Drawing(400, 200) +Axis = Group( + Line(0,0,100,0), # x axis + Line(0,0,0,50), # y axis + Line(0,10,10,10), # ticks on y axis + Line(0,20,10,20), + 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(90,0,90,10), + String(20, 35, 'Axes', fill=colors.black) + ) +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) +draw(d, "Groups examples") \ No newline at end of file diff --git a/bin/reportlab/docs/graphguide/ch4_widgets.py b/bin/reportlab/docs/graphguide/ch4_widgets.py new file mode 100644 index 00000000000..eed115d6a86 --- /dev/null +++ b/bin/reportlab/docs/graphguide/ch4_widgets.py @@ -0,0 +1,422 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/ch4_widgets.py + +from reportlab.tools.docco.rl_doc_utils import * +from reportlab.graphics.shapes import * +from reportlab.graphics.widgets import signsandsymbols + +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. +""") + + +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 + 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 + 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. +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 + Group to represent itself""") +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 + 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 + widgets to be converted to primitives.""") + + +heading2("Using a Widget") + +disc(""" +Let's imagine a simple new widget. +We will use a widget to draw a face, then show how it was implemented.""") + +eg(""" +>>> from reportlab.lib import colors +>>> from reportlab.graphics import shapes +>>> from reportlab.graphics import widgetbase +>>> from reportlab.graphics import renderPDF +>>> d = shapes.Drawing(200, 100) +>>> f = widgetbase.Face() +>>> f.skinColor = colors.yellow +>>> f.mood = "sad" +>>> d.add(f) +>>> renderPDF.drawToFile(d, 'face.pdf', 'A Face') +""") + +from reportlab.graphics import widgetbase +d = Drawing(200, 120) +f = widgetbase.Face() +f.x = 50 +f.y = 10 +f.skinColor = colors.yellow +f.mood = "sad" +d.add(f) +draw(d, 'A sample widget') + +disc(""" +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 +>>> +""") + +disc(""" +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 +window, and you move or resize them by setting properties such as +x, y, width and so on after creation. +""") + +disc(""" +In addition, a widget always provides a $demo()$ method. +Simple ones like this always do something sensible before setting +properties, but more complex ones like a chart would not have any +data to plot. +The documentation tool calls $demo()$ so that your fancy new chart +class can create a drawing showing what it can do. +""") + +disc(""" +Here are a handful of simple widgets available in the module +signsandsymbols.py: +""") + +from reportlab.graphics.shapes import Drawing +from reportlab.graphics.widgets import signsandsymbols + +d = Drawing(230, 230) + +ne = signsandsymbols.NoEntry() +ds = signsandsymbols.DangerSign() +fd = signsandsymbols.FloppyDisk() +ns = signsandsymbols.NoSmoking() + +ne.x, ne.y = 10, 10 +ds.x, ds.y = 120, 10 +fd.x, fd.y = 10, 120 +ns.x, ns.y = 120, 120 + +d.add(ne) +d.add(ds) +d.add(fd) +d.add(ns) + +draw(d, 'A few samples from signsandsymbols.py') + +disc(""" +And this is the code needed to generate them as seen in the drawing above: +""") + +eg(""" +from reportlab.graphics.shapes import Drawing +from reportlab.graphics.widgets import signsandsymbols + +d = Drawing(230, 230) + +ne = signsandsymbols.NoEntry() +ds = signsandsymbols.DangerSign() +fd = signsandsymbols.FloppyDisk() +ns = signsandsymbols.NoSmoking() + +ne.x, ne.y = 10, 10 +ds.x, ds.y = 120, 10 +fd.x, fd.y = 10, 120 +ns.x, ns.y = 120, 120 + +d.add(ne) +d.add(ds) +d.add(fd) +d.add(ns) +""") + + +heading2("Compound Widgets") + +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 +>>> +""") + +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 + has provided the checking information.""") + + +heading2("Implementing Widgets") + +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 +""") + +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 + 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 + "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 + } +""") + +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 +generate a reference for the ReportLab package. +When it encounters widgets, it adds extra sections to the +manual including:""") + +bullet("the doc string for your widget class ") +bullet("the code snippet from your demo() method, so people can see how to use it") +bullet("the drawing produced by the demo() method ") +bullet("the property dump for the widget in the drawing. ") + +disc(""" +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! +""") + + +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 + $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 + 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 +""") +#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 + 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 + in, say, Visual Basic and Delphi.""") + +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.charts.piecharts import Pie + +d = Drawing(400,200) +d.add(String(100,175,"Without labels", textAnchor="middle")) +d.add(String(300,175,"With labels", textAnchor="middle")) + +pc = Pie() +pc.x = 25 +pc.y = 50 +pc.data = [10,20,30,40,50,60] +pc.slices[0].popout = 5 +d.add(pc, 'pie1') + +pc2 = Pie() +pc2.x = 150 +pc2.y = 50 +pc2.data = [10,20,30,40,50,60] +pc2.labels = ['a','b','c','d','e','f'] +d.add(pc2, 'pie2') + +pc3 = Pie() +pc3.x = 275 +pc3.y = 50 +pc3.data = [10,20,30,40,50,60] +pc3.labels = ['a','b','c','d','e','f'] +pc3.wedges.labelRadius = 0.65 +pc3.wedges.fontName = "Helvetica-Bold" +pc3.wedges.fontSize = 16 +pc3.wedges.fontColor = colors.yellow +d.add(pc3, 'pie3') +""") + +# Hack to force a new paragraph before the todo() :-( +disc("") + +from reportlab.lib.colors import * +from reportlab.graphics import shapes,renderPDF +from reportlab.graphics.charts.piecharts import Pie + +d = Drawing(400,200) +d.add(String(100,175,"Without labels", textAnchor="middle")) +d.add(String(300,175,"With labels", textAnchor="middle")) + +pc = Pie() +pc.x = 25 +pc.y = 50 +pc.data = [10,20,30,40,50,60] +pc.slices[0].popout = 5 +d.add(pc, 'pie1') + +pc2 = Pie() +pc2.x = 150 +pc2.y = 50 +pc2.data = [10,20,30,40,50,60] +pc2.labels = ['a','b','c','d','e','f'] +d.add(pc2, 'pie2') + +pc3 = Pie() +pc3.x = 275 +pc3.y = 50 +pc3.data = [10,20,30,40,50,60] +pc3.labels = ['a','b','c','d','e','f'] +pc3.slices.labelRadius = 0.65 +pc3.slices.fontName = "Helvetica-Bold" +pc3.slices.fontSize = 16 +pc3.slices.fontColor = colors.yellow +d.add(pc3, 'pie3') + +draw(d, 'Some sample Pies') \ No newline at end of file diff --git a/bin/reportlab/docs/graphguide/ch5_charts.py b/bin/reportlab/docs/graphguide/ch5_charts.py new file mode 100644 index 00000000000..d37df78d094 --- /dev/null +++ b/bin/reportlab/docs/graphguide/ch5_charts.py @@ -0,0 +1,1229 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/ch5_charts.py + +from reportlab.tools.docco.rl_doc_utils import * +from reportlab.graphics.shapes import * + +heading1("Charts") + +disc(""" +The motivation for much of this is to create a flexible chart +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. +""") + + +heading2("Design Goals") + +disc("Here are some of the design goals: ") + +disc("Make simple top-level use really simple ") +disc("""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("Allow precise positioning ") +disc("""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("""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("Control child elements individually or as a group") +disc("""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(""" +d = Drawing(400,200) +pc = Pie() +pc.x = 150 +pc.y = 50 +pc.data = [10,20,30,40,50,60] +pc.labels = ['a','b','c','d','e','f'] +pc.slices.strokeWidth=0.5 +pc.slices[3].popout = 20 +pc.slices[3].strokeWidth = 2 +pc.slices[3].strokeDashArray = [2,2] +pc.slices[3].labelRadius = 1.75 +pc.slices[3].fontColor = colors.red +d.add(pc, '') +""") + +disc("""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("Only expose things you should change ") +disc("""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("Composition and component based ") +disc("""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(""" +c = MyChartWithLegend() +c.legend = MyNewLegendClass() # just change it +c.legend.swatchRadius = 5 # set a property only relevant to the new one +c.data = [10,20,30] # and then configure as usual... +""") + +disc("""...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("""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("Multiples ") +disc("""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("""(If you want to see the image, it is available on our website at +http://www.reportlab.com/demos/provencio.pdf)""") + + +##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 + 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 + 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, + 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 + properties.""") + + +heading2("Labels") + +disc(""" +A label is a string of text attached to some chart element. +They are used on axes, for titles or alongside axes, or attached +to individual data points. +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 + its position relative to this origin and all of its formatting.""") + +eg(""" +from reportlab.graphics import shapes +from reportlab.graphics.charts.textlabels import Label + +d = Drawing(200, 100) + +# mark the origin of the label +d.add(Circle(100,90, 5, fillColor=colors.green)) + +lab = Label() +lab.setOrigin(100,90) +lab.boxAnchor = 'ne' +lab.angle = 45 +lab.dx = 0 +lab.dy = -20 +lab.boxStrokeColor = colors.green +lab.setText('Some\nMulti-Line\nLabel') + +d.add(lab) +""") + + +from reportlab.graphics import shapes +from reportlab.graphics.charts.textlabels import Label + +d = Drawing(200, 100) + +# mark the origin of the label +d.add(Circle(100,90, 5, fillColor=colors.green)) + +lab = Label() +lab.setOrigin(100,90) +lab.boxAnchor = 'ne' +lab.angle = 45 +lab.dx = 0 +lab.dy = -20 +lab.boxStrokeColor = colors.green +lab.setText('Some\nMulti-Line\nLabel') + +d.add(lab) + +draw(d, 'Label example') + + + +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 +the origin, and be rotated by 45 degrees about that corner. +""") + +disc(""" +At present labels have the following properties, which we believe are +sufficient for all charts we have seen to date: +""") + +disc("") + +data=[["Property", "Meaning"], + ["dx", """The label's x displacement."""], + ["dy", """The label's y displacement."""], + ["angle", """The angle of rotation (counterclockwise) applied to the label."""], + ["boxAnchor", "The label's box anchor, one of 'n', 'e', 'w', 's', 'ne', 'nw', 'se', 'sw'."], + ["textAnchor", """The place where to anchor the label's text, one of 'start', 'middle', 'end'."""], + ["boxFillColor", """The fill color used in the label's box."""], + ["boxStrokeColor", "The stroke color used in the label's box."], + ["boxStrokeWidth", """The line width of the label's box."""], + ["fontName", """The label's font name."""], + ["fontSize", """The label's font size."""], + ["leading", """The leading value of the label's text lines."""], + ["x", """The X-coordinate of the reference point."""], + ["y", """The Y-coordinate of the reference point."""], + ["width", """The label's width."""], + ["height", """The label's height."""] + ] +t=Table(data, colWidths=(100,330)) +t.setStyle(TableStyle([ + ('FONT',(0,0),(-1,0),'Times-Bold',10,12), + ('FONT',(0,1),(0,-1),'Courier',8,8), + ('FONT',(1,1),(1,-1),'Times-Roman',10,12), + ('VALIGN',(0,0),(-1,-1),'MIDDLE'), + ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), + ('BOX', (0,0), (-1,-1), 0.25, colors.black), + ])) +getStory().append(t) +caption("""Table - Label properties""") + +disc(""" +To see many more examples of $Label$ objects with different +combinations of properties, please have a look into the +ReportLab test suite in the folder $reportlab/test$, run the +script $test_charts_textlabels.py$ and look at the PDF document +it generates! +""") + + + +heading2("Axes") + +disc(""" +We identify two basic kinds of axes - Value and Category +ones. +Both come in horizontal and vertical flavors. +Both can be subclassed to make very specific kinds of axis. +For example, if you have complex rules for which dates to display +in a time series application, or want irregular scaling, you override +the axis and make a new one. +""") + +disc(""" +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 +directly without reference to any chart: +""") + + +from reportlab.graphics import shapes +from reportlab.graphics.charts.axes import XCategoryAxis,YValueAxis + +drawing = Drawing(400, 200) + +data = [(10, 20, 30, 40), (15, 22, 37, 42)] + +xAxis = XCategoryAxis() +xAxis.setPosition(75, 75, 300) +xAxis.configure(data) +xAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni'] +xAxis.labels.boxAnchor = 'n' +xAxis.labels[3].dy = -15 +xAxis.labels[3].angle = 30 +xAxis.labels[3].fontName = 'Times-Bold' + +yAxis = YValueAxis() +yAxis.setPosition(50, 50, 125) +yAxis.configure(data) + +drawing.add(xAxis) +drawing.add(yAxis) + +draw(drawing, 'Two isolated axes') + + +disc("Here is the code that created them: ") + +eg(""" +from reportlab.graphics import shapes +from reportlab.graphics.charts.axes import XCategoryAxis,YValueAxis + +drawing = Drawing(400, 200) + +data = [(10, 20, 30, 40), (15, 22, 37, 42)] + +xAxis = XCategoryAxis() +xAxis.setPosition(75, 75, 300) +xAxis.configure(data) +xAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni'] +xAxis.labels.boxAnchor = 'n' +xAxis.labels[3].dy = -15 +xAxis.labels[3].angle = 30 +xAxis.labels[3].fontName = 'Times-Bold' + +yAxis = YValueAxis() +yAxis.setPosition(50, 50, 125) +yAxis.configure(data) + +drawing.add(xAxis) +drawing.add(yAxis) +""") + +disc(""" +Remember that, usually, you won't have to create axes directly; +when using a standard chart, it comes with ready-made axes. +The methods are what the chart uses to configure it and take care +of the geometry. +However, we will talk through them in detail below. +The orthogonally dual axes to those we describe have essentially +the same properties, except for those refering to ticks. +""") + + +heading3("XCategoryAxis class") + +disc(""" +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 +$setPosition(x, y, length)$. +The next stage is to show it the data so that it can configure +itself. +This is easy for a category axis - it just counts the number of +data points in one of the data series. The $reversed$ attribute (if 1) +indicates that the categories should be reversed. +When the drawing is drawn, the axis can provide some help to the +chart with its $scale()$ method, which tells the chart where +a given category begins and ends on the page. +We have not yet seen any need to let people override the widths +or positions of categories. +""") + +disc("An XCategoryAxis has the following editable properties:") + +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 +they manage the scaling of points."""], + ["strokeColor", "Color of the axis"], + ["strokeDashArray", """Whether to draw axis with a dash and, if so, what kind. +Defaults to None"""], + ["strokeWidth", "Width of axis in points"], + ["tickUp", """How far above the axis should the tick marks protrude? +(Note that making this equal to chart height gives you a gridline)"""], + ["tickDown", """How far below the axis should the tick mark protrude?"""], + ["categoryNames", """Either None, or a list of strings. This should have the +same length as each data series."""], + ["labels", """A collection of labels for the tick marks. By default the 'north' +of each text label (i.e top centre) is positioned 5 points down +from the centre of each category on the axis. You may redefine +any property of the whole label group or of any one label. If +categoryNames=None, no labels are drawn."""], + ["title", """Not Implemented Yet. This needs to be like a label, but also +lets you set the text directly. It would have a default +location below the axis."""]] +t=Table(data, colWidths=(100,330)) +t.setStyle(TableStyle([ + ('FONT',(0,0),(-1,0),'Times-Bold',10,12), + ('FONT',(0,1),(0,-1),'Courier',8,8), + ('FONT',(1,1),(1,-1),'Times-Roman',10,12), + ('VALIGN',(0,0),(-1,-1),'MIDDLE'), + ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), + ('BOX', (0,0), (-1,-1), 0.25, colors.black), + ])) +getStory().append(t) +caption("""Table - XCategoryAxis properties""") + + +heading3("YValueAxis") + +disc(""" +The left axis in the diagram is a YValueAxis. +A Value Axis differs from a Category Axis in that each point along +its length corresponds to a y value in chart space. +It is the job of the axis to configure itself, and to convert Y values +from chart space to points on demand to assist the parent chart in +plotting. +""") + +disc(""" +$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 +values. +Once configured, the value axis can convert y data values to drawing +space with the $scale()$ method. +Thus: +""") + +eg(""" +>>> yAxis = YValueAxis() +>>> yAxis.setPosition(50, 50, 125) +>>> data = [(10, 20, 30, 40),(15, 22, 37, 42)] +>>> yAxis.configure(data) +>>> yAxis.scale(10) # should be bottom of chart +50.0 +>>> yAxis.scale(40) # should be near the top +167.1875 +>>> +""") + +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 +they manage the scaling of points."""], + ["strokeColor", "Color of the axis"], + ["strokeDashArray", """Whether to draw axis with a dash and, if so, what kind. +Defaults to None"""], + ["strokeWidth", "Width of axis in points"], + ["tickLeft", """How far to the left of the axis should the tick marks protrude? +(Note that making this equal to chart height gives you a gridline)"""], + ["tickRight", """How far to the right of the axis should the tick mark protrude?"""], + + ["valueMin", """The y value to which the bottom of the axis should correspond. +Default value is None in which case the axis sets it to the lowest +actual data point (e.g. 10 in the example above). It is common to set +this to zero to avoid misleading the eye."""], + ["valueMax", """The y value to which the top of the axis should correspond. +Default value is None in which case the axis sets it to the highest +actual data point (e.g. 42 in the example above). It is common to set +this to a 'round number' so data bars do not quite reach the top."""], + ["valueStep", """The y change between tick intervals. By default this is +None, and the chart tries to pick 'nice round numbers' which are +just wider than the minimumTickSpacing below."""], + + ["valueSteps", """A list of numbers at which to place ticks."""], + + ["minimumTickSpacing", """This is used when valueStep is set to None, and ignored +otherwise. The designer specified that tick marks should be no +closer than X points apart (based, presumably, on considerations +of the label font size and angle). The chart tries values of the +type 1,2,5,10,20,50,100... (going down below 1 if necessary) until +it finds an interval which is greater than the desired spacing, and +uses this for the step."""], + ["labelTextFormat", """This determines what goes in the labels. Unlike a category +axis which accepts fixed strings, the labels on a ValueAxis are +supposed to be numbers. You may provide either a 'format string' +like '%0.2f' (show two decimal places), or an arbitrary function +which accepts a number and returns a string. One use for the +latter is to convert a timestamp to a readable year-month-day +format."""], + ["title", """Not Implemented Yet. This needs to be like a label, but also +lets you set the text directly. It would have a default +location below the axis."""]] +t=Table(data, colWidths=(100,330)) +t.setStyle(TableStyle([ + ('FONT',(0,0),(-1,0),'Times-Bold',10,12), + ('FONT',(0,1),(0,-1),'Courier',8,8), + ('FONT',(1,1),(1,-1),'Times-Roman',10,12), + ('VALIGN',(0,0),(-1,-1),'MIDDLE'), + ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), + ('BOX', (0,0), (-1,-1), 0.25, colors.black), + ])) +getStory().append(t) +caption("""Table - 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 +classes. +The following code show how to create a simple $XValueAxis$ with special +tick intervals. Make sure to set the $valueSteps$ attribute before calling +the configure method! +""") + +eg(""" +from reportlab.graphics.shapes import Drawing +from reportlab.graphics.charts.axes import XValueAxis + +drawing = Drawing(400, 100) + +data = [(10, 20, 30, 40)] + +xAxis = XValueAxis() +xAxis.setPosition(75, 50, 300) +xAxis.valueSteps = [10, 15, 20, 30, 35, 40] +xAxis.configure(data) +xAxis.labels.boxAnchor = 'n' + +drawing.add(xAxis) +""") + + +from reportlab.graphics import shapes +from reportlab.graphics.charts.axes import XValueAxis + +drawing = Drawing(400, 100) + +data = [(10, 20, 30, 40)] + +xAxis = XValueAxis() +xAxis.setPosition(75, 50, 300) +xAxis.valueSteps = [10, 15, 20, 30, 35, 40] +xAxis.configure(data) +xAxis.labels.boxAnchor = 'n' + +drawing.add(xAxis) + +draw(drawing, 'An axis with non-equidistant tick marks') + + +disc(""" +In addition to these properties, all axes classes have three +properties describing how to join two of them to each other. +Again, this is interesting only if you define your own charts +or want to modify the appearance of an existing chart using +such axes. +These properties are listed here only very briefly for now, +but you can find a host of sample functions in the module +$reportlab/graphics/axes.py$ which you can examine... +""") + +disc(""" +One axis is joined to another, by calling the method +$joinToAxis(otherAxis, mode, pos)$ on the first axis, +with $mode$ and $pos$ being the properties described by +$joinAxisMode$ and $joinAxisPos$, respectively. +$'points'$ means to use an absolute value, and $'value'$ +to use a relative value (both indicated by the the +$joinAxisPos$ property) along the axis. +""") + +disc("") + +data=[["Property", "Meaning"], + ["joinAxis", """Join both axes if true."""], + ["joinAxisMode", """Mode used for connecting axis ('bottom', 'top', 'left', 'right', 'value', 'points', None)."""], + ["joinAxisPos", """Position at which to join with other axis."""], + ] +t=Table(data, colWidths=(100,330)) +t.setStyle(TableStyle([ + ('FONT',(0,0),(-1,0),'Times-Bold',10,12), + ('FONT',(0,1),(0,-1),'Courier',8,8), + ('FONT',(1,1),(1,-1),'Times-Roman',10,12), + ('VALIGN',(0,0),(-1,-1),'MIDDLE'), + ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), + ('BOX', (0,0), (-1,-1), 0.25, colors.black), + ])) +getStory().append(t) +caption("""Table - Axes joining properties""") + + +heading2("Bar Charts") + +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 +far from final. +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 +are vertical. +""") + +disc(""" +As usual, we will start with an example: +""") + +from reportlab.graphics.shapes import Drawing +from reportlab.graphics.charts.barcharts import VerticalBarChart + +drawing = Drawing(400, 200) + +data = [ + (13, 5, 20, 22, 37, 45, 19, 4), + (14, 6, 21, 23, 38, 46, 20, 5) + ] + +bc = VerticalBarChart() +bc.x = 50 +bc.y = 50 +bc.height = 125 +bc.width = 300 +bc.data = data +bc.strokeColor = colors.black + +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 +bc.categoryAxis.labels.angle = 30 +bc.categoryAxis.categoryNames = ['Jan-99','Feb-99','Mar-99', + 'Apr-99','May-99','Jun-99','Jul-99','Aug-99'] + +drawing.add(bc) + +draw(drawing, 'Simple bar chart with two data series') + + +eg(""" + # code to produce the above chart + + from reportlab.graphics.shapes import Drawing + from reportlab.graphics.charts.barcharts import VerticalBarChart + + drawing = Drawing(400, 200) + + data = [ + (13, 5, 20, 22, 37, 45, 19, 4), + (14, 6, 21, 23, 38, 46, 20, 5) + ] + + bc = VerticalBarChart() + bc.x = 50 + bc.y = 50 + bc.height = 125 + bc.width = 300 + bc.data = data + bc.strokeColor = colors.black + + 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 + bc.categoryAxis.labels.angle = 30 + bc.categoryAxis.categoryNames = ['Jan-99','Feb-99','Mar-99', + 'Apr-99','May-99','Jun-99','Jul-99','Aug-99'] + + drawing.add(bc) +""") + +disc(""" +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: +""") + +disc("") + +data=[["Property", "Meaning"], + ["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. They are positioned automatically +above the bar for positive values and below for negative ones."""], + ["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 category axis, which may be formatted as described +previously."""], + + ["title", """Not Implemented Yet. This needs to be like a label, but also +lets you set the text directly. It would have a default +location below the axis."""]] +t=Table(data, colWidths=(100,330)) +t.setStyle(TableStyle([ + ('FONT',(0,0),(-1,0),'Times-Bold',10,12), + ('FONT',(0,1),(0,-1),'Courier',8,8), + ('FONT',(1,1),(1,-1),'Times-Roman',10,12), + ('VALIGN',(0,0),(-1,-1),'MIDDLE'), + ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), + ('BOX', (0,0), (-1,-1), 0.25, colors.black), + ])) +getStory().append(t) +caption("""Table - VerticalBarChart properties""") + + +disc(""" +From this table we deduce that adding the following lines to our code +above should double the spacing between bar groups (the $groupSpacing$ +attribute has a default value of five points) and we should also see +some tiny space between bars of the same group ($barSpacing$). +""") + +eg(""" + bc.groupSpacing = 10 + bc.barSpacing = 2.5 +""") + +disc(""" +And, in fact, this is exactly what we can see after adding these +lines to the code above. +Notice how the width of the individual bars has changed as well. +This is because the space added between the bars has to be 'taken' +from somewhere as the total chart width stays unchanged. +""") + +from reportlab.graphics.shapes import Drawing +from reportlab.graphics.charts.barcharts import VerticalBarChart + +drawing = Drawing(400, 200) + +data = [ + (13, 5, 20, 22, 37, 45, 19, 4), + (14, 6, 21, 23, 38, 46, 20, 5) + ] + +bc = VerticalBarChart() +bc.x = 50 +bc.y = 50 +bc.height = 125 +bc.width = 300 +bc.data = data +bc.strokeColor = colors.black + +bc.groupSpacing = 10 +bc.barSpacing = 2.5 + +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 +bc.categoryAxis.labels.angle = 30 +bc.categoryAxis.categoryNames = ['Jan-99','Feb-99','Mar-99', + 'Apr-99','May-99','Jun-99','Jul-99','Aug-99'] + +drawing.add(bc) + +draw(drawing, 'Like before, but with modified spacing') + +disc(""" +Bars labels are automatically displayed for negative values +below the lower end of the bar for positive values +above the upper end of the other ones. +""") + + +##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. +##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. + + +heading2("Line Charts") + +disc(""" +We consider "Line Charts" to be essentially the same as +"Bar Charts", but with lines instead of bars. +Both share the same pair of Category/Value axes pairs. +This is in contrast to "Line Plots", where both axes are +Value axes. +""") + +disc(""" +The following code and its output shall serve as a simple +example. +More explanation will follow. +For the time being you can also study the output of running +the tool $reportlab/lib/graphdocpy.py$ withough any arguments +and search the generated PDF document for examples of +Line Charts. +""") + +eg(""" +from reportlab.graphics.charts.linecharts import HorizontalLineChart + +drawing = Drawing(400, 200) + +data = [ + (13, 5, 20, 22, 37, 45, 19, 4), + (5, 20, 46, 38, 23, 21, 6, 14) +] + +lc = HorizontalLineChart() +lc.x = 50 +lc.y = 50 +lc.height = 125 +lc.width = 300 +lc.data = data +lc.joinedLines = 1 +catNames = string.split('Jan Feb Mar Apr May Jun Jul Aug', ' ') +lc.categoryAxis.categoryNames = catNames +lc.categoryAxis.labels.boxAnchor = 'n' +lc.valueAxis.valueMin = 0 +lc.valueAxis.valueMax = 60 +lc.valueAxis.valueStep = 15 +lc.lines[0].strokeWidth = 2 +lc.lines[1].strokeWidth = 1.5 +drawing.add(lc) +""") + +from reportlab.graphics.charts.linecharts import HorizontalLineChart + +drawing = Drawing(400, 200) + +data = [ + (13, 5, 20, 22, 37, 45, 19, 4), + (5, 20, 46, 38, 23, 21, 6, 14) +] + +lc = HorizontalLineChart() +lc.x = 50 +lc.y = 50 +lc.height = 125 +lc.width = 300 +lc.data = data +lc.joinedLines = 1 +catNames = string.split('Jan Feb Mar Apr May Jun Jul Aug', ' ') +lc.categoryAxis.categoryNames = catNames +lc.categoryAxis.labels.boxAnchor = 'n' +lc.valueAxis.valueMin = 0 +lc.valueAxis.valueMax = 60 +lc.valueAxis.valueStep = 15 +lc.lines[0].strokeWidth = 2 +lc.lines[1].strokeWidth = 1.5 +drawing.add(lc) + +draw(drawing, 'HorizontalLineChart sample') + + +disc("") +todo("Add properties table.") + + +heading2("Line Plots") + +disc(""" +Below we show a more complex example of a Line Plot that +also uses some experimental features like line markers +placed at each data point. +""") + +eg(""" +from reportlab.graphics.charts.lineplots import LinePlot +from reportlab.graphics.widgets.markers import makeMarker + +drawing = Drawing(400, 200) + +data = [ + ((1,1), (2,2), (2.5,1), (3,3), (4,5)), + ((1,2), (2,3), (2.5,2), (3.5,5), (4,6)) +] + +lp = LinePlot() +lp.x = 50 +lp.y = 50 +lp.height = 125 +lp.width = 300 +lp.data = data +lp.joinedLines = 1 +lp.lines[0].symbol = makeMarker('FilledCircle') +lp.lines[1].symbol = makeMarker('Circle') +lp.lineLabelFormat = '%2.0f' +lp.strokeColor = colors.black +lp.xValueAxis.valueMin = 0 +lp.xValueAxis.valueMax = 5 +lp.xValueAxis.valueSteps = [1, 2, 2.5, 3, 4, 5] +lp.xValueAxis.labelTextFormat = '%2.1f' +lp.yValueAxis.valueMin = 0 +lp.yValueAxis.valueMax = 7 +lp.yValueAxis.valueSteps = [1, 2, 3, 5, 6] + +drawing.add(lp) +""") + + +from reportlab.graphics.charts.lineplots import LinePlot +from reportlab.graphics.widgets.markers import makeMarker + +drawing = Drawing(400, 200) + +data = [ + ((1,1), (2,2), (2.5,1), (3,3), (4,5)), + ((1,2), (2,3), (2.5,2), (3.5,5), (4,6)) +] + +lp = LinePlot() +lp.x = 50 +lp.y = 50 +lp.height = 125 +lp.width = 300 +lp.data = data +lp.joinedLines = 1 +lp.lines[0].symbol = makeMarker('FilledCircle') +lp.lines[1].symbol = makeMarker('Circle') +lp.lineLabelFormat = '%2.0f' +lp.strokeColor = colors.black +lp.xValueAxis.valueMin = 0 +lp.xValueAxis.valueMax = 5 +lp.xValueAxis.valueSteps = [1, 2, 2.5, 3, 4, 5] +lp.xValueAxis.labelTextFormat = '%2.1f' +lp.yValueAxis.valueMin = 0 +lp.yValueAxis.valueMax = 7 +lp.yValueAxis.valueSteps = [1, 2, 3, 5, 6] + +drawing.add(lp) + +draw(drawing, 'LinePlot sample') + + + +disc("") +todo("Add properties table.") + + + +heading2("Pie Charts") + +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. +For completeness we will cover it here. +""") + +eg(""" +from reportlab.graphics.charts.piecharts import Pie + +d = Drawing(200, 100) + +pc = Pie() +pc.x = 65 +pc.y = 15 +pc.width = 70 +pc.height = 70 +pc.data = [10,20,30,40,50,60] +pc.labels = ['a','b','c','d','e','f'] + +pc.slices.strokeWidth=0.5 +pc.slices[3].popout = 10 +pc.slices[3].strokeWidth = 2 +pc.slices[3].strokeDashArray = [2,2] +pc.slices[3].labelRadius = 1.75 +pc.slices[3].fontColor = colors.red + +d.add(pc) +""") + +from reportlab.graphics.charts.piecharts import Pie + +d = Drawing(200, 100) + +pc = Pie() +pc.x = 65 +pc.y = 15 +pc.width = 70 +pc.height = 70 +pc.data = [10,20,30,40,50,60] +pc.labels = ['a','b','c','d','e','f'] + +pc.slices.strokeWidth=0.5 +pc.slices[3].popout = 10 +pc.slices[3].strokeWidth = 2 +pc.slices[3].strokeDashArray = [2,2] +pc.slices[3].labelRadius = 1.75 +pc.slices[3].fontColor = colors.red + +d.add(pc) + +draw(d, 'A bare bones pie chart') + +disc(""" +Properties are covered below. +The pie has a 'wedges' collection and we document wedge properties +in the same table. +This was invented before we finished the $Label$ class and will +probably be reworked to use such labels shortly. +""") + +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 +##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.fontSize +##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 +##will keep this to specify their anchor point) +## + + +heading2("Legends") + +disc(""" +Various preliminary legend classes can be found but need a +cleanup to be consistent with the rest of the charting +model. +Legends are the natural place to specify the colors and line +styles of charts; we propose that each chart is created with +a $legend$ attribute which is invisible. +One would then do the following to specify colors: +""") + +eg(""" +myChart.legend.defaultColors = [red, green, blue] +""") + +disc(""" +One could also define a group of charts sharing the same legend: +""") + +eg(""" +myLegend = Legend() +myLegend.defaultColor = [red, green.....] #yuck! +myLegend.columns = 2 +# etc. +chart1.legend = myLegend +chart2.legend = myLegend +chart3.legend = myLegend +""") + +# Hack to force a new paragraph before the todo() :-( +disc("") + +todo("""Does this work? Is it an acceptable complication over specifying chart +colors directly?""") + + + +heading2("Remaining Issues") + +disc(""" +There are several issues that are almost solved, but for which +is is a bit too early to start making them really public. +Nevertheless, here is a list of things that are under way: +""") + +list(""" +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 +the same list of colors. +Most likely, this will be replaced with a scheme to specify a kind +of legend containing attributes with different values for each data +series. +This legend can then also be shared by several charts, but need not +be visible itself. +""") + +list(""" +Additional chart types - when the current design will have become +more stable, we expect to add variants of bar charts to deal with stacked +and percentile bars as well as the side-by-side variant seen here. +""") + + +heading2("Outlook") + +disc(""" +It will take some time to deal with the full range of chart types. +We expect to finalize bars and pies first and to produce trial +implementations of more general plots, thereafter. +""") + + +heading3("X-Y Plots") + +disc(""" +Most other plots involve two value axes and directly plotting +x-y data in some form. +The series can be plotted as lines, marker symbols, both, or +custom graphics such as open-high-low-close graphics. +All share the concepts of scaling and axis/title formatting. +At a certain point, a routine will loop over the data series and +'do something' with the data points at given x-y locations. +Given a basic line plot, it should be very easy to derive a +custom chart type just by overriding a single method - say, +$drawSeries()$. +""") + + +heading3("Marker customisation and custom shapes") + +disc(""" +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. +""") + + +heading4("Combination plots") + +disc(""" +Combining multiple plot types is really easy. +You can just draw several charts (bar, line or whatever) in +the same rectangle, suppressing axes as needed. +So a chart could correlate a line with Scottish typhoid cases +over a 15 year period on the left axis with a set of bars showing +inflation rates on the right axis. +If anyone can remind us where this example came from we'll +attribute it, and happily show the well-known graph as an +example. +""") + + +heading3("Interactive editors") + +disc(""" +One principle of the Graphics package is to make all 'interesting' +properties of its graphic components accessible and changeable by +setting apropriate values of corresponding public attributes. +This makes it very tempting to build a tool like a GUI editor that +that helps you with doing that interactively. +""") + +disc(""" +ReportLab has built such a tool using the Tkinter toolkit that +loads pure Python code describing a drawing and records your +property editing operations. +This "change history" is then used to create code for a subclass +of that chart, say, that can be saved and used instantly just +like any other chart or as a new starting point for another +interactive editing session. +""") + +disc(""" +This is still work in progress, though, and the conditions for +releasing this need to be further elaborated. +""") + + +heading3("Misc.") + +disc(""" +This has not been an exhaustive look at all the chart classes. +Those classes are constantly being worked on. +To see exactly what is in the current distribution, use the +$graphdocpy.py$ utility. +By default, it will run on reportlab/graphics, and produce a full +report. +(If you want to run it on other modules or packages, +$graphdocpy.py -h$ prints a help message that will tell you +how.) +""") + +disc(""" +This is the tool that was mentioned in the section on 'Documenting +Widgets'. +""") \ No newline at end of file diff --git a/bin/reportlab/docs/graphguide/gengraphguide.py b/bin/reportlab/docs/graphguide/gengraphguide.py new file mode 100644 index 00000000000..541bbcedbac --- /dev/null +++ b/bin/reportlab/docs/graphguide/gengraphguide.py @@ -0,0 +1,59 @@ +#!/bin/env python +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/gengraphguide.py +__version__=''' $Id: gengraphguide.py 2385 2004-06-17 15:26:05Z rgbecker $ ''' +__doc__ = """ +This module contains the script for building the graphics guide. +""" +def run(pagesize=None, verbose=1, outDir=None): + import os + from reportlab.tools.docco.rl_doc_utils import setStory, getStory, RLDocTemplate, defaultPageSize + from reportlab.tools.docco import rl_doc_utils + from reportlab.lib.utils import open_and_read, _RL_DIR + if not outDir: outDir = os.path.join(_RL_DIR,'docs') + destfn = os.path.join(outDir,'graphguide.pdf') + doc = RLDocTemplate(destfn,pagesize = pagesize or defaultPageSize) + + #this builds the story + setStory() + G = {} + exec 'from reportlab.tools.docco.rl_doc_utils import *' in G, G + doc = RLDocTemplate(destfn,pagesize = pagesize or defaultPageSize) + for f in ( + 'ch1_intro', + 'ch2_concepts', + 'ch3_shapes', + 'ch4_widgets', + 'ch5_charts', + ): + exec open_and_read(f+'.py',mode='t') in G, G + del G + + story = getStory() + if verbose: print 'Built story contains %d flowables...' % len(story) + doc.build(story) + if verbose: print 'Saved "%s"' % destfn + +def makeSuite(): + "standard test harness support - run self as separate process" + from reportlab.test.utils import ScriptThatMakesFileTest + return ScriptThatMakesFileTest('../docs/graphguide', 'gengraphguide.py', 'graphguide.pdf') + +def main(): + import sys + verbose = '-s' not in sys.argv + if not verbose: sys.argv.remove('-s') + if len(sys.argv) > 1: + try: + pagesize = eval(sys.argv[1]) + except: + print 'Expected page size in argument 1', sys.argv[1] + raise + print 'set page size to',sys.argv[1] + else: + pagesize = None + run(pagesize,verbose) + +if __name__=="__main__": + main() diff --git a/bin/reportlab/docs/images/Edit_Prefs.gif b/bin/reportlab/docs/images/Edit_Prefs.gif new file mode 100644 index 00000000000..ebcfa34987d Binary files /dev/null and b/bin/reportlab/docs/images/Edit_Prefs.gif differ diff --git a/bin/reportlab/docs/images/Python_21.gif b/bin/reportlab/docs/images/Python_21.gif new file mode 100644 index 00000000000..1d6892e074f Binary files /dev/null and b/bin/reportlab/docs/images/Python_21.gif differ diff --git a/bin/reportlab/docs/images/Python_21_HINT.gif b/bin/reportlab/docs/images/Python_21_HINT.gif new file mode 100644 index 00000000000..967a14b6899 Binary files /dev/null and b/bin/reportlab/docs/images/Python_21_HINT.gif differ diff --git a/bin/reportlab/docs/images/fileExchange.gif b/bin/reportlab/docs/images/fileExchange.gif new file mode 100644 index 00000000000..bb5184a833d Binary files /dev/null and b/bin/reportlab/docs/images/fileExchange.gif differ diff --git a/bin/reportlab/docs/images/jpn.gif b/bin/reportlab/docs/images/jpn.gif new file mode 100644 index 00000000000..d1ecbf0f487 Binary files /dev/null and b/bin/reportlab/docs/images/jpn.gif differ diff --git a/bin/reportlab/docs/images/jpnchars.jpg b/bin/reportlab/docs/images/jpnchars.jpg new file mode 100644 index 00000000000..07c8ba6d276 Binary files /dev/null and b/bin/reportlab/docs/images/jpnchars.jpg differ diff --git a/bin/reportlab/docs/images/lj8100.jpg b/bin/reportlab/docs/images/lj8100.jpg new file mode 100644 index 00000000000..be3c6183d3b Binary files /dev/null and b/bin/reportlab/docs/images/lj8100.jpg differ diff --git a/bin/reportlab/docs/images/replogo.a85 b/bin/reportlab/docs/images/replogo.a85 new file mode 100644 index 00000000000..92653e977ec --- /dev/null +++ b/bin/reportlab/docs/images/replogo.a85 @@ -0,0 +1,439 @@ +BI +/W 283 /H 181 /BPC 8 /CS /RGB /F [/A85 /Fl] +ID +Gb"/lGEc',,kl8"&2NBd%Kaogum165&NYZBITmkcQDo:\lEnA +GJETphXmY&(BXdG&0O5g!!*-(#S8+DJ,fTO":,P]5_&h8!X&eu$f\(VI^5_q +jm)jbosgIBN01+GE&G/,0E`$J,.ogcq?_*e\?bYbO$E4*_M&A1cC@I!9Dd\' ++4?4QDr'3BbF=2qLTa,V3(b)tC;HhK!DHiEs= +#e!]_gC"9\WeUZ]%d_rZDm+pZHhMjerV*pJn(tTrkH8+&G'_fGA&n<1gUDI\ +)T%dl>;gEVr7uSSD=[2`\)2)Y\8d.Vp$:55>ISM;g9k_IXBE5_odUJ&4fhbj ++t4u*CCeUS/R,f.kn4Mb(GB+%B[KmgIC4%Q_Cr\%1,1M'_1Dj^kKfbZDr.!E +F(WairP]R[bk1DXB:hnj5(2_GWLnY9BgP/'PUTNpnM"tB`!I)(N#O]nba:,[ +7un]KC=L=e,=d\00l5LHTgOSF))>aLTKrYb%NI015l^i^qt9:L_$;(Sl-nh/ +pYP5l]D"DU][No_Y;b?do<#LYHN!Ng-V^$t+XoX`J[UDW6NstgiU^:#aXJYf +@T/-h#kbk9#UMApV<$^um2e#j'7`g:&J1#=2rAubQ**M!it6f3,*@pVZY%I6 +6o/H!J4.k`9lkR_-;U4ln3a&Bj2[3$3u/IFT]*eDlR2scpu.!iLu\C$^CPtn +H@SNS^AI?QDnk,W"$D00h*&FIlDn4&G3't(Uo5[]m!,=p/AQ+U,=dd\o,oLh +`[7$Kifm(afHdLC\5iol9&c'@AXlrl+e2TcVCt*"D43P1/tBd4IK''*Z:Y1g +&tsE#;eD`AXDo:8;HP?kPAJ]<++5EP`)3&A0_Gc=bj+0GNAo^=jcrnRI.>2- +?@.[$o*RI.f9aJ`&3E/CRVaf0!I//;.6.N@dhWJ":#_Dm4P7SLk/f_K3$fY" +@lB&>=ZT!#RpKMq"Z6@j)ODfZ2)o?9+0oW[2)q0V"P +i5SJT2Aq@18&2N,MORue((.$!o41l.*at,LGSoZG'&i)k+_>o\;RS\8iUnSbf.@["h4W^daDC< +[+g5DH18l\"e-&NZV?P&#\?tUg#Q>8N;^H/+c'&47a2<,ZndtDk/m0)o'Y9I +"Af)p(^a#(U5qJ$"NO<.;GoitP^.[:Han@R-"EJk':6\TnrLq,.c]R(i1M-HV6>$DWiJnWu`pbXf8^#tsp$Blf[o2f0&&E8Fj;UkH;2KPeTN'9<-` +_E>O(dS$eNYO@/]?Jm>IbNhuC)(3i7QGjt[o_n[]],>Y46C;2%ZOfU,n6RL6 +pQXGh.Ts48AWn&r=TE#APblWI!jfTH5qs'iZ7I([Rcm#)4]s3/IWG@.!hl8% +k"5Ai2hk31"fITC&?Wl%R3r7DZT<9r#jE`;DgM?VnOPTHJ6NEF=DX0oV=;jR +N"ee-'gN(,,1IMA,*\r!P!#ZJb/Yi%P$?h-bS)ApoF1$2S`.D2UXU#ifa/5t +gE^EM\-Jt.FMpZj7&UVY^aA_J@B/D`\QM+D5?Y%:r8SkQX)mILmG#,5Qa$@m +8\`%IN+JM>F2lkn-6bE9+'C"P4$:%88J]Hko.1njrgkG16n$[KbII#_p%Qu7 +AE+ku0`TXT)a,W-TbqN<#jU93V[&HNckm'+eCt(+$2Wka!3/NpDgDtsPjuY! +&Osl;iABPJ;B\[/"UG*'SNM&U8$BW">.&+qW`H6*^OH,o4LAeL +6:XCa%o6PiB$Hd`4)!?TBp0l=C<`"Pp/ +m\$/,\foSn:tn@>>.&+rXN:c=IYfebFG+3NbiMdW>Wh$%Tb9lJ,Z=l?0N&Gh +%hOq[K8PLeJg*I1A&jUDW1GZEB0I@H?K&bTn$qD<]C*82Gk'c!.Um,ORPB1S +X.(7fr^"6`JoT&6a&>eUf-b?fn#),:EYL950ZtXh\U7\pG(iO\9lOq# +XrZT?%Us\o*&sSo7H!XR3"?ul#`4f!Zb])99lfrHjSo#-^]+6,^OPUTa&(g] +,XjL"\_WnqMA+tu)_%J0.!LUQk"/iU(.j?`YBf'ePuh98R"@p`^A)0l[V`R2 +gPKuukg6#2UgK&_!SG#.Y9G=NE!Qjc;%hIeB-:05)Dr'p+snP*bJ%1&i@((p'?IgAp1[a)GE\GTFH2IL`l^S2o(A6m?6E<2l$L +;Y'R(,(@?ZKiF0"q<+@tT&PK,F%g#(oSZil5CQj_]O[q`Br_?MX^AjBUQ7T" +@`4'cHhKk=]U=,@T<#7>mE&],fEsJ/^mkC9$&OG7q&6HTG\$(lqac@H(VP3,j+0.uF2VMDhWa371^%^Af^3o`WX]fl=THUV8 +;J-N15UCZnZ$lNCS@!1iRd72#ac[r!.4H&c>e#3_/&6:Xk!k\T$ULAU46i)h +KH%IBj[)gcEr,Fm8/F9"JG-bqWJ=P0'Sa_a8O+\a'e<<9=gB:gLMs_TH*TS32)&7f!:AMCG&[J)1AofJl$\;g^ZSq!^Cknt;Dc +rq^D)=Ld1@AECt!d)V]q@7Ekg^RdT8Q7,V)DV_mO20\KDKS0K@4tMr8-me_+ +6ALSS;34Fo$;PSrC"&qrfWZNdMAT:eiJ/N9h/.>n:)McoCDR=g&EbB?cmQGOOBGCXu1L3)ObU2-@^S6cq05 +nc5;/mQ%?`p.hBGdaHQ]G81hMC-X9k5CORVD$e$*2eaH?-X<`[^HO@dZM4=l +hab9!R=Or%o^Ut^'0p7ELITD^<^"+ +Y!l5XU?A.u?="`9krB9aJ"#6+F6Cj4:db>5(9+:4@Z;6SRum`F3IA4r#nnWs&Oa4CR=Gqu:(/!q"AuW/k>2KVoY(R4ecMKT7N&8fNoIBR'&aTu +_%a8nlP$gt1hjg.A&aJ$sW.\U= +KOa]?e`5]MM*PY*DnCl6E32BB-7:0ra%\H4"(mN22(EhnjW*?28pfK@J`[[!MH!B8[HQK"!jf +o&R]D%nHJm"5FeBE%?@jo3S$g"8jar0l.N@RCY?!>0pJlFiV":, +&g1[(4*Jhq4I[qd=t#2]@%_3GZgHMV8%Q>l$=k!K4DE4hF[E))8cGMmOmSJk?qlY!GSG +'_ngSBXGW%WF4CmbBfH-3VQK-:?/N?Na1r%YB8a/6fP63Waj9$Pl!n ++l7j>8A\fLp2K7U;6T>E8cDG6!4WXc7"?Hb4Wk7fh,^l +Gu-2k?3!Y7cm+Skj[`5QE>n)0T9M@!8U^1;abaC7_SidkoJoUefH/9?E +m[7^Z+i%f8.H9CJ_lri9)WY8p75:$OAAe5ELDN`>?bUp7P;"RLL(age=oA'T +O+^%JPcaC(_^&i&\OMW$?*I^&jCHZ47FAA,!\WBYV+\4^X;sfD#_(f_`)u%D +ioZYkE\3NqppFke.Pj4>CKh1_F!5H&-r[]0L18NU;5m^/LH4?c?Q`Oc+.f> +e'lc1r:!(0,K&T&5#R9!O*0a;.9*5W'_;b]%M6T=E8Z8c8n+!r1V8tF-R:'I ++$4X^F::4AG[id#s#kMi'IFbKBbr[3@`!p_(!L,Yf9&7*"3cmV!eZ2bigph@OdFSrfZ>_)pa+!F0[?c:Jha3e$ +Wb9YLH1U1ceu]n+M;lM9Y4]K4f5O5c]&>)%37YT_leK$l5PsfR1M=uAFuG9k +S2bN*&eV9`ZAkZR>FRNf$5=o8Vb`p:>IHrQH3h7\I94<8qod?[6Y2su'8LFG +A#!QR2/8@+="a7_215o7IMTF;cpp)Z910VdA>cG-X&c)k)<>H!hS%ARq=Ku>CCY/RHP>@o_)Usb^#_d/YQ.l\.UBW-ac[tIp$9)0ldcnS +7'Q`g\Mef2ib4WcY?R`Dh*LdI@Sfe +'.EM&=(sh7GC/YXT4glkDrBMHTQ5bpueo<4-Jk7ZJI6i4snO\K1c? +oYqhgpuXipp4\#IjiWi=;P_CgDniu2oB(rc?XlqA[q3$bf`Gq?"eh]Y"fM.j +l)109b*/G:ZL[;4B'K.OcM)%!,a1qTu2iPK0LQMp$BO&AkR +/d?ud!>#gE>IRAG0akrjfr;0hqML2`"qA_A0-B`WJcuO6Y"?Od\T>#Gm\6$d +cGr?W:`VT=aI+hsh7@aLN>lMG0*e#)8m"T5H@!.X'&cYVJo?#.k^fU"@(uX: +lQ?`MW4E9K-9rP&dNX0:*P9Hb5c^2&>@u-K(!AdN`f,_TFEH?aGskaV*NJ8_ +acl#'21JE1amp(+#hr=aABE]AHY^aP8/M(<`0K13r&T_6?b_'DD+tcQ._2#c +o!)N7HFV*<4*ID<,IQUdD*b#^J?&%QJHP[iQI+[i9+RQQi,QW!3d'^eXBRT]Uk^G:S0iH +o&W5ZLp3V&4To+BADdNcV57$RIJ`_dl`IXBHI-,gm`DtYj)C0""m(6!\CCq3 +i@8gGr-=;eL(N$>3.:Y1m#fWIRhrr),tg)R[!1uqfWqG_nl-8MBbrl$iF5@C +NZC3iG3rI-+1#t+2O05B^=p>O^Up#Z`Q1X;6G,+9:,YQ +j,\EPgj,*AG8$(0Sj%Adh!*:cc^6EhkB;`8:HV=@30E-=bEaa7[r3X3;R5`7 +R58(f4aQaf0k3\3(kH$Q1^)QTJ3Rr+[Z,e(h7GW*].20N4aQaFrUndSGOM[u +BYh"Q0>-ekW)9=7_;s\Y7VGG1>&==R1G$g9n!4?>eAt*TB,# +jN'oV->hJDaXhe7gqRRPVJ16(:s-\.*_MYF;7q-n^;?q#m^_LoAV=2P?_iVp +:/O>E_@-qdlLW=ds5Jqi+OjX,MFZGE`PR+IS*G[1THSel[VQhbF8Yh'S)[bU +?b`1!;RQ`=.'j9,3I3Z'hRnge2s.e1kic&gZYpDE2fI9eC4`kuE;9[k[Vboc +1XGPBIYD+#'3"Ji%Yi\`6YP>h3IetT7EVpJR1Lnro[/!OO$uh@C\l>b5[ub)Ft?"Pa)^W6[TA$TKFo,u/Hu&4g%\!A:pA +@aL!>i[8[qI)UO2pANF:$>#.)cU3-+Sk@9YE8J?Zru=%>Zu=ini^MrU/8-`) +@XApFT'o-$9GJaQZY%HJK*GI;*3BO4ZtZqmKX/#1TiK-n*O,cBRP_iI7$Qa$S +X`VMIn3,=hshgs0.:8h45VC=NY[UjX;d +Y9?emeEPG[)`26$AA5J[JQ&jK!(([Qi.2,Rk0/Z'5S>9>3Urpn9UINUK*[0Z +JQ!QY!+i8H9"8C\;1=fB:]Bh+V.jiWkVW`,>B(2-I^H:gJB0&'oi +U-/,7f.U+%&2H_&*V!*/VLpfo',!ZHB.2C%':WAFd1Ff@e#!Qh,&/6=r8(^< +9P_X_W>;T\JH2aS!=Kb7^4oq*G#b_P*?Jqp*F(eL,uXuL0Me3Lc^qghiPK74 +c.e+T'5u[9ER^paY&0>IZ?V8%B_An@R4SHeQ!LW877>&l)_bY"TeV$BT).OQ +UN1Dj'dJWA&M>N929>m$:pk&g0k855HU^C4TqKE0@DfIiRd9+X6I>p`Ctc71 +JH?"J$,JCHi8"nb4S[K3Dn0Y;Bm3kM!=JUZBEe4m5-jMk,c)g-Nh:#!a +TBm94\@=MYf]Z&!2Vn9D)K=+oN#7,$L-\-'OA&e*V.""_0]12>](l\nEWS+- +!V#iM?@$>Ti5*>kmUcorgDi_D*20=L7ocQgOZu\A;Gb8,4RiQnYeL*mO7gY# +Uo(#(QYLA?BXCYS"e3#"]68&.Gu6peHGbIHBQ?`Jg.o7^/,=NGMi\'-Vrg00.2G^[*0]]nqE_tWNNF#2#%!mQAY;hhPea$M1s=X-9,IC)KVG`]rlZUg+VY*tq7"U!Q2&mO*aKaGEocZE +]Cl%L@$"bLo%eNIaktPon)BIib4Tb=1+0:`C7k[:)jL$U\D+`-TjE!&"oQ'& +2/=BKiQZRfWmQ7;7j!0OcpJ?>`^cH?#P]'$2/CbOdBtC_ju54b4oQLU6L*JC +[>2LbOlZKjOcD/jjs_l/'qISlRH#Z,5oIkN><%87U<.'bmUKa.I)$K8V'c`s +NoN(q4OAK&K^7UQ`8NZ6a&k\fBQ?B^.FQM444Sn2m+ATAqtKDBr/p063-!r5 +++C^MCTmbPM8mpW)-=XmJP_A1I+Enb$ISZrRV[V_Kk +CY&:UGkEq!P@Wt!4H#ktE+[Y#hR:C[H0(pTP_,\,hisWP5?b[YE^epm9ZqHjCn:o4n`c3rk#fQt@#VkiF-;9f"(drO> +[%^q;)`G@hN]Z[?l`MF#MELR];lC'_N0OdW:QY+nFK&$!SQDVfPZr"3"KL^n=&,J$7"O) +nB_rmGCrD03[>6d=;3@+Bi)o3iU=E@omid3JT0lY%NO-9It*oDVt7XfUu7S% +g:"$dg@1X`U):lX-\3*Albe/?aU]@N^n$=$D;?o!.@[B=/0BA`Pq,qJG3sOs +2,/%eEG7CWrTpl:@P=>D^^6a\.o861[VXpiW.-oR.SX,"Nq>"L"H&'^:fQLS +$A@tXOt;+rVi4c+otUY?'J!4CVmL?tRZJBtOH651Q,7bhKL:J&J_IK%`9EVp +>\hroV:n05puA&8L[lY%eEG;T,pD7a@Y=/Hk.C)rRhnBTnOrdp)cInqjb?jr +"`="nM_?u%d"!)++sI^&L@cYor.Vmi5F84YAaF#S^sD'ja?9$MIR=TnofuW4 +%.fs&*orQ7l9R$QD_u%J'Q0aXKi*[K9_O"2k"WBWOgnU"X']H>1Z!eB5 +56lus/g"=c6h`m1 +>dD.s:7XFC$-3+XQYNU&X]d"]qLNFXFMnN-;5O]pYB9$WYXo5Z(+N:^@)7GJ +=3q;nMfud7RsXhD5gU:R(IlOQ29(9F.C]HXGt4)?6A89e23M;-eWm`X$Y6]a +'IrhH`ujJFl:f.U,I_QJ@nm;W'Urp[PIS`ZjbTYQ0f5h$f1p2<\5@tbLj_=A +@N5tuatEt@i7b`$G2ihK.TOaBnZ4@tIt86j0@Z%_No9>).lAj?=XW!gB2N0; +=kCaSKM^Vp085dlImFbC`G[`fa?%_+qF@][H0,un8XV;;>i@+&Uja`F.A\B@ ++iT:?"&5A9qIp(t]CAb3:1fu3%5CT2Ppl4\/+!NUStNmc[VXV0qXB^b/QuNu +["C8c,:?2J4Se'%>j(>_%8PID:tl*B>)aFXGer[qX)irH'U8lsd8A1(4_TcW +-^Jk[6m$qR%soug4o!rf]EK"u^a+A&Fj\R7kf`\thB:"g4NK"PN2P#fU6W/L +5IlenYmLp[/XUJXpBU+Oh9&0CRBf)l58i.;ml +r7mfGKeI>\gkHl8%7.[)lJ^jC`qsJk+.SLnW`?)8Q&iLGXbCu%h&rDIa(Z@> +QTPMA7_ZH=&[a'HldDV&[VXVn>kn5A01:1#:(pnf9@c]u8nC4 +FrOV33A)pZ':c7?l#7V\3lPn*o`"" +Fo80CW@o1/fL0R,9d01#gJQqZ!uJ4=K_];(%HnO3EE++`^\DB\NZGH:ab&&t +"ZEp,r'O>BF8hnRK4^qG/,MJ7UDW3-,SPr3]ioX^r'c[te#am)QCCt'7:"kb +@Zq.;IDPK4GTr0?U)p$YAK)=V$K@;q'g7t%)LEoDXcRhP!VaW#,t@_%+sF'T^p5)iE!d5o.IICs6m$qf +&o4/$lk/EjI%9-o@6q+rLje7!KddiG%CM7`#_T-XX_M:2`Dc&]&q,^8Z;rks +)#UQ!Ie2"U.h1+!(kX0HeS..?Y['G9R<`[BJ7qt4e5N9.\odU5h+Fmk +L$g(a,W;X#^2XiPSHT9NoLEdR`39suS$1>2+MPAEP"pB=0Gi$O."+K.+lmm\ +Qrh4Y)p5QHlXgpTG[sc/6?,EG&/_@a\$XQ'*]S^O>l;qNA8tm=BLSc>=s6Wh +C460/j0*h``GXkL_:O:KA6rX5il.T@V5!7@ +/R*u.c,AIRoFHs%Q)QgBo$u8#Xd!pJj(1j`MFXD(Gtf'ME9+H,l(*%TM.u*b +E("_!,NWqQ'>r'&'I`I_hu2u7Hg\^m(T1f5P\Mn-ORh=2:k86)f.1&28)4$6 +SbS^9;+Wc2Yts6qS+Ja*Y:#(7M +b3$MSbS,Ol/IRW(b-TJ-2?9^tkK^Se80``,cYTb>%sF([PFGrG=upmd"JmI+ +rY\*Y@oe3nPQh7)&r.,5;:VR>SK\-;i^#],*.m9#6n%AedVr?KSUaG#nIr%_ +'SPIH]H+gZ-LT/HS^?.K1aZP+?d,65Uth1fOqT6rA`=u'O]e+9!4de.[-ugp +hu/SnosAn]3%`_9Kanm;I4(EQ>84rG*mYD;2K)][&SP!BK=_\.]R5 +)TM)q<]j6)#'U?FSVU#2(qGLL,`,#,'Bodr&3M$1h07cHXhC]:,s)@%lWKaV +B$=G8H?N%(.M]16p$-\ceu:F\)6tlmP]#$XUr7?s=p1mW5k7d\$#6E^M$iDo +HXm/A#c50U5NBG=;C%Ypas>)"a[3Od;U>b/+fH)Z]..&WIP-@1HO?5"NWLU9 +agjMs=X?gf2#a'YVnNB>9lfsgmr="3pYUHbIn+="$8i5dWd:lLb(^sO*f$R@ +D#ChgRj!]7iJ(X0Bfi9Gm^6%u)#1oH^u'q;:K6QVmoQ.!;l +2C;_\=+um5q2nnRgL'sN(H=`=,!Q@2H"@b+=aCVq"W^%ne(i`B]C?i.,g4ni +)?MjKEG/=a^=:Y3JkG?4ZI$^d.m+`FL/WZ3Pl1D8J7rNWgn2BSIk=d,J/>Sr +XNS]o&/V=6kF[6qpmi'W.:KbNX!k!.![-G0(G8+n+OV#InWg\[e@Wa]-iAZ* +_&/kIX&lKb)PL$,=9O8BU)s(=V?GkUBuDGZVe8Z(d&+mal#!5PB&tVUKciH' +$Y@cqnTtWZ/4cUCG/JNrK1*gi&G8<(e_1+D.Z2WT@MXtGi>Y2CT$YWc&-d4R +A>(D$/g&5qlGDN@V'$7S."mbGP.tYRi^h:Y2/?6Qr)XSrKp(J/S._r#(S"=& +e2*OLZUSi1UnjZABK37g/ftOXkFeDjUj[auAc/>aJ`O`Y_\G,X=M,PO_V%<, +Cu;sTfT.d'T>4>]]Di/=]B9oJ3#8GPq5U +]Q@Hh*[qoa=t=lBYUOMI]G(@FaIPE%fOWj0W8o;L\Y>#cKj:rr%DaU'JQu@A +Uu](\-_71Z5dkL^po#a9AL*45ErQhI!N8^[CtuNTZf[N_51%:f+__]a?0>l] +V.9U[;N=(`Ym)YfrA)G&3fUVDm=+`/?h&:RFj$(&(VM!d;W\bib?A'F_RO4) +=-c1[n40-oBKO<.mC1uaSt>CX4:[K@0PEl>\QH+G-t+Mh@4W=;j^0B_X%Y1M +7VR:`E.<`BUVjVuTc^:e3lFo)%mdrb"/H2:)+,-8Ec/$pe.55=M5m)=oC'Be +?:t4[5Q;TMV>a>0MM@5^_hSb420a>)Dc'\6,:1j3CW#s-U?&iqKu=ee/%eU3 +&tTJHCr:Hoan"VF)T\6u+8Y0$YJ0QR_.9-R,TbD/S-'.i`%55_,P%p:i1A8A +BG:M&PWV38>uSt!J5Cbt5URX9GYhm"WdBhi13*D5X8?PUSm<@OmUTX!e0/E& +T%J]en2MnZ=3)p#779Ul;/]Xl)G[9@6A1MmOpf#HcFCCX6 +0D2!\a1[V1Ab7\nc=S^:DHbA8i!sH4I:r\N8b;8YX`&n8H]"Cc*E"A%O4&LU +p"*:N,F$k"=-@hFPUGJOVAI6W$L%dFME;J!;BG.GPKm#P_-K5qYp["LQ8!0q +15hOTKUrf$h#'rtqNEu>@)9-[b;?h0&N!"\'1cjlP4e+o:ik;@c?UG;*4hRh +P+8nd1tn;YQCi(/F_rL&:2nO@2\[eI,3/H-rquSj+Cu_?a0X!Bn6c4g?bB-b +!X0tn9gG,3Mm+bD]KT!bTqF)ME/1HG9l&@`jW+,1pk0h?QVdG4G9?S*R564J +Ab"d!Zp$t%VT,*pB1""j23*n+]2)inDr.!e(5c.Y#=Wa3)4F_/7k7lg"6>sh +62=W*Hq6Rt>pF\%(mX^Ihu4B9`>)@NlC[3k-C?L=d's.\5s[E7cF$8:*V_62 +bambCR9f%OW61(]8$ll^g7d:7XF7dtfI56ElCO(HI%F1`93- +X2u*`,_Kl/\2baTf3NUZT:j)_*'&U`9C\fs$mL`.O#TEH+;FS"5R7fF;?5ga +O&DZZ@0+mg"d%ngkK]V\H1Jb%"'2\i4D`c\N>@XJP!'Gf,!p:$B]6Ut[$-Z9 +Ukb.tPI6eRAQ*u6Up(>J&=Y2hGZgsj<'EKu3IB>XCBGi[;pYJ>XnlAA4ZMXNN.5Pd]WHBMMcZJ4>;jLleEV63ra%BLRjFASF=0E%*2n +9Pm1Tgh^7aL1qP-aY1F,dUe3%%uWiK)![6udj!\!s#lOE1q3]WD@EHWA=EqX +^`Eku/73&J>H.rDa'3%;&6(W#_d\&nSd:$2im(LY[hYB3H^5g6Rmm"uf!IUD +caY&=o7>2R6YKtkA?aRg9+.JOO[bp[agr3;AFUpV(!)GnN1dqZnjK386(E]d?rY7(m*00&l+s]*, +e]WE#l)3fC.9$JY#H_ZW@U9M&PY6OmiuS0[5Q1cRh1gS3#O!Ke?l?h3V*dmP +D^d+ane4hQW$@]a>I22>.)7SBe;WZ.h$"12Xp.Hqq5S(fZiZ<8GQSDDPs)DR +F`.,o'hX/aV>sd8e[gVh$Xk.Q0t6/_Zjr@O\Zp,^EcKp'"aU_EUE11'>e"qB +<\1-=2T?,KKEL>S!Q^lt58DB%1euB\k&s15B9Z)U/6Pg'G`ir*hF+0q!IMOH +jtmjT5r);']\refqt2V"C/+V@#SoR;mY6b7+I]aP#:-*^gU:tQ[,Hfq_P?/j +Zmdker,C%Q8#RM%VFk?XC=]K.I;nnaj&?iHBh(,0B0&u&'L.TP<82X@6F]f& +VeudSOgMWGE/2K]7^Or$BPDN"b/PG>Tf@)ms8CjTV/2AG;\lsB;5dn,P114O +E6XU!KS#qdjF0?QotP:RNTM7kOoR1N8u$h3mC.s`:S0h10;i?m0+>*_VF?@V +_.6JAq"#CWb!h=Q!Z%hnq24jB9;;FN"Y1^,NX#A_L +L+)9+L^,MifP\9\=\KMbh)\tfoi,F7fdJDXd[i"@(DUOTBn-=9d +X::cBqk?2ePRM.IaYSKfEpse+qA*dr>VI?S/e2BB;_@W$Z[]i!,u2jIIA.]B'X?[P__CIr_IX,:#)4.]3BaAH"saW:%%R6a.^)AS93 +i*!&T1tKrM)8-+!;4d:)k)=7J@]t_IJ)kL7"5&:0F(\1*E^jjA +7e2@'iPSK/(k[q\mUXY8SbhO(%3%3]K5Qa5%$MVPa[:-?,!42.+PCYnSA:Q4 +Q!:1>-Q+T7Z&Y'(Wm7(m0%YG`jR6,GR$:I??sZUu.NV_27Lfmkr#1ZZZi +WH,Q>k(iF\?bUnU7T9Yr%UfrV)4N0oY,NC;8SN5b,GBB\[ap*9pfVdW-?T1M +:Ob^G;>@hOpKeqi"Eu1)4su&^&uZ6g)>!\U39?YGTnIed1V)@r#1F'$JFL?H +>)J[NJ_/s`g_+/;bs/hGD;u1<36$WK%(hhE685!e!+YSujL&dTg9`(`Rk8>5 +Id-"[06UhOG?g7/"aL]=hu2te8A_ZDb75LOJCeGIDs"e`]carRNYE*H1br=u +gO]p,70W\a\%bAa:^EqJ`26t0JtaGO-o#:l1XMGdDB<>`ok`#0%4h`h6km0H +@W-$8'4mg^h0!1DGe%'CnVDAb&Z%EPr=#qsM)l08A4%pNq=sao4a-o*Vd"e*?r8"'e/OWt)a:8>=o +_UO1Ora01Be&Hft$FD="U9p:eP8:K'1,ku@\N^u`-Z`YtHc,t'#giZg8-@8F +#iUmj7kfN5X_g2njhShXRr.,-k.7.U$9#bjXS4sZo07a#b?oM+K*Mo"]\lVS +B.M-W\Tm1=-'#9$k.IZs-k)C:lX0Z1O.Dn?Cp#:hj+dA^6K"A'7m-QI)=f;c +1=U7J*P%r+C]G)GL\tO%[qs_A06-[MeJKW-KJ>[IYM& +V5[AB)mr)/LhM;P=Y]`!`\0uYbAnb'@[/aBLJ,-%Z@lDhDIIS6HVfpR7>!>ibS7@or+$PWaeC6TK`EYS] +CLe:+^0!UdA7!.d:g=Mnn,RiG+E+>63=TV#@W@O2HQX!#+:B8(,=LP5$9D4c/!gs +BSGNB_g1IoV+YM..S;/(C*EAb5'PsFXb3Ddb#/mjQ4J"Uo/lERZZ+m?";a!P +EPiT6V5C,)pkSDoW"CLICdR)WDq#q1c&38h?5sSlre5G45(dN[S<>8'@C5rp +Atl;Lm+@GlSrT815(,K'g'uI^ql5R?*-7;DAoo_)#T/hWV1r,dX]),mBm>Ap +<7-]kQ#Xc0)i`ElZi)L6\.q>Nf3NSLRAlTTfN,j;DGJ<5I=h"@HB)5H:2^8* +Pc;H4VrVebqA)!oU7$.F8!WBbFc3?L*/'MiBk\GAk^isGW-MU.`Hn:q[9/@t +.L8VCiNVQ]G:JeGe1,i&V(HDafnCW4ki;:2d-'d`J-Bq4EC^IKTTsdOacFG4 +fRS#hcY]=+Os\poaZURc@JN&M,&[Vl'L97.J)gi;Jifnm%$S8s1g!)D$&fHd +S%pOVkiAm+Te#U7Wpprp%';O8K43:_O<9r/> +s8)&bjXQXgd[1C;m2Th435p#Weq!0Lj^H]>-a$<6Srj0$AP.&'$ZKVgA::\R8/F/-,A:uDj?NY=,7uXR +%hFp`csJt[TFP*tJ.H\9UCh5<,4u3aEYlDa"Hj +4F-Me@p0YJ''A\-V=I#&Rh)?'asIrLC%uLbo5$UTfVF(Gb",o4W,m>i*,jn: +Cm*DJ'C4D,#BEq[$2[&i9_opc"BBmTG=1LhbP`LneG+f(H"ql-*q[U:-:AeRbta)]$@/, +?,Ifm^a:+XZI6N`=r)DY.C9D>1<_?m/M>LS3!*;j"MU8HkCu:^ef.W*j4*1$>=$q1$oni%QCPruZ!rEQaIkP,25QcV +3n_A$[bZ\^P8l\%UaSLa:HF&6G`maf(#j3mZ"M@PiCM4'TqG3V!$iF/H$tJ^ +A5puQrgng@10_D?[VXW9lF>gCj2X)rg^&`ZNfQeQr+*?OB_7%BkI1#Z)(A\k +fYjOB8/OPr%?S,:!ji$Z6?tEV=NodlG]CtBUF)rX'G2'H@!M%jYsX9V+ff:* +R_T3*G`',TF]Y"u".?#[R6jme7\OHqY$?fQjd3=mUiQdqR%H9![*g:dM5@!H +n%%U&C>drqmmU71?7Lc^Z=V57`O/qe:+dE6s35J2K/u=EXQR[qhTBt+!T%!I +TM(S%l)S?Kn9aot?*n8Ws&JR6D)G/.2+El6Q]oP;LjX1beTUlC`fY/mZq8G< +C-7,C=1<6gY3A(H-@F$ub:,!AL,%F,@+MNWc47"MY)=#F7WWtOh01=N"pLkP +FQsc2k7F;Lndc_fV6W__8FnTQC'K4ZLb#BN[OcPVNj_%1S7/_!fgT%6)8H8X0j3a8c(`s.m*^Md/>: +S'1Pi[GoT@numN8.rIOro&NJO4cC=X"/mFmYKT*u<\m6V+-#!=)1fU^8RpdC +5ROM*9u9tX4"6.-+](TU0j$e>:K;0P?;?Sa-jJoMTYX5'5_D)I\&DE>,L+8' +rqqoj/%%<>,WioGm +#@X9Ar.V"9ltI%?)<*rM-#tn4>sa?Z6`t)L\RYg]W!F6*um +,ndbj]?WFOjBGlC]C3HQ=+M0=Vn^S^HrtkT2HiWPj3qG0GZZBHUeu(I]f>uF +Dnd;WIQWn;=7Hd],R]ttfWfDS6bQp]*85ptL/!gKj<'MZeL7t3QACABP)R6q'3^1< +D*Bf)e>Z@i<)X$>2*uBF#cR-TnI(o#XtNX:rEZD +6#'(OrfXI)1CI:oW1ieu]]dn?6-0G/8thQ`fc?%Yl"b9od,Q +@?Q"`76$!&N97s56E\\cBQujRUqN<$Zn=ZK6(k$.TD@nBI'(3hQ6eb,GQM19P%6bj,gKBkpQe"Ojn#79*6M@WP>` +Rl@'BM7bYr_$=:ZqXj#iSQk9_eXj`A#%-&4$EY1@Lh_cChq^+!"N0NZnH9U$ +`>;n6-tTl[cGo&%+I:F#68\*js+9gUKJQ5]+qaD(q/@";!KBJ4i.6d&PV6=R +'ELHV\[OG!dSXdtQjQ9I_%_*6NDJCZ$q*:(n/u04S2kZ#8@-`$3"3/%mOMkA +l"A;3W>46=$"r_$-efQhJYSfa"_cM+o2tY*UIUC)!epZt]u"VBfR96Di7fhf +[Nm.F+eRsT>LuMhI^t9.Vi&?X)-7\(Q+B\,#b:GfqP]3>3?Q=24]=6WOkR73 +^JljMPq>)^NZP`/NU]&C9?]He#SESm7'e=G*2+t921<:>kdrXYLOuhCo$sOJ +2hs1D]O5!\Mt9r\misd#J[IDr"52.HP>nhG8XUM!kAUm2LYgs%1kET_$H\,G +Z$Z65bGkrM#[N3iM`u\m[&bTN;c2>9lP+t9L)8SOXQ=6-O4>2@X]o;omu&-8 +7.EoL#?M2]GnHXH=[J@(7rr=8`P:qOHbR,6gpepWNlu>3VsD'hKn$c%6f"[3 +K#@rKEC5XPEIn6^jD[sOhR%mC[e9,q=Bs/YhP6(S7jh]!0JV9+K.C-@s#MW. +;j1T)2bA#)7sC^/X4ZpV>K)>hr93+FQ$+lU"r*L%Rd?ctPi;X/>hs,)QI\u\ +*2(^b$lGZ)'sqjMpha;N^[+$[Z*Z&MTNZ#0g/Kq>H7?MZG%Z"GUO1B9PJ46U +7mee+Z&'-TcCgl76NAmU_iXs?pM)MrBU;d8ARB-T(C,mVNQIa:#bsNuOk08eg`bE2NXcGd+kUO+m$`+>< +%5EH5*$J:8$5HaQCl)5`nYi>c;#kS:-XV2hWD]Ps%NK08f)S49]mB@W%UA%V7RTKcY10CIUN#2/\9t>XXnq.&(_:RY +@K$&q]mKM)gdW6h4YR$:4m8cg+9DR&FW]Wd:B0KAs(V96GOhF'ft"&\%@ZU& +Xo!5F\4o7kUi!s[!6p4Fku+m,hnD@,!c?Yu=h&FE"rd]TkcL.e;_p7h>XpSP +*BJ;hEo/*3NkE2"X9!2`*'Sapo&Rp;Rl@g1!o3U=3bd0HR4Y+OnI!D$=Ms6q0iiPUF<-o:'FJ'\U)I!g=mXBAc8C,Kqd]YLhn%e)q'04(09 +R&FM:l_M$^@?f&Qe>SKkGAd%Npt2JEd>I#G +AF1>7;.jB+Rr[5WA>;VR;D18LZlq[8cpF+bo9cCb@ +if!NtgY39'X_4K<=d1ISh7@a3>e+V#XGQ1+FQcPsb8]AOi9].'++3R/(-&^e +:3A0NKtGdGH1R1F9;6QcUk5a@5oC!R0%&s'3jCQ&+B3`9HsBo]-E]u]i78.% +'/S^p]@Rt<2YF\+n(s<[="[UZ+CD6X^HNJ=.A2Kq2l6:cd#gClJeMr6(5h"B +Lk:RRN*tDKD6J<5RS35DCh45J;FK*tb*D;M^V=\"DCj9%^juTL8?"_R)I_rq +gQHPfbEa_ZW6hTK^8fSAOY1[)Rt6hTDh+;[/U;*N8.5FL_HGTj +,@A04/R#NK5(.a=1H3OI2c%&dBK9Wi+1:rSX&c?CkK[A8>.(%kLP@=R=>oSE +%/c2!,=ZeBg/ZmZ=Qj;K#sPe8h)^&br2AV/$Q!,`(RS;,F;QoP(c>erG*p$W ++.n#Ykq#uC1i:rgb*4=mmnXt^G!ri4r5i0$!..+9D2U5c!F)[VWqA7lJ,Ji2 +7>l36G+&\uSt8]j6(C]:_UdTH[;4C>Sio/9D!p)hQX)-d5SV"(X*sm=C&FPl +le-.f>4n,<=K%)l/!_eng3/p@<69&-*'8>F9:%:!16o9cm^(5'X.:caQS4D2 +V](mT?QLVi(r<4PWt5^,$u>0L)m][k'7ms_dA)?I#Gt:[PERS!ZHSn(En%\C +b"02Bm^jDsD@@4VN'O][?4K97PI@ta=7?E8jiU"7TN.`h_%;cmP&0;.gB5<[ +"Y`gX$PogI[Hc,46[.qO($Y8npncnY"HbRQeD7K&4L,unEF\"fiXhKq`5H'1 +OT@n(G=U14@WGs,*M7W>)>q0;N>bN]3&,e:oDha=E8u!4lrcY#/O6>pB=:a+ +3/%T>[r1$W\T?g+X^&F-qUXG[8rOTAJlkSk8\:$'N_ +,7qA^'cNhdLCYIrs/<7qCpK09(.hA;,taEceZ7DfY@F^lNi#aV3D(W/q3,;j5cW92?o_]Ua5Z;X`"1(mRh5,qO2X-aSKNXgYd#g6- +p?hSg+Bl$beLI@]4)!AVBnb1`'^%oC(4G8+8,DoE[r^`X8=0'O!O3n>>U_iU +)=+k`S=k]/kKf25>.8BT0^'oSnC_HH`Q-$B0H"\"APNdIr&p;3Y[PF#&;XIN +AM:c3djA1,Z')C(mZt$nW=g79pu$d4&bt"pi5(%cooY-p6BJf'^aZD4a>"h] ++UA2ZoB+:BJ84,;[0,\*MWN$JYB&aI,=ddL[r5WLb8]AOi7tka0>IFj'"g+@ +9bp>Z$\,?\X]egT4MV+.('N*Z%+(eQZY#LT[tM<3R=ch\RUjO'V.%8re##hI +k$pkDIL9rV.pXX*,YhKQXhiFsb*4>WY[FqXh3*qa@Q_VBTH8FQm&<.s73_$D +[S>q.!K\%mAF?:EQYoB,Go[Hi\b.fr-R,?VU'0qO4- +,pT7*TN)9=$0J3j[;&'`%,&=@GGNE/X'j\jD43mA7:\b1TT[M7(JBu@JM)97 +Xg_+p5t3%fOH>RnjHE@`$mlqQO`aS8-KN:4#LZ><4?;&I`@uf@r2*2XWno;G +f/s1"Em0k'hkQ5r3cO#m4aZlj]"A&mEQIJ3gUHVb:HT42*tN?B"99&IbYs,u +%3SW^G4"G;SSNk`$e;b,j)!DSTrc7o*NQT7K1_&J +S3(qt9:%7f3j"IWKiZc[,2#4\W`5rqW)00h??p,Xo&[^S"%3+frRKLBgLN!) +4oY6:EH-!FD8qMP_)/)-!La\>e>Q4h,EuuAA>)V\.TNcbakj^XJ,AWB_31_5 +KaS^.FmDMVM*'^ZC/!eg7(@VJE\/,M'I-.@9#<]I:ddl!P[LAg5_0!%.THi, +6Z@&;kYZ_8ji2][^E?M/Z=Sq//(UIcO4C:4#Dsqp+b)[!+e_Ab)FR0ildp(- +YT_5*kb56dIE\9G45Wf%1eARA+:nMl2f=kgOZbJ+DVd.m_Q9(S=0>oFITs:! +NHBFJr3EQK:jr67Khqp(cprcK]TEHHMEp,!qsT%&\`[SNSfIq8!qhkHQq704 +nR+4DFZgH@[Q]3?r3^=l*]7\38kM^OM]CYei;EEBGke[]eWPUf%6PaP10@(< +`JPCOjN,`F9:)JJQNe<6_oRrbW@3Zch7us4$;OH:>b='"C+N/"NY0?!*BJ9J +imar+LG6jsPkfd,hr;V5UM8V7qe^IM#6*IJYP*d2Pi?aS7p+oD,IRnFFm@H_ +>8FW/*'AK8aH7]op?ZMFY+9,l3Q?D2s1gCM>U4VF:nU)JmbLsH=qs_` +M@nd+i6aiha$YrdB>G;[JnUZ)5AVcX2bU6G!mcVZNjWihJCoZ)_+"ab%SG&S +$JSh-5$e]$oG;^)N6D4W*P88T_&5qhi!!*qb48[f_SB6lMA=SsW*g54fKnE/ +I4J9qJ9+Vl?G3pmlZ0r_;a0SLo1$DYWQ'4sT'I=nOMp-&u8NWFlC@hq2_%W\/Lk7U3o! +7:j`4PtF\?8-gs`0`n'X-r[Zsjm!n%G]9&s:-g;=JqBInfAI"4Ngkcr_+QE" +>QM8F9dZ1o(akq)nT!#(RZWE$H"EE_l$@78ML"bQD3l+^>CGZe+6D4e4l(#5 +\(DrI)9YiKEH-!rGM]uX_3/RgK%6o'=8#IuC=R(LWejP9*W\&mn-J$P\(=<= +6-N5NE4?Q0Qb(4?:>_g[s9OYrj-i"a1mUc07AZ+!9q]DB+82o)fusgpqKMmbBfO.4Np=4[q,RqXcOSb2DI#W@Ar1HgEJSAHo3$ +#=VahQ)3'L]7<2"&+'M0$t@f1JhR(#*u1BWGn46^AOaVPEnP)4 +\HB]#S`4\7kU+k"f3FApK:Rfs7Oqu7jX]*l.pNdR`3>;SfejF9Y*eSa+06FLqjHR: +)5cnZa\@Nb7b#&dTX*Ip*IAeAVF>/q,9PTuVc"$#oB/VH;8Y[h,'M>@CY+=_ +H:VA7b`dE==X]YkOfIdL:732;ek0mAjdu@*-?J<1LU'E6V_S0KR)s6ujE%0$gaL:26ZDFTBP%3d$g&5TCo*95[BmT`q<%-C +7JG\h5NgLm9fmL_<2?!E^s0Zg6\hm9\0ZgSO*Z=QYXuPN8$U1;Q0aa)VNC90 +H@VNt,;(O='#dP"9.%1dIQ,+0)F$$ajk;A[9lVaX3(GODYrngN6bYh3jgb1D +[m*V8ekbJc8hB"`.&`XrF1,l9DS^o._d[4=N,gQ,KZe +%[9VQOg8@%(`-F=(![(DO>jAhkNVdHQhkab^4'D?a(p.gCjhXTc(+SDQGX6Z +Hi&Q+\i4`[(XG),7CWYFZ\HJ,ISd=\aT;VQ]_^ooX&c?[F?9`;8_CCae&sDZ +$mSB2/mYhtd:+/SH[ocU0?&Pb8qg)&KSMmER"'`lR,Oe2~> +EI diff --git a/bin/reportlab/docs/images/replogo.gif b/bin/reportlab/docs/images/replogo.gif new file mode 100644 index 00000000000..e91e1ca03e0 Binary files /dev/null and b/bin/reportlab/docs/images/replogo.gif differ diff --git a/bin/reportlab/docs/reference/build.bat b/bin/reportlab/docs/reference/build.bat new file mode 100755 index 00000000000..483af7b9b6c --- /dev/null +++ b/bin/reportlab/docs/reference/build.bat @@ -0,0 +1,3 @@ +del reference.pdf +python ..\tools\yaml2pdf.py reference.yml +start reference.pdf diff --git a/bin/reportlab/docs/reference/genreference.py b/bin/reportlab/docs/reference/genreference.py new file mode 100644 index 00000000000..c2b6afd7598 --- /dev/null +++ b/bin/reportlab/docs/reference/genreference.py @@ -0,0 +1,29 @@ +#!/bin/env python +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/reference/genreference.py +__version__=''' $Id: genreference.py 2385 2004-06-17 15:26:05Z rgbecker $ ''' +__doc__ = """ +This module contains the script for building the reference. +""" +def run(verbose=None, outDir=None): + import os, sys, shutil + from reportlab.tools.docco import yaml2pdf + from reportlab.lib.utils import _RL_DIR + if verbose is None: verbose=('-s' not in sys.argv) + yaml2pdf.run('reference.yml','reference.pdf') + if verbose: print 'Saved reference.pdf' + docdir = os.path.join(_RL_DIR,'docs') + if outDir: docDir = outDir + destfn = docdir + os.sep + 'reference.pdf' + shutil.copyfile('reference.pdf', destfn) + if verbose: print 'copied to %s' % destfn + +def makeSuite(): + "standard test harness support - run self as separate process" + from reportlab.test.utils import ScriptThatMakesFileTest + return ScriptThatMakesFileTest('../docs/reference', 'genreference.py', 'reference.pdf') + + +if __name__=='__main__': + run() diff --git a/bin/reportlab/docs/reference/reference.yml b/bin/reportlab/docs/reference/reference.yml new file mode 100644 index 00000000000..65e4091af5c --- /dev/null +++ b/bin/reportlab/docs/reference/reference.yml @@ -0,0 +1,217 @@ +.t ReportLab API Reference + +.nextPageTemplate Normal + +.h1 Introduction + +This is the API reference for the ReportLab library. All public +classes, functions and methods are documented here. + +Most of the reference text is built automatically from the +documentation strings in each class, method and function. +That's why it uses preformatted text and doesn't look very +pretty. + +Please note the following points: +.bu ()Items with one leading underscore are considered private +to the modules they are defined in; they are not documented +here and we make no commitment to their maintenance. +.bu ()Items ending in a digit (usually zero) are experimental; +they are released to allow widespread testing, but are +guaranteed to be broken in future (if only by dropping the +zero). By all means play with these and give feedback, but +do not use them in production scripts. + +.h2 Package Architecture + +The reportlab package is broken into a number of subpackages. +These are as follows: + +.df reportlab.pdfgen +- this is the programming +interface to the PDF file format. The Canvas (and its co-workers, +TextObject and PathObject) provide everything you need to +create PDF output working at a low level - individual shapes +and lines of text. Internally, it constructs blocks of +page marking operators which match your drawing commands, +and hand them over to the pdfbase +package for drawing. + +.df reportlab.pdfbase +- this is not part of the +public interface. It contains code to handle the 'outer +structure' of PDF files, and utilities to handle text metrics +and compressed streams. + +.df reportlab.platypus +- PLATYPUS stands for +"Page Layout and Typography Using Scripts". It provides a +higher level of abstraction dealing with paragraphs, frames +on the page, and document templates. This is used for multi- +page documents such as this reference. + +.df reportlab.lib +- this contains code of +interest to application developers which cuts across +both of our libraries, such as standard colors, units, and +page sizes. It will also contain more drawable and flowable +objects in future. + +There is also a demos directory containing various demonstrations, +and a docs directory. These can be accessed with package +notation but should not be thought of as packages. + +Each package is documented in turn. + +.pageBreak +.h1 reportlab.pdfgen subpackage + +This package contains three modules, canvas.py, textobject.py +and pathobject.py, which define three classes of corresponding +names. The only class users should construct directly is +the Canvas, defined in reportlab.pdfgen.canvas; it provides +methods to obtain PathObjects and TextObjects. + + +.getClassDoc reportlab.pdfgen.canvas Canvas +.pageBreak +The method Canvas.beginPath allows users to construct +a PDFPathObject, which is defined in reportlab/pdfgen/pathobject.py. + +.getClassDoc reportlab.pdfgen.pathobject PDFPathObject +.pageBreak +The method Canvas.beginText allows users to construct +a PDFTextObject, which is defined in reportlab/pdfgen/textobject.py. + +.getClassDoc reportlab.pdfgen.textobject PDFTextObject + +.pageBreak +.h1 reportlab.platypus subpackage + +The platypus package defines our high-level page layout API. +The division into modules is far from final and has been +based more on balancing the module lengths than on any +particular programming interface. The __init__ module +imports the key classes into the top level of the package. + +.h2 Overall Structure + +Abstractly Platypus currently can be thought of has having four +levels: documents, pages, frames and flowables (things which can fit into frames in some way). +In practice there is a fifth level, the canvas, so that if you want +you can do anything that pdfgen's canvas allows. + +.h2 Document Templates +.h3 BaseDocTemplate + +The basic document template class; it provides for initialisation and +rendering of documents. A whole bunch of methods +handle_XXX handle document +rendering events. These event routines all contain some +significant semantics so while these may be overridden that +may require some detailed knowledge. Some other methods are +completely virtual and are designed to be overridden. +.h3 BaseDocTemplate +.getClassDoc reportlab.platypus.doctemplate BaseDocTemplate + +.pageBreak +A simple document processor can be made using derived class, +SimpleDocTemplate. + +.pageBreak +.h3 SimpleDocTemplate +.getClassDoc reportlab.platypus.doctemplate SimpleDocTemplate + +.pageBreak +.h2 Flowables +.getClassDoc reportlab.platypus.paragraph Paragraph +.getClassDoc reportlab.platypus.flowables Flowable +.getClassDoc reportlab.platypus.flowables XBox +.getClassDoc reportlab.platypus.flowables Preformatted +.getClassDoc reportlab.platypus.flowables Image +.getClassDoc reportlab.platypus.flowables Spacer +.getClassDoc reportlab.platypus.flowables PageBreak +.getClassDoc reportlab.platypus.flowables CondPageBreak +.getClassDoc reportlab.platypus.flowables KeepTogether +.getClassDoc reportlab.platypus.flowables Macro +.getClassDoc reportlab.platypus.xpreformatted XPreformatted +.getClassDoc reportlab.platypus.xpreformatted PythonPreformatted + +.pageBreak +.h1 reportlab.lib subpackage + +This package contains a number of modules which either add utility +to pdfgen and platypus, or which are of general use in graphics +applications. + +.h2 reportlab.lib.colors module +.getModuleDoc reportlab.lib.colors + +.h2 reportlab.lib.corp module +.getModuleDoc reportlab.lib.corp + +.h2 reportlab.lib.enums module +.getModuleDoc reportlab.lib.enums + +.h2 reportlab.lib.fonts module +.getModuleDoc reportlab.lib.fonts + +.h2 reportlab.lib.pagesizes module +.getModuleDoc reportlab.lib.pagesizes + +.h2 reportlab.lib.sequencer module +.getModuleDoc reportlab.lib.sequencer + + + + +.pageBreak +.h1 Appendix A - CVS Revision History +.beginPre Code +$Log: reference.yml,v $ +Revision 1.1 2001/10/05 12:33:33 rgbecker +Moved from original project docs, history lost + +Revision 1.13 2001/08/30 10:32:38 dinu_gherman +Added missing flowables. + +Revision 1.12 2001/07/11 09:21:27 rgbecker +Typo fix from Jerome Alet + +Revision 1.11 2000/07/10 23:56:09 andy_robinson +Paragraphs chapter pretty much complete. Fancy cover. + +Revision 1.10 2000/07/03 15:39:51 rgbecker +Documentation fixes + +Revision 1.9 2000/06/28 14:52:43 rgbecker +Documentation changes + +Revision 1.8 2000/06/19 23:52:31 andy_robinson +rltemplate now simple, based on UserDocTemplate + +Revision 1.7 2000/06/17 07:46:45 andy_robinson +Small text changes + +Revision 1.6 2000/06/14 21:22:52 andy_robinson +Added docs for library + +Revision 1.5 2000/06/12 11:26:34 andy_robinson +Numbered list added + +Revision 1.4 2000/06/12 11:13:09 andy_robinson +Added sequencer tags to paragraph parser + +Revision 1.3 2000/06/09 01:44:24 aaron_watters +added automatic generation for pathobject and textobject modules. + +Revision 1.2 2000/06/07 13:39:22 andy_robinson +Added some text to the first page of reference, and a build batch file + +Revision 1.1.1.1 2000/06/05 16:39:04 andy_robinson +initial import + +.endPre + + + diff --git a/bin/reportlab/docs/userguide/app_demos.py b/bin/reportlab/docs/userguide/app_demos.py new file mode 100644 index 00000000000..6c1c156477c --- /dev/null +++ b/bin/reportlab/docs/userguide/app_demos.py @@ -0,0 +1,113 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/app_demos.py +from reportlab.tools.docco.rl_doc_utils import * + +Appendix1("ReportLab Demos") +disc("""In the subdirectories of $reportlab/demos$ there are a number of working examples showing +almost all aspects of reportlab in use.""") + +heading2("""Odyssey""") +disc(""" +The three scripts odyssey.py, dodyssey.py and fodyssey.py all take the file odyssey.txt +and produce PDF documents. The included odyssey.txt is short; a longer and more testing version +can be found at ftp://ftp.reportlab.com/odyssey.full.zip. +""") +eg(""" +Windows +cd reportlab\\demos\\odyssey +python odyssey.py +start odyssey.pdf + +Linux +cd reportlab/demos/odyssey +python odyssey.py +acrord odyssey.pdf +""") +disc("""Simple formatting is shown by the odyssey.py script. It runs quite fast, +but all it does is gather the text and force it onto the canvas pages. It does no paragraph +manipulation at all so you get to see the XML < & > tags. +""") +disc("""The scripts fodyssey.py and dodyssey.py handle paragraph formatting so you get +to see colour changes etc. Both scripts +use the document template class and the dodyssey.py script shows the ability to do dual column +layout and uses multiple page templates. +""") + +heading2("""Standard Fonts and Colors""") +disc("""In $reportlab/demos/stdfonts$ the script stdfonts.py can be used to illustrate +ReportLab's standard fonts. Run the script using""") +eg(""" +cd reportlab\\demos\\stdfonts +python stdfonts.py +""") +disc(""" +to produce two PDF documents, StandardFonts_MacRoman.pdf & +StandardFonts_WinAnsi.pdf which show the two most common built in +font encodings. +""") +disc("""The colortest.py script in $reportlab/demos/colors$ demonstrates the different ways in which +reportlab can set up and use colors.""") +disc("""Try running the script and viewing the output document, colortest.pdf. This shows +different color spaces and a large selection of the colors which are named +in the $reportlab.lib.colors$ module. +""") +heading2("""Py2pdf""") +disc("""Dinu Gherman (<gherman@europemail.com>) contributed this useful script +which uses reportlab to produce nicely colorized PDF documents from Python +scripts including bookmarks for classes, methods and functions. +To get a nice version of the main script try""") +eg(""" +cd reportlab/demos/py2pdf +python py2pdf.py py2pdf.py +acrord py2pdf.pdf +""") +disc("""i.e. we used py2pdf to produce a nice version of py2pdf.py in +the document with the same rootname and a .pdf extension. +""") +disc(""" +The py2pdf.py script has many options which are beyond the scope of this +simple introduction; consult the comments at the start of the script. +""") +heading2("Gadflypaper") +disc(""" +The Python script, gfe.py, in $reportlab/demos/gadflypaper$ uses an inline style of +document preparation. The script almost entirely produced by Aaron Watters produces a document +describing Aaron's $gadfly$ in memory database for Python. To generate the document use +""") +eg(""" +cd reportlab\\gadflypaper +python gfe.py +start gfe.pdf +""") +disc(""" +everything in the PDF document was produced by the script which is why this is an inline style +of document production. So, to produce a header followed by some text the script uses functions +$header$ and $p$ which take some text and append to a global story list. +""") +eg(''' +header("Conclusion") + +p("""The revamped query engine design in Gadfly 2 supports +.......... +and integration.""") +''') +heading2("""Pythonpoint""") +disc("""Andy Robinson has refined the pythonpoint.py script (in $reportlab\\demos\\pythonpoint$) +until it is a really useful script. It takes an input file containing an XML markup +and uses an xmllib style parser to map the tags into PDF slides. When run in its own directory +pythonpoint.py takes as a default input the file pythonpoint.xml and produces pythonpoint.pdf +which is documentation for Pythonpoint! You can also see it in action with an older paper +""") +eg(""" +cd reportlab\\demos\\pythonpoint +python pythonpoint.py monterey.xml +start monterey.pdf +""") +disc(""" +Not only is pythonpoint self documenting, but it also demonstrates reportlab and PDF. It uses +many features of reportlab (document templates, tables etc). +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 inline style of the gadflypaper demo; the +content is completely separate from the formatting +""") \ No newline at end of file diff --git a/bin/reportlab/docs/userguide/ch1_intro.py b/bin/reportlab/docs/userguide/ch1_intro.py new file mode 100644 index 00000000000..1aa99314d99 --- /dev/null +++ b/bin/reportlab/docs/userguide/ch1_intro.py @@ -0,0 +1,693 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch1_intro.py +from reportlab.tools.docco.rl_doc_utils import * +import reportlab + +title("ReportLab PDF Library") +title("User Guide") +centred('ReportLab Version ' + reportlab.Version) + +nextTemplate("Normal") + +######################################################################## +# +# Chapter 1 +# +######################################################################## + + +heading1("Introduction") + + +heading2("About this document") +disc("""This document is an introduction to the ReportLab PDF library. +Some previous programming experience +is presumed and familiarity with the Python Programming language is +recommended. If you are new to Python, we tell you in the next section +where to go for orientation. +""") + +disc(""" +This manual does not cover 100% of the features, but should explain all +the main concepts and help you get started, and point you at other +learning resources. +After working your way through this, you should be ready to begin +writing programs to produce sophisticated reports. +""") + +disc("""In this chapter, we will cover the groundwork:""") +bullet("What is ReportLab all about, and why should I use it?") +bullet("What is Python?") +bullet("How do I get everything set up and running?") + +todo(""" +We need your help to make sure this manual is complete and helpful. +Please send any feedback to our user mailing list, +which is signposted from www.reportlab.org. +""") + +heading2("What is the ReportLab PDF Library?") +disc("""This is a software library that lets you directly +create documents in Adobe's Portable Document Format (PDF) using +the Python programming language. It also creates charts and data graphics +in various bitmap and vector formats as well as PDF.""") + +disc("""PDF is the global standard for electronic documents. It +supports high-quality printing yet is totally portable across +platforms, thanks to the freely available Acrobat Reader. Any +application which previously generated hard copy reports or driving a printer +can benefit from making PDF documents instead; these can be archived, +emailed, placed on the web, or printed out the old-fashioned way. +However, the PDF file format is a complex +indexed binary format which is impossible to type directly. +The PDF format specification is more than 600 pages long and +PDF files must provide precise byte offsets -- a single extra +character placed anywhere in a valid PDF document can render it +invalid. This makes it harder to generate than HTML.""") + +disc("""Most of the world's PDF documents have been produced +by Adobe's Acrobat tools, or rivals such as JAWS PDF Creator, which act +as 'print drivers'. Anyone wanting to automate PDF production would +typically use a product like Quark, Word or Framemaker running in a loop +with macros or plugins, connected to Acrobat. Pipelines of several +languages and products can be slow and somewhat unwieldy. +""") + + +disc("""The ReportLab library directly creates PDF based on +your graphics commands. There are no intervening steps. Your applications +can generate reports extremely fast - sometimes orders +of magnitude faster than traditional report-writing +tools. This approach is shared by several other libraries - PDFlib for C, +iText for Java, iTextSharp for .NET and others. However, The ReportLab library +differs in that it can work at much higher levels, with a full featured engine +for laying out documents complete with tables and charts. """) + + +disc("""In addition, because you are writing a program +in a powerful general purpose language, there are no +restrictions at all on where you get your data from, +how you transform it, and the kind of output +you can create. And you can reuse code across +whole families of reports.""") + +disc("""The ReportLab library is expected to be useful +in at least the following contexts:""") +bullet("Dynamic PDF generation on the web") +bullet("High-volume corporate reporting and database publishing") +bullet("""An embeddable print engine for other applications, including +a 'report language' so that users can customize their own reports. +This is particularly relevant to cross-platform apps which cannot +rely on a consistent printing or previewing API on each operating +system.""") +bullet("""A 'build system' for complex documents with charts, tables +and text such as management accounts, statistical reports and +scientific papers """) +bullet("""Going from XML to PDF in one step!""") + + + + +heading2("What is Python?") +disc(""" +Python is an interpreted, interactive, object-oriented programming language. It is often compared to Tcl, Perl, +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. +""") + + +disc(""" +Python is as old as Java and has been growing steadily in popularity for 13 years; since our +library first came out it has entered the mainstream. Many ReportLab library users are +already Python devotees, but if you are not, we feel that the language is an excellent +choice for document-generation apps because of its expressiveness and ability to get +data from anywhere. +""") + +disc(""" +Python is copyrighted but freely usable and distributable, even for commercial use. +""") + +heading2("Acknowledgements") +disc("""Many people have contributed to ReportLab. We would like to thank +in particular (in approximately chronological order) Chris Lee, Magnus Lie Hetland, +Robert Kern, Jeff Bauer (who contributed normalDate.py); Jerome Alet (numerous patches +and the rlzope demo), Andre Reitz, Max M, Albertas Agejevas, T Blatter, Ron Peleg, +Gary Poster, Steve Halasz, Andrew Mercer, Paul McNett, Chad Miller, Tim Roberts, +Jorge Godoy and Benn B.""") + +disc("""Special thanks go to Just van Rossum for his valuable assistance with +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$) +for Luxi Serif Regular and Ray Larabie ($http://www.larabiefonts.com$) for the Rina TrueType font.""") + +heading2("Installation and Setup") + +disc(""" +Below we provide an abbreviated setup procedure for Python experts and a more +verbose procedure for people who are new to Python. +""") + +heading3("Installation for experts") +disc("""First of all, we'll give you the high-speed version for experienced +Python developers:""") +list("""Install Python 2.3 or later (2.4 recommended). ReportLab 2.x uses + Python 2.3 features and will use 2.4 going forwards. We also maintain + a 1.x branch which works back to Python 2.1. + """) +list("""If you want to produce compressed PDF files (recommended), +check that zlib is installed.""") +list("""If you want to work with bitmap images, install and +test the Python Imaging Library""") +list("""Unpack the reportlab package (reportlab.zip +or reportlab.tgz) into a directory on your path. (You can also use ^python setup.py install^ if you wish)""") +list("""Unpack the rl_addons package and build the C extensions with distutils; or grab the +corresponding .pyd files from our download page. """) + + +list("""$cd$ to ^reportlab/test^ and execute $runAll.py$. +This will create many PDF files. """) +list("""You may also want to download and run the ^rl_check.py^ on our site, which +health-checks an installation and reports on any missing options. """) +disc(" ") +disc("""If you have any problems, check the 'Detailed Instructions' section below.""") + +heading3("A note on available versions") +disc("""The $reportlab$ library can be found at $ftp.reportlab.com$ in +the top-level directory or at http://www.reportlab.com/ftp/. +Each successive version is stored in both zip +and tgz format, but the contents are identical apart from line endings. +Versions are numbered: $ReportLab_1_00.zip$, $ReportLab_1_01.zip$ and so on. The +latest stable version is also available as just $reportlab.zip$ (or +$reportlab.tgz$), which is actually a symbolic link to the latest +numbered version. Finally, daily snapshots off the trunk are available as +$current.zip$ (or $current.tgz$). +""") + + +heading3("Instructions for novices: Windows") + + + +disc("""This section assumes you +don't know much about Python. We cover all of the steps for three +common platforms, including how to verify that each one is complete. +While this may seem like a long list, everything takes 5 minutes if +you have the binaries at hand.""") + + +restartList() + +list("""Get and install Python from $http://www.python.org/.$ +Reportlab 2.x works with Python 2.3 upwards but we strongly recommend to use +the latest stable version of Python (2.4.3 at the time of writing). +Follow the links to 'Download' and get the latest +official version. This will install itself into $C:\Python24$ +After installing, you should be able to run the +'Python (command line)' option from the Start Menu.""") + +list("""If on Windows, we strongly recommend installing the Python Windows +Extensions, which let you use access all the Windows data sources, and provide +a very nice IDE. This can be found at ^http://sourceforge.net/projects/pywin32/^. +Once this is installed, you can start +Pythonwin from the Start Menu and get a GUI application.""") + +list("""The next step is optional and only necessary if you want to +include images in your reports; it can also be carried out later. However +we always recommend a full installation if time permits.""") + +list("""Install the Python Imaging Library ($PIL$) from $http://www.pythonware.com/products/pil/$. +""") + + +list("""Now you are ready to install reportlab itself. Unzip the archive straight into +your Python directory; it creates a subdirectory named +$reportlab$. You should now be able to go to a Python +command line interpreter and type $import reportlab$ without getting +an error message.""") + +list("""Download the zip file of precompiled DLLs for your Python version from +the bottom of the ^http://www.reportlab.org/downloads.html^ downloads page, and unzip +them into ^C:\Python24\lib\site-packages^ (or its equivalent for other Python versions""") + +list("""Open up a $MS-DOS$ command prompt and CD to +"$..\\reportlab\\test$". Enter "$runAll.py$". You should see lots of dots +and no error messages. This will also create many PDF files and generate +the manuals in ^reportlab/docs^ (including this one). """) + +list(""" +Finally, we recommend you download and run the script ^rl_check.py^ from +^^http://www.reportlab.org/ftp/^. This will health-check all the above +steps and warn you if anything is missing or mismatched.""") + +heading3("Instructions for Python novices: Unix") + +restartList() +list("""On a large number of Unix and Linux distributions, Python is already installed, +or is avaialable as a standard package you can install with the relevant package manager.""") + +list("""If you want to compile from +source download the latest +sources from http://www.python.org (currently the latest source is +in http://www.python.org/ftp/python/2.4.3/Python-2.4.3.tgz). If you wish to use +binaries +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 Python-2.4.3.tgz$; +this will create a subdirectory called Python-2.4.3 (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 +check that the zlib extension will be installed by default by editing +the file Modules/Setup.in and ensuring that (near line 405) the line +containing zlib zlibmodule.c is uncommented i.e. has no hash '#' character at the +beginning. You also need to decide if you will be installing in the default location +(/usr/local/) or in some other place. +The zlib module is needed if you want compressed PDF and for some images.""") + +list("""Invoke the command $./configure --prefix=/usr/local$ this should configure +the source directory for building. Then you can build the binaries with +a $make$ command. If your $make$ command is not up to it try building +with $make MAKE=make$. If all goes well install with $make install$.""") + +list("""If all has gone well and python is in the execution search path +you should now be able to type $python$ and see a Python prompt.""") + +list(""" +Once you can do that it's time to try and install ReportLab. +First get the latest reportlab.tgz. +If ReportLab is to be available to all then the reportlab archive should be unpacked in +the lib/site-python directory (typically /usr/local/lib/site-python) if necessary by +a superuser. +Otherwise unpack in a directory of your choice and arrange for that directory to be on your +$PYTHONPATH$ variable. +""") +eg(""" +#put something like this in your +#shell rcfile +PYTHONPATH=$HOME/mypythonpackages +export PYTHONPATH +""",after=0.1) + +list("""You should now be able to run python and execute the python statement +""",doBullet=0) +eg("""import reportlab""",after=0.1) +list("""If you want to use images you should certainly consider +getting & installing the Python Imaging Library - follow the +directions from +$http://www.python.org/sigs/image-sig/index.html$ or get it directly from +$http://www.pythonware.com/products/pil/$.""") + + +heading3("Instructions for Python novices: Mac") +disc(""" +This is much, much easier with Mac OS X since Python (usually 2.3) is installed on your +system as standard. Just follow the instructions for installing the ReportLab archive +above. +""") + + +heading3("Instructions for Jython (Java implementation of Python) users") + +disc(""" +A port to Java was done in 2004. This involved some changes to the framework +and creating Java equivalents of the C extensions. At the end of this work +the entire output of the test suite produced byte-for-byte identical output. +However, we have not been testng against Jython since, because (a) as far as +we know no one used it, and (b) Jython has not kept up with Python features +which we need to use. We suggest you use ReportLab v1.19 or v1.20 which +were Python-2.1 compatible. We'd welcome test reports and/or a volunteer to +refresh things now that Jython is progressing.""") + +disc(""" +The Jython version was tested under Sun's J2SDK 1.3.1. It is known that under +J2SDK 1.4.0_01 $test_pdfbase_ttfonts.py$ fails horribly with an outOfMemory +exception, probably caused by a JVM bug. +""") + + + + +restartList() + +list(""" +Before installing Jython, make sure you have a supported version of +Java Virtual Machine installed. For the list of supported JVM's see +$http://www.jython.org/platform.html$ +""") + +list(""" +To install Jython, download the setup package from $www.jython.org$ and +follow installation instructions. +""") + +list(""" +To set ReportLab toolkit under Jython PATH, edit $JYTHON_HOME/registry$ file +and include line that tells Jython where to look for packages. To include +ReportLab toolkit under Jython PATH, directory that contains Reportlab +should be included: $python.path=REPORTLAB_HOME_PARENT_DIR$ +For example, if your Reportlab toolkit is installed under $C:\code\\reportlab$ +the path line should be: $python.path=C:\\\\code$ (note two backslashes!) +""") + +heading3("Instructions for IronPython (Python for .NET) users") + +disc(""" +We haven't tackled this yet officially, but IronPython can apparently +run much of our code. We do need to go through the same exercises we did for Jython +- finding the .NET equivalents of _rl_accel, pyRXP, _renderPM and PIL - +to get 100% managed code. Hopefully this will happen soon and we'd be +delighted to work with anyone on this. +""") + + +heading2("Getting Involved") +disc("""ReportLab is an Open Source project. Although we are +a commercial company we provide the core PDF generation +sources freely, even for commercial purposes, and we make no income directly +from these modules. We also welcome help from the community +as much as any other Open Source project. There are many +ways in which you can help:""") + +bullet("""General feedback on the core API. Does it work for you? +Are there any rough edges? Does anything feel clunky and awkward?""") + +bullet("""New objects to put in reports, or useful utilities for the library. +We have an open standard for report objects, so if you have written a nice +chart or table class, why not contribute it?""") + +bullet("""Demonstrations and Case Studies: If you have produced some nice +output, send it to us (with or without scripts). If ReportLab solved a +problem for you at work, write a little 'case study' and send it in. +And if your web site uses our tools to make reports, let us link to it. +We will be happy to display your work (and credit it with your name +and company) on our site!""") + +bullet("""Working on the core code: we have a long list of things +to refine or to implement. If you are missing some features or +just want to help out, let us know!""") + +disc("""The first step for anyone wanting to learn more or +get involved is to join the mailing list. To Subscribe visit +$http://two.pairlist.net/mailman/listinfo/reportlab-users$. +From there you can also browse through the group's archives +and contributions. The mailing list is +the place to report bugs and get support. """) + + +heading2("Site Configuration") +disc("""There are a number of options which most likely need to be configured globally for a site. +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("""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.""") +bullet("""defaultImageCaching: set to zero to inhibit the creation of .a85 files on your +hard-drive. The default is to create these preprocessed PDF compatible image files for faster loading""") +bullet("""T1SearchPath: this is a python list of strings representing directories that +may be queried for information on Type 1 fonts""") +bullet("""TTFSearchPath: this is a python list of strings representing directories that +may be queried for information on TrueType fonts""") +bullet("""CMapSearchPath: this is a python list of strings representing directories that +may be queried for information on font code maps.""") +bullet("""showBoundary: set to non-zero to get boundary lines drawn.""") +bullet("""ZLIB_WARNINGS: set to non-zero to get warnings if the Python compression extension is not found.""") +bullet("""pageComression: set to non-zero to try and get compressed PDF.""") +bullet("""allowtableBoundsErrors: set to 0 to force an error on very large Platypus table elements""") +bullet("""emptyTableAction: Controls behaviour for empty tables, can be 'error' (default), 'indicate' or 'ignore'.""") + + + +heading2("Learning More About Python") + +disc(""" +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: +""") + + +bullet("""Introductory Material on Python. +A list of tutorials on the Python.org web site. +$http://www.python.org/doc/Intros.html$ +""") + + +bullet("""Python Tutorial. +The official Python Tutorial by Guido van Rossum (edited by Fred L. Drake, Jr.) +$http://www.python.org/doc/tut/$ +""") + + +bullet("""Learning to Program. +A tutorial on programming by Alan Gauld. Has a heavy emphasis on +Python, but also uses other languages. +$http://www.freenetpages.co.uk/hp/alan.gauld/$ +""") + + +bullet("""How to think like a computer scientist (Python version). +$http://www.ibiblio.org/obp/thinkCSpy/$ +""") + + +bullet("""Instant Python. +A 6-page minimal crash course by Magnus Lie Hetland. +$http://www.hetland.org/python/instant-python.php$ +""") + + +bullet("""Dive Into Python. +A free Python tutorial for experienced programmers. +$http://diveintopython.org/$ +""") + + +from reportlab.lib.codecharts import SingleByteEncodingChart +from reportlab.tools.docco.stylesheet import getStyleSheet +styles = getStyleSheet() +indent0_style = styles['Indent0'] +indent1_style = styles['Indent1'] + +heading2("What's New in ReportLab 2.0") +disc(""" +Many new features have been added, foremost amongst which is the support +for unicode. This page documents what has changed since version 1.20.""") + +disc(""" +Adding full unicode support meant that we had to break backwards-compatibility, +so old code written for ReportLab 1 will sometimes need changes before it will +run correctly with ReportLab 2. Now that we have made the clean break to +introduce this important new feature, we intend to keep the API +backwards-compatible throughout the 2.* series. +""") +heading3("Goals for the 2.x series") +disc(""" +The main rationale for 2.0 was an incompatible change at the character level: +to properly support Unicode input. Now that it's out we will maintain compatibility +with 2.0. There are no pressing feature wishlists and new features will be driven, +as always, by contributions and the demands of projects.""") + +disc(""" +Our 1.x code base is still Python 2.1 compatible. The new version lets us move forwards +with a baseline of Python 2.4 (2.3 will work too, for the moment, but we don't promise +that going forwards) so we can use newer language features freely in our development.""") + +disc(""" +One area where we do want to make progress from release to release is with documentation +and installability. We'll be looking into better support for distutils, setuptools, +eggs and so on; and into better examples and tools to help people learn what's in the +(substantial) code base.""") + +disc(""" +Bigger ideas and more substantial rewrites are deferred to Version 3.0, with no particular +target dates. +""") + +heading3("Contributions") +disc("""Thanks to everybody who has contributed to the open-source toolkit in the run-up +to the 2.0 release, whether by reporting bugs, sending patches, or contributing to the +reportlab-users mailing list. Thanks especially to the following people, who contributed +code that has gone into 2.0: Andre Reitz, Max M, Albertas Agejevas, T Blatter, Ron Peleg, +Gary Poster, Steve Halasz, Andrew Mercer, Paul McNett, Chad Miller. +""") +todo("""If we missed you, please let us know!""") + +heading3("Unicode support") +disc(""" +This is the Big One, and the reason some apps may break. You must now pass in text either +in UTF-8 or as unicode string objects. The library will handle everything to do with output +encoding. There is more information on this below. +Since this is the biggest change, we'll start by reviewing how it worked in the past.""") + +disc(""" +In ReportLab 1.x, any string input you passed to our APIs was supposed to be in the same +encoding as the font you selected for output. If using the default fonts in Acrobat Reader +(Helvetica/Times/Courier), you would have implicitly used WinAnsi encoding, which is almost +exactly the same as Latin-1. However, if using TrueType fonts, you would have been using UTF-8.""") + +disc("""For Asian fonts, you had a wide choice of encodings but had to specify which one +(e.g Shift-JIS or EUC for Japanese). This state of affairs meant that you had +to make sure that every piece of text input was in the same encoding as the font used +to display it.""") + + + +disc("""Input text encoding is UTF-8 or Python Unicode strings""") +disc(""" +Any text you pass to a canvas API (drawString etc.), Paragraph or other flowable +constructor, into a table cell, or as an attribute of a graphic (e.g. chart.title.text), +is supposed to be unicode. If you use a traditional Python string, it is assumed to be UTF-8. +If you pass a Unicode object, we know it's unicode.""", style=indent1_style) + +disc("""Font encodings""") +disc(""" +Fonts still work in different ways, and the built-in ones will still use WinAnsi or MacRoman +internally while TrueType will use UTF-8. However, the library hides this from you; it converts +as it writes out the PDF file. As before, it's still your job to make sure the font you use has +the characters you need, or you may get either a traceback or a visible error character.""",style=indent1_style) + +disc("""Asian CID fonts""") +disc(""" +You no longer need to specify the encoding for the built-in Asian fonts, just the face name. +ReportLab knows about the standard fonts in Adobe's Asian Language Packs +""", style=indent1_style) + +disc("""Asian Truetype fonts""") +disc(""" +The standard Truetype fonts differ slightly for Asian languages (e.g msmincho.ttc). +These can now be read and used, albeit somewhat inefficiently. +""", style=indent1_style) + +disc("""Asian word wrapping""") +disc(""" +Previously we could display strings in Asian languages, but could not properly +wrap paragraphs as there are no gaps between the words. We now have a basic word wrapping +algorithm. +""", style=indent1_style) + +disc("""unichar tag""") +disc(""" +A convenience tag, <unichar/> has also been added. You can now do +or <unichar name='LATIN SMALL LETTER U WITH DIAERESIS'/> and +get a lowercase u umlaut. Names should be those in the Unicode Character Database. +""", style=indent1_style) + +disc("""Accents, greeks and symbols""") +disc(""" +The correct way to refer to all non-ASCII characters is to use their unicode representation. +This can be literal Unicode or UTF-8. Special symbols and Greek letters (collectively, "greeks") +inserted in paragraphs using the greek tag (e.g. <greek>lambda</greek>) or using the entity +references (e.g. λ) are now processed in a different way than in version 1.""", style=indent1_style) +disc(""" +Previously, these were always rendered using the Zapf Dingbats font. Now they are always output +in the font you specified, unless that font does not support that character. If the font does +not support the character, and the font you specified was an Adobe Type 1 font, Zapf Dingbats +is used as a fallback. However, at present there is no fallback in the case of TTF fonts. +Note that this means that documents that contain greeks and specify a TTF font may need +changing to explicitly specify the font to use for the greek character, or you will see a black +square in place of that character when you view your PDF output in Acrobat Reader. +""", style=indent1_style) + +# Other New Features Section ####################### +heading3("Other New Features") +disc("""PDF""") +disc("""Improved low-level annotation support for PDF "free text annotations" +""", style=indent0_style) +disc("""FreeTextAnnotation allows showing and hiding of an arbitrary PDF "form" +(reusable chunk of PDF content) depending on whether the document is printed or +viewed on-screen, or depending on whether the mouse is hovered over the content, etc. +""", style=indent1_style) + +disc("""TTC font collection files are now readable" +""", style=indent0_style) +disc("""ReportLab now supports using TTF fonts packaged in .TTC files""", style=indent1_style) + +disc("""East Asian font support (CID and TTF)""", style=indent0_style) +disc("""You no longer need to specify the encoding for the built-in Asian fonts, +just the face name. ReportLab knows about the standard fonts in Adobe's Asian Language Packs. +""", style=indent1_style) + +disc("""Native support for JPEG CMYK images""", style=indent0_style) +disc("""ReportLab now takes advantage of PDF's native JPEG CMYK image support, +so that JPEG CMYK images are no longer (lossily) converted to RGB format before including +them in PDF.""", style=indent1_style) + + +disc("""Platypus""") +disc("""Link support in paragraphs""", style=indent0_style) +disc(""" +Platypus paragraphs can now contain link elements, which support both internal links +to the same PDF document, links to other local PDF documents, and URL links to pages on +the web. Some examples:""", style=indent1_style) +disc("""Web links:""", style=indent1_style) +disc("""<link href="http://www.reportlab.com/">ReportLab<link>""", style=styles['Link']) + +disc("""Internal link to current PDF document:""", style=indent1_style) +disc("""<link href="summary">ReportLab<link>""", style=styles['Link']) + +disc("""External link to a PDF document on the local filesystem:""", style=indent1_style) +disc("""<link href="pdf:C:/john/report.pdf">ReportLab<link>""", style=styles['Link']) + +disc("""Improved wrapping support""", style=indent0_style) +disc("""Support for wrapping arbitrary sequence of flowables around an image, using +reportlab.platypus.flowables.ImageAndFlowables (similar to ParagraphAndImage).""" +,style=indent1_style) + +disc("""KeepInFrame""", style=indent0_style) +disc("""Sometimes the length of a piece of text you'd like to include in a fixed piece +of page "real estate" is not guaranteed to be constrained to a fixed maximum length. +In these cases, KeepInFrame allows you to specify an appropriate action to take when +the text is too long for the space allocated for it. In particular, it can shrink the text +to fit, mask (truncate) overflowing text, allow the text to overflow into the rest of the document, +or raise an error.""",style=indent1_style) + + +disc("""Improved convenience features for inserting unicode symbols and other characters +""", style=indent0_style) +disc(""" lets you conveniently insert unicode characters using the standard long name +or code point. Characters inserted with the <greek> tags (e.g. lambda) or corresponding +entity references (e.g. λ) support arbitrary fonts (rather than only Zapf Dingbats).""",style=indent1_style) + +disc("""Improvements to Legending""", style=indent0_style) +disc("""Instead of manual placement, there is now a attachment point (N, S, E, W, etc.), so that +the legend is always automatically positioned correctly relative to the chart. Swatches (the small +sample squares of colour / pattern fill sometimes displayed in the legend) can now be automatically +created from the graph data. Legends can now have automatically-computed totals (useful for +financial applications).""",style=indent1_style) + +disc("""More and better ways to place piechart labels""", style=indent0_style) +disc("""New smart algorithms for automatic pie chart label positioning have been added. +You can now produce nice-looking labels without manual positioning even for awkward cases in +big runs of charts.""",style=indent1_style) + +disc("""Adjustable piechart slice ordering""", style=indent0_style) +disc("""For example. pie charts with lots of small slices can be configured to alternate thin and +thick slices to help the lagel placememt algorithm work better.""",style=indent1_style) +disc("""Improved spiderplots""", style=indent0_style) + + +# Noteworthy bug fixes Section ####################### +heading3("Noteworthy bug fixes") +disc("""Fixes to TTF splitting (patch from Albertas Agejevas)""") +disc("""This affected some documents using font subsetting""", style=indent0_style) + +disc("""Tables with spans improved splitting""") +disc("""Splitting of tables across pages did not work correctly when the table had +row/column spans""", style=indent0_style) + +disc("""Fix runtime error affecting keepWithNext""") diff --git a/bin/reportlab/docs/userguide/ch2_graphics.py b/bin/reportlab/docs/userguide/ch2_graphics.py new file mode 100644 index 00000000000..083b756db5b --- /dev/null +++ b/bin/reportlab/docs/userguide/ch2_graphics.py @@ -0,0 +1,1180 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py +from reportlab.tools.docco.rl_doc_utils import * +from reportlab.lib.codecharts import SingleByteEncodingChart + +heading1("Graphics and Text with $pdfgen$") + +heading2("Basic Concepts") +disc(""" +The $pdfgen$ package is the lowest level interface for +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$. +""") + +disc(""" +The canvas should be thought of as a sheet of white paper +with points on the sheet identified using Cartesian ^(X,Y)^ coordinates +which by default have the ^(0,0)^ origin point at the lower +left corner of the page. Furthermore the first coordinate ^x^ +goes to the right and the second coordinate ^y^ goes up, by +default.""") + +disc(""" +A simple example +program that uses a canvas follows. +""") + +eg(""" + from reportlab.pdfgen import canvas + def hello(c): + c.drawString(100,100,"Hello World") + c = canvas.Canvas("hello.pdf") + hello(c) + c.showPage() + c.save() +""") + +disc(""" +The above code creates a $canvas$ object which will generate +a PDF file named $hello.pdf$ in the current working directory. +It then calls the $hello$ function passing the $canvas$ as an argument. +Finally the $showPage$ method saves the current page of the canvas +and the $save$ method stores the file and closes the canvas.""") + +disc(""" +The $showPage$ method causes the $canvas$ to stop drawing on the +current page and any further operations will draw on a subsequent +page (if there are any further operations -- if not no +new page is created). The $save$ method must be called after the +construction of the document is complete -- it generates the PDF +document, which is the whole purpose of the $canvas$ object. +""") + +heading2("More about the Canvas") +disc(""" +Before describing the drawing operations, we will digress to cover +some of the things which can be done to configure a canvas. There +are many different settings available. If you are new to Python +or can't wait to produce some output, you can skip ahead, but +come back later and read this!""") + +disc("""First of all, we will look at the constructor +arguments for the canvas:""") +eg(""" def __init__(self,filename, + pagesize=(595.27,841.89), + bottomup = 1, + pageCompression=0, + encoding=rl_config.defaultEncoding, + verbosity=0): + """) + +disc("""The $filename$ argument controls the +name of the final PDF file. You +may also pass in any open file object (such as $sys.stdout$, the python process standard output) +and the PDF document will be written to that. Since PDF +is a binary format, you should take care when writing other +stuff before or after it; you can't deliver PDF documents +inline in the middle of an HTML page!""") + +disc("""The $pagesize$ argument is a tuple of two numbers +in points (1/72 of an inch). The canvas defaults to $A4$ (an international standard +page size which differs from the American standard page size of $letter$), +but it is better to explicitly specify it. Most common page +sizes are found in the library module $reportlab.lib.pagesizes$, +so you can use expressions like""") + +eg("""from reportlab.lib.pagesizes import letter, A4 +myCanvas = Canvas('myfile.pdf', pagesize=letter) +width, height = letter #keep for later +""") + +pencilnote() + +disc("""If you have problems printing your document make sure you +are using the right page size (usually either $A4$ or $letter$). +Some printers do not work well with pages that are too large or too small.""") + +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 +define a right margin as $width - inch$ rather than using +a constant. By using variables the margin will still make sense even +if the page size changes.""") + +disc("""The $bottomup$ argument +switches coordinate systems. Some graphics systems (like PDF +and PostScript) place (0,0) at the bottom left of the page +others (like many graphical user interfaces [GUI's]) place the origen at the top left. The +$bottomup$ argument is deprecated and may be dropped in future""") + +todo("""Need to see if it really works for all tasks, and if not + then get rid of it""") + +disc("""The $pageCompression$ option determines whether the stream +of PDF operations for each page is compressed. By default +page streams are not compressed, because the compression slows the file generation process. +If output size is important set $pageCompression=1$, but remember that, compressed documents will +be smaller, but slower to generate. Note that images are always compressed, and this option +will only save space if you have a very large amount of text and vector graphics +on each page.""") + +disc("""The $encoding$ argument is largely obsolete in version 2.0 and can +probably be omitted by 99% of users. Its default value is fine unless you +very specifically need to use one of the 25 or so characters which are present +in MacRoman and not in Winansi. A useful reference to these is here: +http://www.alanwood.net/demos/charsetdiffs.html. + +The parameter determines which font encoding is used for the +standard Type 1 fonts; this should correspond to the encoding on your system. +Note that this is the encoding used internally by the font; text you +pass to the ReportLab toolkit for rendering should always either be a Python +unicode string object or a UTF-8 encoded byte string (see the next chapter)! +The font encoding has two values at present: $'WinAnsiEncoding'$ or +$'MacRomanEncoding'$. The variable $rl_config.defaultEncoding$ above points +to the former, which is standard on Windows, Mac OS X and many Unices +(including Linux). If you are Mac user and don't have OS X, you may want to +make a global change: modify the line at the top of +reportlab/pdfbase/pdfdoc.py to switch it over. Otherwise, you can +probably just ignore this argument completely and never pass it. For all TTF +and the commonly-used CID fonts, the encoding you pass in here is ignored, +since the reportlab library itself knows the right encodings in those +cases.""") + +disc("""The demo script $reportlab/demos/stdfonts.py$ +will print out two test documents showing all code points +in all fonts, so you can look up characters. Special +characters can be inserted into string commands with +the usual Python escape sequences; for example \\101 = 'A'.""") + +disc("""The $verbosity$ argument determines how much log +information is printed. By default, it is zero to assist +applications which want to capture PDF from standard output. +With a value of 1, you will get a confirmation message +each time a document is generated. Higher numbers may +give more output in future.""") + +todo("to do - all the info functions and other non-drawing stuff") + + + + + +todo("""Cover all constructor arguments, and setAuthor etc.""") + +heading2("Drawing Operations") +disc(""" +Suppose the $hello$ function referenced above is implemented as +follows (we will not explain each of the operations in detail +yet). +""") + +eg(examples.testhello) + +disc(""" +Examining this code notice that there are essentially two types +of operations performed using a canvas. The first type draws something +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. +""") + +disc(""" +If we imagine the program as a painter working on +the canvas the "draw" operations apply paint to the canvas using +the current set of tools (colors, line styles, fonts, etcetera) +and the "state change" operations change one of the current tools +(changing the fill color from whatever it was to blue, or changing +the current font to $Times-Roman$ in 15 points, for example). +""") + +disc(""" +The document generated by the "hello world" program listed above would contain +the following graphics. +""") + +illust(examples.hello, '"Hello World" in pdfgen') + +heading3("About the demos in this document") + +disc(""" +This document contains demonstrations of the code discussed like the one shown +in the rectangle above. These demos are drawn on a "tiny page" embedded +within the real pages of the guide. The tiny pages are %s inches wide +and %s inches tall. The demo displays show the actual output of the demo code. +For convenience the size of the output has been reduced slightly. +""" % (examplefunctionxinches, examplefunctionyinches)) + +heading2('The tools: the "draw" operations') + +disc(""" +This section briefly lists the tools available to the program +for painting information onto a page using the canvas interface. +These will be discussed in detail in later sections. They are listed +here for easy reference and for summary purposes. +""") + +heading3("Line methods") + +eg("""canvas.line(x1,y1,x2,y2)""") +eg("""canvas.lines(linelist)""") + +disc(""" +The line methods draw straight line segments on the canvas. +""") + +heading3("Shape methods") + +eg("""canvas.grid(xlist, ylist) """) +eg("""canvas.bezier(x1, y1, x2, y2, x3, y3, x4, y4)""") +eg("""canvas.arc(x1,y1,x2,y2) """) +eg("""canvas.rect(x, y, width, height, stroke=1, fill=0) """) +eg("""canvas.ellipse(x1,y1, x2,y2, stroke=1, fill=0)""") +eg("""canvas.wedge(x1,y1, x2,y2, startAng, extent, stroke=1, fill=0) """) +eg("""canvas.circle(x_cen, y_cen, r, stroke=1, fill=0)""") +eg("""canvas.roundRect(x, y, width, height, radius, stroke=1, fill=0) """) + +disc(""" +The shape methods draw common complex shapes on the canvas. +""") + +heading3("String drawing methods") + +eg("""canvas.drawString(x, y, text):""") +eg("""canvas.drawRightString(x, y, text) """) +eg("""canvas.drawCentredString(x, y, text)""") + +disc(""" +The draw string methods draw single lines of text on the canvas. +""") + +heading3("The text object methods") +eg("""textobject = canvas.beginText(x, y) """) +eg("""canvas.drawText(textobject) """) + +disc(""" +Text objects are used to format text in ways that +are not supported directly by the $canvas$ interface. +A program creates a text object from the $canvas$ using $beginText$ +and then formats text by invoking $textobject$ methods. +Finally the $textobject$ is drawn onto the canvas using +$drawText$. +""") + +heading3("The path object methods") + +eg("""path = canvas.beginPath() """) +eg("""canvas.drawPath(path, stroke=1, fill=0) """) +eg("""canvas.clipPath(path, stroke=1, fill=0) """) + +disc(""" +Path objects are similar to text objects: they provide dedicated control +for performing complex graphical drawing not directly provided by the +canvas interface. A program creates a path object using $beginPath$ +populates the path with graphics using the methods of the path object +and then draws the path on the canvas using $drawPath$.""") + +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. +""") + +heading3("Image methods") +pencilnote() +disc(""" +You need the Python Imaging Library (PIL) to use images with the ReportLab package. +Examnples of the techniques below can be found by running the script $test_pdfgen_general.py$ +in our $test$ subdirectory and looking at page 7 of the output. +""") + +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 +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, +$drawInlineImage$, stores bitmaps within the page stream and is thus very +inefficient if you use the same image more than once in a document; but can result +in PDFs which render faster if the images are very small and not repeated. We'll +discuss the oldest one first: +""") + +eg("""canvas.drawInlineImage(self, image, x,y, width=None,height=None) """) + +disc(""" +The $drawInlineImage$ method places an image on the canvas. The $image$ +parameter may be either a PIL Image object or an image filename. Many common +file formats are accepted including GIF and JPEG. It returns the size of the actual +image in pixels as a (width, height) tuple. +""") + +eg("""canvas.drawImage(self, image, x,y, width=None,height=None,mask=None) """) +disc(""" +The arguments and return value work as for $drawInlineImage$. However, we use a caching +system; a given image will only be stored the first time it is used, and just referenced +on subsequent use. If you supply a filename, it assumes that the same filename +means the same image. If you supply a PIL image, it tests if the content +has actually changed before re-embedding.""") + +disc(""" +The $mask$ parameter lets you create transparent images. It takes 6 numbers +and defines the range of RGB values which will be masked out or treated as +transparent. For example with [0,2,40,42,136,139], it will mask out any pixels +with a Red value from 0 or 1, Green from 40 or 41 and Blue of 136, 137 or 138 +(on a scale of 0-255). It's currently your job to know which color is the +'transparent' or background one.""") + +disc("""PDF allows for many image features and we will expose more of the over +time, probably with extra keyword arguments to $drawImage$.""") + +heading3("Ending a page") + +eg("""canvas.showPage()""") + +disc("""The $showPage$ method finishes the current page. All additional drawing will +be done on another page.""") + +pencilnote() + +disc("""Warning! All state changes (font changes, color settings, geometry transforms, etcetera) +are FORGOTTEN when you advance to a new page in $pdfgen$. Any state settings you wish to preserve +must be set up again before the program proceeds with drawing!""") + +heading2('The toolbox: the "state change" operations') + +disc(""" +This section briefly lists the ways to switch the tools used by the +program +for painting information onto a page using the $canvas$ interface. +These too will be discussed in detail in later sections. +""") + +heading3("Changing Colors") +eg("""canvas.setFillColorCMYK(c, m, y, k) """) +eg("""canvas.setStrikeColorCMYK(c, m, y, k) """) +eg("""canvas.setFillColorRGB(r, g, b) """) +eg("""canvas.setStrokeColorRGB(r, g, b) """) +eg("""canvas.setFillColor(acolor) """) +eg("""canvas.setStrokeColor(acolor) """) +eg("""canvas.setFillGray(gray) """) +eg("""canvas.setStrokeGray(gray) """) + +disc(""" +PDF supports three different color models: gray level, additive (red/green/blue or RGB), and +subtractive with darkness parameter (cyan/magenta/yellow/darkness or CMYK). +The ReportLab packages also provide named colors such as $lawngreen$. There are two +basic color parameters in the graphics state: the $Fill$ color for the interior of graphic +figures and the $Stroke$ color for the boundary of graphic figures. The above methods +support setting the fill or stroke color using any of the four color specifications. +""") + +heading3("Changing Fonts") +eg("""canvas.setFont(psfontname, size, leading = None) """) + +disc(""" +The $setFont$ method changes the current text font to a given type and size. +The $leading$ parameter specifies the distance down to move when advancing from +one text line to the next. +""") + +heading3("Changing Graphical Line Styles") + +eg("""canvas.setLineWidth(width) """) +eg("""canvas.setLineCap(mode) """) +eg("""canvas.setLineJoin(mode) """) +eg("""canvas.setMiterLimit(limit) """) +eg("""canvas.setDash(self, array=[], phase=0) """) + +disc(""" +Lines drawn in PDF can be presented in a number of graphical styles. +Lines can have different widths, they can end in differing cap styles, +they can meet in different join styles, and they can be continuous or +they can be dotted or dashed. The above methods adjust these various parameters.""") + +heading3("Changing Geometry") + +eg("""canvas.setPageSize(pair) """) +eg("""canvas.transform(a,b,c,d,e,f): """) +eg("""canvas.translate(dx, dy) """) +eg("""canvas.scale(x, y) """) +eg("""canvas.rotate(theta) """) +eg("""canvas.skew(alpha, beta) """) + +disc(""" +All PDF drawings fit into a specified page size. Elements drawn outside of the specified +page size are not visible. Furthermore all drawn elements are passed through an affine +transformation which may adjust their location and/or distort their appearence. The +$setPageSize$ method adjusts the current page size. The $transform$, $translate$, $scale$, +$rotate$, and $skew$ methods add additional transformations to the current transformation. +It is important to remember that these transformations are incremental -- a new +transform modifies the current transform (but does not replace it). +""") + +heading3("State control") + +eg("""canvas.saveState() """) +eg("""canvas.restoreState() """) + +disc(""" +Very often it is important to save the current font, graphics transform, line styles and +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. +You cannot save the state on one page and restore +it on the next, however -- no state is preserved between pages.""") + +heading2("Other $canvas$ methods.") + +disc(""" +Not all methods of the $canvas$ object fit into the "tool" or "toolbox" +categories. Below are some of the misfits, included here for completeness. +""") + +eg(""" + canvas.setAuthor() + canvas.addOutlineEntry(title, key, level=0, closed=None) + canvas.setTitle(title) + canvas.setSubject(subj) + canvas.pageHasData() + canvas.showOutline() + canvas.bookmarkPage(name) + canvas.bookmarkHorizontalAbsolute(name, yhorizontal) + canvas.doForm() + canvas.beginForm(name, lowerx=0, lowery=0, upperx=None, uppery=None) + canvas.endForm() + canvas.linkAbsolute(contents, destinationname, Rect=None, addtopage=1, name=None, **kw) + canvas.getPageNumber() + canvas.addLiteral() + canvas.getAvailableFonts() + canvas.stringWidth(self, text, fontName, fontSize, encoding=None) + canvas.setPageCompression(onoff=1) + canvas.setPageTransition(self, effectname=None, duration=1, + direction=0,dimension='H',motion='I') +""") + + +heading2('Coordinates (default user space)') + +disc(""" +By default locations on a page are identified by a pair of numbers. +For example the pair $(4.5*inch, 1*inch)$ identifies the location +found on the page by starting at the lower left corner and moving to +the right 4.5 inches and up one inch. +""") + +disc("""For example, the following function draws +a number of elements on a $canvas$.""") + +eg(examples.testcoords) + +disc("""In the default user space the "origin" ^(0,0)^ point is at the lower +left corner. Executing the $coords$ function in the default user space +(for the "demo minipage") we obtain the following.""") + +illust(examples.coords, 'The Coordinate System') + +heading3("Moving the origin: the $translate$ method") + +disc("""Often it is useful to "move the origin" to a new point off +the lower left corner. The $canvas.translate(^x,y^)$ method moves the origin +for the current page to the point currently identified by ^(x,y)^.""") + +disc("""For example the following translate function first moves +the origin before drawing the same objects as shown above.""") + +eg(examples.testtranslate) + +disc("""This produces the following.""") + +illust(examples.translate, "Moving the origin: the $translate$ method") + + +#illust(NOP) # execute some code + +pencilnote() + + +disc(""" +Note: 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 +it is possible that all the drawn objects are off the page. +""") + +heading3("Shrinking and growing: the scale operation") + +disc("""Another important operation is scaling. The scaling operation $canvas.scale(^dx,dy^)$ +stretches or shrinks the ^x^ and ^y^ dimensions by the ^dx^, ^dy^ factors respectively. Often +^dx^ and ^dy^ are the same -- for example to reduce a drawing by half in all dimensions use +$dx = dy = 0.5$. However for the purposes of illustration we show an example where +$dx$ and $dy$ are different. +""") + +eg(examples.testscale) + +disc("""This produces a "short and fat" reduced version of the previously displayed operations.""") + +illust(examples.scale, "Scaling the coordinate system") + + +#illust(NOP) # execute some code + +pencilnote() + + +disc("""Note: scaling may also move objects or parts of objects off the page, +or may cause objects to "shrink to nothing." """) + +disc("""Scaling and translation can be combined, but the order of the +operations are important.""") + +eg(examples.testscaletranslate) + +disc("""This example function first saves the current $canvas$ state +and then does a $scale$ followed by a $translate$. Afterward the function +restores the state (effectively removing the effects of the scaling and +translation) and then does the same operations in a different order. +Observe the effect below.""") + +illust(examples.scaletranslate, "Scaling and Translating") + + +#illust(NOP) # execute some code + +pencilnote() + + +disc("""Note: scaling shrinks or grows everything including line widths +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). +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 +the units externally before rendering them using the canvas.""") + +heading3("Saving and restoring the $canvas$ state: $saveState$ and $restoreState$") + +disc(""" +The $scaletranslate$ function used an important feature of the $canvas$ object: +the ability to save and restore the current parameters of the $canvas$. +By enclosing a sequence of operations in a matching pair of $canvas.saveState()$ +an $canvas.restoreState()$ operations all changes of font, color, line style, +scaling, translation, or other aspects of the $canvas$ graphics state can be +restored to the state at the point of the $saveState()$. Remember that the save/restore +calls must match: a stray save or restore operation may cause unexpected +and undesirable behavior. Also, remember that no $canvas$ state is +preserved across page breaks, and the save/restore mechanism does not work +across page breaks. +""") + +heading3("Mirror image") + +disc(""" +It is interesting although perhaps not terribly useful to note that +scale factors can be negative. For example the following function +""") + +eg(examples.testmirror) + +disc(""" +creates a mirror image of the elements drawn by the $coord$ function. +""") + +illust(examples.mirror, "Mirror Images") + +disc(""" +Notice that the text strings are painted backwards. +""") + +heading2("Colors") + +disc(""" +There are four ways to specify colors in $pdfgen$: by name (using the $color$ +module, by red/green/blue (additive, $RGB$) value, +by cyan/magenta/yellow/darkness (subtractive, $CMYK$), or by gray level. +The $colors$ function below exercises each of the four methods. +""") + +eg(examples.testcolors) + +disc(""" +The $RGB$ or additive color specification follows the way a computer +screen adds different levels of the red, green, or blue light to make +any color, where white is formed by turning all three lights on full +$(1,1,1)$.""") + +disc("""The $CMYK$ or subtractive method follows the way a printer +mixes three pigments (cyan, magenta, and yellow) to form colors. +Because mixing chemicals is more difficult than combining light there +is a fourth parameter for darkness. For example a chemical +combination of the $CMY$ pigments generally never makes a perfect +black -- instead producing a muddy color -- so, to get black printers +don't use the $CMY$ pigments but use a direct black ink. Because +$CMYK$ maps more directly to the way printer hardware works it may +be the case that colors specified in $CMYK$ will provide better fidelity +and better control when printed. +""") + +illust(examples.colors, "Color Models") + +heading2('Painting back to front') + +disc(""" +Objects may be painted over other objects to good effect in $pdfgen$. As +in painting with oils the object painted last will show up on top. For +example, the $spumoni$ function below paints up a base of colors and then +paints a white text over the base. +""") + +eg(examples.testspumoni) + +disc(""" +The word "SPUMONI" is painted in white over the colored rectangles, +with the apparent effect of "removing" the color inside the body of +the word. +""") + +illust(examples.spumoni, "Painting over colors") + +disc(""" +The last letters of the word are not visible because the default $canvas$ +background is white and painting white letters over a white background +leaves no visible effect. +""") + +disc(""" +This method of building up complex paintings in layers can be done +in very many layers in $pdfgen$ -- there are fewer physical limitations +than there are when dealing with physical paints. +""") + +eg(examples.testspumoni2) + +disc(""" +The $spumoni2$ function layers an ice cream cone over the +$spumoni$ drawing. Note that different parts of the cone +and scoops layer over eachother as well. +""") +illust(examples.spumoni2, "building up a drawing in layers") + + +heading2('Standard fonts and text objects') + +disc(""" +Text may be drawn in many different colors, fonts, and sizes in $pdfgen$. +The $textsize$ function demonstrates how to change the color and font and +size of text and how to place text on the page. +""") + +eg(examples.testtextsize) + +disc(""" +The $textsize$ function generates the following page. +""") + +illust(examples.textsize, "text in different fonts and sizes") + +disc(""" +A number of different fonts are always available in $pdfgen$. +""") + +eg(examples.testfonts) + +disc(""" +The $fonts$ function lists the fonts that are always available. +These don't need to be stored in a PDF document, since they +are guaranteed to be present in Acrobat Reader. +""") + +illust(examples.fonts, "the 14 standard fonts") + +disc(""" +For information on how to use arbitrary fonts, see the next chapter. +""") + + +heading2("Text object methods") + +disc(""" +For the dedicated presentation of text in a PDF document, use a text object. +The text object interface provides detailed control of text layout parameters +not available directly at the $canvas$ level. In addition, it results in smaller +PDF that will render faster than many separate calls to the $drawString$ methods. +""") + +eg("""textobject.setTextOrigin(x,y)""") +eg("""textobject.setTextTransform(a,b,c,d,e,f)""") +eg("""textobject.moveCursor(dx, dy) # from start of current LINE""") +eg("""(x,y) = textobject.getCursor()""") +eg("""x = textobject.getX(); y = textobject.getY()""") +eg("""textobject.setFont(psfontname, size, leading = None)""") +eg("""textobject.textOut(text)""") +eg("""textobject.textLine(text='')""") +eg("""textobject.textLines(stuff, trim=1)""") + +disc(""" +The text object methods shown above relate to basic text geometry. +""") + +disc(""" +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. +""") + +eg(examples.testcursormoves1) + +disc(""" +The $cursormoves$ function relies on the automatic +movement of the text cursor for placing text after the origin +has been set. +""") + +illust(examples.cursormoves1, "How the text cursor moves") + +disc(""" +It is also possible to control the movement of the cursor +more explicitly by using the $moveCursor$ method (which moves +the cursor as an offset from the start of the current line +NOT the current cursor, and which also has positive ^y^ offsets +move down (in contrast to the normal geometry where +positive ^y^ usually moves up. +""") + +eg(examples.testcursormoves2) + +disc(""" +Here the $textOut$ does not move the down a line in contrast +to the $textLine$ function which does move down. +""") + +illust(examples.cursormoves2, "How the text cursor moves again") + +heading3("Character Spacing") + +eg("""textobject.setCharSpace(charSpace)""") + +disc("""The $setCharSpace$ method adjusts one of the parameters of text -- the inter-character +spacing.""") + +eg(examples.testcharspace) + +disc("""The +$charspace$ function exercises various spacing settings. +It produces the following page.""") + +illust(examples.charspace, "Adjusting inter-character spacing") + +heading3("Word Spacing") + +eg("""textobject.setWordSpace(wordSpace)""") + +disc("The $setWordSpace$ method adjusts the space between words.") + +eg(examples.testwordspace) + +disc("""The $wordspace$ function shows what various word space settings +look like below.""") + +illust(examples.wordspace, "Adjusting word spacing") + +heading3("Horizontal Scaling") + +eg("""textobject.setHorizScale(horizScale)""") + +disc("""Lines of text can be stretched or shrunken horizontally by the +$setHorizScale$ method.""") + +eg(examples.testhorizontalscale) + +disc("""The horizontal scaling parameter ^horizScale^ +is given in percentages (with 100 as the default), so the 80 setting +shown below looks skinny. +""") +illust(examples.horizontalscale, "adjusting horizontal text scaling") + +heading3("Interline spacing (Leading)") + +eg("""textobject.setLeading(leading)""") + +disc("""The vertical offset between the point at which one +line starts and where the next starts is called the leading +offset. The $setLeading$ method adjusts the leading offset. +""") + +eg(examples.testleading) + +disc("""As shown below if the leading offset is set too small +characters of one line my write over the bottom parts of characters +in the previous line.""") + +illust(examples.leading, "adjusting the leading") + +heading3("Other text object methods") + +eg("""textobject.setTextRenderMode(mode)""") + +disc("""The $setTextRenderMode$ method allows text to be used +as a forground for clipping background drawings, for example.""") + +eg("""textobject.setRise(rise)""") + +disc(""" +The $setRise$ method raises or lowers text on the line +(for creating superscripts or subscripts, for example). +""") + +eg("""textobject.setFillColor(aColor); +textobject.setStrokeColor(self, aColor) +# and similar""") + +disc(""" +These color change operations change the color of the text and are otherwise +similar to the color methods for the $canvas$ object.""") + +heading2('Paths and Lines') + +disc("""Just as textobjects are designed for the dedicated presentation +of text, path objects are designed for the dedicated construction of +graphical figures. When path objects are drawn onto a $canvas$ they +are drawn as one figure (like a rectangle) and the mode of drawing +for the entire figure can be adjusted: the lines of the figure can +be drawn (stroked) or not; the interior of the figure can be filled or +not; and so forth.""") + +disc(""" +For example the $star$ function uses a path object +to draw a star +""") + +eg(examples.teststar) + +disc(""" +The $star$ function has been designed to be useful in illustrating +various line style parameters supported by $pdfgen$. +""") + +illust(examples.star, "line style parameters") + +heading3("Line join settings") + +disc(""" +The $setLineJoin$ method can adjust whether line segments meet in a point +a square or a rounded vertex. +""") + +eg(examples.testjoins) + +disc(""" +The line join setting is only really of interest for thick lines because +it cannot be seen clearly for thin lines. +""") + +illust(examples.joins, "different line join styles") + +heading3("Line cap settings") + +disc("""The line cap setting, adjusted using the $setLineCap$ method, +determines whether a terminating line +ends in a square exactly at the vertex, a square over the vertex +or a half circle over the vertex. +""") + +eg(examples.testcaps) + +disc("""The line cap setting, like the line join setting, is only clearly +visible when the lines are thick.""") + +illust(examples.caps, "line cap settings") + +heading3("Dashes and broken lines") + +disc(""" +The $setDash$ method allows lines to be broken into dots or dashes. +""") + +eg(examples.testdashes) + +disc(""" +The patterns for the dashes or dots can be in a simple on/off repeating pattern +or they can be specified in a complex repeating pattern. +""") + +illust(examples.dashes, "some dash patterns") + +heading3("Creating complex figures with path objects") + +disc(""" +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. +This function will be used later on as part of a +pencil icon construction. +""") + +eg(examples.testpenciltip) + +disc(""" +Note that the interior of the pencil tip is filled +as one object even though it is constructed from +several lines and curves. The pencil lead is then +drawn over it using a new path object. +""") + +illust(examples.penciltip, "a pencil tip") + +heading2('Rectangles, circles, ellipses') + +disc(""" +The $pdfgen$ module supports a number of generally useful shapes +such as rectangles, rounded rectangles, ellipses, and circles. +Each of these figures can be used in path objects or can be drawn +directly on a $canvas$. For example the $pencil$ function below +draws a pencil icon using rectangles and rounded rectangles with +various fill colors and a few other annotations. +""") + +eg(examples.testpencil) + +pencilnote() + +disc(""" +Note that this function is used to create the "margin pencil" to the left. +Also note that the order in which the elements are drawn are important +because, for example, the white rectangles "erase" parts of a black rectangle +and the "tip" paints over part of the yellow rectangle. +""") + +illust(examples.pencil, "a whole pencil") + +heading2('Bezier curves') + +disc(""" +Programs that wish to construct figures with curving borders +generally use Bezier curves to form the borders. +""") + +eg(examples.testbezier) + +disc(""" +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)$ +and the line segment from $(x3,y3)$ to $(x4,y4)$ +both form tangents to the curve. Furthermore the +curve is entirely contained in the convex figure with vertices +at the control points. +""") + +illust(examples.bezier, "basic bezier curves") + +disc(""" +The drawing above (the output of $testbezier$) shows +a bezier curves, the tangent lines defined by the control points +and the convex figure with vertices at the control points. +""") + +heading3("Smoothly joining bezier curve sequences") + +disc(""" +It is often useful to join several bezier curves to form a +single smooth curve. To construct a larger smooth curve from +several bezier curves make sure that the tangent lines to adjacent +bezier curves that join at a control point lie on the same line. +""") + +eg(examples.testbezier2) + +disc(""" +The figure created by $testbezier2$ describes a smooth +complex curve because adjacent tangent lines "line up" as +illustrated below. +""") + +illust(examples.bezier2, "bezier curves") + +heading2("Path object methods") + +disc(""" +Path objects build complex graphical figures by setting +the "pen" or "brush" at a start point on the canvas and drawing +lines or curves to additional points on the canvas. Most operations +apply paint on the canvas starting at the end point of the last +operation and leave the brush at a new end point. +""") + +eg("""pathobject.moveTo(x,y)""") + +disc(""" +The $moveTo$ method lifts the brush (ending any current sequence +of lines or curves if there is one) and replaces the brush at the +new ^(x,y)^ location on the canvas to start a new path sequence. +""") + +eg("""pathobject.lineTo(x,y)""") + +disc(""" +The $lineTo$ method paints straight line segment from the current brush +location to the new ^(x,y)^ location. +""") + +eg("""pathobject.curveTo(x1, y1, x2, y2, x3, y3) """) + +disc(""" +The $curveTo$ method starts painting a Bezier curve beginning at +the current brush location, using ^(x1,y1)^, ^(x2,y2)^, and ^(x3,y3)^ +as the other three control points, leaving the brush on ^(x3,y3)^. +""") + +eg("""pathobject.arc(x1,y1, x2,y2, startAng=0, extent=90) """) + +eg("""pathobject.arcTo(x1,y1, x2,y2, startAng=0, extent=90) """) + +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 +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 +the ellipse. The $startAng$ is an angle (in degrees) specifying where to begin +the partial ellipse where the 0 angle is the midpoint of the right border of the enclosing +rectangle (when ^(x1,y1)^ is the lower left corner and ^(x2,y2)^ is the upper +right corner). The $extent$ is the angle in degrees to traverse on the ellipse. +""") + +eg(examples.testarcs) + +disc("""The $arcs$ function above exercises the two partial ellipse methods. +It produces the following drawing.""") + +illust(examples.arcs, "arcs in path objects") + +eg("""pathobject.rect(x, y, width, height) """) + +disc("""The $rect$ method draws a rectangle with lower left corner +at ^(x,y)^ of the specified ^width^ and ^height^.""") + +eg("""pathobject.ellipse(x, y, width, height)""") + +disc("""The $ellipse$ method +draws an ellipse enclosed in the rectange with lower left corner +at ^(x,y)^ of the specified ^width^ and ^height^. +""") + +eg("""pathobject.circle(x_cen, y_cen, r) """) + +disc("""The $circle$ method +draws a circle centered at ^(x_cen, y_cen)^ with radius ^r^. +""") + +eg(examples.testvariousshapes) + +disc(""" +The $variousshapes$ function above shows a rectangle, circle and ellipse +placed in a frame of reference grid. +""") + +illust(examples.variousshapes, "rectangles, circles, ellipses in path objects") + +eg("""pathobject.close() """) + +disc(""" +The $close$ method closes the current graphical figure +by painting a line segment from the last point of the figure +to the starting point of the figure (the the most +recent point where the brush was placed on the paper by $moveTo$ +or $arc$ or other placement operations). +""") + +eg(examples.testclosingfigures) + +disc(""" +The $closingfigures$ function illustrates the +effect of closing or not closing figures including a line +segment and a partial ellipse. +""") + +illust(examples.closingfigures, "closing and not closing pathobject figures") + +disc(""" +Closing or not closing graphical figures effects only the stroked outline +of a figure, not the filling of the figure as illustrated above. +""") + + +disc(""" +For a more extensive example of drawing using a path object +examine the $hand$ function. +""") + +eg(examples.testhand) + +disc(""" +In debug mode (the default) the $hand$ function shows the tangent line segments +to the bezier curves used to compose the figure. Note that where the segments +line up the curves join smoothly, but where they do not line up the curves show +a "sharp edge". +""") + +illust(examples.hand, "an outline of a hand using bezier curves") + +disc(""" +Used in non-debug mode the $hand$ function only shows the +Bezier curves. With the $fill$ parameter set the figure is +filled using the current fill color. +""") + +eg(examples.testhand2) + +disc(""" +Note that the "stroking" of the border draws over the interior fill where +they overlap. +""") + +illust(examples.hand2, "the finished hand, filled") + + + +heading2("Further Reading: The ReportLab Graphics Library") + +disc(""" +So far the graphics we have seen was created on a fairly low level. +It should be noted, though, that there is another way of creating +much more sophisticated graphics using the emerging dedicated +high-level ReportLab Graphics Library. +""") + +disc(""" +It can be used to produce high-quality, platform-independant, +reusable graphics for different output formats (vector and bitmap) +like PDF, EPS and soon others like SVG. +""") + +disc(""" +A thorough description of its philsophy and features is beyond the +scope of this general user guide and the reader is recommended to +continue with the "ReportLab Graphics Guide". +There she will find information about the existing components and +how to create customized ones. +""") + +disc(""" +Also, the graphics guide contains a presentation of an emerging +charting package and its components (labels, axes, legends and +different types of charts like bar, line and pie charts) that +builds directly on the graphics library. +""") + + +##### FILL THEM IN diff --git a/bin/reportlab/docs/userguide/ch2a_fonts.py b/bin/reportlab/docs/userguide/ch2a_fonts.py new file mode 100644 index 00000000000..460305d42a1 --- /dev/null +++ b/bin/reportlab/docs/userguide/ch2a_fonts.py @@ -0,0 +1,513 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py +from reportlab.tools.docco.rl_doc_utils import * +from reportlab.lib.codecharts import SingleByteEncodingChart +from reportlab.platypus import Image +import reportlab + +heading1("Fonts and encodings") + +disc(""" +This chapter covers fonts, encodings and Asian language capabilities. +If you are purely concerned with generating PDFs for Western +European languages, you can just read the "Unicode is the default" section +below and skip the rest on a first reading. +We expect this section to grow considerably over time. We +hope that Open Source will enable us to give better support for +more of the world's languages than other tools, and we welcome +feedback and help in this area. +""") + +heading2("Unicode and UTF8 are the default input encodings") + +disc(""" +Starting with reportlab Version 2.0 (May 2006), all text input you +provide to our APIs should be in UTF8 or as Python Unicode objects. +This applies to arguments to canvas.drawString and related APIs, +table cell content, drawing object parameters, and paragraph source +text. +""") + + +disc(""" +We considered making the input encoding configurable or even locale-dependent, +but decided that "explicit is better than implicit".""") + +disc(""" +This simplifies many things we used to do previously regarding greek +letters, symbols and so on. To display any character, find out its +unicode code point, and make sure the font you are using is able +to display it.""") + +disc(""" +If you are adapting a ReportLab 1.x application, or reading data from +another source which contains single-byte data (e.g. latin-1 or WinAnsi), +you need to do a conversion into Unicode. The Python codecs package now +includes converters for all the common encodings, including Asian ones. +""") + + + +disc(u""" +If your data is not encoded as UTF8, you will get a UnicodeDecodeError as +soon as you feed in a non-ASCII character. For example, this snippet below is +attempting to read in and print a series of names, including one with a French +accent: ^Marc-Andr\u00e9 Lemburg^. The standard error is quite helpful and tells you +what character it doesn't like: +""") + +eg(u""" +>>> from reportlab.pdfgen.canvas import Canvas +>>> c = Canvas('temp.pdf') +>>> y = 700 +>>> for line in file('latin_python_gurus.txt','r'): +... c.drawString(100, y, line.strip()) +... +Traceback (most recent call last): +... +UnicodeDecodeError: 'utf8' codec can't decode bytes in position 9-11: invalid data +-->\u00e9 L<--emburg +>>> +""") + + +disc(""" +The simplest fix is just to convert your data to unicode, saying which encoding +it comes from, like this:""") + +eg(""" +>>> for line in file('latin_input.txt','r'): +... uniLine = unicode(line, 'latin-1') +... c.drawString(100, y, uniLine.strip()) +>>> +>>> c.save() +""") + + +heading2("Changing the built-in fonts output encoding") + +disc(""" +There are still a number of places in the code, including the rl_config +defaultEncoding parameter, and arguments passed to various Font constructors. +These generally relate to the OUTPUT encoding used when we write data in the font +file. This affects which characters are actually available in the font if +you are using Type 1 fonts, since only 256 glyphs can be available at +one time. Unless you have a very specific need for +MacRoman or MacExpert encoding characters, we advise you to ignore +this. By default the standard fonts (Helvetica, Courier, Times Roman) +will offer the glyphs available in Latin-1. If you try to print a non-Latin-1 +character using the built-in Helvetica, you'll see a rectangle or blob. + +""") + + +heading2("Using non-standard Type 1 fonts") + +disc(""" +As discussed in the previous chapter, every copy of Acrobat Reader +comes with 14 standard fonts built in. Therefore, the ReportLab +PDF Library only needs to refer to these by name. If you want +to use other fonts, they must be available to your code and +will be embedded in the PDF document.""") + +disc(""" +You can use the mechanism described below to include arbitrary +fonts in your documents. Just van Rossum has kindly donated a Type 1 +font named LettErrorRobot-Chrome which we may +use for testing and/or documenting purposes (and which you may +use as well). It comes bundled with the ReportLab distribution in the +directory $reportlab/fonts$. +""") + +disc(""" +Right now font-embedding relies on font description files in the Adobe +AFM ('Adobe Font Metrics') and PFB ('Printer Font Binary') format. The +former is an ASCII file and contains information about the characters +('glyphs') in the font such as height, width, bounding box info and +other 'metrics', while the latter is a binary file that describes the +shapes of the font. The $reportlab/fonts$ directory contains the files +$'LeERC___.AFM'$ and $'LeERC___.PFB'$ that are used as an example +font. +""") + +disc(""" +In the following example locate the folder containing the test font and +register it for future use with the $pdfmetrics$ module, +after which we can use it like any other standard font. +""") + + +eg(""" +import os +import reportlab +folder = os.path.dirname(reportlab.__file__) + os.sep + 'fonts' +afmFile = os.path.join(folder, 'LeERC___.AFM') +pfbFile = os.path.join(folder, 'LeERC___.PFB') + +from reportlab.pdfbase import pdfmetrics +justFace = pdfmetrics.EmbeddedType1Face(afmFile, pfbFile) +faceName = 'LettErrorRobot-Chrome' # pulled from AFM file +pdfmetrics.registerTypeFace(justFace) +justFont = pdfmetrics.Font('LettErrorRobot-Chrome', + faceName, + 'WinAnsiEncoding') +pdfmetrics.registerFont(justFont) + +canvas.setFont('LettErrorRobot-Chrome', 32) +canvas.drawString(10, 150, 'This should be in') +canvas.drawString(10, 100, 'LettErrorRobot-Chrome') +""") + + +disc(""" +Note that the argument "WinAnsiEncoding" has nothing to do with the input; +it's to say which set of characters within the font file will be active +and available. +""") + +illust(examples.customfont1, "Using a very non-standard font") + +disc(""" +The font's facename comes from the AFM file's $FontName$ field. +In the example above we knew the name in advance, but quite +often the names of font description files are pretty cryptic +and then you might want to retrieve the name from an AFM file +automatically. +When lacking a more sophisticated method you can use some +code as simple as this: +""") + +eg(""" +class FontNameNotFoundError(Exception): + pass + + +def findFontName(path): + "Extract a font name from an AFM file." + + f = open(path) + + found = 0 + while not found: + line = f.readline()[:-1] + if not found and line[:16] == 'StartCharMetrics': + raise FontNameNotFoundError, path + if line[:8] == 'FontName': + fontName = line[9:] + found = 1 + + return fontName +""") + +disc(""" +In the LettErrorRobot-Chrome example we explicitely specified +the place of the font description files to be loaded. +In general, you'll prefer to store your fonts in some canonic +locations and make the embedding mechanism aware of them. +Using the same configuration mechanism we've already seen at the +beginning of this section we can indicate a default search path +for Type-1 fonts. +""") + +disc(""" +Unfortunately, there is no reliable standard yet for such +locations (not even on the same platform) and, hence, you might +have to edit the file $reportlab/rl_config.py$ to modify the +value of the $T1SearchPath$ identifier to contain additional +directories. Our own recommendation is to use the ^reportlab/fonts^ +folder in development; and to have any needed fonts as packaged parts of +your application in any kind of controlled server deployment. This insulates +you from fonts being installed and uninstalled by other software or system +administrator. +""") + +heading3("Warnings about missing glyphs") +disc("""If you specify an encoding, it is generally assumed that +the font designer has provided all the needed glyphs. However, +this is not always true. In the case of our example font, +the letters of the alphabet are present, but many symbols and +accents are missing. The default behaviour is for the font to +print a 'notdef' character - typically a blob, dot or space - +when passed a character it cannot draw. However, you can ask +the library to warn you instead; the code below (executed +before loading a font) will cause warnings to be generated +for any glyphs not in the font when you register it.""") + +eg(""" +import reportlab.rl_config +reportlab.rl_config.warnOnMissingFontGlyphs = 0 +""") + + + +heading2("Standard Single-Byte Font Encodings") +disc(""" +This section shows you the glyphs available in the common encodings. +""") + + +disc("""The code chart below shows the characters in the $WinAnsiEncoding$. +This is the standard encoding on Windows and many Unix systems in America +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$, +which can be used to display the contents of fonts. The index numbers +along the edges are in hex.""") + +cht1 = SingleByteEncodingChart(encodingName='WinAnsiEncoding',charsPerRow=32, boxSize=12) +illust(lambda canv: cht1.drawOn(canv, 0, 0), "WinAnsi Encoding", cht1.width, cht1.height) + +disc("""The code chart below shows the characters in the $MacRomanEncoding$. +as it sounds, this is the standard encoding on Macintosh computers in +America and Western Europe. As usual with non-unicode encodings, the first +128 code points (top 4 rows in this case) are the ASCII standard and agree +with the WinAnsi code chart above; but the bottom 4 rows differ.""") +cht2 = SingleByteEncodingChart(encodingName='MacRomanEncoding',charsPerRow=32, boxSize=12) +illust(lambda canv: cht2.drawOn(canv, 0, 0), "MacRoman Encoding", cht2.width, cht2.height) + +disc("""These two encodings are available for the standard fonts (Helvetica, +Times-Roman and Courier and their variants) and will be available for most +commercial fonts including those from Adobe. However, some fonts contain non- +text glyphs and the concept does not really apply. For example, ZapfDingbats +and Symbol can each be treated as having their own encoding.""") + +cht3 = SingleByteEncodingChart(faceName='ZapfDingbats',encodingName='ZapfDingbatsEncoding',charsPerRow=32, boxSize=12) +illust(lambda canv: cht3.drawOn(canv, 0, 0), "ZapfDingbats and its one and only encoding", cht3.width, cht3.height) + +cht4 = SingleByteEncodingChart(faceName='Symbol',encodingName='SymbolEncoding',charsPerRow=32, boxSize=12) +illust(lambda canv: cht4.drawOn(canv, 0, 0), "Symbol and its one and only encoding", cht4.width, cht4.height) + + +CPage(5) +heading2("TrueType Font Support") +disc(""" +Marius Gedminas ($mgedmin@delfi.lt$) with the help of Viktorija Zaksiene ($vika@pov.lt$) +have contributed support for embedded TrueType fonts. TrueType fonts work in Unicode/UTF8 +and are not limited to 256 characters.""") + + +CPage(3) +disc("""We use $reportlab.pdfbase.ttfonts.TTFont$ to create a true type +font object and register using $reportlab.pdfbase.pdfmetrics.registerFont$. +In pdfgen drawing directly to the canvas we can do""") +eg(""" +# we know some glyphs are missing, suppress warnings +import reportlab.rl_config +reportlab.rl_config.warnOnMissingFontGlyphs = 0 + +from reportlab.pdfbase import pdfmetrics +from reportlab.pdfbase.ttfonts import TTFont +pdfmetrics.registerFont(TTFont('Rina', 'rina.ttf')) +canvas.setFont(Rina, 32) +canvas.drawString(10, 150, "Some text encoded in UTF-8") +canvas.drawString(10, 100, "In the Rina TT Font!") +""") +illust(examples.ttffont1, "Using a the Rina TrueType Font") +disc("""In the above example the true type font object is created using""") +eg(""" + TTFont(name,filename) +""") +disc("""so that the ReportLab internal name is given by the first argument and the second argument +is a string(or file like object) denoting the font's TTF file. In Marius' original patch the filename +was supposed to be exactly correct, but we have modified things so that if the filename is relative +then a search for the corresponding file is done in the current directory and then in directories +specified by $reportlab.rl_config.TTFSearchpath$!""") + +from reportlab.lib.styles import ParagraphStyle + +from reportlab.lib.fonts import addMapping +addMapping('Rina', 0, 0, 'Rina') +addMapping('Rina', 0, 1, 'Rina') +addMapping('Rina', 1, 0, 'Rina') +addMapping('Rina', 1, 1, 'Rina') + +disc("""Before using the TT Fonts in Platypus we should add a mapping from the family name to the +individual font names that describe the behaviour under the $$ and $$ attributes.""") + +eg(""" +from reportlab.lib.fonts import addMapping +addMapping('Rina', 0, 0, 'Rina') #normal +addMapping('Rina', 0, 1, 'Rina') #italic +addMapping('Rina', 1, 0, 'Rina') #bold +addMapping('Rina', 1, 1, 'Rina') #italic and bold +""") + +disc("""We only have a Rina regular font, no bold or italic, so we must map all to the +same internal fontname. ^<b>^ and ^<i>^ tags may now be used safely, but +have no effect. +After registering and mapping +the Rina font as above we can use paragraph text like""") +parabox2("""This is in Times-Roman +and this is in magenta Rina!""","Using TTF fonts in paragraphs") + + + + +heading2("Asian Font Support") +disc("""The Reportlab PDF Library aims to expose full support for Asian fonts. +PDF is the first really portable solution for Asian text handling. There are +two main approaches for this: Adobe's Asian Language Packs, or TrueType fonts. +""") + +heading3("Asian Language Packs") +disc(""" +This approach offers the best performance since nothing needs embedding in the PDF file; +as with the standard fonts, everything is on the reader.""") + +disc(""" +Adobe makes available add-ons for each main language. In Adobe Reader 6.0 and 7.0, you +will be prompted to download and install these as soon as you try to open a document +using them. In earlier versions, you would see an error message on opening an Asian document +and had to know what to do. +""") + +disc(""" +Japanese, Traditional Chinese (Taiwan/Hong Kong), Simplified Chinese (mainland China) +and Korean are all supported and our software knows about the following fonts: +""") +bullet(""" +$chs$ = Chinese Simplified (mainland): '$STSong-Light$' +""") +bullet(""" +$cht$ = Chinese Traditional (Taiwan): '$MSung-Light$', '$MHei-Medium$' +""") +bullet(""" +$kor$ = Korean: '$HYSMyeongJoStd-Medium$','$HYGothic-Medium$' +""") +bullet(""" +$jpn$ = Japanese: '$HeiseiMin-W3$', '$HeiseiKakuGo-W5$' +""") + + +disc("""Since many users will not have the font packs installed, we have included +a rather grainy ^bitmap^ of some Japanese characters. We will discuss below what is needed to +generate them.""") +# include a bitmap of some Asian text +I=os.path.join(os.path.dirname(reportlab.__file__),'docs','images','jpnchars.jpg') +try: + getStory().append(Image(I)) +except: + disc("""An image should have appeared here.""") + +disc("""Prior to Version 2.0, you had to specify one of many native encodings +when registering a CID Font. In version 2.0 you should a new UnicodeCIDFont +class.""") + +eg(""" +from reportlab.pdfbase import pdfmetrics +from reportlab.pdfbase.cidfonts import UnicodeCIDFont +pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3')) +canvas.setFont('HeiseiMin-W3', 16) + +# the two unicode characters below are "Tokyo" +msg = u'\u6771\u4EAC : Unicode font, unicode input' +canvas.drawString(100, 675, msg) +""") +#had to double-escape the slashes above to get escapes into the PDF + +disc("""The old coding style with explicit encodings should still work, but is now +only relevant if you need to construct vertical text. We aim to add more readable options +for horizontal and vertical text to the UnicodeCIDFont constructor in future. +The following four test scripts generate samples in the corresponding languages:""") +eg("""reportlab/test/test_multibyte_jpn.py +reportlab/test/test_multibyte_kor.py +reportlab/test/test_multibyte_chs.py +reportlab/test/test_multibyte_cht.py""") + +## put back in when we have vertical text... +##disc("""The illustration below shows part of the first page +##of the Japanese output sample. It shows both horizontal and vertical +##writing, and illustrates the ability to mix variable-width Latin +##characters in Asian sentences. The choice of horizontal and vertical +##writing is determined by the encoding, which ends in 'H' or 'V'. +##Whether an encoding uses fixed-width or variable-width versions +##of Latin characters also depends on the encoding used; see the definitions +##below.""") +## +##Illustration(image("../images/jpn.gif", width=531*0.50, +##height=435*0.50), 'Output from test_multibyte_jpn.py') +## +##caption(""" +##Output from test_multibyte_jpn.py +##""") + + + + +disc("""In previous versions of the ReportLab PDF Library, we had to make +use of Adobe's CMap files (located near Acrobat Reader if the Asian Language +packs were installed). Now that we only have one encoding to deal with, the +character width data is embedded in the package, and CMap files are not needed +for generation. The CMap search path in ^rl_config.py^ is now deprecated +and has no effect if you restrict yourself to UnicodeCIDFont. +""") + + +heading3("TrueType fonts with Asian characters") +disc(""" +This is the easy way to do it. No special handling at all is needed to +work with Asian TrueType fonts. Windows users who have installed, for example, +Japanese as an option in Control Panel, will have a font "msmincho.ttf" which +can be used. However, be aware that it takes time to parse the fonts, and that +quite large subsets may need to be embedded in your PDFs. We can also now parse +files ending in .ttc, which are a slight variation of .ttf. + +""") + + +heading3("To Do") +disc("""We expect to be developing this area of the package for some time.accept2dyear +Here is an outline of the main priorities. We welcome help!""") + +bullet(""" +Ensure that we have accurate character metrics for all encodings in horizontal and +vertical writing.""") + +bullet(""" +Add options to ^UnicodeCIDFont^ to allow vertical and proportional variants where the font permits it.""") + + +bullet(""" +Improve the word wrapping code in paragraphs and allow vertical writing.""") + + + +CPage(5) +heading2("RenderPM tests") + +disc("""This may also be the best place to mention the test function of $reportlab/graphics/renderPM.py$, +which can be considered the cannonical place for tests which exercise renderPM (the "PixMap Renderer", +as opposed to renderPDF, renderPS or renderSVG).""") + +disc("""If you run this from the command line, you should see lots of output like the following.""") + +eg("""C:\\code\\reportlab\\graphics>renderPM.py +wrote pmout\\renderPM0.gif +wrote pmout\\renderPM0.tif +wrote pmout\\renderPM0.png +wrote pmout\\renderPM0.jpg +wrote pmout\\renderPM0.pct +... +wrote pmout\\renderPM12.gif +wrote pmout\\renderPM12.tif +wrote pmout\\renderPM12.png +wrote pmout\\renderPM12.jpg +wrote pmout\\renderPM12.pct +wrote pmout\\index.html""") + +disc("""This runs a number of tests progressing from a "Hello World" test, through various tests of +Lines; text strings in a number of sizes, fonts, colours and alignments; the basic shapes; translated +and rotated groups; scaled coordinates; rotated strings; nested groups; anchoring and non-standard fonts.""") + +disc("""It creates a subdirectory called $pmout$, writes the image files into it, and writes an +$index.html$ page which makes it easy to refer to all the results.""") + +disc("""The font-related tests which you may wish to look at are test #11 ('Text strings in a non-standard font') +and test #12 ('Test Various Fonts').""") + + + + +##### FILL THEM IN diff --git a/bin/reportlab/docs/userguide/ch3_pdffeatures.py b/bin/reportlab/docs/userguide/ch3_pdffeatures.py new file mode 100644 index 00000000000..36fe8b8be07 --- /dev/null +++ b/bin/reportlab/docs/userguide/ch3_pdffeatures.py @@ -0,0 +1,271 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch3_pdffeatures.py +from reportlab.tools.docco.rl_doc_utils import * + + +heading1("Exposing PDF Special Capabilities") +disc("""PDF provides a number of features to make electronic + document viewing more efficient and comfortable, and + our library exposes a number of these.""") + +heading2("Forms") +disc("""The Form feature lets you create a block of graphics and text + once near the start of a PDF file, and then simply refer to it on + subsequent pages. If you are dealing with a run of 5000 repetitive + business forms - for example, one-page invoices or payslips - you + only need to store the backdrop once and simply draw the changing + text on each page. Used correctly, forms can dramatically cut + file size and production time, and apparently even speed things + up on the printer. + """) +disc("""Forms do not need to refer to a whole page; anything which + might be repeated often should be placed in a form.""") +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) + +heading2("Links and Destinations") +disc("""PDF supports internal hyperlinks. There is a very wide + range of link types, destination types and events which + can be triggered by a click. At the moment we just + support the basic ability to jump from one part of a document + to another, and to control the zoom level of the window after + the jump. The bookmarkPage method defines a destination that + is the endpoint of a jump.""") +#todo("code example here...") + +eg(""" + canvas.bookmarkPage(name, + fitType="Fit", + left=None, + top=None, + bottom=None, + right=None, + zoom=None + ) +""") +disc(""" +By default the $bookmarkPage$ method defines the page itself as the +destination. After jumping to an endpoint defined by bookmarkPage, +the PDF browser will display the whole page, scaling it to fit the +screen:""") + +eg("""canvas.bookmarkPage(name)""") + +disc("""The $bookmarkPage$ method can be instructed to display the +page in a number of different ways by providing a $fitType$ +parameter.""") + +eg("") + +t = Table([ + ['fitType','Parameters Required','Meaning'], + ['Fit',None,'Entire page fits in window (the default)'], + ['FitH','top','Top coord at top of window, width scaled to fit'], + ['FitV','left','Left coord at left of window, height scaled to fit'], + ['FitR','left bottom right top','Scale window to fit the specified rectangle'], + ['XYZ','left top zoom','Fine grained control. If you omit a parameter\nthe PDF browser interprets it as "leave as is"'] + ]) +t.setStyle(TableStyle([ + ('FONT',(0,0),(-1,1),'Times-Bold',10,12), + ('VALIGN',(0,0),(-1,-1),'MIDDLE'), + ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), + ('BOX', (0,0), (-1,-1), 0.25, colors.black), + ])) + +getStory().append(t) +caption("""Table - Required attributes for different fit types""") + +disc(""" +Note : $fitType$ settings are case-sensitive so $fitType="FIT"$ is invalid$ +""") + + +disc(""" +Sometimes you want the destination of a jump to be some part of a page. +The $FitR$ fitType allows you to identify a particular rectangle, scaling +the area to fit the entire page. +""") + +disc(""" +To set the display to a particular x and y coordinate of the page and to +control the zoom directly use fitType="XYZ". +""") + +eg(""" +canvas.bookmarkPage('my_bookmark',fitType="XYZ",left=0,top=200) +""") + + + +disc(""" +This destination is at the leftmost of the page with the top of the screen +at position 200. Because $zoom$ was not set the zoom remains at whatever the +user had it set to. +""") + +eg(""" +canvas.bookmarkPage('my_bookmark',fitType="XYZ",left=0,top=200,zoom=2) +""") + +disc("""This time zoom is set to expand the page 2X its normal size.""") + +disc(""" +Note : Both $XYZ$ and $FitR$ fitTypes require that their positional parameters +($top, bottom, left, right$) be specified in terms of the default user space. +They ignore any geometric transform in effect in the canvas graphic state. +""") + + + +pencilnote() + +disc(""" +Note: Two previous bookmark methods are supported but deprecated now +that bookmarkPage is so general. These are $bookmarkHorizontalAbsolute$ +and $bookmarkHorizontal$. +""") + +heading3("Defining internal links") +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) + when the mouse is clicked when the pointer is within the rectangle specified + by $Rect$ the viewer will jump to the endpoint associated with $destinationname$. + As in the case with $bookmarkHorizontalAbsolute$ the rectangle $Rect$ must be + specified in terms of the default user space. The $contents$ parameter specifies + a chunk of text which displays in the viewer if the user left-clicks on the region. +""") + +disc(""" +The rectangle $Rect$ must be specified in terms of a tuple ^(x1,y1,x2,y2)^ identifying +the lower left and upper right points of the rectangle in default user space. +""") + +disc(""" +For example the code +""") + +eg(""" + canvas.bookmarkPage("Meaning_of_life") +""") + +disc(""" +defines a location as the whole of the current page with the identifier +$Meaning_of_life$. To create a rectangular link to it while drawing a possibly +different page, we would use this code: +""") + +eg(""" + canvas.linkAbsolute("Find the Meaning of Life", "Meaning_of_life", + (inch, inch, 6*inch, 2*inch)) +""") + +disc(""" +By default during interactive viewing a rectangle appears around the +link. Use the keyword argument $Border='[0 0 0]'$ to +suppress the visible rectangle around the during viewing link. +For example +""") + +eg(""" + canvas.linkAbsolute("Meaning of Life", "Meaning_of_life", + (inch, inch, 6*inch, 2*inch), Border='[0 0 0]') +""") + + +heading2("Outline Trees") +disc("""Acrobat Reader has a navigation page which can hold a + document outline; it should normally be visible when you + open this guide. We provide some simple methods to add + outline entries. Typically, a program to make a document + (such as this user guide) will call the method + $canvas.addOutlineEntry(^self, title, key, level=0, + closed=None^)$ as it reaches each heading in the document. + """) + +disc("""^title^ is the caption which will be displayed in + the left pane. The ^key^ must be a string which is + unique within the document and which names a bookmark, + as with the hyperlinks. The ^level^ is zero - the + uppermost level - unless otherwise specified, and + it is an error to go down more than one level at a time + (for example to follow a level 0 heading by a level 2 + 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 + when a new chapter occurs, taking the chapter heading text + as the caption text. The key is obtained from the + chapter number (not shown here), so Chapter 2 has the + key 'ch2'. The bookmark to which the + 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': + self.chapter = paragraph.getPlainText() + key = 'ch%d' % self.chapterNo + self.canv.bookmarkPage(key) + self.canv.addOutlineEntry(paragraph.getPlainText(), + key, 0, 0) + """) + +heading2("Page Transition Effects") + + +eg(""" + 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 +the current page will appear to melt away when it is replaced by the next +page during interactive viewing. These effects are useful in spicing up +slide presentations, among other places. +Please see the reference manual for more detail on how to use this method. +""") + +heading2("Internal File Annotations") + +eg(""" + canvas.setAuthor(name) + 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 +viewed using the "Document Info" menu item of the browser and they also can +be used as a simple standard way of providing basic information about the +document to archiving software which need not parse the entire +file. To find the annotations view the $*.pdf$ output file using a standard +text editor (such as $notepad$ on MS/Windows or $vi$ or $emacs$ on unix) and look +for the string $/Author$ in the file contents. +""") + +eg(examples.testannotations) + +disc(""" +If you want the subject, title, and author to automatically display +in the document when viewed and printed you must paint them onto the +document like any other text. +""") + +illust(examples.annotations, "Setting document internal annotations") diff --git a/bin/reportlab/docs/userguide/ch4_platypus_concepts.py b/bin/reportlab/docs/userguide/ch4_platypus_concepts.py new file mode 100644 index 00000000000..b3b6d17a748 --- /dev/null +++ b/bin/reportlab/docs/userguide/ch4_platypus_concepts.py @@ -0,0 +1,509 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch4_platypus_concepts.py +from reportlab.tools.docco.rl_doc_utils import * + +#####################################################################################################3 + + +heading1("PLATYPUS - Page Layout and Typography Using Scripts") + +heading2("Design Goals") + +disc(""" +Platypus stands for "Page Layout and Typography Using Scripts". It is a high +level page layout library which lets you programmatically create complex +documents with a minimum of effort. +""") + + + +disc(""" +The design of Platypus seeks to separate "high level" layout decisions +from the document content as much as possible. Thus, for example, paragraphs +are constructed using paragraph styles and pages are constructed +using page templates with the intention that hundreds of +documents with thousands of pages can be reformatted to different +style specifications with the modifications of a few lines in a single +shared file which contains the paragraph styles and page layout specifications. +""") + + +disc(""" +The overall design of Platypus can be thought of has having +several layers, top down, these are""") + +disc("$DocTemplates$ the outermost container for the document;") + +disc("$PageTemplates$ specifications for layouts of pages of various kinds;") + +disc("$Frames$ specifications of regions in pages that can contain flowing text or graphics.") + +disc("""$Flowables$ 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("""$pdfgen.Canvas$ 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 + of the $PageTemplates$ actually may specify the format for any number of pages + (not just one as might be inferred from the diagram). +""") + +disc(""" +$DocTemplates$ contain one or more $PageTemplates$ each of which contain one or more +$Frames$. $Flowables$ are things which can be flowed into a $Frame$ e.g. +a $Paragraph$ or a $Table$. +""") + +disc(""" +To use platypus you create a document from a $DocTemplate$ class and pass +a list of $Flowable$s to its $build$ method. The document +$build$ method knows how to process the list of flowables +into something reasonable. +""") + +disc(""" +Internally the $DocTemplate$ class implements page layout and formatting +using various events. Each of the events has a corresponding handler method +called $handle_XXX$ where $XXX$ is the event name. A typical event is +$frameBegin$ which occurs when the machinery begins to use a frame for the +first time. +""") + +disc(""" +A Platypus story consists of a sequence of basic elements called $Flowables$ +and these elements drive the data driven Platypus formatting engine. +To modify the behavior of the engine +a special kind of flowable, $ActionFlowables$, tell the layout engine to, +for example, skip to the next +column or change to another $PageTemplate$. +""") + + +heading2("""Getting started""") + +disc("""Consider the following code sequence which provides +a very simple "hello world" example for Platypus.""") + +eg(examples.platypussetup) + +disc("""First we import some constructors, some paragraph styles +and other conveniences from other modules.""") + +eg(examples.platypusfirstpage) + +disc("""We define the fixed features of the first page of the document +with the function above.""") + +eg(examples.platypusnextpage) + +disc("""Since we want pages after the first to look different from the +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. +""") + +eg(examples.platypusgo) + +disc(""" +Finally, we create a story and build the document. +Note that we are using a "canned" document template here which +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. +""") + +disc(""" +To see the output of this example program run the module +$docs/userguide/examples.py$ (from the ReportLab $docs$ distribution) +as a "top level script". The script interpretation $python examples.py$ will +generate the Platypus output $phello.pdf$. +""") + + +heading2("$Flowables$") +disc(""" +$Flowables$ are things which can be drawn and which have $wrap$, $draw$ and perhaps $split$ methods. +$Flowable$ is an abstract base class for things to be drawn and an instance knows its size +and draws in its own coordinate system (this requires the base API to provide an absolute coordinate +system when the $Flowable.draw$ method is called). To get an instance use $f=Flowable()$. +""") +disc(""" +It should be noted that the $Flowable$ class is an abstract class and is normally +only used as a base class. +""") +k=startKeep() +disc(""" +To illustrate the general way in which $Flowables$ are used we show how a derived class $Paragraph$ +is used and drawn on a canvas. $Paragraphs$ are so important they will get a whole chapter +to themselves. +""") +eg(""" + from reportlab.lib.styles import getSampleStyleSheet + from reportlab.platypus import Paragraph + from reportlab.pdfgen.canvas import Canvas + styleSheet = getSampleStyleSheet() + style = styleSheet['BodyText'] + P=Paragraph('This is a very silly example',style) + canv = Canvas('doc.pdf') + aW = 460 # available width and height + aH = 800 + w,h = P.wrap(aW, aH) # find required space + if w<=aW and h<=aH: + P.drawOn(canv,0,aH) + aH = aH - h # reduce the available height + canv.save() + else: + raise ValueError, "Not enough room" +""") +endKeep(k) +heading3("$Flowable$ User Methods") +eg(""" + Flowable.draw() +""") +disc("""This will be called to ask the flowable to actually render itself. +The $Flowable$ class does not implement $draw$. +The calling code should ensure that the flowable has an attribute $canv$ +which is the $pdfgen.Canvas$ which should be drawn to an that the $Canvas$ +is in an appropriate state (as regards translations rotations, etc). Normally +this method will only be called internally by the $drawOn$ method. Derived classes +must implement this method. +""") +eg(""" + Flowable.drawOn(canvas,x,y) +""") +disc(""" +This is the method which controlling programs use to render the flowable to a particular +canvas. It handles the translation to the canvas coordinate (x,y) and ensuring that +the flowable has a $canv$ attribute so that the +$draw$ method (which is not implemented in the base class) can render in an +absolute coordinate frame. +""") +eg(""" + Flowable.wrap(availWidth, availHeight) +""") +disc("""This will be called by the enclosing frame before objects +are asked their size, drawn or whatever. It returns the +size actually used.""") +eg(""" + Flowable.split(self, availWidth, availheight): +""") +disc("""This will be called by more sophisticated frames when + wrap fails. Stupid flowables should return [] meaning that they are unable to split. +Clever flowables should split themselves and return a list of flowables. It is up to +the client code to ensure that repeated attempts to split are avoided. +If the space is sufficient the split method should return [self]. +Otherwise +the flowable should rearrange itself and return a list $[f0,...]$ of flowables +which will be considered in order. The implemented split method should avoid +changing $self$ as this will allow sophisticated layout mechanisms to do multiple +passes over a list of flowables. +""") + +heading2("Guidelines for flowable positioning") + +disc("""Two methods, which by default return zero, provide guidance on vertical +spacing of flowables: +""") + +eg(""" + Flowable.getSpaceAfter(self): + Flowable.getSpaceBefore(self): +""") +disc("""These methods return how much space should follow or precede +the flowable. The space doesn't belong to the flowable itself i.e. the flowable's +$draw$ method shouldn't consider it when rendering. Controlling programs +will use the values returned in determining how much space is required by +a particular flowable in context. +""") + +disc("""All flowables have an $hAlign$ property: $('LEFT', 'RIGHT', 'CENTER' or 'CENTRE')$. +For paragraphs, which fill the full width of the frame, this has no effect. For tables, +images or other objects which are less than the width of the frame, this determines their +horizontal placement. + +""") + + +disc("""The chapters which follow will cover the most important +specific types of flowables: Paragraphs and Tables.""") + + +heading2("Frames") +disc(""" +$Frames$ are active containers which are themselves contained in $PageTemplates$. +$Frames$ have a location and size and maintain a concept of remaining drawable +space. The command +""") + +eg(""" + Frame(x1, y1, width,height, leftPadding=6, bottomPadding=6, + rightPadding=6, topPadding=6, id=None, showBoundary=0) +""") +disc("""creates a $Frame$ instance with lower left hand corner at coordinate $(x1,y1)$ +(relative to the canvas at use time) and with dimensions $width$ x $height$. The $Padding$ +arguments are positive quantities used to reduce the space available for drawing. +The $id$ argument is an identifier for use at runtime e.g. 'LeftColumn' or 'RightColumn' etc. +If the $showBoundary$ argument is non-zero then the boundary of the frame will get drawn +at run time (this is useful sometimes). +""") +heading3("$Frame$ User Methods") +eg(""" + Frame.addFromList(drawlist, canvas) +""") +disc("""consumes $Flowables$ from the front of $drawlist$ until the + frame is full. If it cannot fit one object, raises + an exception.""") + +eg(""" + Frame.split(flowable,canv) +""") +disc('''Asks the flowable to split using up the available space and return +the list of flowables. +''') + +eg(""" + Frame.drawBoundary(canvas) +""") +disc("draws the frame boundary as a rectangle (primarily for debugging).") +heading3("Using $Frames$") +disc(""" +$Frames$ can be used directly with canvases and flowables to create documents. +The $Frame.addFromList$ method handles the $wrap$ & $drawOn$ calls for you. +You don't need all of the Platypus machinery to get something useful into +PDF. +""") +eg(""" +from reportlab.pdfgen.canvas import Canvas +from reportlab.lib.styles import getSampleStyleSheet +from reportlab.lib.units import inch +from reportlab.platypus import Paragraph, Frame +styles = getSampleStyleSheet() +styleN = styles['Normal'] +styleH = styles['Heading1'] +story = [] + +#add some flowables +story.append(Paragraph("This is a Heading",styleH)) +story.append(Paragraph("This is a paragraph in Normal style.", + styleN)) +c = Canvas('mydoc.pdf') +f = Frame(inch, inch, 6*inch, 9*inch, showBoundary=1) +f.addFromList(story,c) +c.save() +""") + +heading2("Documents and Templates") + +disc(""" +The $BaseDocTemplate$ class implements the basic machinery for document +formatting. An instance of the class contains a list of one or more +$PageTemplates$ that can be used to describe the layout of information +on a single page. The $build$ method can be used to process +a list of $Flowables$ to produce a PDF document. +""") + +CPage(3.0) +heading3("The $BaseDocTemplate$ class") + +eg(""" + BaseDocTemplate(self, filename, + pagesize=defaultPageSize, + pageTemplates=[], + showBoundary=0, + leftMargin=inch, + rightMargin=inch, + topMargin=inch, + bottomMargin=inch, + allowSplitting=1, + title=None, + author=None, + _pageBreakQuick=1) +""") + +disc(""" +creates a document template suitable for creating a basic document. It comes with quite a lot +of internal machinery, but no default page templates. The required $filename$ can be a string, +the name of a file to receive the created PDF document; alternatively it +can be an object which has a $write$ method such as a $StringIO$ or $file$ or $socket$. +""") + +disc(""" +The allowed arguments should be self explanatory, but $showBoundary$ controls whether or +not $Frame$ boundaries are drawn which can be useful for debugging purposes. The +$allowSplitting$ argument determines whether the builtin methods should try to split +individual $Flowables$ across $Frames$. The $_pageBreakQuick$ argument determines whether +an attempt to do a page break should try to end all the frames on the page or not, before ending +the page. +""") + +heading4("User $BaseDocTemplate$ Methods") + +disc("""These are of direct interest to client programmers +in that they are normally expected to be used. +""") +eg(""" + BaseDocTemplate.addPageTemplates(self,pageTemplates) +""") +disc(""" +This method is used to add one or a list of $PageTemplates$ to an existing documents. +""") +eg(""" + BaseDocTemplate.build(self, flowables, filename=None, canvasmaker=canvas.Canvas) +""") +disc(""" +This is the main method which is of interest to the application +programmer. Assuming that the document instance is correctly set up the +$build$ method takes the story 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 +the $BaseDocTemplate$ instance to issue calls to the instance $handle_XXX$ methods +to process the various events. +""") +heading4("User Virtual $BaseDocTemplate$ Methods") +disc(""" +These have no semantics at all in the base class. They are intended as pure virtual hooks +into the layout machinery. Creators of immediately derived classes can override these +without worrying about affecting the properties of the layout engine. +""") +eg(""" + BaseDocTemplate.afterInit(self) +""") +disc(""" +This is called after initialisation of the base class; a derived class could overide +the method to add default $PageTemplates$. +""") + +eg(""" + BaseDocTemplate.afterPage(self) +""") +disc("""This is called after page processing, and + immediately after the afterDrawPage method + of the current page template. A derived class could +use this to do things which are dependent on information in the page +such as the first and last word on the page of a dictionary. +""") + +eg(""" + BaseDocTemplate.beforeDocument(self) +""") + +disc("""This is called before any processing is +done on the document, but after the processing machinery +is ready. It can therefore be used to do things to the instance\'s +$pdfgen.canvas$ and the like. +""") + +eg(""" + BaseDocTemplate.beforePage(self) +""") + +disc("""This is called at the beginning of page + processing, and immediately before the + beforeDrawPage method of the current page + template. It could be used to reset page specific + information holders.""") + +eg(""" + BaseDocTemplate.filterFlowables(self,flowables) +""") + +disc("""This is called to filter flowables at the start of the main handle_flowable method. + Upon return if flowables[0] has been set to None it is discarded and the main + method returns immediately. + """) + +eg(""" + BaseDocTemplate.afterFlowable(self, flowable) +""") + +disc("""Called after a flowable has been rendered. An interested class could use this +hook to gather information about what information is present on a particular page or frame.""") + +heading4("$BaseDocTemplate$ Event handler Methods") +disc(""" +These methods constitute the greater part of the layout engine. Programmers shouldn't +have to call or override these methods directly unless they are trying to modify the layout engine. +Of course, the experienced programmer who wants to intervene at a particular event, $XXX$, +which does not correspond to one of the virtual methods can always override and +call the base method from the drived class version. We make this easy by providing +a base class synonym for each of the handler methods with the same name prefixed by an underscore '_'. +""") + +eg(""" + def handle_pageBegin(self): + doStuff() + BaseDocTemplate.handle_pageBegin(self) + doMoreStuff() + + #using the synonym + def handle_pageEnd(self): + doStuff() + self._handle_pageEnd() + doMoreStuff() +""") +disc(""" +Here we list the methods only as an indication of the events that are being +handled. +Interested programmers can take a look at the source. +""") +eg(""" + handle_currentFrame(self,fx) + handle_documentBegin(self) + handle_flowable(self,flowables) + handle_frameBegin(self,*args) + handle_frameEnd(self) + handle_nextFrame(self,fx) + handle_nextPageTemplate(self,pt) + handle_pageBegin(self) + handle_pageBreak(self) + handle_pageEnd(self) +""") + +disc(""" +Using document templates can be very easy; $SimpleDoctemplate$ is a class derived from +$BaseDocTemplate$ which provides its own $PageTemplate$ and $Frame$ setup. +""") + +eg(""" +from reportlab.lib.styles import getSampleStyleSheet +from reportlab.lib.pagesizes import letter +from reportlab.platypus import Paragraph, SimpleDocTemplate +styles = getSampleStyleSheet() +styleN = styles['Normal'] +styleH = styles['Heading1'] +story = [] + +#add some flowables +story.append(Paragraph("This is a Heading",styleH)) +story.append(Paragraph("This is a paragraph in Normal style.", + styleN)) +doc = SimpleDocTemplate('mydoc.pdf',pagesize = letter) +doc.build(story) +""") +heading3("$PageTemplates$") +disc(""" +The $PageTemplate$ class is a container class with fairly minimal semantics. Each instance +contains a list of $Frames$ and has methods which should be called at the start and end +of each page. +""") +eg("PageTemplate(id=None,frames=[],onPage=_doNothing,onPageEnd=_doNothing)") +disc(""" +is used to initialize an instance, the $frames$ argument should be a list of $Frames$ +whilst the optional $onPage$ and $onPageEnd$ arguments are callables which should have signature +$def XXX(canvas,document)$ where $canvas$ and $document$ +are the canvas and document being drawn. These routines are intended to be used to paint non-flowing (i.e. standard) +parts of pages. These attribute functions are exactly parallel to the pure virtual methods +$PageTemplate.beforPage$ and $PageTemplate.afterPage$ which have signature +$beforPage(self,canvas,document)$. The methods allow class derivation to be used to define +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. +""") diff --git a/bin/reportlab/docs/userguide/ch5_paragraphs.py b/bin/reportlab/docs/userguide/ch5_paragraphs.py new file mode 100644 index 00000000000..3191f1f1d55 --- /dev/null +++ b/bin/reportlab/docs/userguide/ch5_paragraphs.py @@ -0,0 +1,319 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch5_paragraphs.py +from reportlab.tools.docco.rl_doc_utils import * + +#begin chapter oon paragraphs +heading1("Paragraphs") +disc(""" +The $reportlab.platypus.Paragraph$ class is one of the most useful of the Platypus $Flowables$; +it can format fairly arbitrary text and provides for inline font style and colour changes using +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:""") +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 +linefeeds. This allows easy use of indented triple quoted text in Python scripts. +The $bulletText$ argument provides the text of a default bullet for the paragraph. +The font and other properties for the paragraph text and bullet are set using the style argument. +""") +disc(""" +The $style$ argument should be an instance of class $ParagraphStyle$ obtained typically +using""") +eg(""" +from reportlab.lib.styles import ParagraphStyle +""") +disc(""" +this container class provides for the setting of multiple default paragraph attributes +in a structured way. The styles are arranged in a dictionary style object called a $stylesheet$ +which allows for the styles to be accessed as $stylesheet['BodyText']$. A sample style +sheet is provided. +""") +eg(""" +from reportlab.lib.styles import getSampleStyleSheet +stylesheet=getSampleStyleSheet() +normalStyle = stylesheet['Normal'] +""") +disc(""" +The options which can be set for a $Paragraph$ can be seen from the $ParagraphStyle$ defaults. +""") +heading4("$class ParagraphStyle$") +eg(""" +class ParagraphStyle(PropertySet): + defaults = { + 'fontName':'Times-Roman', + 'fontSize':10, + 'leading':12, + 'leftIndent':0, + 'rightIndent':0, + 'firstLineIndent':0, + 'alignment':TA_LEFT, + 'spaceBefore':0, + 'spaceAfter':0, + 'bulletFontName':'Times-Roman', + 'bulletFontSize':10, + 'bulletIndent':0, + 'textColor': black + } +""") + +heading2("Using Paragraph Styles") + +#this will be used in the ParaBox demos. +sample = """You are hereby charged that on the 28th day of May, 1970, you did +willfully, unlawfully, and with malice of forethought, publish an +alleged English-Hungarian phrase book with intent to cause a breach +of the peace. How do you plead?""" + + +disc("""The $Paragraph$ and $ParagraphStyle$ classes together +handle most common formatting needs. The following examples +draw paragraphs in various styles, and add a bounding box +so that you can see exactly what space is taken up.""") + +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. +This means that you could specify that a 'Heading2' style had two +inches of space before when it occurs in mid-page, but will not +get acres of whitespace at the top of a page. These two attributes +should be thought of as 'requests' to the Frame and are not part +of the space occupied by the Paragraph itself.""") + +disc("""The $fontSize$ and $fontName$ tags are obvious, but it is +important to set the $leading$. This is the spacing between +adjacent lines of text; a good rule of thumb is to make this +20% larger than the point size. To get double-spaced text, +use a high $leading$.""") + +disc("""The figure below shows space before and after and an +increased leading:""") + +parabox(sample, + ParagraphStyle('Spaced', + spaceBefore=6, + spaceAfter=6, + leading=16), + 'Space before and after and increased leading' + ) + +disc("""The $leftIndent$ and $rightIndent$ attributes do exactly +what you would expect; $firstLineIndent$ is added to the $leftIndent$ of the +first line. If you want a straight left edge, remember +to set $firstLineIndent$ equal to 0.""") + +parabox(sample, + ParagraphStyle('indented', + firstLineIndent=+24, + leftIndent=24, + rightIndent=24), + 'one third inch indents at left and right, two thirds on first line' + ) + +disc("""Setting $firstLineIndent$ equal to a negative number, $leftIndent$ +much higher, and using a +different font (we'll show you how later!) can give you a +definition list:.""") + +parabox('Judge Pickles: ' + sample, + ParagraphStyle('dl', + leftIndent=36), + 'Definition Lists' + ) + +disc("""There are four possible values of $alignment$, defined as +constants in the module reportlab.lib.enums. These are +TA_LEFT, TA_CENTER or TA_CENTRE, TA_RIGHT and +TA_JUSTIFY, with values of 0, 1, 2 and 4 respectively. These +do exactly what you would expect.""") + + +heading2("Paragraph XML Markup Tags") +disc("""XML markup can be used to modify or specify the +overall paragraph style, and also to specify intra- +paragraph markup.""") + +heading3("The outermost < para > tag") + + +disc(""" +The paragraph text may optionally be surrounded by +<para attributes....> +</para> +tags. The attributes if any of the opening <para> tag affect the style that is used +with the $Paragraph$ $text$ and/or $bulletText$. +""") +disc(" ") + +from reportlab.platypus.paraparser import _addAttributeNames, _paraAttrMap, _bulletAttrMap + +def getAttrs(A): + _addAttributeNames(A) + S={} + for k, v in A.items(): + a = v[0] + if not S.has_key(a): + S[a] = k + else: + S[a] = "%s, %s" %(S[a],k) + + K = S.keys() + K.sort() + D=[('Attribute','Synonyms')] + for k in K: + D.append((k,S[k])) + cols=2*[None] + rows=len(D)*[None] + return D,cols,rows + +t=apply(Table,getAttrs(_paraAttrMap)) +t.setStyle(TableStyle([ + ('FONT',(0,0),(-1,1),'Times-Bold',10,12), + ('FONT',(0,1),(-1,-1),'Courier',8,8), + ('VALIGN',(0,0),(-1,-1),'MIDDLE'), + ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), + ('BOX', (0,0), (-1,-1), 0.25, colors.black), + ])) +getStory().append(t) +caption("""Table - Synonyms for style attributes""") + +disc("""Some useful synonyms have been provided for our Python attribute +names, including lowercase versions, and the equivalent properties +from the HTML standard where they exist. These additions make +it much easier to build XML-printing applications, since +much intra-paragraph markup may not need translating. The +table below shows the allowed attributes and synonyms in the +outermost paragraph tag.""") + + +heading2("Intra-paragraph markup") +disc("""'...) +and italic (...). It is also legal to use an underline +tag (... but it has no effect; PostScript fonts don't +support underlining, and neither do we, yet.]]>""") + +parabox2("""You are hereby charged that on the 28th day of May, 1970, you did +willfully, unlawfully, and with malice of forethought, publish an +alleged English-Hungarian phrase book with intent to cause a breach +of the peace. How do you plead?""", "Simple bold and italic tags") + +heading3("The $<font>$ tag") +disc("""The $<font>$ tag can be used to change the font name, +size and text color for any substring within the paragraph. +Legal attributes are $size$, $face$, $name$ (which is the same as $face$), +$color$, and $fg$ (which is the same as $color$). The $name$ is +the font family name, without any 'bold' or 'italic' suffixes. +Colors may be +HTML color names or a hex string encoded in a variety of ways; +see ^reportlab.lib.colors^ for the formats allowed.""") + +parabox2(""" +You are hereby charged that on the 28th day of May, 1970, you did +willfully, unlawfully, and with malice of forethought, +publish an +alleged English-Hungarian phrase book with intent to cause a breach +of the peace. How do you plead?""", "The $font$ tag") + +heading3("Superscripts and Subscripts") +disc("""Superscripts and subscripts are supported with the + and tags, which work exactly +as you might expect. In addition, most greek letters +can be accessed by using the +tag, or with mathML entity names.]]>""") + +##parabox2("""epsiloniota +##pi = -1""", "Greek letters and subscripts") + +parabox2("""Equation (α): e ip = -1""", + "Greek letters and superscripts") + +heading3("Numbering Paragraphs and Lists") +disc("""The $<seq>$ tag provides comprehensive support +for numbering lists, chapter headings and so on. It acts as +an interface to the $Sequencer$ class in ^reportlab.lib.sequencer^. +These are used to number headings and figures throughout this +document. +You may create as many separate 'counters' as you wish, accessed +with the $id$ attribute; these will be incremented by one each +time they are accessed. The $seqreset$ tag resets a counter. +If you want it to resume from a number other than 1, use +the syntax <seqreset id="mycounter" base="42">. +Let's have a go:""") + +parabox2(""", , . +Reset. , , +.""", "Basic sequences") + +disc("""You can save specifying an ID by designating a counter ID +as the default using the <seqdefault id="Counter"> +tag; it will then be used whenever a counter ID +is not specified. This saves some typing, especially when +doing multi-level lists; you just change counter ID when +stepping in or out a level.""") + +parabox2("""Continued... , +, , , , , .""", +"The default sequence") + +disc("""Finally, one can access multi-level sequences using +a variation of Python string formatting and the $template$ +attribute in a <seq> tags. This is used to do the +captions in all of the figures, as well as the level two +headings. The substring $%(counter)s$ extracts the current +value of a counter without incrementing it; appending a +plus sign as in $%(counter)s$ increments the counter. +The figure captions use a pattern like the one below:""") + +parabox2("""Figure - Multi-level templates""", +"Multi-level templates") + +disc("""We cheated a little - the real document used 'Figure', +but the text above uses 'FigureNo' - otherwise we would have +messed up our numbering!""") + +heading2("Bullets and Paragraph Numbering") +disc("""In addition to the three indent properties, some other +parameters are needed to correctly handle bulleted and numbered +lists. We discuss this here because you have now seen how +to handle numbering. A paragraph may have an optional +^bulletText^ argument passed to its constructor; alternatively, +bullet text may be placed in a $..]]>$ +tag at its head. The text will be drawn on the first line of +the paragraph, with its x origin determined by the $bulletIndent$ +attribute of the style, and in the font given in the +$bulletFontName$ attribute. For genuine bullets, a good +idea is to select the Times-Roman font in the style, and +use a character such as $\\xe2\\x80\\xa2)$:""") + +t=apply(Table,getAttrs(_bulletAttrMap)) +t.setStyle([ + ('FONT',(0,0),(-1,1),'Times-Bold',10,12), + ('FONT',(0,1),(-1,-1),'Courier',8,8), + ('VALIGN',(0,0),(-1,-1),'MIDDLE'), + ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), + ('BOX', (0,0), (-1,-1), 0.25, colors.black), + ]) +getStory().append(t) + +caption("""Table - <bullet> attributes & synonyms""") +disc("""The <bullet> tag is only allowed once in a given paragraph and its use +overrides the implied bullet style and ^bulletText^ specified in the ^Paragraph^ +creation. +""") +parabox("""\xe2\x80\xa2this 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 """, + styleSheet['Bullet'], + 'Basic use of bullet points') + +disc("""Exactly the same technique is used for numbers, +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.""") diff --git a/bin/reportlab/docs/userguide/ch6_tables.py b/bin/reportlab/docs/userguide/ch6_tables.py new file mode 100644 index 00000000000..011423367ba --- /dev/null +++ b/bin/reportlab/docs/userguide/ch6_tables.py @@ -0,0 +1,419 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch6_tables.py +from reportlab.tools.docco.rl_doc_utils import * +from reportlab.platypus import Image +import reportlab + +heading1("Tables and TableStyles") +disc(""" +The $Table$ and $LongTable$ classes derive from the $Flowable$ class and are intended +as a simple textual gridding mechanisms. The $longTable$ class uses a greedy algorithm +when calculating column widths and is intended for long tables where speed counts. +$Table$ cells can hold anything which can be converted to +a Python $string$ or $Flowables$ (or lists of $Flowables$). +""") + +disc(""" +Our present tables are a trade-off between efficient drawing and specification +and functionality. We assume the reader has some familiarity with HTML tables. +In brief, they have the following characteristics: +""") + +bullet("""They can contain anything convertible to a string; flowable +objects such as other tables; or entire sub-stories""") + +bullet("""They can work out the row heights to fit the data if you don't supply +the row height. (They can also work out the widths, but generally it is better +for a designer to set the width manually, and it draws faster).""") + +bullet("""They can split across pages if needed (see the canSplit attribute). +You can specify that a number of rows at the top and bottom should be +repeated after the split (e.g. show the headers again on page 2,3,4...)""") + +bullet("""For very wide tables, they can also split 'by column'. You can choose +whether tou want to split down-and-across or across-and-down""") + +bullet("""They have a simple and powerful notation for specifying shading and +gridlines which works well with financial or database tables, where you +don't know the number of rows up front. You can easily say 'make the last row +bold and put a line above it'""") + +bullet("""The style and data are separated, so you can declare a handful of table +styles and use them for a family of reports. Styes can also 'inherit', as with +paragraphs.""") + +disc("""There is however one main limitation compared to an HTML table. +They define a simple rectangular grid. There is no simple row or column +spanning; if you need to span cells, you must nest tables inside table cells instead or use a more +complex scheme in which the lead cell of a span contains the actual contents.""") + +disc(""" +$Tables$ are created by passing the constructor an optional sequence of column widths, +an optional sequence 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 +color and weight of the lines (if any), and the font, alignment and padding of the text. +A primitive automatic row height and or column width calculation mechanism is provided for. +""") + +heading2('$Table$ User Methods') +disc("""These are the main methods which are of interest to the client programmer.""") + +heading4("""$Table(data, colWidths=None, rowHeights=None, style=None, splitByRow=1, +repeatRows=0, repeatCols=0)$""") + +disc("""The $data$ argument is a sequence of sequences of cell values each of which +should be convertible to a string value using the $str$ function or should be a Flowable instance (such as a $Paragraph$) or a list (or tuple) of such instances. +If a cell value is a $Flowable$ or list of $Flowables$ these must either have a determined width +or the containing column must have a fixed width. +The first row of cell values +is in $data[0]$ i.e. the values are in row order. The $i$, $j$th. cell value is in +$data[i][j]$. Newline characters $'\\n'$ in cell values are treated as line split characters and +are used at draw time to format the cell into lines. +""") +disc("""The other arguments are fairly obvious, the $colWidths$ argument is a sequence +of numbers or possibly $None$, representing the widths of the columns. The number of elements +in $colWidths$ determines the number of columns in the table. +A value of $None$ means that the corresponding column width should be calculated automatically.""") + +disc("""The $rowHeights$ argument is a sequence +of numbers or possibly $None$, representing the heights of the rows. The number of elements +in $rowHeights$ determines the number of rows in the table. +A value of $None$ means that the corresponding row height should be calculated automatically.""") + +disc("""The $style$ argument can be an initial style for the table.""") +disc("""The $splitByRow$ argument is only needed for tables both too tall and too wide +to fit in the current context. In this case you must decide whether to 'tile' +down and across, or across and then down. This parameter is a Boolean indicating that the +$Table$ should split itself +by row before attempting to split itself by column when too little space is available in +the current drawing area and the caller wants the $Table$ to split.""") + +disc("""The $repeatRows$ and $repeatCols$ arguments specify the number of leading rows and columns +that should be repeated when the $Table$ is asked to split itself.""") +heading4('$Table.setStyle(tblStyle)$') +disc(""" +This method applies a particular instance of class $TableStyle$ (discussed below) +to the $Table$ instance. This is the only way to get $tables$ to appear +in a nicely formatted way. +""") +disc(""" +Successive uses of the $setStyle$ method apply the styles in an additive fashion. +That is, later applications override earlier ones where they overlap. +""") + +heading2('$TableStyle$') +disc(""" +This class is created by passing it a sequence of commands, each command +is a tuple identified by its first element which is a string; the remaining +elements of the command tuple represent the start and stop cell coordinates +of the command and possibly thickness and colors, etc. +""") +heading2("$TableStyle$ User Methods") +heading3("$TableStyle(commandSequence)$") +disc("""The creation method initializes the $TableStyle$ with the argument +command sequence as an example:""") +eg(""" + LIST_STYLE = TableStyle( + [('LINEABOVE', (0,0), (-1,0), 2, colors.green), + ('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black), + ('LINEBELOW', (0,-1), (-1,-1), 2, colors.green), + ('ALIGN', (1,1), (-1,-1), 'RIGHT')] + ) +""") +heading3("$TableStyle.add(commandSequence)$") +disc("""This method allows you to add commands to an existing +$TableStyle$, i.e. you can build up $TableStyles$ in multiple statements. +""") +eg(""" + LIST_STYLE.add('BACKGROUND', (0,0), (-1,0), colors.Color(0,0.7,0.7)) +""") +heading3("$TableStyle.getCommands()$") +disc("""This method returns the sequence of commands of the instance.""") +eg(""" + cmds = LIST_STYLE.getCommands() +""") +heading2("$TableStyle$ Commands") +disc("""The commands passed to $TableStyles$ come in three main groups +which affect the table background, draw lines, or set cell styles. +""") +disc("""The first element of each command is its identifier, +the second and third arguments determine the cell coordinates of +the box of cells which are affected with negative coordinates +counting backwards from the limit values as in Python +indexing. The coordinates are given as +(column, row) which follows the spreadsheet 'A1' model, but not +the more natural (for mathematicians) 'RC' ordering. +The top left cell is (0, 0) the bottom right is (-1, -1). Depending on +the command various extra (???) occur at indices beginning at 3 on. +""") +heading3("""$TableStyle$ Cell Formatting Commands""") +disc("""The cell formatting commands all begin with an identifier, followed by +the start and stop cell definitions and the perhaps other arguments. +the cell formatting commands are:""") +eg(""" +FONT - takes fontname, optional fontsize and optional leading. +FONTNAME (or FACE) - takes fontname. +FONTSIZE (or SIZE) - takes fontsize in points; leading may get out of sync. +LEADING - takes leading in points. +TEXTCOLOR - takes a color name or (R,G,B) tuple. +ALIGNMENT (or ALIGN) - takes one of LEFT, RIGHT and CENTRE (or CENTER) or DECIMAL. +LEFTPADDING - takes an integer, defaults to 6. +RIGHTPADDING - takes an integer, defaults to 6. +BOTTOMPADDING - takes an integer, defaults to 3. +TOPPADDING - takes an integer, defaults to 3. +BACKGROUND - takes a color. +ROWBACKGROUNDS - takes a list of colors to be used cyclically. +COLBACKGROUNDS - takes a list of colors to be used cyclically. +VALIGN - takes one of TOP, MIDDLE or the default BOTTOM +""") +disc("""This sets the background cell color in the relevant cells. +The following example shows the $BACKGROUND$, and $TEXTCOLOR$ commands in action:""") +EmbeddedCode(""" +data= [['00', '01', '02', '03', '04'], + ['10', '11', '12', '13', '14'], + ['20', '21', '22', '23', '24'], + ['30', '31', '32', '33', '34']] +t=Table(data) +t.setStyle(TableStyle([('BACKGROUND',(1,1),(-2,-2),colors.green), + ('TEXTCOLOR',(0,0),(1,-1),colors.red)])) +""") +disc("""To see the effects of the alignment styles we need some widths +and a grid, but it should be easy to see where the styles come from.""") +EmbeddedCode(""" +data= [['00', '01', '02', '03', '04'], + ['10', '11', '12', '13', '14'], + ['20', '21', '22', '23', '24'], + ['30', '31', '32', '33', '34']] +t=Table(data,5*[0.4*inch], 4*[0.4*inch]) +t.setStyle(TableStyle([('ALIGN',(1,1),(-2,-2),'RIGHT'), + ('TEXTCOLOR',(1,1),(-2,-2),colors.red), + ('VALIGN',(0,0),(0,-1),'TOP'), + ('TEXTCOLOR',(0,0),(0,-1),colors.blue), + ('ALIGN',(0,-1),(-1,-1),'CENTER'), + ('VALIGN',(0,-1),(-1,-1),'MIDDLE'), + ('TEXTCOLOR',(0,-1),(-1,-1),colors.green), + ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), + ('BOX', (0,0), (-1,-1), 0.25, colors.black), + ])) +""") +heading3("""$TableStyle$ Line Commands""") +disc(""" + Line commands begin with the identifier, the start and stop cell coordinates + and always follow this with the thickness (in points) and color of the desired lines. Colors can be names, + or they can be specified as a (R, G, B) tuple, where R, G and B are floats and (0, 0, 0) is black. The line + command names are: GRID, BOX, OUTLINE, INNERGRID, LINEBELOW, LINEABOVE, LINEBEFORE + and LINEAFTER. BOX and OUTLINE are equivalent, and GRID is the equivalent of applying both BOX and + INNERGRID. +""") +CPage(4.0) +disc("""We can see some line commands in action with the following example. +""") +EmbeddedCode(""" +data= [['00', '01', '02', '03', '04'], + ['10', '11', '12', '13', '14'], + ['20', '21', '22', '23', '24'], + ['30', '31', '32', '33', '34']] +t=Table(data,style=[('GRID',(1,1),(-2,-2),1,colors.green), + ('BOX',(0,0),(1,-1),2,colors.red), + ('LINEABOVE',(1,2),(-2,2),1,colors.blue), + ('LINEBEFORE',(2,1),(2,-2),1,colors.pink), + ]) +""") +disc("""Line commands cause problems for tables when they split; the following example +shows a table being split in various positions""") +EmbeddedCode(""" +data= [['00', '01', '02', '03', '04'], + ['10', '11', '12', '13', '14'], + ['20', '21', '22', '23', '24'], + ['30', '31', '32', '33', '34']] +t=Table(data,style=[ + ('GRID',(0,0),(-1,-1),0.5,colors.grey), + ('GRID',(1,1),(-2,-2),1,colors.green), + ('BOX',(0,0),(1,-1),2,colors.red), + ('BOX',(0,0),(-1,-1),2,colors.black), + ('LINEABOVE',(1,2),(-2,2),1,colors.blue), + ('LINEBEFORE',(2,1),(2,-2),1,colors.pink), + ('BACKGROUND', (0, 0), (0, 1), colors.pink), + ('BACKGROUND', (1, 1), (1, 2), colors.lavender), + ('BACKGROUND', (2, 2), (2, 3), colors.orange), + ]) +""") +t=getStory()[-1] +getStory().append(Spacer(0,6)) +for s in t.split(4*inch,30): + getStory().append(s) + getStory().append(Spacer(0,6)) +getStory().append(Spacer(0,6)) +for s in t.split(4*inch,36): + getStory().append(s) + getStory().append(Spacer(0,6)) + +disc("""When unsplit and split at the first or second row.""") + +CPage(4.0) +heading3("""Complex Cell Values""") +disc(""" +As mentioned above we can have complicated cell values including $Paragraphs$, $Images$ and other $Flowables$ +or lists of the same. To see this in operation consider the following code and the table it produces. +Note that the $Image$ has a white background which will obscure any background you choose for the cell. +To get better results you should use a transparent background. +""") +import os, reportlab.platypus +I = '../images/replogo.gif' +EmbeddedCode(""" +I = Image('%s') +I.drawHeight = 1.25*inch*I.drawHeight / I.drawWidth +I.drawWidth = 1.25*inch +P0 = Paragraph(''' + A paragraph + 1''', + styleSheet["BodyText"]) +P = Paragraph(''' + The ReportLab Left + Logo + Image''', + styleSheet["BodyText"]) +data= [['A', 'B', 'C', P0, 'D'], + ['00', '01', '02', [I,P], '04'], + ['10', '11', '12', [P,I], '14'], + ['20', '21', '22', '23', '24'], + ['30', '31', '32', '33', '34']] + +t=Table(data,style=[('GRID',(1,1),(-2,-2),1,colors.green), + ('BOX',(0,0),(1,-1),2,colors.red), + ('LINEABOVE',(1,2),(-2,2),1,colors.blue), + ('LINEBEFORE',(2,1),(2,-2),1,colors.pink), + ('BACKGROUND', (0, 0), (0, 1), colors.pink), + ('BACKGROUND', (1, 1), (1, 2), colors.lavender), + ('BACKGROUND', (2, 2), (2, 3), colors.orange), + ('BOX',(0,0),(-1,-1),2,colors.black), + ('GRID',(0,0),(-1,-1),0.5,colors.black), + ('VALIGN',(3,0),(3,0),'BOTTOM'), + ('BACKGROUND',(3,0),(3,0),colors.limegreen), + ('BACKGROUND',(3,1),(3,1),colors.khaki), + ('ALIGN',(3,1),(3,1),'CENTER'), + ('BACKGROUND',(3,2),(3,2),colors.beige), + ('ALIGN',(3,2),(3,2),'LEFT'), + ]) + +t._argW[3]=1.5*inch +"""%I) +heading3("""$TableStyle$ Span Commands""") +disc("""Our $Table$ classes support the concept of spanning, but it isn't specified in the same way +as html. The style specification +""") +eg(""" +SPAN, (sc,sr), (ec,er) +""") +disc("""indicates that the cells in columns $sc$ - $ec$ and rows $sr$ - $er$ should be combined into a super cell +with contents determined by the cell $(sc, sr)$. The other cells should be present, but should contain empty strings +or you may get unexpected results. +""") +EmbeddedCode(""" +data= [['Top\\nLeft', '', '02', '03', '04'], + ['', '', '12', '13', '14'], + ['20', '21', '22', 'Bottom\\nRight', ''], + ['30', '31', '32', '', '']] +t=Table(data,style=[ + ('GRID',(0,0),(-1,-1),0.5,colors.grey), + ('BACKGROUND',(0,0),(1,1),colors.palegreen), + ('SPAN',(0,0),(1,1)), + ('BACKGROUND',(-2,-2),(-1,-1), colors.pink), + ('SPAN',(-2,-2),(-1,-1)), + ]) +""") + +disc("""notice that we don't need to be conservative with our $GRID$ command. The spanned cells are not drawn through. +""") +heading3("""Special $TableStyle$ Indeces""") +disc("""In any style command the first row index may be set to one of the special strings +$'splitlast'$ or $'splitfirst'$ to indicate that the style should be used only for the last row of +a split table, or the first row of a continuation. This allows splitting tables with nicer effects around the split.""") + +heading1("""Other Useful $Flowables$""") +heading2("""$Preformatted(text, style, bulletText = None, dedent=0)$""") +disc(""" +Creates a preformatted paragraph which does no wrapping, line splitting or other manipulations. +No $XML$ style tags are taken account of in the text. +If dedent is non zero $dedent$ common leading +spaces will be removed from the front of each line. +""") +heading2("""$XPreformatted(text, style, bulletText = None, dedent=0, frags=None)$""") +disc(""" +This is a non rearranging form of the $Paragraph$ class; $XML$ tags are allowed in +$text$ and have the same meanings as for the $Paragraph$ class. +As for $Preformatted$, if dedent is non zero $dedent$ common leading +spaces will be removed from the front of each line. +""") +EmbeddedCode(""" +from reportlab.lib.styles import getSampleStyleSheet +stylesheet=getSampleStyleSheet() +normalStyle = stylesheet['Normal'] +text=''' + + This is a non rearranging form of the Paragraph class; + XML tags are allowed in text and have the same + + meanings as for the Paragraph class. + As for Preformatted, if dedent is non zero dedent + common leading spaces will be removed from the + front of each line. + You can have &amp; style entities as well for & < > and ". + +''' +t=XPreformatted(text,normalStyle,dedent=3) +""") +heading2("""$Image(filename, width=None, height=None)$""") +disc("""Create a flowable which will contain the image defined by the data in file $filename$. +The default PDF image type jpeg is supported and if the PIL extension to Python +is installed the other image types can also be handled. If $width$ and or $height$ are specified +then they determine the dimension of the displayed image in points. If either dimension is +not specified (or specified as $None$) then the corresponding pixel dimension of the image is assumed +to be in points and used. +""") +I=os.path.join(os.path.dirname(reportlab.__file__),'docs','images','lj8100.jpg') +eg(""" +Image("lj8100.jpg") +""",after=0.1) +disc("""will display as""") +try: + getStory().append(Image(I)) +except: + disc("""An image should have appeared here.""") +disc("""whereas""") +eg(""" +im = Image("lj8100.jpg", width=2*inch, height=2*inch) +im.hAlign = 'CENTER' +""", after=0.1) +disc('produces') +try: + im = Image(I, width=2*inch, height=2*inch) + im.hAlign = 'CENTER' + getStory().append(Image(I, width=2*inch, height=2*inch)) +except: + disc("""An image should have appeared here.""") +heading2("""$Spacer(width, height)$""") +disc("""This does exactly as would be expected; it adds a certain amount of space into the story. +At present this only works for vertical space. +""") +CPage(1) +heading2("""$PageBreak()$""") +disc("""This $Flowable$ represents a page break. It works by effectively consuming all vertical +space given to it. This is sufficient for a single $Frame$ document, but would only be a +frame break for multiple frames so the $BaseDocTemplate$ mechanism +detects $pageBreaks$ internally and handles them specially. +""") +CPage(1) +heading2("""$CondPageBreak(height)$""") +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$. +""") +CPage(1) +heading2("""$KeepTogether(flowables)$""") +disc(""" +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. +""") diff --git a/bin/reportlab/docs/userguide/ch7_custom.py b/bin/reportlab/docs/userguide/ch7_custom.py new file mode 100644 index 00000000000..176d042cd85 --- /dev/null +++ b/bin/reportlab/docs/userguide/ch7_custom.py @@ -0,0 +1,81 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch7_custom.py +from reportlab.tools.docco.rl_doc_utils import * + +heading1("Writing your own $Flowable$ Objects") +disc(""" +Flowables are intended to be an open standard for creating +reusable report content, and you can easily create your +own objects. We hope that over time we will build up +a library of contributions, giving reportlab users a +rich selection of charts, graphics and other "report +widgets" they can use in their own reports. This section +shows you how to create your own flowables.""") + +todo("""we should put the Figure class in the +standard library, as it is a very useful base.""") + + + + +heading2("A very simple $Flowable$") + +disc(""" +Recall the $hand$ function from the $pdfgen$ section of this user guide which +generated a drawing of a hand as a closed figure composed from Bezier curves. +""") +illust(examples.hand, "a hand") +disc(""" +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. +""") +eg(examples.testhandannotation) +disc(""" +The $wrap$ method must provide the size of the drawing -- it is used by +the Platypus mainloop to decide whether this element fits in the space remaining +on the current frame. The $draw$ method performs the drawing of the object after +the Platypus mainloop has translated the $(0,0)$ origin to an appropriate location +in an appropriate frame. +""") +disc(""" +Below are some example uses of the $HandAnnotation$ flowable. +""") + +from reportlab.lib.colors import blue, pink, yellow, cyan, brown +from reportlab.lib.units import inch + +handnote() + +disc("""The default.""") + +handnote(size=inch) + +disc("""Just one inch high.""") + +handnote(xoffset=3*inch, size=inch, strokecolor=blue, fillcolor=cyan) + +disc("""One inch high and shifted to the left with blue and cyan.""") + + +heading2("Modifying a Built in $Flowable$") +disc("""To modify an existing flowable, you should create a derived class +and override the methods you need to change to get the desired behaviour""") +disc("""As an example to create a rotated image you need to override the wrap +and draw methods of the existing Image class""") +import os +from reportlab.platypus import * +I = '../images/replogo.gif' + +EmbeddedCode(""" +class RotatedImage(Image): + def wrap(self,availWidth,availHeight): + h, w = Image.wrap(self,availHeight,availWidth) + return w, h + def draw(self): + self.canv.rotate(90) + Image.draw(self) +I = RotatedImage('%s') +I.hAlign = 'CENTER' +""" % I,'I') \ No newline at end of file diff --git a/bin/reportlab/docs/userguide/ch9_future.py b/bin/reportlab/docs/userguide/ch9_future.py new file mode 100644 index 00000000000..6ac5b94e502 --- /dev/null +++ b/bin/reportlab/docs/userguide/ch9_future.py @@ -0,0 +1,35 @@ +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/ch9_future.py +from reportlab.tools.docco.rl_doc_utils import * + +heading1("Future Directions") + +disc("""We have a very long list of things we plan to do +and what we do first will most likely be inspired by customer +or user interest. +""") + +disc(""" +We plan to provide a large number of pre-designed Platypus example +document types -- brochure, newsletter, business letter, thesis, memo, +etcetera, to give our users a better boost towards the solutions they +desire. +""") + +disc(""" +We plan to fully support adding fonts and internationalization, which are +not well supported in the current release.""") + +disc(""" +We plan to fully support some of the more obscure features of PDF +such as general hyperlinks, which are not yet well supported. +""") + +disc(""" +We are also open for suggestions. Please let us know what you think +is missing. You can also offer patches or contributions. Please +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 \ No newline at end of file diff --git a/bin/reportlab/docs/userguide/genuserguide.py b/bin/reportlab/docs/userguide/genuserguide.py new file mode 100644 index 00000000000..3166a6a6036 --- /dev/null +++ b/bin/reportlab/docs/userguide/genuserguide.py @@ -0,0 +1,85 @@ +#!/bin/env python +#Copyright ReportLab Europe Ltd. 2000-2004 +#see license.txt for license details +#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/userguide/genuserguide.py +__version__=''' $Id: genuserguide.py 2900 2006-05-22 21:49:00Z andy $ ''' +__doc__ = """ +This module contains the script for building the user guide. +""" +def run(pagesize=None, verbose=0, outDir=None): + import os + from reportlab.tools.docco.rl_doc_utils import setStory, getStory, RLDocTemplate, defaultPageSize + from reportlab.tools.docco import rl_doc_utils + from reportlab.lib.utils import open_and_read, _RL_DIR + if not outDir: outDir = os.path.join(_RL_DIR,'docs') + destfn = os.path.join(outDir,'userguide.pdf') + doc = RLDocTemplate(destfn,pagesize = pagesize or defaultPageSize) + + #this builds the story + setStory() + G = {} + exec 'from reportlab.tools.docco.rl_doc_utils import *' in G, G + for f in ( + 'ch1_intro', + 'ch2_graphics', + 'ch2a_fonts', + 'ch3_pdffeatures', + 'ch4_platypus_concepts', + 'ch5_paragraphs', + 'ch6_tables', + 'ch7_custom', + 'ch9_future', + 'app_demos', + ): + exec open_and_read(f+'.py',mode='t') in G, G + del G + + story = getStory() + if verbose: print 'Built story contains %d flowables...' % len(story) + doc.build(story) + if verbose: print 'Saved "%s"' % destfn + +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') + +def main(): + import sys + outDir = filter(lambda x: x[:9]=='--outdir=',sys.argv) + if outDir: + outDir = outDir[0] + sys.argv.remove(outDir) + outDir = outDir[9:] + else: + outDir = None + verbose = '-s' not in sys.argv + if not verbose: sys.argv.remove('-s') + timing = '-timing' in sys.argv + if timing: sys.argv.remove('-timing') + prof = '-prof' in sys.argv + if prof: sys.argv.remove('-prof') + + if len(sys.argv) > 1: + try: + pagesize = (w,h) = eval(sys.argv[1]) + except: + print 'Expected page size in argument 1', sys.argv[1] + raise + if verbose: + print 'set page size to',sys.argv[1] + else: + pagesize = None + if timing: + from time import time + t0 = time() + run(pagesize, verbose,outDir) + if verbose: + print 'Generation of userguide took %.2f seconds' % (time()-t0) + elif prof: + import profile + profile.run('run(pagesize,verbose,outDir)','genuserguide.stats') + else: + run(pagesize, verbose,outDir) +if __name__=="__main__": + main() diff --git a/bin/reportlab/docs/userguide/testfile.txt b/bin/reportlab/docs/userguide/testfile.txt new file mode 100644 index 00000000000..020f3d7cbaf --- /dev/null +++ b/bin/reportlab/docs/userguide/testfile.txt @@ -0,0 +1,2 @@ +Test of ability to create new files in sourceforge CVS, which +seems not to be working. Can be removed any time. \ No newline at end of file diff --git a/bin/reportlab/license.txt b/bin/reportlab/license.txt new file mode 100644 index 00000000000..7406864d503 --- /dev/null +++ b/bin/reportlab/license.txt @@ -0,0 +1,29 @@ +##################################################################################### +# +# Copyright (c) 2000-2004, ReportLab Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the company nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE OFFICERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +#####################################################################################