Merge lp:~logan/ubuntu/raring/z3c.rml/2.0.0 into lp:ubuntu/raring/z3c.rml

Proposed by Logan Rosen
Status: Merged
Merged at revision: 7
Proposed branch: lp:~logan/ubuntu/raring/z3c.rml/2.0.0
Merge into: lp:ubuntu/raring/z3c.rml
Diff against target: 54995 lines
To merge this branch: bzr merge lp:~logan/ubuntu/raring/z3c.rml/2.0.0
Reviewer Review Type Date Requested Status
Daniel Holbach (community) Approve
Ubuntu branches Pending
Review via email: mp+142435@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Daniel Holbach (dholbach) wrote :

Thanks. Uploaded.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '.pc/no-scripts.patch/setup.py'
--- .pc/no-scripts.patch/setup.py 2012-04-02 19:19:22 +0000
+++ .pc/no-scripts.patch/setup.py 2013-01-09 02:49:23 +0000
@@ -21,7 +21,7 @@
2121
22setup (22setup (
23 name='z3c.rml',23 name='z3c.rml',
24 version='1.0.0',24 version='2.0.0',
25 author = "Stephan Richter and the Zope Community",25 author = "Stephan Richter and the Zope Community",
26 author_email = "zope-dev@zope.org",26 author_email = "zope-dev@zope.org",
27 description = "An alternative implementation of RML",27 description = "An alternative implementation of RML",
@@ -46,12 +46,12 @@
46 extras_require = dict(46 extras_require = dict(
47 test = [47 test = [
48 'zope.pagetemplate',48 'zope.pagetemplate',
49 'zope.testing',49 'Pillow'],
50 'PIL'],
51 pagetemplate = [50 pagetemplate = [
52 'zope.pagetemplate']51 'zope.pagetemplate']
53 ),52 ),
54 install_requires = [53 install_requires = [
54 'Pygments',
55 'lxml',55 'lxml',
56 'pyPdf',56 'pyPdf',
57 'reportlab',57 'reportlab',
5858
=== modified file 'CHANGES.txt'
--- CHANGES.txt 2012-04-02 15:47:51 +0000
+++ CHANGES.txt 2013-01-09 02:49:23 +0000
@@ -2,6 +2,115 @@
2CHANGES2CHANGES
3=======3=======
44
52.0.0 (2012-12-21)
6------------------
7
8- Implemented ``saveState`` and ``restoreState`` directives. (LP #666194)
9
10- Implemented ``storyPlace`` directive. (LP #665941)
11
12- Implemented ``clip`` attribute of ``path`` directive. See RML example 041.
13
14- Added ``h4``, ``h5``, and ``h6`` directives.
15
16- Implemented ``codesnippet`` directive.
17
18- Implemented ``pageBreakBefore``, ``frameBreakBefore``, ``textTransform``,
19 and ``endDots`` attributes for paragraph styles.
20
21- Added ``maxLineLength`` and ``newLineChars`` attributes to the ``pre``
22 directive.
23
24- Implemented ``pageNumber`` element for all ``draw*String`` elements.
25
26- Implemented ``NamedString`` directive.
27
28- Implemented ``startIndex`` and ``showIndex`` directive. Also hooked up
29 ``index`` in paragraphs properly. You can now create real book indexes.
30
31- Implemented ``ol``, ``ul``, and ``li`` directives, which allow highly
32 flexible lists to be created. Also implemented a complimentary ``listStyle``
33 directive.
34
35- Implemented the following doc-programming directives:
36
37 * docAssert
38 * docAssign
39 * docElse
40 * docIf
41 * docExec
42 * docPara
43 * docWhile
44
45- Added ``encName`` attribute to ``registerCidFont`` directive.
46
47- Renamed ``bookmark`` to ``bookmarkPage``.
48
49- Created a new canvas directive called ``bookmark``.
50
51- Added ``img`` directive, which is a simple image flowable.
52
53- Implemented crop marks support fully.
54
55- Added ``pageLayout`` and ``pageMode`` to ``docInit`` directive.
56
57- Implemented all logging related directives.
58
59- Implemented ``color`` directive inside the ``initialize`` directive.
60
61- Renamed ``pdfInclude`` to documented ``includePdfPages`` and added `pages`
62 attribute, so that you can only include specific pages.
63
64- Don't show "doc" namespace in reference snippets.
65
66- Create a list of RML2PDF and z3c.rml differences.
67
68- Implemented the ``ABORT_ON_INVALID_DIRECTIVE`` flag, that when set ``True``
69 will raise a ``ValueError`` error on the first occurence of a bad tag.
70
71- Implemented ``setFontSize`` directive for page drawings.
72
73- Implemented ``plugInGraphic`` which allows inserting graphics rendered in
74 Python.
75
76- Added `href` and `destination` to table cells and rectangles.
77
78- Bug: Due to a logic error, bad directives were never properly detected and
79 logged about.
80
81- Bug: Overwriting the default paragraph styles did not work properly.
82
83- Bug: Specifying a color in any tag inside the paragraph would fail, if the
84 color was a referenced name.
85
86- Bug: Moved premature ``getName`` evaluation into runtime to properly handle
87 synamic content now. This is now properly done for any paragraph and
88 draw string variant.
89
90- Bug: Fixed DTD generator to properly ignore Text Nodes as attributes. Also
91 text nodes were not properly documented as element PCDATA.
92
93
941.1.0 (2012-12-18)
95------------------
96
97- Upgrade to ReportLab 2.6. This required some font changes and several
98 generated PDFs did not match, since some default fonts changed to sans-serif.
99
100- Added ``pdfInclude`` directive from Alex Garel. (LP #969399).
101
102- Switched to Pillow (from PIL).
103
104- Switched RML highlighting in RML Reference from SilverCity to Pygments.
105
106- Bug: Addressed a bug in ReportLab 2.6 that disallowed 3-D pie charts from
107 rendering.
108
109- Bug: Properly reset pdfform before rendering a document.
110
111- Bug: Reset fonts properly before a rendering.
112
113
51.0.0 (2012-04-02)1141.0.0 (2012-04-02)
6------------------115------------------
7116
@@ -16,6 +125,7 @@
16 is updated, the border supports a border radius and the tag-para.rml sample125 is updated, the border supports a border radius and the tag-para.rml sample
17 has been updated.126 has been updated.
18127
128
190.9.0 (2010-07-22)1290.9.0 (2010-07-22)
20------------------130------------------
21131
22132
=== modified file 'PKG-INFO'
--- PKG-INFO 2012-04-02 15:47:51 +0000
+++ PKG-INFO 2013-01-09 02:49:23 +0000
@@ -1,6 +1,6 @@
1Metadata-Version: 1.11Metadata-Version: 1.1
2Name: z3c.rml2Name: z3c.rml
3Version: 1.0.03Version: 2.0.0
4Summary: An alternative implementation of RML4Summary: An alternative implementation of RML
5Home-page: http://pypi.python.org/pypi/z3c.rml5Home-page: http://pypi.python.org/pypi/z3c.rml
6Author: Stephan Richter and the Zope Community6Author: Stephan Richter and the Zope Community
@@ -22,6 +22,115 @@
22 CHANGES22 CHANGES
23 =======23 =======
24 24
25 2.0.0 (2012-12-21)
26 ------------------
27
28 - Implemented ``saveState`` and ``restoreState`` directives. (LP #666194)
29
30 - Implemented ``storyPlace`` directive. (LP #665941)
31
32 - Implemented ``clip`` attribute of ``path`` directive. See RML example 041.
33
34 - Added ``h4``, ``h5``, and ``h6`` directives.
35
36 - Implemented ``codesnippet`` directive.
37
38 - Implemented ``pageBreakBefore``, ``frameBreakBefore``, ``textTransform``,
39 and ``endDots`` attributes for paragraph styles.
40
41 - Added ``maxLineLength`` and ``newLineChars`` attributes to the ``pre``
42 directive.
43
44 - Implemented ``pageNumber`` element for all ``draw*String`` elements.
45
46 - Implemented ``NamedString`` directive.
47
48 - Implemented ``startIndex`` and ``showIndex`` directive. Also hooked up
49 ``index`` in paragraphs properly. You can now create real book indexes.
50
51 - Implemented ``ol``, ``ul``, and ``li`` directives, which allow highly
52 flexible lists to be created. Also implemented a complimentary ``listStyle``
53 directive.
54
55 - Implemented the following doc-programming directives:
56
57 * docAssert
58 * docAssign
59 * docElse
60 * docIf
61 * docExec
62 * docPara
63 * docWhile
64
65 - Added ``encName`` attribute to ``registerCidFont`` directive.
66
67 - Renamed ``bookmark`` to ``bookmarkPage``.
68
69 - Created a new canvas directive called ``bookmark``.
70
71 - Added ``img`` directive, which is a simple image flowable.
72
73 - Implemented crop marks support fully.
74
75 - Added ``pageLayout`` and ``pageMode`` to ``docInit`` directive.
76
77 - Implemented all logging related directives.
78
79 - Implemented ``color`` directive inside the ``initialize`` directive.
80
81 - Renamed ``pdfInclude`` to documented ``includePdfPages`` and added `pages`
82 attribute, so that you can only include specific pages.
83
84 - Don't show "doc" namespace in reference snippets.
85
86 - Create a list of RML2PDF and z3c.rml differences.
87
88 - Implemented the ``ABORT_ON_INVALID_DIRECTIVE`` flag, that when set ``True``
89 will raise a ``ValueError`` error on the first occurence of a bad tag.
90
91 - Implemented ``setFontSize`` directive for page drawings.
92
93 - Implemented ``plugInGraphic`` which allows inserting graphics rendered in
94 Python.
95
96 - Added `href` and `destination` to table cells and rectangles.
97
98 - Bug: Due to a logic error, bad directives were never properly detected and
99 logged about.
100
101 - Bug: Overwriting the default paragraph styles did not work properly.
102
103 - Bug: Specifying a color in any tag inside the paragraph would fail, if the
104 color was a referenced name.
105
106 - Bug: Moved premature ``getName`` evaluation into runtime to properly handle
107 synamic content now. This is now properly done for any paragraph and
108 draw string variant.
109
110 - Bug: Fixed DTD generator to properly ignore Text Nodes as attributes. Also
111 text nodes were not properly documented as element PCDATA.
112
113
114 1.1.0 (2012-12-18)
115 ------------------
116
117 - Upgrade to ReportLab 2.6. This required some font changes and several
118 generated PDFs did not match, since some default fonts changed to sans-serif.
119
120 - Added ``pdfInclude`` directive from Alex Garel. (LP #969399).
121
122 - Switched to Pillow (from PIL).
123
124 - Switched RML highlighting in RML Reference from SilverCity to Pygments.
125
126 - Bug: Addressed a bug in ReportLab 2.6 that disallowed 3-D pie charts from
127 rendering.
128
129 - Bug: Properly reset pdfform before rendering a document.
130
131 - Bug: Reset fonts properly before a rendering.
132
133
25 1.0.0 (2012-04-02)134 1.0.0 (2012-04-02)
26 ------------------135 ------------------
27 136
@@ -36,6 +145,7 @@
36 is updated, the border supports a border radius and the tag-para.rml sample145 is updated, the border supports a border radius and the tag-para.rml sample
37 has been updated.146 has been updated.
38 147
148
39 0.9.0 (2010-07-22)149 0.9.0 (2010-07-22)
40 ------------------150 ------------------
41 151
42152
=== modified file 'buildout.cfg'
--- buildout.cfg 2012-04-02 15:47:51 +0000
+++ buildout.cfg 2013-01-09 02:49:23 +0000
@@ -21,7 +21,6 @@
21eggs = ${test:eggs}21eggs = ${test:eggs}
2222
23[versions]23[versions]
24# tag-textField test fails with reportlab 2.5, because of this change to PDFPattern:24reportlab = 2.6
25# http://two.pairlist.net/pipermail/reportlab-users/2010-January/009216.html25Pillow = 1.7.8
26reportlab = 2.426lxml = 3.0.2
27PIL = 1.1.7
2827
=== modified file 'debian/changelog'
--- debian/changelog 2012-09-27 17:31:39 +0000
+++ debian/changelog 2013-01-09 02:49:23 +0000
@@ -1,3 +1,10 @@
1z3c.rml (2.0.0-0ubuntu1) raring; urgency=low
2
3 * New upstream release.
4 * debian/control: Bump Standards-Version to 3.9.4.
5
6 -- Logan Rosen <logatronico@gmail.com> Tue, 08 Jan 2013 21:40:32 -0500
7
1z3c.rml (1.0.0-0ubuntu2) quantal; urgency=low8z3c.rml (1.0.0-0ubuntu2) quantal; urgency=low
29
3 * debian/control: added the Homepage field. 10 * debian/control: added the Homepage field.
411
=== modified file 'debian/control'
--- debian/control 2012-09-27 17:31:39 +0000
+++ debian/control 2013-01-09 02:49:23 +0000
@@ -7,7 +7,7 @@
7 python-all (>= 2.6.6-3~),7 python-all (>= 2.6.6-3~),
8 python-setuptools,8 python-setuptools,
9 python-van.pydeb (>= 1.3.0-4)9 python-van.pydeb (>= 1.3.0-4)
10Standards-Version: 3.9.310Standards-Version: 3.9.4
11X-Python-Version: >= 2.511X-Python-Version: >= 2.5
12Homepage: http://pypi.python.org/pypi/z3c.rml/12Homepage: http://pypi.python.org/pypi/z3c.rml/
1313
1414
=== modified file 'setup.py'
--- setup.py 2012-04-02 19:19:22 +0000
+++ setup.py 2013-01-09 02:49:23 +0000
@@ -21,7 +21,7 @@
2121
22setup (22setup (
23 name='z3c.rml',23 name='z3c.rml',
24 version='1.0.0',24 version='2.0.0',
25 author = "Stephan Richter and the Zope Community",25 author = "Stephan Richter and the Zope Community",
26 author_email = "zope-dev@zope.org",26 author_email = "zope-dev@zope.org",
27 description = "An alternative implementation of RML",27 description = "An alternative implementation of RML",
@@ -46,12 +46,12 @@
46 extras_require = dict(46 extras_require = dict(
47 test = [47 test = [
48 'zope.pagetemplate',48 'zope.pagetemplate',
49 'zope.testing',49 'Pillow'],
50 'PIL'],
51 pagetemplate = [50 pagetemplate = [
52 'zope.pagetemplate']51 'zope.pagetemplate']
53 ),52 ),
54 install_requires = [53 install_requires = [
54 'Pygments',
55 'lxml',55 'lxml',
56 'pyPdf',56 'pyPdf',
57 'reportlab',57 'reportlab',
5858
=== modified file 'src/z3c.rml.egg-info/PKG-INFO'
--- src/z3c.rml.egg-info/PKG-INFO 2012-04-02 15:47:51 +0000
+++ src/z3c.rml.egg-info/PKG-INFO 2013-01-09 02:49:23 +0000
@@ -1,6 +1,6 @@
1Metadata-Version: 1.11Metadata-Version: 1.1
2Name: z3c.rml2Name: z3c.rml
3Version: 1.0.03Version: 2.0.0
4Summary: An alternative implementation of RML4Summary: An alternative implementation of RML
5Home-page: http://pypi.python.org/pypi/z3c.rml5Home-page: http://pypi.python.org/pypi/z3c.rml
6Author: Stephan Richter and the Zope Community6Author: Stephan Richter and the Zope Community
@@ -22,6 +22,115 @@
22 CHANGES22 CHANGES
23 =======23 =======
24 24
25 2.0.0 (2012-12-21)
26 ------------------
27
28 - Implemented ``saveState`` and ``restoreState`` directives. (LP #666194)
29
30 - Implemented ``storyPlace`` directive. (LP #665941)
31
32 - Implemented ``clip`` attribute of ``path`` directive. See RML example 041.
33
34 - Added ``h4``, ``h5``, and ``h6`` directives.
35
36 - Implemented ``codesnippet`` directive.
37
38 - Implemented ``pageBreakBefore``, ``frameBreakBefore``, ``textTransform``,
39 and ``endDots`` attributes for paragraph styles.
40
41 - Added ``maxLineLength`` and ``newLineChars`` attributes to the ``pre``
42 directive.
43
44 - Implemented ``pageNumber`` element for all ``draw*String`` elements.
45
46 - Implemented ``NamedString`` directive.
47
48 - Implemented ``startIndex`` and ``showIndex`` directive. Also hooked up
49 ``index`` in paragraphs properly. You can now create real book indexes.
50
51 - Implemented ``ol``, ``ul``, and ``li`` directives, which allow highly
52 flexible lists to be created. Also implemented a complimentary ``listStyle``
53 directive.
54
55 - Implemented the following doc-programming directives:
56
57 * docAssert
58 * docAssign
59 * docElse
60 * docIf
61 * docExec
62 * docPara
63 * docWhile
64
65 - Added ``encName`` attribute to ``registerCidFont`` directive.
66
67 - Renamed ``bookmark`` to ``bookmarkPage``.
68
69 - Created a new canvas directive called ``bookmark``.
70
71 - Added ``img`` directive, which is a simple image flowable.
72
73 - Implemented crop marks support fully.
74
75 - Added ``pageLayout`` and ``pageMode`` to ``docInit`` directive.
76
77 - Implemented all logging related directives.
78
79 - Implemented ``color`` directive inside the ``initialize`` directive.
80
81 - Renamed ``pdfInclude`` to documented ``includePdfPages`` and added `pages`
82 attribute, so that you can only include specific pages.
83
84 - Don't show "doc" namespace in reference snippets.
85
86 - Create a list of RML2PDF and z3c.rml differences.
87
88 - Implemented the ``ABORT_ON_INVALID_DIRECTIVE`` flag, that when set ``True``
89 will raise a ``ValueError`` error on the first occurence of a bad tag.
90
91 - Implemented ``setFontSize`` directive for page drawings.
92
93 - Implemented ``plugInGraphic`` which allows inserting graphics rendered in
94 Python.
95
96 - Added `href` and `destination` to table cells and rectangles.
97
98 - Bug: Due to a logic error, bad directives were never properly detected and
99 logged about.
100
101 - Bug: Overwriting the default paragraph styles did not work properly.
102
103 - Bug: Specifying a color in any tag inside the paragraph would fail, if the
104 color was a referenced name.
105
106 - Bug: Moved premature ``getName`` evaluation into runtime to properly handle
107 synamic content now. This is now properly done for any paragraph and
108 draw string variant.
109
110 - Bug: Fixed DTD generator to properly ignore Text Nodes as attributes. Also
111 text nodes were not properly documented as element PCDATA.
112
113
114 1.1.0 (2012-12-18)
115 ------------------
116
117 - Upgrade to ReportLab 2.6. This required some font changes and several
118 generated PDFs did not match, since some default fonts changed to sans-serif.
119
120 - Added ``pdfInclude`` directive from Alex Garel. (LP #969399).
121
122 - Switched to Pillow (from PIL).
123
124 - Switched RML highlighting in RML Reference from SilverCity to Pygments.
125
126 - Bug: Addressed a bug in ReportLab 2.6 that disallowed 3-D pie charts from
127 rendering.
128
129 - Bug: Properly reset pdfform before rendering a document.
130
131 - Bug: Reset fonts properly before a rendering.
132
133
25 1.0.0 (2012-04-02)134 1.0.0 (2012-04-02)
26 ------------------135 ------------------
27 136
@@ -36,6 +145,7 @@
36 is updated, the border supports a border radius and the tag-para.rml sample145 is updated, the border supports a border radius and the tag-para.rml sample
37 has been updated.146 has been updated.
38 147
148
39 0.9.0 (2010-07-22)149 0.9.0 (2010-07-22)
40 ------------------150 ------------------
41 151
42152
=== modified file 'src/z3c.rml.egg-info/SOURCES.txt'
--- src/z3c.rml.egg-info/SOURCES.txt 2012-04-02 15:47:51 +0000
+++ src/z3c.rml.egg-info/SOURCES.txt 2013-01-09 02:49:23 +0000
@@ -16,37 +16,42 @@
16src/z3c.rml.egg-info/not-zip-safe16src/z3c.rml.egg-info/not-zip-safe
17src/z3c.rml.egg-info/requires.txt17src/z3c.rml.egg-info/requires.txt
18src/z3c.rml.egg-info/top_level.txt18src/z3c.rml.egg-info/top_level.txt
19src/z3c/rml/DEPENDENCIES.cfg
20src/z3c/rml/README.txt19src/z3c/rml/README.txt
21src/z3c/rml/__init__.py20src/z3c/rml/__init__.py
22src/z3c/rml/attr.py21src/z3c/rml/attr.py
23src/z3c/rml/canvas.py22src/z3c/rml/canvas.py
24src/z3c/rml/chart.py23src/z3c/rml/chart.py
25src/z3c/rml/directive.py24src/z3c/rml/directive.py
25src/z3c/rml/doclogic.py
26src/z3c/rml/document.py26src/z3c/rml/document.py
27src/z3c/rml/dtd.py27src/z3c/rml/dtd.py
28src/z3c/rml/error.py28src/z3c/rml/error.py
29src/z3c/rml/flowable.py29src/z3c/rml/flowable.py
30src/z3c/rml/form.py30src/z3c/rml/form.py
31src/z3c/rml/interfaces.py31src/z3c/rml/interfaces.py
32src/z3c/rml/list.py
32src/z3c/rml/occurence.py33src/z3c/rml/occurence.py
33src/z3c/rml/page.py34src/z3c/rml/page.py
34src/z3c/rml/pagetemplate.py35src/z3c/rml/pagetemplate.py
35src/z3c/rml/pagetemplate.txt36src/z3c/rml/pagetemplate.txt
36src/z3c/rml/paraparser.py37src/z3c/rml/paraparser.py
38src/z3c/rml/pdfinclude.py
37src/z3c/rml/platypus.py39src/z3c/rml/platypus.py
38src/z3c/rml/reference.pt40src/z3c/rml/reference.pt
39src/z3c/rml/reference.py41src/z3c/rml/reference.py
42src/z3c/rml/rlfix.py
40src/z3c/rml/rml-reference.pdf43src/z3c/rml/rml-reference.pdf
41src/z3c/rml/rml.dtd44src/z3c/rml/rml.dtd
42src/z3c/rml/rml2pdf.py45src/z3c/rml/rml2pdf.py
43src/z3c/rml/rml2pdfscript.py46src/z3c/rml/rml2pdfscript.py
44src/z3c/rml/special.py47src/z3c/rml/special.py
48src/z3c/rml/storyplace.py
45src/z3c/rml/stylesheet.py49src/z3c/rml/stylesheet.py
46src/z3c/rml/template.py50src/z3c/rml/template.py
47src/z3c/rml/tests/__init__.py51src/z3c/rml/tests/__init__.py
48src/z3c/rml/tests/flowable.py52src/z3c/rml/tests/flowable.py
49src/z3c/rml/tests/module.py53src/z3c/rml/tests/module.py
54src/z3c/rml/tests/test_directive.py
50src/z3c/rml/tests/test_pagetemplate.py55src/z3c/rml/tests/test_pagetemplate.py
51src/z3c/rml/tests/test_rml.py56src/z3c/rml/tests/test_rml.py
52src/z3c/rml/tests/test_subprocess.py57src/z3c/rml/tests/test_subprocess.py
5358
=== modified file 'src/z3c.rml.egg-info/requires.txt'
--- src/z3c.rml.egg-info/requires.txt 2012-04-02 19:19:22 +0000
+++ src/z3c.rml.egg-info/requires.txt 2013-01-09 02:49:23 +0000
@@ -1,3 +1,4 @@
1Pygments
1lxml2lxml
2pyPdf3pyPdf
3reportlab4reportlab
@@ -7,8 +8,7 @@
78
8[test]9[test]
9zope.pagetemplate10zope.pagetemplate
10zope.testing11Pillow
11PIL
1212
13[pagetemplate]13[pagetemplate]
14zope.pagetemplate14zope.pagetemplate
15\ No newline at end of file15\ No newline at end of file
1616
=== removed file 'src/z3c/rml/DEPENDENCIES.cfg'
--- src/z3c/rml/DEPENDENCIES.cfg 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/DEPENDENCIES.cfg 1970-01-01 00:00:00 +0000
@@ -1,5 +0,0 @@
1zope.interface
2zope.pagetemplate
3zope.testing
4reportlab
5reportlab.graphics.barcode
60
=== modified file 'src/z3c/rml/README.txt'
--- src/z3c/rml/README.txt 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/README.txt 2013-01-09 02:49:23 +0000
@@ -2,10 +2,10 @@
2Reportlab Markup Language2Reportlab Markup Language
3=========================3=========================
44
5This pacakge is a free implementation of the RML markup language developed by5This package is a free implementation of the RML markup language developed by
6Reportlab. Unfortunately, full compliance cannot be immediately verified,6Reportlab. Unfortunately, full compliance cannot be immediately verified,
7since the RML User Guide is ambiguous, incomplete and even incorrect. This7since the RML User Guide is ambiguous, incomplete and even incorrect. This
8pacakge can also not support the commercial extensions to Reportlab.8package can also not support the commercial extensions to Reportlab.
99
10In the course of implementing the specification, I made already some10In the course of implementing the specification, I made already some
11improvements for various tags and added others fully. I also tried hard to11improvements for various tags and added others fully. I also tried hard to
1212
=== modified file 'src/z3c/rml/__init__.py'
--- src/z3c/rml/__init__.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/__init__.py 2013-01-09 02:49:23 +0000
@@ -1,3 +1,4 @@
11
2# Hook up our custom paragraph parser.2# Hook up our custom paragraph parser.
3import z3c.rml.paraparser3import z3c.rml.paraparser
4import z3c.rml.rlfix
45
=== modified file 'src/z3c/rml/attr.py'
--- src/z3c/rml/attr.py 2012-04-02 15:47:51 +0000
+++ src/z3c/rml/attr.py 2013-01-09 02:49:23 +0000
@@ -13,7 +13,7 @@
13##############################################################################13##############################################################################
14"""RML Attribute Implementation14"""RML Attribute Implementation
1515
16$Id: attr.py 121449 2011-04-19 16:00:38Z menesis $16$Id: attr.py 128842 2012-12-21 05:38:51Z srichter $
17"""17"""
18__docformat__ = "reStructuredText"18__docformat__ = "reStructuredText"
19import cStringIO19import cStringIO
@@ -37,12 +37,12 @@
37logger = logging.getLogger("z3c.rml")37logger = logging.getLogger("z3c.rml")
3838
3939
40def getFileInfo(attr):40def getFileInfo(directive):
41 root = attr.context41 root = directive
42 while root.parent:42 while root.parent:
43 root = root.parent43 root = root.parent
44 return '(file %s, line %i)' % (44 return '(file %s, line %i)' % (
45 root.filename, attr.context.element.sourceline)45 root.filename, directive.element.sourceline)
4646
4747
48def getManager(context, interface=None):48def getManager(context, interface=None):
@@ -87,7 +87,7 @@
87 name = self.deprecatedName87 name = self.deprecatedName
88 logger.warn(88 logger.warn(
89 u'Deprecated attribute "%s": %s %s' % (89 u'Deprecated attribute "%s": %s %s' % (
90 name, self.deprecatedReason, getFileInfo(self)))90 name, self.deprecatedReason, getFileInfo(self.context)))
91 else:91 else:
92 name = self.__name__92 name = self.__name__
93 # Extract the value.93 # Extract the value.
@@ -102,14 +102,16 @@
102102
103class BaseChoice(RMLAttribute):103class BaseChoice(RMLAttribute):
104 choices = {}104 choices = {}
105 doLower = True
105106
106 def fromUnicode(self, value):107 def fromUnicode(self, value):
107 value = value.lower()108 if self.doLower:
109 value = value.lower()
108 if value in self.choices:110 if value in self.choices:
109 return self.choices[value]111 return self.choices[value]
110 raise ValueError(112 raise ValueError(
111 '%r not a valid value for attribute "%s". %s' % (113 '%r not a valid value for attribute "%s". %s' % (
112 value, self.__name__, getFileInfo(self)))114 value, self.__name__, getFileInfo(self.context)))
113115
114116
115class Combination(RMLAttribute):117class Combination(RMLAttribute):
@@ -127,7 +129,8 @@
127 except ValueError:129 except ValueError:
128 pass130 pass
129 raise ValueError(131 raise ValueError(
130 '"%s" is not a valid value. %s' %(value, getFileInfo(self)))132 '"%s" is not a valid value. %s' %(
133 value, getFileInfo(self.context)))
131134
132135
133class String(RMLAttribute, zope.schema.Bytes):136class String(RMLAttribute, zope.schema.Bytes):
@@ -185,18 +188,46 @@
185 (self.max_length is not None and len(result) > self.max_length)):188 (self.max_length is not None and len(result) > self.max_length)):
186 raise ValueError(189 raise ValueError(
187 'Length of sequence must be at least %s and at most %i. %s' % (190 'Length of sequence must be at least %s and at most %i. %s' % (
188 self.min_length, self.max_length, getFileInfo(self)))191 self.min_length, self.max_length,
192 getFileInfo(self.context)))
189 return result193 return result
190194
191195
196class IntegerSequence(Sequence):
197 """A sequence of integers."""
198
199 def fromUnicode(self, ustr):
200 ustr = ustr.strip()
201 pieces = self.splitre.split(ustr)
202 numbers = set([])
203 for piece in pieces:
204 # Ignore empty pieces.
205 if not piece:
206 continue
207 # The piece is a range.
208 if '-' in piece:
209 start, end = piece.split('-')
210 # Make range lower and upper bound inclusive.
211 numbers.update(range(int(start), int(end)+1))
212 continue
213 # The piece is just a number
214 numbers.add(int(piece))
215 return list(numbers)
216
192class Choice(BaseChoice):217class Choice(BaseChoice):
193 """A choice of several values. The values are always case-insensitive."""218 """A choice of several values. The values are always case-insensitive."""
194219
195 def __init__(self, choices=None, *args, **kw):220 def __init__(self, choices=None, doLower=True, *args, **kw):
196 super(Choice, self).__init__(*args, **kw)221 super(Choice, self).__init__(*args, **kw)
197 if isinstance(choices, (tuple, list)):222 if isinstance(choices, (tuple, list)):
198 choices = dict([(val.lower(), val) for val in choices])223 choices = dict(
224 [(val.lower() if doLower else val, val) for val in choices])
225 else:
226 choices = dict(
227 [(key.lower() if doLower else key, val)
228 for key, val in choices.items()])
199 self.choices = choices229 self.choices = choices
230 self.doLower = doLower
200231
201232
202class Boolean(BaseChoice):233class Boolean(BaseChoice):
@@ -220,7 +251,7 @@
220class Measurement(RMLAttribute):251class Measurement(RMLAttribute):
221 '''This field represents a length value.252 '''This field represents a length value.
222253
223 The units "in" (inch), "cm", and "mm" are allowed. If no units are254 The units "in" (inch), "cm", "mm", and "pt" are allowed. If no units are
224 specified, the value is given in points/pixels.255 specified, the value is given in points/pixels.
225 '''256 '''
226 def __init__(self, allowPercentage=False, allowStar=False, *args, **kw):257 def __init__(self, allowPercentage=False, allowStar=False, *args, **kw):
@@ -232,6 +263,7 @@
232 (re.compile('^(-?[0-9\.]+)\s*in$'), reportlab.lib.units.inch),263 (re.compile('^(-?[0-9\.]+)\s*in$'), reportlab.lib.units.inch),
233 (re.compile('^(-?[0-9\.]+)\s*cm$'), reportlab.lib.units.cm),264 (re.compile('^(-?[0-9\.]+)\s*cm$'), reportlab.lib.units.cm),
234 (re.compile('^(-?[0-9\.]+)\s*mm$'), reportlab.lib.units.mm),265 (re.compile('^(-?[0-9\.]+)\s*mm$'), reportlab.lib.units.mm),
266 (re.compile('^(-?[0-9\.]+)\s*pt$'), 1),
235 (re.compile('^(-?[0-9\.]+)\s*$'), 1)267 (re.compile('^(-?[0-9\.]+)\s*$'), 1)
236 ]268 ]
237269
@@ -251,7 +283,7 @@
251 return unit[1]*float(res.group(1))283 return unit[1]*float(res.group(1))
252 raise ValueError(284 raise ValueError(
253 'The value %r is not a valid measurement. %s' % (285 'The value %r is not a valid measurement. %s' % (
254 value, getFileInfo(self)))286 value, getFileInfo(self.context)))
255287
256288
257class File(Text):289class File(Text):
@@ -277,7 +309,7 @@
277 if result is None:309 if result is None:
278 raise ValueError(310 raise ValueError(
279 'The package-path-pair you specified was incorrect. %s' %(311 'The package-path-pair you specified was incorrect. %s' %(
280 getFileInfo(self)))312 getFileInfo(self.context)))
281 modulepath, path = result.groups()313 modulepath, path = result.groups()
282 module = __import__(modulepath, {}, {}, (modulepath))314 module = __import__(modulepath, {}, {}, (modulepath))
283 value = os.path.join(os.path.dirname(module.__file__), path)315 value = os.path.join(os.path.dirname(module.__file__), path)
@@ -325,9 +357,13 @@
325 self.acceptNone = acceptNone357 self.acceptNone = acceptNone
326358
327 def fromUnicode(self, value):359 def fromUnicode(self, value):
328 if self.acceptNone and value == 'None':360 if self.acceptNone and value.lower() == 'none':
329 return None361 return None
330 manager = getManager(self.context)362 manager = getManager(self.context)
363
364 if value.startswith('rml:'):
365 value = manager.names[value[4:]]
366
331 if value in manager.colors:367 if value in manager.colors:
332 return manager.colors[value]368 return manager.colors[value]
333 try:369 try:
@@ -336,7 +372,20 @@
336 except:372 except:
337 raise ValueError(373 raise ValueError(
338 'The color specification "%s" is not valid. %s' % (374 'The color specification "%s" is not valid. %s' % (
339 value, getFileInfo(self)))375 value, getFileInfo(self.context)))
376
377def _getStyle(context, value):
378 manager = getManager(context)
379 for styles in (manager.styles,
380 reportlab.lib.styles.getSampleStyleSheet().byName):
381 if value in styles:
382 return styles[value]
383 elif 'style.' + value in styles:
384 return styles['style.' + value]
385 elif value.startswith('style.') and value[6:] in styles:
386 return styles[value[6:]]
387 raise ValueError('Style %r could not be found. %s' % (
388 value, getFileInfo(context)))
340389
341class Style(String):390class Style(String):
342 """Requires a valid style to be entered.391 """Requires a valid style to be entered.
@@ -347,17 +396,23 @@
347 default = reportlab.lib.styles.getSampleStyleSheet().byName['Normal']396 default = reportlab.lib.styles.getSampleStyleSheet().byName['Normal']
348397
349 def fromUnicode(self, value):398 def fromUnicode(self, value):
350 manager = getManager(self.context)399 return _getStyle(self.context, value)
351 for styles in (manager.styles,400
352 reportlab.lib.styles.getSampleStyleSheet().byName):401
353 if value in styles:402class Padding(Sequence):
354 return styles[value]403 """This attribute is specific for padding and will produce the proper
355 elif 'style.' + value in styles:404 length of the padding sequence."""
356 return styles['style.' + value]405
357 elif value.startswith('style.') and value[6:] in styles:406 def __init__(self, *args, **kw):
358 return styles[value[6:]]407 kw.update(dict(value_type=Integer(), min_length=1, max_length=4))
359 raise ValueError('Style %r could not be found. %s' % (408 super(Padding, self).__init__(*args, **kw)
360 value, getFileInfo(self)))409
410 def fromUnicode(self, value):
411 seq = super(Padding, self).fromUnicode(value)
412 # pdfgen does not like a single paddign value.
413 if len(seq) == 1:
414 seq.append(seq[0])
415 return seq
361416
362417
363class Symbol(Text):418class Symbol(Text):
@@ -420,7 +475,7 @@
420 return text.strip()475 return text.strip()
421476
422477
423class TextNodeSequence(Sequence):478class TextNodeSequence(Sequence, TextNode):
424 """A sequence of values retrieved from the element's content."""479 """A sequence of values retrieved from the element's content."""
425480
426 def get(self):481 def get(self):
@@ -443,7 +498,7 @@
443 if len(result) % self.columns != 0:498 if len(result) % self.columns != 0:
444 raise ValueError(499 raise ValueError(
445 'Number of elements must be divisible by %i. %s' %(500 'Number of elements must be divisible by %i. %s' %(
446 self.columns, getFileInfo(self)))501 self.columns, getFileInfo(self.context)))
447 return [result[i*self.columns:(i+1)*self.columns]502 return [result[i*self.columns:(i+1)*self.columns]
448 for i in range(len(result)/self.columns)]503 for i in range(len(result)/self.columns)]
449504
@@ -456,28 +511,17 @@
456511
457 def __init__(self, *args, **kw):512 def __init__(self, *args, **kw):
458 super(RawXMLContent, self).__init__(*args, **kw)513 super(RawXMLContent, self).__init__(*args, **kw)
459 # Do it in here, since we have a recursive problem otherwise
460 from z3c.rml import special
461 self.handleElements = {'getName': special.GetName}
462514
463 def get(self):515 def get(self):
464 # Replace what we can replace
465 for subElement in self.context.element.iterdescendants():
466 if subElement.tag in self.handleElements:
467 substitute = self.handleElements[subElement.tag](
468 subElement, self.context)
469 substitute.process()
470 # Now create the text
471 # ReportLab's paragraph parser does not like attributes from other516 # ReportLab's paragraph parser does not like attributes from other
472 # namespaces; sigh. So we have to improvize.517 # namespaces; sigh. So we have to improvize.
473 text = etree.tounicode(self.context.element)518 text = etree.tounicode(self.context.element)
474 text = text[text.find('>')+1:text.rfind('<')]519 text = text[text.find('>')+1:text.rfind('<')]
475 return text520 return text
476521
477
478class XMLContent(RawXMLContent):522class XMLContent(RawXMLContent):
479 """Same as 'RawXMLContent', except that the whitespace is normalized."""523 """Same as 'RawXMLContent', except that the whitespace is normalized."""
480524
481 def get(self):525 def get(self):
482 result = super(XMLContent, self).get()526 text = super(XMLContent, self).get()
483 return result.strip().replace('\t', ' ')527 return text.strip().replace('\t', ' ')
484528
=== modified file 'src/z3c/rml/canvas.py'
--- src/z3c/rml/canvas.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/canvas.py 2013-01-09 02:49:23 +0000
@@ -13,7 +13,7 @@
13##############################################################################13##############################################################################
14"""Page Drawing Related Element Processing14"""Page Drawing Related Element Processing
1515
16$Id: canvas.py 114908 2010-07-22 02:23:18Z srichter $16$Id: canvas.py 128843 2012-12-21 06:58:39Z srichter $
17"""17"""
18__docformat__ = "reStructuredText"18__docformat__ = "reStructuredText"
19import zope.interface19import zope.interface
@@ -59,6 +59,22 @@
59 getattr(canvas, self.callable)(**kwargs)59 getattr(canvas, self.callable)(**kwargs)
6060
6161
62class ISaveState(interfaces.IRMLDirectiveSignature):
63 """Saves the current canvas state."""
64
65class SaveState(CanvasRMLDirective):
66 signature = ISaveState
67 callable = 'saveState'
68
69
70class IRestoreState(interfaces.IRMLDirectiveSignature):
71 """Saves the current canvas state."""
72
73class RestoreState(CanvasRMLDirective):
74 signature = IRestoreState
75 callable = 'restoreState'
76
77
62class IDrawString(interfaces.IRMLDirectiveSignature):78class IDrawString(interfaces.IRMLDirectiveSignature):
63 """Draws a simple string (left aligned) onto the canvas at the specified79 """Draws a simple string (left aligned) onto the canvas at the specified
64 location."""80 location."""
@@ -75,7 +91,7 @@
75 u'string.'),91 u'string.'),
76 required=True)92 required=True)
7793
78 text = attr.TextNode(94 text = attr.RawXMLContent(
79 title=u'Text',95 title=u'Text',
80 description=(u'The string/text that is put onto the canvas.'),96 description=(u'The string/text that is put onto the canvas.'),
81 required=True)97 required=True)
@@ -84,6 +100,31 @@
84 signature = IDrawString100 signature = IDrawString
85 callable = 'drawString'101 callable = 'drawString'
86102
103 def getPageNumber(self, elem, canvas):
104 return str(canvas.getPageNumber() + int(elem.get('countingFrom', 1)) - 1)
105
106 def getName(self, elem, canvas):
107 return attr.getManager(self).names[elem.get('id')]
108
109 handleElements = {'pageNumber': getPageNumber,
110 'getName': getName}
111
112 def _getText(self, node, canvas):
113 text = node.text or u''
114 for sub in node.iterdescendants():
115 if sub.tag in self.handleElements:
116 text += self.handleElements[sub.tag](self, sub, canvas)
117 else:
118 self._getText(sub, canvas)
119 text += node.tail or u''
120 return text
121
122 def process(self):
123 canvas = attr.getManager(self, interfaces.ICanvasManager).canvas
124 kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping))
125 kwargs['text'] = self._getText(self.element, canvas).strip()
126 getattr(canvas, self.callable)(**kwargs)
127
87class IDrawRightString(IDrawString):128class IDrawRightString(IDrawString):
88 """Draws a simple string (right aligned) onto the canvas at the specified129 """Draws a simple string (right aligned) onto the canvas at the specified
89 location."""130 location."""
@@ -180,6 +221,17 @@
180 description=u'The radius of the rounded corners.',221 description=u'The radius of the rounded corners.',
181 required=False)222 required=False)
182223
224 href = attr.Text(
225 title=u'Link URL',
226 description=u'When specified, the rectangle becomes a link to that URL.',
227 required=False)
228
229 destination = attr.Text(
230 title=u'Link Destination',
231 description=(u'When specified, the rectangle becomes a link to that '
232 u'destination.'),
233 required=False)
234
183class Rectangle(CanvasRMLDirective):235class Rectangle(CanvasRMLDirective):
184 signature = IRectangle236 signature = IRectangle
185 callable = 'rect'237 callable = 'rect'
@@ -188,8 +240,24 @@
188 def process(self):240 def process(self):
189 if 'round' in self.element.keys():241 if 'round' in self.element.keys():
190 self.callable = 'roundRect'242 self.callable = 'roundRect'
191 super(Rectangle, self).process()243 kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping))
244 canvas = attr.getManager(self, interfaces.ICanvasManager).canvas
245 # Create a link
246 url = kwargs.pop('href', None)
247 if url:
248 canvas.linkURL(
249 url,
250 (kwargs['x'], kwargs['y'],
251 kwargs['x']+kwargs['width'], kwargs['y']+kwargs['height']))
252 dest = kwargs.pop('destination', None)
253 if dest:
254 canvas.linkRect(
255 '', dest,
256 (kwargs['x'], kwargs['y'],
257 kwargs['x']+kwargs['width'], kwargs['y']+kwargs['height']))
192258
259 # Render the rectangle
260 getattr(canvas, self.callable)(**kwargs)
193261
194class IGrid(interfaces.IRMLDirectiveSignature):262class IGrid(interfaces.IRMLDirectiveSignature):
195 """A shape to be drawn on the canvas."""263 """A shape to be drawn on the canvas."""
@@ -490,6 +558,13 @@
490 default=False,558 default=False,
491 required=False)559 required=False)
492560
561 clip = attr.Boolean(
562 title=u'Clip Path',
563 description=(u"A flag specifying whether the path should clip "
564 u"overlapping elements."),
565 default=False,
566 required=False)
567
493class Path(CanvasRMLDirective):568class Path(CanvasRMLDirective):
494 signature = IPath569 signature = IPath
495 factories = {570 factories = {
@@ -527,7 +602,10 @@
527 if kwargs.pop('close', False):602 if kwargs.pop('close', False):
528 self.path.close()603 self.path.close()
529604
530 canvas.drawPath(self.path, **kwargs)605 if kwargs.pop('clip', False):
606 canvas.clipPath(self.path, **kwargs)
607 else:
608 canvas.drawPath(self.path, **kwargs)
531609
532610
533class IFill(interfaces.IRMLDirectiveSignature):611class IFill(interfaces.IRMLDirectiveSignature):
@@ -582,18 +660,38 @@
582 attrMapping = {'name': 'psfontname'}660 attrMapping = {'name': 'psfontname'}
583661
584662
663class ISetFontSize(interfaces.IRMLDirectiveSignature):
664 """Set the font size."""
665
666 size = attr.Measurement(
667 title=u'Size',
668 description=(u'The font size.'),
669 required=True)
670
671 leading = attr.Measurement(
672 title=u'Leading',
673 description=(u'The font leading.'),
674 required=False)
675
676class SetFontSize(CanvasRMLDirective):
677 signature = ISetFontSize
678 callable = 'setFontSize'
679
680
585class IScale(interfaces.IRMLDirectiveSignature):681class IScale(interfaces.IRMLDirectiveSignature):
586 """Scale the drawing using x and y scaling factors."""682 """Scale the drawing using x and y scaling factors."""
587683
588 sx = attr.Float(684 sx = attr.Float(
589 title=u'X-Scaling-Factor',685 title=u'X-Scaling-Factor',
590 description=(u'The scaling factor applied on x-coordinates.'),686 description=(u'The scaling factor applied on x-coordinates.'),
591 required=True)687 default=1,
688 required=False)
592689
593 sy = attr.Float(690 sy = attr.Float(
594 title=u'Y-Scaling-Factor',691 title=u'Y-Scaling-Factor',
595 description=(u'The scaling factor applied on y-coordinates.'),692 description=(u'The scaling factor applied on y-coordinates.'),
596 required=True)693 default=1,
694 required=False)
597695
598class Scale(CanvasRMLDirective):696class Scale(CanvasRMLDirective):
599 signature = IScale697 signature = IScale
@@ -720,10 +818,87 @@
720 canvas.setDash(kw['dash'])818 canvas.setDash(kw['dash'])
721819
722820
821class IBookmark(interfaces.IRMLDirectiveSignature):
822 """
823 This creates a bookmark to the current page which can be referred to with
824 the given key elsewhere. (Used inside a page drawing.)
825 """
826
827 name = attr.Text(
828 title=u'Name',
829 description=u'The name of the bookmark.',
830 required=True)
831
832 fit = attr.Choice(
833 title=u'Fit',
834 description=u'The Fit Type.',
835 choices=('XYZ', 'Fit', 'FitH', 'FitV', 'FitR'),
836 required=False)
837
838 zoom = attr.Float(
839 title=u'Zoom',
840 description=u'The zoom level when clicking on the bookmark.',
841 required=False)
842
843 x = attr.Measurement(
844 title=u'X-Position',
845 description=u'The x-position.',
846 required=False)
847
848 y = attr.Measurement(
849 title=u'Y-Position',
850 description=u'The y-position.',
851 required=False)
852
853class Bookmark(CanvasRMLDirective):
854 signature = IBookmark
855
856 def process(self):
857 args = dict(self.getAttributeValues())
858 canvas = attr.getManager(self, interfaces.ICanvasManager).canvas
859 args['left'], args['top'] = canvas.absolutePosition(args['x'], args['y'])
860 canvas.bookmarkPage(**args)
861
862
863class IPlugInGraphic(interfaces.IRMLDirectiveSignature):
864 """Inserts a custom graphic developed in Python."""
865
866 module = attr.String(
867 title=u'Module',
868 description=u'The Python module in which the flowable is located.',
869 required=True)
870
871 function = attr.String(
872 title=u'Function',
873 description=(u'The name of the factory function within the module '
874 u'that returns the custom flowable.'),
875 required=True)
876
877 params = attr.TextNode(
878 title=u'Parameters',
879 description=(u'A list of parameters encoded as a long string.'),
880 required=False)
881
882class PlugInGraphic(CanvasRMLDirective):
883 signature = IPlugInGraphic
884
885 def process(self):
886 modulePath, functionName, params = self.getAttributeValues(
887 valuesOnly=True)
888 module = __import__(modulePath, {}, {}, [modulePath])
889 function = getattr(module, functionName)
890 canvas = attr.getManager(self, interfaces.ICanvasManager).canvas
891 function(canvas, params)
892
893
723class IDrawing(interfaces.IRMLDirectiveSignature):894class IDrawing(interfaces.IRMLDirectiveSignature):
724 """A container directive for all directives that draw directly on the895 """A container directive for all directives that draw directly on the
725 cnavas."""896 cnavas."""
726 occurence.containing(897 occurence.containing(
898 # State Manipulation
899 occurence.ZeroOrMore('saveState', ISaveState),
900 occurence.ZeroOrMore('restoreState', IRestoreState),
901 # String Drawing
727 occurence.ZeroOrMore('drawString', IDrawString),902 occurence.ZeroOrMore('drawString', IDrawString),
728 occurence.ZeroOrMore('drawRightString', IDrawRightString),903 occurence.ZeroOrMore('drawRightString', IDrawRightString),
729 occurence.ZeroOrMore('drawCenteredString', IDrawCenteredString),904 occurence.ZeroOrMore('drawCenteredString', IDrawCenteredString),
@@ -744,6 +919,7 @@
744 occurence.ZeroOrMore('fill', IFill),919 occurence.ZeroOrMore('fill', IFill),
745 occurence.ZeroOrMore('stroke', IStroke),920 occurence.ZeroOrMore('stroke', IStroke),
746 occurence.ZeroOrMore('setFont', ISetFont),921 occurence.ZeroOrMore('setFont', ISetFont),
922 occurence.ZeroOrMore('setFontSize', ISetFontSize),
747 occurence.ZeroOrMore('scale', IScale),923 occurence.ZeroOrMore('scale', IScale),
748 occurence.ZeroOrMore('translate', ITranslate),924 occurence.ZeroOrMore('translate', ITranslate),
749 occurence.ZeroOrMore('rotate', IRotate),925 occurence.ZeroOrMore('rotate', IRotate),
@@ -763,12 +939,19 @@
763 occurence.ZeroOrMore('pieChart', chart.IPieChart),939 occurence.ZeroOrMore('pieChart', chart.IPieChart),
764 occurence.ZeroOrMore('pieChart3D', chart.IPieChart3D),940 occurence.ZeroOrMore('pieChart3D', chart.IPieChart3D),
765 occurence.ZeroOrMore('spiderChart', chart.ISpiderChart),941 occurence.ZeroOrMore('spiderChart', chart.ISpiderChart),
942 # Misc
943 occurence.ZeroOrMore('bookmark', IBookmark),
944 occurence.ZeroOrMore('plugInGraphic', IPlugInGraphic),
766 )945 )
767946
768class Drawing(directive.RMLDirective):947class Drawing(directive.RMLDirective):
769 signature = IDrawing948 signature = IDrawing
770949
771 factories = {950 factories = {
951 # State Management
952 'saveState': SaveState,
953 'restoreState': RestoreState,
954 # Drawing Strings
772 'drawString': DrawString,955 'drawString': DrawString,
773 'drawRightString': DrawRightString,956 'drawRightString': DrawRightString,
774 'drawCenteredString': DrawCenteredString,957 'drawCenteredString': DrawCenteredString,
@@ -794,6 +977,7 @@
794 'fill': Fill,977 'fill': Fill,
795 'stroke': Stroke,978 'stroke': Stroke,
796 'setFont': SetFont,979 'setFont': SetFont,
980 'setFontSize': SetFontSize,
797 'scale': Scale,981 'scale': Scale,
798 'translate': Translate,982 'translate': Translate,
799 'rotate': Rotate,983 'rotate': Rotate,
@@ -807,7 +991,10 @@
807 'linePlot3D': chart.LinePlot3D,991 'linePlot3D': chart.LinePlot3D,
808 'pieChart': chart.PieChart,992 'pieChart': chart.PieChart,
809 'pieChart3D': chart.PieChart3D,993 'pieChart3D': chart.PieChart3D,
810 'spiderChart': chart.SpiderChart994 'spiderChart': chart.SpiderChart,
995 # Misc
996 'bookmark': Bookmark,
997 'plugInGraphic': PlugInGraphic,
811 }998 }
812999
8131000
8141001
=== modified file 'src/z3c/rml/chart.py'
--- src/z3c/rml/chart.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/chart.py 2013-01-09 02:49:23 +0000
@@ -13,7 +13,7 @@
13##############################################################################13##############################################################################
14"""Chart Element Processing14"""Chart Element Processing
1515
16$Id: chart.py 114908 2010-07-22 02:23:18Z srichter $16$Id: chart.py 128763 2012-12-18 21:44:52Z srichter $
17"""17"""
18__docformat__ = "reStructuredText"18__docformat__ = "reStructuredText"
19import reportlab.lib.formatters19import reportlab.lib.formatters
@@ -1621,7 +1621,6 @@
1621 'slices': Slices3D,1621 'slices': Slices3D,
1622 })1622 })
16231623
1624
1625class ISpiderChart(IChart):1624class ISpiderChart(IChart):
1626 """A spider chart."""1625 """A spider chart."""
1627 occurence.containing(1626 occurence.containing(
16281627
=== modified file 'src/z3c/rml/directive.py'
--- src/z3c/rml/directive.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/directive.py 2013-01-09 02:49:23 +0000
@@ -13,7 +13,7 @@
13##############################################################################13##############################################################################
14"""RML Directive Implementation14"""RML Directive Implementation
1515
16$Id: directive.py 78750 2007-08-12 01:50:06Z rogerineichen $16$Id: directive.py 128767 2012-12-19 02:00:30Z srichter $
17"""17"""
18__docformat__ = "reStructuredText"18__docformat__ = "reStructuredText"
19import logging19import logging
@@ -26,6 +26,7 @@
26logging.raiseExceptions = False26logging.raiseExceptions = False
27logger = logging.getLogger("z3c.rml")27logger = logging.getLogger("z3c.rml")
2828
29ABORT_ON_INVALID_DIRECTIVE = False
2930
30def DeprecatedDirective(iface, reason):31def DeprecatedDirective(iface, reason):
31 zope.interface.directlyProvides(iface, interfaces.IDeprecatedDirective)32 zope.interface.directlyProvides(iface, interfaces.IDeprecatedDirective)
@@ -92,18 +93,21 @@
92 # Ignore all comments93 # Ignore all comments
93 if isinstance(element, etree._Comment):94 if isinstance(element, etree._Comment):
94 continue95 continue
96 # Raise an error/log any unknown directive.
97 if element.tag not in self.factories:
98 msg = "Directive %r could not be processed and was " \
99 "ignored. %s" %(element.tag, getFileInfo(self))
100 # Record any tags/elements that could not be processed.
101 logger.warn(msg)
102 if ABORT_ON_INVALID_DIRECTIVE:
103 raise ValueError(msg)
104 continue
95 if select is not None and element.tag not in select:105 if select is not None and element.tag not in select:
96 continue106 continue
97 if ignore is not None and element.tag in ignore:107 if ignore is not None and element.tag in ignore:
98 continue108 continue
99 # If the element is a directive, process it109 directive = self.factories[element.tag](element, self)
100 if element.tag in self.factories:110 directive.process()
101 directive = self.factories[element.tag](element, self)
102 directive.process()
103 else:
104 # Record any tags/elements that could not be processed.
105 logger.warn("Directive %r could not be processed and was "
106 "ignored. %s" %(element.tag, getFileInfo(self)))
107111
108 def process(self):112 def process(self):
109 self.processSubDirectives()113 self.processSubDirectives()
110114
=== added file 'src/z3c/rml/doclogic.py'
--- src/z3c/rml/doclogic.py 1970-01-01 00:00:00 +0000
+++ src/z3c/rml/doclogic.py 2013-01-09 02:49:23 +0000
@@ -0,0 +1,169 @@
1##############################################################################
2#
3# Copyright (c) 2012 Zope Foundation and Contributors.
4# All Rights Reserved.
5#
6# This software is subject to the provisions of the Zope Public License,
7# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
8# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
9# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
11# FOR A PARTICULAR PURPOSE.
12#
13##############################################################################
14"""``doc*`` directives.
15"""
16import reportlab.platypus
17from z3c.rml import attr, directive, flowable, interfaces, occurence
18
19class IDocAssign(interfaces.IRMLDirectiveSignature):
20 """Assign a value to the namesapce."""
21
22 var = attr.String(
23 title=u'Variable Name',
24 description=u'The name under which the value is stored.',
25 required=True)
26
27 expr = attr.String(
28 title=u'Expression',
29 description=u'The expression that creates the value when evaluated.',
30 required=True)
31
32class DocAssign(flowable.Flowable):
33 signature = IDocAssign
34 klass = reportlab.platypus.flowables.DocAssign
35
36
37class IDocExec(interfaces.IRMLDirectiveSignature):
38 """Execute a statement."""
39
40 stmt = attr.String(
41 title=u'Statement',
42 description=u'The statement to be executed.',
43 required=True)
44
45class DocExec(flowable.Flowable):
46 signature = IDocExec
47 klass = reportlab.platypus.flowables.DocExec
48
49
50class IDocPara(interfaces.IRMLDirectiveSignature):
51 """Create a paragraph with the value returned from the expression."""
52
53 expr = attr.String(
54 title=u'Expression',
55 description=u'The expression to be executed.',
56 required=True)
57
58 format = attr.String(
59 title=u'Format',
60 description=u'The format used to render the expression value.',
61 required=False)
62
63 style = attr.Style(
64 title=u'Style',
65 description=u'The style of the paragraph.',
66 required=False)
67
68 escape = attr.Boolean(
69 title=u'Escape Text',
70 description=u'When set (default) the expression value is escaped.',
71 required=False)
72
73class DocPara(flowable.Flowable):
74 signature = IDocPara
75 klass = reportlab.platypus.flowables.DocPara
76
77
78class IDocAssert(interfaces.IRMLDirectiveSignature):
79 """Assert a certain condition."""
80
81 cond = attr.String(
82 title=u'Condition',
83 description=u'The condition to be asserted.',
84 required=True)
85
86 format = attr.String(
87 title=u'Format',
88 description=u'The text displayed if assertion fails.',
89 required=False)
90
91class DocAssert(flowable.Flowable):
92 signature = IDocAssert
93 klass = reportlab.platypus.flowables.DocAssert
94
95
96class IDocElse(interfaces.IRMLDirectiveSignature):
97 """Starts 'else' block."""
98
99class DocElse(flowable.Flowable):
100 signature = IDocElse
101
102 def process(self):
103 if not isinstance(self.parent, DocIf):
104 raise ValueError("<docElse> can only be placed inside a <docIf>")
105 self.parent.flow = self.parent.elseFlow
106
107
108class IDocIf(flowable.IFlow):
109 """Display story flow based on the value of the condition."""
110
111 cond = attr.String(
112 title=u'Condition',
113 description=u'The condition to be tested.',
114 required=True)
115
116class DocIf(flowable.Flow):
117 signature = IDocAssert
118 klass = reportlab.platypus.flowables.DocIf
119
120 def __init__(self, *args, **kw):
121 super(flowable.Flow, self).__init__(*args, **kw)
122 self.thenFlow = self.flow = []
123 self.elseFlow = []
124
125 def process(self):
126 args = dict(self.getAttributeValues())
127 self.processSubDirectives()
128 dif = self.klass(
129 thenBlock = self.thenFlow, elseBlock = self.elseFlow, **args)
130 self.parent.flow.append(dif)
131
132class IDocWhile(flowable.IFlow):
133 """Repeat the included directives as long as the condition is true."""
134
135 cond = attr.String(
136 title=u'Condition',
137 description=u'The condition to be tested.',
138 required=True)
139
140class DocWhile(flowable.Flow):
141 signature = IDocAssert
142 klass = reportlab.platypus.flowables.DocWhile
143
144 def process(self):
145 args = dict(self.getAttributeValues())
146 self.processSubDirectives()
147 dwhile = self.klass(whileBlock = self.flow, **args)
148 self.parent.flow.append(dwhile)
149
150
151flowable.Flow.factories['docAssign'] = DocAssign
152flowable.Flow.factories['docExec'] = DocExec
153flowable.Flow.factories['docPara'] = DocPara
154flowable.Flow.factories['docAssert'] = DocAssert
155flowable.Flow.factories['docIf'] = DocIf
156flowable.Flow.factories['docElse'] = DocElse
157flowable.Flow.factories['docWhile'] = DocWhile
158
159flowable.IFlow.setTaggedValue(
160 'directives',
161 flowable.IFlow.getTaggedValue('directives') +
162 (occurence.ZeroOrMore('docAssign', IDocAssign),
163 occurence.ZeroOrMore('docExec', IDocExec),
164 occurence.ZeroOrMore('docPara', IDocPara),
165 occurence.ZeroOrMore('docIf', IDocIf),
166 occurence.ZeroOrMore('docElse', IDocElse),
167 occurence.ZeroOrMore('docWhile', IDocWhile),
168 )
169 )
0170
=== modified file 'src/z3c/rml/document.py'
--- src/z3c/rml/document.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/document.py 2013-01-09 02:49:23 +0000
@@ -13,19 +13,23 @@
13##############################################################################13##############################################################################
14"""RML ``document`` element14"""RML ``document`` element
1515
16$Id: document.py 114907 2010-07-22 01:59:57Z srichter $16$Id: document.py 128841 2012-12-21 05:02:18Z srichter $
17"""17"""
18__docformat__ = "reStructuredText"18__docformat__ = "reStructuredText"
19import cStringIO19import cStringIO
20import logging
20import sys21import sys
21import zope.interface22import zope.interface
22import reportlab.pdfgen.canvas23import reportlab.pdfgen.canvas
23from reportlab.pdfbase import pdfmetrics, ttfonts, cidfonts24from reportlab.pdfbase import pdfmetrics, ttfonts, cidfonts
24from reportlab.lib import fonts25from reportlab.lib import colors, fonts
2526from reportlab.platypus import tableofcontents
26from z3c.rml import attr, directive, interfaces, occurence27
27from z3c.rml import canvas, stylesheet, template28from z3c.rml import attr, canvas, directive, doclogic, interfaces, list
2829from z3c.rml import occurence, pdfinclude, special, storyplace, stylesheet
30from z3c.rml import template
31
32LOGGER_NAME = 'z3c.rml.render'
2933
30class IRegisterType1Face(interfaces.IRMLDirectiveSignature):34class IRegisterType1Face(interfaces.IRMLDirectiveSignature):
31 """Register a new Type 1 font face."""35 """Register a new Type 1 font face."""
@@ -141,13 +145,58 @@
141 u'be previously registered.'),145 u'be previously registered.'),
142 required=True)146 required=True)
143147
148 encName = attr.String(
149 title=u'Encoding Name',
150 description=(u'The name of the encoding to use for the font.'),
151 required=False)
152
144class RegisterCidFont(directive.RMLDirective):153class RegisterCidFont(directive.RMLDirective):
145 signature = IRegisterCidFont154 signature = IRegisterCidFont
155 attrMapping = {'faceName': 'face', 'encName': 'encoding'}
156
157 def process(self):
158 args = dict(self.getAttributeValues(attrMapping=self.attrMapping))
159 if 'encoding' in args:
160 font = cidfonts.CIDFont(**args)
161 else:
162 font = cidfonts.UnicodeCIDFont(**args)
163 pdfmetrics.registerFont(font)
164
165
166class IRegisterFontFamily(interfaces.IRMLDirectiveSignature):
167 """Register a new font family."""
168
169 name = attr.String(
170 title=u'Name',
171 description=(u'The name of the font family.'),
172 required=True)
173
174 normal = attr.String(
175 title=u'Normal Font Name',
176 description=(u'The name of the normal font variant.'),
177 required=False)
178
179 bold = attr.String(
180 title=u'Bold Font Name',
181 description=(u'The name of the bold font variant.'),
182 required=False)
183
184 italic = attr.String(
185 title=u'Italic Font Name',
186 description=(u'The name of the italic font variant.'),
187 required=False)
188
189 boldItalic = attr.String(
190 title=u'Bold/Italic Font Name',
191 description=(u'The name of the bold/italic font variant.'),
192 required=True)
193
194class RegisterFontFamily(directive.RMLDirective):
195 signature = IRegisterFontFamily
146196
147 def process(self):197 def process(self):
148 args = self.getAttributeValues(valuesOnly=True)198 args = self.getAttributeValues(valuesOnly=True)
149 font = cidfonts.UnicodeCIDFont(*args)199 pdfmetrics.registerFontFamily(*args)
150 pdfmetrics.registerFont(font)
151200
152201
153class IColorDefinition(interfaces.IRMLDirectiveSignature):202class IColorDefinition(interfaces.IRMLDirectiveSignature):
@@ -158,45 +207,264 @@
158 description=(u'The id/name the color will be available under.'),207 description=(u'The id/name the color will be available under.'),
159 required=True)208 required=True)
160209
210 RGB = attr.Color(
211 title=u'RGB Color',
212 description=(u'The color value that is represented.'),
213 required=False)
214
215 CMYK = attr.Color(
216 title=u'CMYK Color',
217 description=(u'The color value that is represented.'),
218 required=False)
219
161 value = attr.Color(220 value = attr.Color(
162 title=u'Color',221 title=u'Color',
163 description=(u'The color value that is represented.'),222 description=(u'The color value that is represented.'),
164 required=True)223 required=False)
165 attr.deprecated(224
166 'RGB', value,225 spotName = attr.String(
167 (u'Ensures compatibility with ReportLab RML. Please use '226 title=u'Spot Name',
168 u'the "value" attribute.'))227 description=(u'The Spot Name of the CMYK color.'),
228 required=False)
229
230 density = attr.Float(
231 title=u'Density',
232 description=(u'The color density of the CMYK color.'),
233 min=0.0,
234 max=1.0,
235 required=False)
236
237 knockout = attr.String(
238 title=u'Knockout',
239 description=(u'The knockout of the CMYK color.'),
240 required=False)
241
242 alpha = attr.Float(
243 title=u'Alpha',
244 description=(u'The alpha channel of the color.'),
245 min=0.0,
246 max=1.0,
247 required=False)
169248
170class ColorDefinition(directive.RMLDirective):249class ColorDefinition(directive.RMLDirective):
171 signature = IColorDefinition250 signature = IColorDefinition
172251
173 def process(self):252 def process(self):
174 id, value = self.getAttributeValues(valuesOnly=True)253 kwargs = dict(self.getAttributeValues())
254 id = kwargs.pop('id')
255 for attrName in ('RGB', 'CMYK', 'value'):
256 color = kwargs.pop(attrName, None)
257 if color is not None:
258 # CMYK has additional attributes.
259 for name, value in kwargs.items():
260 setattr(color, name, value)
261 manager = attr.getManager(self)
262 manager.colors[id] = color
263 return
264 raise ValueError('At least one color definition must be specified.')
265
266# Initialize also supports the <color> tag.
267stylesheet.Initialize.factories['color'] = ColorDefinition
268stylesheet.IInitialize.setTaggedValue(
269 'directives',
270 stylesheet.IInitialize.getTaggedValue('directives') +
271 (occurence.ZeroOrMore('color', IColorDefinition),)
272 )
273
274
275class IStartIndex(interfaces.IRMLDirectiveSignature):
276 """Start a new index."""
277
278 name = attr.String(
279 title=u'Name',
280 description=u'The name of the index.',
281 default='index',
282 required=True)
283
284 offset = attr.Integer(
285 title=u'Offset',
286 description=u'The counting offset.',
287 min=0,
288 required=False)
289
290 format = attr.Choice(
291 title=u'Format',
292 description=(u'The format the index is going to use.'),
293 choices=interfaces.LIST_FORMATS,
294 required=False)
295
296class StartIndex(directive.RMLDirective):
297 signature = IStartIndex
298
299 def process(self):
300 kwargs = dict(self.getAttributeValues())
301 name = kwargs['name']
175 manager = attr.getManager(self)302 manager = attr.getManager(self)
176 manager.colors[id] = value303 manager.indexes[name] = tableofcontents.SimpleIndex(**kwargs)
304
305
306class ICropMarks(interfaces.IRMLDirectiveSignature):
307 """Crop Marks specification"""
308
309 name = attr.String(
310 title=u'Name',
311 description=u'The name of the index.',
312 default='index',
313 required=True)
314
315 borderWidth = attr.Measurement(
316 title=u'Border Width',
317 description=u'The width of the crop mark border.',
318 required=False)
319
320 markColor = attr.Color(
321 title=u'Mark Color',
322 description=u'The color of the crop marks.',
323 required=False)
324
325 markWidth = attr.Measurement(
326 title=u'Mark Width',
327 description=u'The line width of the actual crop marks.',
328 required=False)
329
330 markLength = attr.Measurement(
331 title=u'Mark Length',
332 description=u'The length of the actual crop marks.',
333 required=False)
334
335 markLast = attr.Boolean(
336 title=u'Mark Last',
337 description=u'If set, marks are drawn after the content is rendered.',
338 required=False)
339
340 bleedWidth = attr.Measurement(
341 title=u'Bleed Width',
342 description=(u'The width of the page bleed.'),
343 required=False)
344
345class CropMarksProperties(object):
346 borderWidth = 36
347 markWidth = 0.5
348 markColor = colors.toColor('green')
349 markLength = 18
350 markLast = True
351 bleedWidth = 0
352
353class CropMarks(directive.RMLDirective):
354 signature = ICropMarks
355
356 def process(self):
357 cmp = CropMarksProperties()
358 for name, value in self.getAttributeValues():
359 setattr(cmp, name, value)
360 self.parent.parent.cropMarks = cmp
361
362class ILogConfig(interfaces.IRMLDirectiveSignature):
363 """Configure the render logger."""
364
365 level = attr.Choice(
366 title=u'Level',
367 description=u'The default log level.',
368 choices=interfaces.LOG_LEVELS,
369 doLower=False,
370 required=False)
371
372 format = attr.String(
373 title=u'Format',
374 description=u'The format of the log messages.',
375 required=False)
376
377 filename = attr.File(
378 title=u'File Name',
379 description=u'The path to the file that is being logged.',
380 doNotOpen=True,
381 required=True)
382
383 filemode = attr.Choice(
384 title=u'File Mode',
385 description=u'The mode to open the file in.',
386 choices={'WRITE': 'w', 'APPEND': 'a'},
387 default='a',
388 required=False)
389
390 datefmt = attr.String(
391 title=u'Date Format',
392 description=u'The format of the log message date.',
393 required=False)
394
395class LogConfig(directive.RMLDirective):
396 signature = ILogConfig
397
398 def process(self):
399 args = dict(self.getAttributeValues())
400 logger = logging.Logger(LOGGER_NAME)
401 handler = logging.FileHandler(args['filename'], args['filemode'])
402 formatter = logging.Formatter(
403 args.get('format'), args.get('datefmt'))
404 handler.setFormatter(formatter)
405 logger.addHandler(handler)
406 if 'level' in args:
407 logger.setLevel(args['level'])
408 self.parent.parent.logger = logger
177409
178410
179class IDocInit(interfaces.IRMLDirectiveSignature):411class IDocInit(interfaces.IRMLDirectiveSignature):
180 occurence.containing(412 occurence.containing(
413 occurence.ZeroOrMore('color', IColorDefinition),
414 occurence.ZeroOrMore('name', special.IName),
181 occurence.ZeroOrMore('registerType1Face', IRegisterType1Face),415 occurence.ZeroOrMore('registerType1Face', IRegisterType1Face),
182 occurence.ZeroOrMore('registerFont', IRegisterFont),416 occurence.ZeroOrMore('registerFont', IRegisterFont),
417 occurence.ZeroOrMore('registerCidFont', IRegisterCidFont),
183 occurence.ZeroOrMore('registerTTFont', IRegisterTTFont),418 occurence.ZeroOrMore('registerTTFont', IRegisterTTFont),
184 occurence.ZeroOrMore('registerCidFont', IRegisterCidFont),419 occurence.ZeroOrMore('registerFontFamily', IRegisterFontFamily),
185 occurence.ZeroOrMore('color', IColorDefinition),
186 occurence.ZeroOrMore('addMapping', IAddMapping),420 occurence.ZeroOrMore('addMapping', IAddMapping),
421 occurence.ZeroOrMore('logConfig', ILogConfig),
422 occurence.ZeroOrMore('cropMarks', ICropMarks),
423 occurence.ZeroOrMore('startIndex', IStartIndex),
187 )424 )
188425
426 pageMode = attr.Choice(
427 title=u'Page Mode',
428 description=(u'The page mode in which the document is opened in '
429 u'the viewer.'),
430 choices=('UseNone', 'UseOutlines', 'UseThumbs', 'FullScreen'),
431 required=False)
432
433 pageLayout = attr.Choice(
434 title=u'Page Layout',
435 description=(u'The layout in which the pages are displayed in '
436 u'the viewer.'),
437 choices=('SinglePage', 'OneColumn', 'TwoColumnLeft', 'TwoColumnRight'),
438 required=False)
439
440 useCropMarks = attr.Boolean(
441 title=u'Use Crop Marks',
442 description=u'A flag when set shows crop marks on the page.',
443 required=False)
444
445
189class DocInit(directive.RMLDirective):446class DocInit(directive.RMLDirective):
190 signature = IDocInit447 signature = IDocInit
191 factories = {448 factories = {
449 'name': special.Name,
450 'color': ColorDefinition,
192 'registerType1Face': RegisterType1Face,451 'registerType1Face': RegisterType1Face,
193 'registerFont': RegisterFont,452 'registerFont': RegisterFont,
194 'registerTTFont': RegisterTTFont,453 'registerTTFont': RegisterTTFont,
195 'registerCidFont': RegisterCidFont,454 'registerCidFont': RegisterCidFont,
196 'color': ColorDefinition,
197 'addMapping': AddMapping,455 'addMapping': AddMapping,
456 'logConfig': LogConfig,
457 'cropMarks': CropMarks,
458 'startIndex': StartIndex,
198 }459 }
199460
461 def process(self):
462 kwargs = dict(self.getAttributeValues())
463 self.parent.cropMarks = kwargs.get('useCropMarks', False)
464 self.parent.pageMode = kwargs.get('pageMode')
465 self.parent.pageLayout = kwargs.get('pageLayout')
466 super(DocInit, self).process()
467
200468
201class IDocument(interfaces.IRMLDirectiveSignature):469class IDocument(interfaces.IRMLDirectiveSignature):
202 occurence.containing(470 occurence.containing(
@@ -252,11 +520,38 @@
252 self.names = {}520 self.names = {}
253 self.styles = {}521 self.styles = {}
254 self.colors = {}522 self.colors = {}
523 self.indexes = {}
255 self.postProcessors = []524 self.postProcessors = []
256 self.filename = '<unknwon>'525 self.filename = '<unknown>'
526 self.cropMarks = False
527 self.pageLayout = None
528 self.pageMode = None
529 self.logger = None
530
531 def _indexAdd(self, canvas, name, label):
532 self.indexes[name](canvas, name, label)
533
534 def _beforeDocument(self):
535 self._initCanvas(self.doc.canv)
536 self.canvas = self.doc.canv
537
538 def _initCanvas(self, canvas):
539 canvas._indexAdd = self._indexAdd
540 canvas.manager = self
541 if self.pageLayout:
542 canvas._doc._catalog.setPageLayout(self.pageLayout)
543 if self.pageMode:
544 canvas._doc._catalog.setPageMode(self.pageMode)
257545
258 def process(self, outputFile=None):546 def process(self, outputFile=None):
259 """Process document"""547 """Process document"""
548 # Reset all reportlab global variables. This is very important for
549 # ReportLab not to fail.
550 reportlab.rl_config._reset()
551
552 # Add our colors mapping to the default ones.
553 colors.toColor.setExtraColorsNameSpace(self.colors)
554
260 if outputFile is None:555 if outputFile is None:
261 # TODO: This is relative to the input file *not* the CWD!!!556 # TODO: This is relative to the input file *not* the CWD!!!
262 outputFile = open(self.element.get('filename'), 'wb')557 outputFile = open(self.element.get('filename'), 'wb')
@@ -275,14 +570,17 @@
275 attrMapping={'compression': 'pageCompression',570 attrMapping={'compression': 'pageCompression',
276 'debug': 'verbosity'}571 'debug': 'verbosity'}
277 ))572 ))
573 kwargs['cropMarks'] = self.cropMarks
278574
279 self.canvas = reportlab.pdfgen.canvas.Canvas(tempOutput, **kwargs)575 self.canvas = reportlab.pdfgen.canvas.Canvas(tempOutput, **kwargs)
576 self._initCanvas(self.canvas)
280 self.processSubDirectives(select=('pageInfo', 'pageDrawing'))577 self.processSubDirectives(select=('pageInfo', 'pageDrawing'))
281 self.canvas.save()578 self.canvas.save()
282579
283 # Handle Flowable-based documents.580 # Handle Flowable-based documents.
284 elif self.element.find('template') is not None:581 elif self.element.find('template') is not None:
285 self.processSubDirectives(select=('template', 'story'))582 self.processSubDirectives(select=('template', 'story'))
583 self.doc.beforeDocument = self._beforeDocument
286 self.doc.multiBuild(self.flowables)584 self.doc.multiBuild(self.flowables)
287585
288 # Process all post processors586 # Process all post processors
@@ -294,3 +592,6 @@
294 tempOutput.seek(0)592 tempOutput.seek(0)
295 outputFile.write(tempOutput.getvalue())593 outputFile.write(tempOutput.getvalue())
296594
595 # Cleanup.
596 colors.toColor.setExtraColorsNameSpace({})
597
297598
=== modified file 'src/z3c/rml/dtd.py'
--- src/z3c/rml/dtd.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/dtd.py 2013-01-09 02:49:23 +0000
@@ -13,7 +13,7 @@
13##############################################################################13##############################################################################
14"""Generate a DTD from the code14"""Generate a DTD from the code
1515
16$Id: dtd.py 76810 2007-06-19 19:49:26Z srichter $16$Id: dtd.py 128803 2012-12-20 14:19:44Z srichter $
17"""17"""
18__docformat__ = "reStructuredText"18__docformat__ = "reStructuredText"
19import zope.schema19import zope.schema
@@ -36,15 +36,20 @@
36 subElementList.append(36 subElementList.append(
37 occurence.tag + occurence2Symbol.get(occurence.__class__, '')37 occurence.tag + occurence2Symbol.get(occurence.__class__, '')
38 )38 )
39 fields = zope.schema.getFields(signature).keys()39 fields = zope.schema.getFieldsInOrder(signature)
40 if len(fields) == 1 and isinstance(fields[0], attr.TextNode):40 for attrName, field in fields:
41 subElementList.append('#PCDATA')41 if isinstance(field, attr.TextNode):
42 subElementList.append('#PCDATA')
43 break
42 subElementList = ','.join(subElementList)44 subElementList = ','.join(subElementList)
43 if subElementList:45 if subElementList:
44 subElementList = ' (' + subElementList + ')'46 subElementList = ' (' + subElementList + ')'
45 text = '\n<!ELEMENT %s%s>' %(name, subElementList)47 text = '\n<!ELEMENT %s%s>' %(name, subElementList)
46 # Create a list of attributes for this element.48 # Create a list of attributes for this element.
47 for attrName, field in zope.schema.getFieldsInOrder(signature):49 for attrName, field in fields:
50 # Ignore text nodes, since they are not attributes.
51 if isinstance(field, attr.TextNode):
52 continue
48 # Create the type53 # Create the type
49 if isinstance(field, attr.Choice):54 if isinstance(field, attr.Choice):
50 type = '(' + '|'.join(field.choices.keys()) + ')'55 type = '(' + '|'.join(field.choices.keys()) + ')'
5156
=== modified file 'src/z3c/rml/flowable.py'
--- src/z3c/rml/flowable.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/flowable.py 2013-01-09 02:49:23 +0000
@@ -13,10 +13,11 @@
13##############################################################################13##############################################################################
14"""Flowable Element Processing14"""Flowable Element Processing
1515
16$Id: flowable.py 84838 2008-03-21 12:32:58Z rogerineichen $16$Id: flowable.py 128843 2012-12-21 06:58:39Z srichter $
17"""17"""
18__docformat__ = "reStructuredText"18__docformat__ = "reStructuredText"
19import copy19import copy
20import logging
20import re21import re
21import reportlab.lib.styles22import reportlab.lib.styles
22import reportlab.platypus23import reportlab.platypus
@@ -24,7 +25,8 @@
24import reportlab.platypus.flowables25import reportlab.platypus.flowables
25import reportlab.platypus.tables26import reportlab.platypus.tables
26import zope.schema27import zope.schema
27from reportlab.lib import styles28from reportlab.lib import styles, pygments2xpre
29from xml.sax.saxutils import unescape
28from z3c.rml import attr, directive, interfaces, occurence30from z3c.rml import attr, directive, interfaces, occurence
29from z3c.rml import form, platypus, special, stylesheet31from z3c.rml import form, platypus, special, stylesheet
3032
@@ -141,8 +143,7 @@
141 description=(u'The paragraph style that is applied to the paragraph. '143 description=(u'The paragraph style that is applied to the paragraph. '
142 u'See the ``paraStyle`` tag for creating a paragraph '144 u'See the ``paraStyle`` tag for creating a paragraph '
143 u'style.'),145 u'style.'),
144 default=reportlab.lib.styles.getSampleStyleSheet()['Normal'],146 required=False)
145 required=True)
146147
147 bulletText = attr.String(148 bulletText = attr.String(
148 title=u'Bullet Character',149 title=u'Bullet Character',
@@ -185,19 +186,44 @@
185class IPreformatted(IMinimalParagraphBase):186class IPreformatted(IMinimalParagraphBase):
186 """A preformatted text, similar to the <pre> tag in HTML."""187 """A preformatted text, similar to the <pre> tag in HTML."""
187188
189 style = attr.Style(
190 title=u'Style',
191 description=(u'The paragraph style that is applied to the paragraph. '
192 u'See the ``paraStyle`` tag for creating a paragraph '
193 u'style.'),
194 default=reportlab.lib.styles.getSampleStyleSheet()['Code'],
195 required=False)
196
188 text = attr.RawXMLContent(197 text = attr.RawXMLContent(
189 title=u'Text',198 title=u'Text',
190 description=(u'The text that will be layed out.'),199 description=(u'The text that will be layed out.'),
191 required=True)200 required=True)
192201
202 maxLineLength = attr.Integer(
203 title=u'Max Line Length',
204 description=(u'The maximum number of characters on one line.'),
205 required=False)
206
207 newLineChars = attr.Text(
208 title=u'New Line Characters',
209 description=u'The characters placed at the beginning of a wrapped line',
210 required=False)
211
193class Preformatted(Flowable):212class Preformatted(Flowable):
194 signature = IPreformatted213 signature = IPreformatted
195 klass = reportlab.platypus.Preformatted214 klass = reportlab.platypus.Preformatted
196215
197
198class IXPreformatted(IParagraphBase):216class IXPreformatted(IParagraphBase):
199 """A preformatted text that allows paragraph markup."""217 """A preformatted text that allows paragraph markup."""
200218
219 style = attr.Style(
220 title=u'Style',
221 description=(u'The paragraph style that is applied to the paragraph. '
222 u'See the ``paraStyle`` tag for creating a paragraph '
223 u'style.'),
224 default=reportlab.lib.styles.getSampleStyleSheet()['Normal'],
225 required=False)
226
201 text = attr.RawXMLContent(227 text = attr.RawXMLContent(
202 title=u'Text',228 title=u'Text',
203 description=(u'The text that will be layed out.'),229 description=(u'The text that will be layed out.'),
@@ -208,6 +234,36 @@
208 klass = reportlab.platypus.XPreformatted234 klass = reportlab.platypus.XPreformatted
209235
210236
237class ICodeSnippet(IXPreformatted):
238 """A code snippet with text highlighting."""
239
240 style = attr.Style(
241 title=u'Style',
242 description=(u'The paragraph style that is applied to the paragraph. '
243 u'See the ``paraStyle`` tag for creating a paragraph '
244 u'style.'),
245 required=False)
246
247 language = attr.String(
248 title=u'Language',
249 description=u'The language the code snippet is written in.',
250 required=False)
251
252class CodeSnippet(XPreformatted):
253 signature = ICodeSnippet
254
255 def process(self):
256 args = dict(self.getAttributeValues())
257 lang = args.pop('language', None)
258 args['text'] = unescape(args['text'])
259 if lang is not None:
260 args['text'] = pygments2xpre.pygments2xpre(
261 args['text'], lang.lower())
262 if 'style' not in args:
263 args['style'] = attr._getStyle(self, 'Code')
264 self.parent.flow.append(self.klass(**args))
265
266
211class IParagraph(IParagraphBase, stylesheet.IBaseParagraphStyle):267class IParagraph(IParagraphBase, stylesheet.IBaseParagraphStyle):
212 """Lays out an entire paragraph."""268 """Lays out an entire paragraph."""
213269
@@ -219,6 +275,7 @@
219class Paragraph(Flowable):275class Paragraph(Flowable):
220 signature = IParagraph276 signature = IParagraph
221 klass = reportlab.platypus.Paragraph277 klass = reportlab.platypus.Paragraph
278 defaultStyle = 'Normal'
222279
223 styleAttributes = zope.schema.getFieldNames(stylesheet.IBaseParagraphStyle)280 styleAttributes = zope.schema.getFieldNames(stylesheet.IBaseParagraphStyle)
224281
@@ -232,6 +289,8 @@
232289
233 def process(self):290 def process(self):
234 args = dict(self.getAttributeValues(ignore=self.styleAttributes))291 args = dict(self.getAttributeValues(ignore=self.styleAttributes))
292 if 'style' not in args:
293 args['style'] = attr._getStyle(self, self.defaultStyle)
235 args['style'] = self.processStyle(args['style'])294 args['style'] = self.processStyle(args['style'])
236 self.parent.flow.append(self.klass(**args))295 self.parent.flow.append(self.klass(**args))
237296
@@ -239,61 +298,56 @@
239class ITitle(IParagraph):298class ITitle(IParagraph):
240 """The title is a simple paragraph with a special title style."""299 """The title is a simple paragraph with a special title style."""
241300
242 style = attr.Style(
243 title=u'Style',
244 description=(u'The paragraph style that is applied to the paragraph. '
245 u'See the ``paraStyle`` tag for creating a paragraph '
246 u'style.'),
247 default=reportlab.lib.styles.getSampleStyleSheet()['Title'],
248 required=True)
249
250class Title(Paragraph):301class Title(Paragraph):
251 signature = ITitle302 signature = ITitle
252303 defaultStyle = 'Title'
253304
254class IHeading1(IParagraph):305class IHeading1(IParagraph):
255 """Heading 1 is a simple paragraph with a special heading 1 style."""306 """Heading 1 is a simple paragraph with a special heading 1 style."""
256307
257 style = attr.Style(
258 title=u'Style',
259 description=(u'The paragraph style that is applied to the paragraph. '
260 u'See the ``paraStyle`` tag for creating a paragraph '
261 u'style.'),
262 default=reportlab.lib.styles.getSampleStyleSheet()['Heading1'],
263 required=True)
264
265class Heading1(Paragraph):308class Heading1(Paragraph):
266 signature = IHeading1309 signature = IHeading1
310 defaultStyle = 'Heading1'
267311
268312
269class IHeading2(IParagraph):313class IHeading2(IParagraph):
270 """Heading 2 is a simple paragraph with a special heading 2 style."""314 """Heading 2 is a simple paragraph with a special heading 2 style."""
271315
272 style = attr.Style(
273 title=u'Style',
274 description=(u'The paragraph style that is applied to the paragraph. '
275 u'See the ``paraStyle`` tag for creating a paragraph '
276 u'style.'),
277 default=reportlab.lib.styles.getSampleStyleSheet()['Heading2'],
278 required=True)
279
280class Heading2(Paragraph):316class Heading2(Paragraph):
281 signature = IHeading2317 signature = IHeading2
318 defaultStyle = 'Heading2'
282319
283320
284class IHeading3(IParagraph):321class IHeading3(IParagraph):
285 """Heading 3 is a simple paragraph with a special heading 3 style."""322 """Heading 3 is a simple paragraph with a special heading 3 style."""
286323
287 style = attr.Style(
288 title=u'Style',
289 description=(u'The paragraph style that is applied to the paragraph. '
290 u'See the ``paraStyle`` tag for creating a paragraph '
291 u'style.'),
292 default=reportlab.lib.styles.getSampleStyleSheet()['Heading3'],
293 required=True)
294
295class Heading3(Paragraph):324class Heading3(Paragraph):
296 signature = IHeading3325 signature = IHeading3
326 defaultStyle = 'Heading3'
327
328
329class IHeading4(IParagraph):
330 """Heading 4 is a simple paragraph with a special heading 4 style."""
331
332class Heading4(Paragraph):
333 signature = IHeading4
334 defaultStyle = 'Heading4'
335
336
337class IHeading5(IParagraph):
338 """Heading 5 is a simple paragraph with a special heading 5 style."""
339
340class Heading5(Paragraph):
341 signature = IHeading5
342 defaultStyle = 'Heading5'
343
344
345class IHeading6(IParagraph):
346 """Heading 6 is a simple paragraph with a special heading 6 style."""
347
348class Heading6(Paragraph):
349 signature = IHeading6
350 defaultStyle = 'Heading6'
297351
298352
299class ITableCell(interfaces.IRMLDirectiveSignature):353class ITableCell(interfaces.IRMLDirectiveSignature):
@@ -470,6 +524,18 @@
470 description=u'The space of the line right of the cell.',524 description=u'The space of the line right of the cell.',
471 required=False)525 required=False)
472526
527 href = attr.Text(
528 title=u'Link URL',
529 description=u'When specified, the cell becomes a link to that URL.',
530 required=False)
531
532 destination = attr.Text(
533 title=u'Link Destination',
534 description=(u'When specified, the cell becomes a link to that '
535 u'destination.'),
536 required=False)
537
538
473class TableCell(directive.RMLDirective):539class TableCell(directive.RMLDirective):
474 signature = ITableCell540 signature = ITableCell
475 styleAttributesMapping = (541 styleAttributesMapping = (
@@ -492,6 +558,8 @@
492 'lineLeftCap', 'lineLeftCount', 'lineLeftSpace')),558 'lineLeftCap', 'lineLeftCount', 'lineLeftSpace')),
493 ('LINEAFTER', ('lineRightThickness', 'lineRightColor',559 ('LINEAFTER', ('lineRightThickness', 'lineRightColor',
494 'lineRightCap', 'lineRightCount', 'lineRightSpace')),560 'lineRightCap', 'lineRightCount', 'lineRightSpace')),
561 ('HREF', ('href',)),
562 ('DESTINATION', ('destination',)),
495 )563 )
496564
497 def processStyle(self):565 def processStyle(self):
@@ -755,7 +823,7 @@
755 description=u'The maximum height the flowables are allotted.',823 description=u'The maximum height the flowables are allotted.',
756 default=None,824 default=None,
757 required=False)825 required=False)
758 826
759class KeepTogether(Flowable):827class KeepTogether(Flowable):
760 signature = IKeepTogether828 signature = IKeepTogether
761 klass = reportlab.platypus.flowables.KeepTogether829 klass = reportlab.platypus.flowables.KeepTogether
@@ -771,6 +839,50 @@
771 frame = self.klass(flow.flow, **args)839 frame = self.klass(flow.flow, **args)
772 self.parent.flow.append(frame)840 self.parent.flow.append(frame)
773841
842class IImage(interfaces.IRMLDirectiveSignature):
843 """An image."""
844
845 src = attr.Image(
846 title=u'Image Source',
847 description=u'The file that is used to extract the image data.',
848 onlyOpen=True,
849 required=True)
850
851 width = attr.Measurement(
852 title=u'Image Width',
853 description=u'The width of the image.',
854 required=False)
855
856 height = attr.Measurement(
857 title=u'Image Height',
858 description=u'The height the image.',
859 required=False)
860
861 mask = attr.Color(
862 title=u'Mask',
863 description=u'The color mask used to render the image.',
864 required=False)
865
866 vAlign = attr.Choice(
867 title=u'Vertical Alignment',
868 description=u'The vertical alignment of the image.',
869 choices=interfaces.VALIGN_TEXT_CHOICES,
870 required=False)
871
872class Image(Flowable):
873 signature = IImage
874 klass = reportlab.platypus.flowables.Image
875 attrMapping = {'src': 'filename'}
876
877 def process(self):
878 args = dict(self.getAttributeValues(attrMapping=self.attrMapping))
879 vAlign = args.pop('vAlign', None)
880 img = self.klass(**args)
881 if vAlign:
882 img.vAlign = vAlign
883 self.parent.flow.append(img)
884
885
774class IImageAndFlowables(interfaces.IRMLDirectiveSignature):886class IImageAndFlowables(interfaces.IRMLDirectiveSignature):
775 """An image with flowables around it."""887 """An image with flowables around it."""
776888
@@ -931,7 +1043,7 @@
931 self.parent.flow.append(frame)1043 self.parent.flow.append(frame)
9321044
9331045
934class IBookmark(interfaces.IRMLDirectiveSignature):1046class IBookmarkPage(interfaces.IRMLDirectiveSignature):
935 """1047 """
936 This creates a bookmark to the current page which can be referred to with1048 This creates a bookmark to the current page which can be referred to with
937 the given key elsewhere.1049 the given key elsewhere.
@@ -947,20 +1059,10 @@
947 description=u'The name of the bookmark.',1059 description=u'The name of the bookmark.',
948 required=True)1060 required=True)
9491061
950 fitType = attr.Choice(1062 fit = attr.Choice(
951 title=u'Fit Type',1063 title=u'Fit',
952 description=u'The Fit Type.',1064 description=u'The Fit Type.',
953 choices=('Fit', 'FitH', 'FitV', 'FitR'),1065 choices=('XYZ', 'Fit', 'FitH', 'FitV', 'FitR'),
954 required=False)
955
956 left = attr.Measurement(
957 title=u'Left',
958 description=u'The left position.',
959 required=False)
960
961 right = attr.Measurement(
962 title=u'Right',
963 description=u'The right position.',
964 required=False)1066 required=False)
9651067
966 top = attr.Measurement(1068 top = attr.Measurement(
@@ -968,6 +1070,16 @@
968 description=u'The top position.',1070 description=u'The top position.',
969 required=False)1071 required=False)
9701072
1073 bottom = attr.Measurement(
1074 title=u'Bottom',
1075 description=u'The bottom position.',
1076 required=False)
1077
1078 left = attr.Measurement(
1079 title=u'Left',
1080 description=u'The left position.',
1081 required=False)
1082
971 right = attr.Measurement(1083 right = attr.Measurement(
972 title=u'Right',1084 title=u'Right',
973 description=u'The right position.',1085 description=u'The right position.',
@@ -978,10 +1090,39 @@
978 description=u'The zoom level when clicking on the bookmark.',1090 description=u'The zoom level when clicking on the bookmark.',
979 required=False)1091 required=False)
9801092
1093class BookmarkPage(Flowable):
1094 signature = IBookmarkPage
1095 klass = platypus.BookmarkPage
1096 attrMapping = {'name': 'key', 'fitType': 'fit'}
1097
1098
1099class IBookmark(interfaces.IRMLDirectiveSignature):
1100 """
1101 This creates a bookmark to the current page which can be referred to with
1102 the given key elsewhere. (Used inside a story.)
1103 """
1104
1105 name = attr.Text(
1106 title=u'Name',
1107 description=u'The name of the bookmark.',
1108 required=True)
1109
1110 x = attr.Measurement(
1111 title=u'X Coordinate',
1112 description=u'The x-position of the bookmark.',
1113 default=0,
1114 required=False)
1115
1116 y = attr.Measurement(
1117 title=u'Y Coordinate',
1118 description=u'The y-position of the bookmark.',
1119 default=0,
1120 required=False)
1121
981class Bookmark(Flowable):1122class Bookmark(Flowable):
982 signature = IBookmark1123 signature = IBookmark
983 klass = platypus.BookmarkPage1124 klass = platypus.Bookmark
984 attrMapping = {'name': 'key', 'fitType': 'fit'}1125 attrMapping = {'name': 'key', 'x': 'relativeX', 'y': 'relativeY'}
9851126
9861127
987class ILink(interfaces.IRMLDirectiveSignature):1128class ILink(interfaces.IRMLDirectiveSignature):
@@ -1118,6 +1259,170 @@
1118 klass = platypus.OutlineAdd1259 klass = platypus.OutlineAdd
11191260
11201261
1262class NamedStringFlowable(reportlab.platypus.flowables.Flowable):
1263
1264 def __init__(self, manager, id, value):
1265 reportlab.platypus.flowables.Flowable.__init__(self)
1266 self.manager = manager
1267 self.id = id
1268 self.value = value
1269
1270 def wrap(self, *args):
1271 return (0, 0)
1272
1273 def draw(self):
1274 self.manager.names[self.id] = self.value
1275
1276
1277class INamedString(interfaces.IRMLDirectiveSignature):
1278 """Defines a name for a string."""
1279
1280 id = attr.String(
1281 title=u'Id',
1282 description=u'The id under which the value will be known.',
1283 required=True)
1284
1285 value = attr.XMLContent(
1286 title=u'Value',
1287 description=u'The text that is displayed if the id is called.',
1288 required=True)
1289
1290class NamedString(directive.RMLDirective):
1291 signature = INamedString
1292
1293 def process(self):
1294 id, value = self.getAttributeValues(valuesOnly=True)
1295 manager = attr.getManager(self)
1296 # We have to delay assigning values, otherwise the last one wins.
1297 self.parent.flow.append(NamedStringFlowable(manager, id, value))
1298
1299
1300class IShowIndex(interfaces.IRMLDirectiveSignature):
1301 """Creates an index in the document."""
1302
1303 name = attr.String(
1304 title=u'Name',
1305 description=u'The name of the index.',
1306 default='index',
1307 required=False)
1308
1309 dot = attr.String(
1310 title=u'Dot',
1311 description=u'The character to use as a dot.',
1312 required=False)
1313
1314 style = attr.Style(
1315 title=u'Style',
1316 description=u'The paragraph style that is applied to the index. ',
1317 required=False)
1318
1319 tableStyle = attr.Style(
1320 title=u'Table Style',
1321 description=u'The table style that is applied to the index layout. ',
1322 required=False)
1323
1324class ShowIndex(directive.RMLDirective):
1325 signature = IShowIndex
1326
1327 def process(self):
1328 args = dict(self.getAttributeValues())
1329 manager = attr.getManager(self)
1330 index = manager.indexes[args['name']]
1331 args['format'] = index.formatFunc.__name__[8:]
1332 args['offset'] = index.offset
1333 index.setup(**args)
1334 self.parent.flow.append(index)
1335
1336
1337class IBaseLogCall(interfaces.IRMLDirectiveSignature):
1338
1339 message = attr.RawXMLContent(
1340 title=u'Message',
1341 description=u'The message to be logged.',
1342 required=True)
1343
1344class LogCallFlowable(reportlab.platypus.flowables.Flowable):
1345
1346 def __init__(self, logger, level, message):
1347 self.logger = logger
1348 self.level = level
1349 self.message = message
1350
1351 def wrap(self, *args):
1352 return (0, 0)
1353
1354 def draw(self):
1355 self.logger.log(self.level, self.message)
1356
1357class BaseLogCall(directive.RMLDirective):
1358 signature = IBaseLogCall
1359 level = None
1360
1361 def process(self):
1362 message = self.getAttributeValues(
1363 select=('message',), valuesOnly=True)[0]
1364 manager = attr.getManager(self)
1365 self.parent.flow.append(
1366 LogCallFlowable(manager.logger, self.level, message))
1367
1368class ILog(IBaseLogCall):
1369 """Log message at DEBUG level."""
1370
1371 level = attr.Choice(
1372 title=u'Level',
1373 description=u'The default log level.',
1374 choices=interfaces.LOG_LEVELS,
1375 doLower=False,
1376 default=logging.INFO,
1377 required=True)
1378
1379class Log(BaseLogCall):
1380 signature = ILog
1381
1382 @property
1383 def level(self):
1384 return self.getAttributeValues(select=('level',), valuesOnly=True)[0]
1385
1386class IDebug(IBaseLogCall):
1387 """Log message at DEBUG level."""
1388
1389class Debug(BaseLogCall):
1390 signature = IDebug
1391 level = logging.DEBUG
1392
1393
1394class IInfo(IBaseLogCall):
1395 """Log message at INFO level."""
1396
1397class Info(BaseLogCall):
1398 signature = IInfo
1399 level = logging.INFO
1400
1401
1402class IWarning(IBaseLogCall):
1403 """Log message at WARNING level."""
1404
1405class Warning(BaseLogCall):
1406 signature = IWarning
1407 level = logging.WARNING
1408
1409
1410class IError(IBaseLogCall):
1411 """Log message at ERROR level."""
1412
1413class Error(BaseLogCall):
1414 signature = IError
1415 level = logging.ERROR
1416
1417
1418class ICritical(IBaseLogCall):
1419 """Log message at CRITICAL level."""
1420
1421class Critical(BaseLogCall):
1422 signature = ICritical
1423 level = logging.CRITICAL
1424
1425
1121class IFlow(interfaces.IRMLDirectiveSignature):1426class IFlow(interfaces.IRMLDirectiveSignature):
1122 """A list of flowables."""1427 """A list of flowables."""
1123 occurence.containing(1428 occurence.containing(
@@ -1125,6 +1430,7 @@
1125 occurence.ZeroOrMore('illustration', IIllustration),1430 occurence.ZeroOrMore('illustration', IIllustration),
1126 occurence.ZeroOrMore('pre', IPreformatted),1431 occurence.ZeroOrMore('pre', IPreformatted),
1127 occurence.ZeroOrMore('xpre', IXPreformatted),1432 occurence.ZeroOrMore('xpre', IXPreformatted),
1433 occurence.ZeroOrMore('codesnippet', ICodeSnippet),
1128 occurence.ZeroOrMore('plugInFlowable', IPluginFlowable),1434 occurence.ZeroOrMore('plugInFlowable', IPluginFlowable),
1129 occurence.ZeroOrMore('barCodeFlowable', IBarCodeFlowable),1435 occurence.ZeroOrMore('barCodeFlowable', IBarCodeFlowable),
1130 occurence.ZeroOrMore('outlineAdd', IOutlineAdd),1436 occurence.ZeroOrMore('outlineAdd', IOutlineAdd),
@@ -1132,6 +1438,9 @@
1132 occurence.ZeroOrMore('h1', IHeading1),1438 occurence.ZeroOrMore('h1', IHeading1),
1133 occurence.ZeroOrMore('h2', IHeading2),1439 occurence.ZeroOrMore('h2', IHeading2),
1134 occurence.ZeroOrMore('h3', IHeading3),1440 occurence.ZeroOrMore('h3', IHeading3),
1441 occurence.ZeroOrMore('h4', IHeading4),
1442 occurence.ZeroOrMore('h5', IHeading5),
1443 occurence.ZeroOrMore('h6', IHeading6),
1135 occurence.ZeroOrMore('para', IParagraph),1444 occurence.ZeroOrMore('para', IParagraph),
1136 occurence.ZeroOrMore('blockTable', IBlockTable),1445 occurence.ZeroOrMore('blockTable', IBlockTable),
1137 occurence.ZeroOrMore('nextFrame', INextFrame),1446 occurence.ZeroOrMore('nextFrame', INextFrame),
@@ -1141,14 +1450,24 @@
1141 occurence.ZeroOrMore('condPageBreak', IConditionalPageBreak),1450 occurence.ZeroOrMore('condPageBreak', IConditionalPageBreak),
1142 occurence.ZeroOrMore('keepInFrame', IKeepInFrame),1451 occurence.ZeroOrMore('keepInFrame', IKeepInFrame),
1143 occurence.ZeroOrMore('keepTogether', IKeepTogether),1452 occurence.ZeroOrMore('keepTogether', IKeepTogether),
1453 occurence.ZeroOrMore('img', IImage),
1144 occurence.ZeroOrMore('imageAndFlowables', IImageAndFlowables),1454 occurence.ZeroOrMore('imageAndFlowables', IImageAndFlowables),
1145 occurence.ZeroOrMore('pto', IPTO),1455 occurence.ZeroOrMore('pto', IPTO),
1146 occurence.ZeroOrMore('indent', IIndent),1456 occurence.ZeroOrMore('indent', IIndent),
1147 occurence.ZeroOrMore('fixedSize', IFixedSize),1457 occurence.ZeroOrMore('fixedSize', IFixedSize),
1458 occurence.ZeroOrMore('bookmarkPage', IBookmarkPage),
1148 occurence.ZeroOrMore('bookmark', IBookmark),1459 occurence.ZeroOrMore('bookmark', IBookmark),
1149 occurence.ZeroOrMore('link', ILink),1460 occurence.ZeroOrMore('link', ILink),
1150 occurence.ZeroOrMore('hr', IHorizontalRow),1461 occurence.ZeroOrMore('hr', IHorizontalRow),
1462 occurence.ZeroOrMore('showIndex', IShowIndex),
1151 occurence.ZeroOrMore('name', special.IName),1463 occurence.ZeroOrMore('name', special.IName),
1464 occurence.ZeroOrMore('namedString', INamedString),
1465 occurence.ZeroOrMore('log', ILog),
1466 occurence.ZeroOrMore('debug', IDebug),
1467 occurence.ZeroOrMore('info', IInfo),
1468 occurence.ZeroOrMore('warning', IWarning),
1469 occurence.ZeroOrMore('error', IError),
1470 occurence.ZeroOrMore('critical', ICritical),
1152 )1471 )
11531472
1154class Flow(directive.RMLDirective):1473class Flow(directive.RMLDirective):
@@ -1159,6 +1478,7 @@
1159 'illustration': Illustration,1478 'illustration': Illustration,
1160 'pre': Preformatted,1479 'pre': Preformatted,
1161 'xpre': XPreformatted,1480 'xpre': XPreformatted,
1481 'codesnippet': CodeSnippet,
1162 'plugInFlowable': PluginFlowable,1482 'plugInFlowable': PluginFlowable,
1163 'barCodeFlowable': BarCodeFlowable,1483 'barCodeFlowable': BarCodeFlowable,
1164 'outlineAdd': OutlineAdd,1484 'outlineAdd': OutlineAdd,
@@ -1167,6 +1487,9 @@
1167 'h1': Heading1,1487 'h1': Heading1,
1168 'h2': Heading2,1488 'h2': Heading2,
1169 'h3': Heading3,1489 'h3': Heading3,
1490 'h4': Heading4,
1491 'h5': Heading5,
1492 'h6': Heading6,
1170 'para': Paragraph,1493 'para': Paragraph,
1171 # Table Flowable1494 # Table Flowable
1172 'blockTable': BlockTable,1495 'blockTable': BlockTable,
@@ -1178,15 +1501,26 @@
1178 'condPageBreak': ConditionalPageBreak,1501 'condPageBreak': ConditionalPageBreak,
1179 'keepInFrame': KeepInFrame,1502 'keepInFrame': KeepInFrame,
1180 'keepTogether': KeepTogether,1503 'keepTogether': KeepTogether,
1504 'img': Image,
1181 'imageAndFlowables': ImageAndFlowables,1505 'imageAndFlowables': ImageAndFlowables,
1182 'pto': PTO,1506 'pto': PTO,
1183 'indent': Indent,1507 'indent': Indent,
1184 'fixedSize': FixedSize,1508 'fixedSize': FixedSize,
1509 'bookmarkPage': BookmarkPage,
1185 'bookmark': Bookmark,1510 'bookmark': Bookmark,
1186 'link': Link,1511 'link': Link,
1187 'hr': HorizontalRow,1512 'hr': HorizontalRow,
1513 'showIndex': ShowIndex,
1188 # Special Elements1514 # Special Elements
1189 'name': special.Name,1515 'name': special.Name,
1516 'namedString': NamedString,
1517 # Logging
1518 'log': Log,
1519 'debug': Debug,
1520 'info': Info,
1521 'warning': Warning,
1522 'error': Error,
1523 'critical': Critical,
1190 }1524 }
11911525
1192 def __init__(self, *args, **kw):1526 def __init__(self, *args, **kw):
11931527
=== modified file 'src/z3c/rml/form.py'
--- src/z3c/rml/form.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/form.py 2013-01-09 02:49:23 +0000
@@ -13,7 +13,7 @@
13##############################################################################13##############################################################################
14"""Page Drawing Related Element Processing14"""Page Drawing Related Element Processing
1515
16$Id: form.py 74162 2007-04-16 04:16:37Z srichter $16$Id: form.py 128806 2012-12-20 16:34:40Z srichter $
17"""17"""
18__docformat__ = "reStructuredText"18__docformat__ = "reStructuredText"
19import types19import types
@@ -54,21 +54,6 @@
54 description=u'The height of the barcode.',54 description=u'The height of the barcode.',
55 required=False)55 required=False)
5656
57 strokeColor = attr.Color(
58 title=u'Stroke Color',
59 description=(u'The color of the line strokes in the area.'),
60 required=False)
61
62 strokeWidth = attr.Measurement(
63 title=u'Stroke Width',
64 description=u'The width of the line strokes in the area.',
65 required=False)
66
67 fillColor = attr.Color(
68 title=u'Fill Color',
69 description=(u'The color of the filled shapes in the area.'),
70 required=False)
71
72 barStrokeColor = attr.Color(57 barStrokeColor = attr.Color(
73 title=u'Bar Stroke Color',58 title=u'Bar Stroke Color',
74 description=(u'The color of the line strokes in the barcode.'),59 description=(u'The color of the line strokes in the barcode.'),
@@ -196,6 +181,12 @@
196 description=(u'The color of human readable text.'),181 description=(u'The color of human readable text.'),
197 required=False)182 required=False)
198183
184 # USPS4S
185 routing = attr.String(
186 title=u'Routing',
187 description=u'The routing information string.',
188 required=False)
189
199190
200class IBarCode(IBarCodeBase):191class IBarCode(IBarCodeBase):
201 """A barcode graphic."""192 """A barcode graphic."""
@@ -212,7 +203,10 @@
212 default=0,203 default=0,
213 required=False)204 required=False)
214205
215206 isoScale = attr.Boolean(
207 title=u'Isometric Scaling',
208 description=u'When set, the aspect ration of the barcode is enforced.',
209 required=False)
216210
217class BarCode(directive.RMLDirective):211class BarCode(directive.RMLDirective):
218 signature = IBarCode212 signature = IBarCode
219213
=== modified file 'src/z3c/rml/interfaces.py'
--- src/z3c/rml/interfaces.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/interfaces.py 2013-01-09 02:49:23 +0000
@@ -12,10 +12,9 @@
12#12#
13##############################################################################13##############################################################################
14"""RML to PDF Converter Interfaces14"""RML to PDF Converter Interfaces
15
16$Id: interfaces.py 74195 2007-04-16 22:41:24Z srichter $
17"""15"""
18__docformat__ = "reStructuredText"16__docformat__ = "reStructuredText"
17import logging
19import reportlab.lib.enums18import reportlab.lib.enums
20import zope.interface19import zope.interface
21import zope.schema20import zope.schema
@@ -36,7 +35,16 @@
36VALIGN_TEXT_CHOICES = {35VALIGN_TEXT_CHOICES = {
37 'top': 'TOP', 'middle': 'MIDDLE', 'bottom': 'BOTTOM'}36 'top': 'TOP', 'middle': 'MIDDLE', 'bottom': 'BOTTOM'}
38SPLIT_CHOICES = ('splitfirst', 'splitlast')37SPLIT_CHOICES = ('splitfirst', 'splitlast')
3938TEXT_TRANSFORM_CHOICES = ('uppercase', 'lowercase')
39LIST_FORMATS = ('I', 'i', '123', 'ABC', 'abc')
40ORDERED_LIST_TYPES = ('I', 'i', '1', 'A', 'a')
41UNORDERED_BULLET_VALUES = ('circle', 'square', 'disc', 'diamond', 'rarrowhead')
42LOG_LEVELS = {
43 'DEBUG': logging.DEBUG,
44 'INFO': logging.INFO,
45 'WARNING': logging.WARNING,
46 'ERROR': logging.ERROR,
47 'CRITICAL': logging.CRITICAL}
4048
41class IRML2PDF(zope.interface.Interface):49class IRML2PDF(zope.interface.Interface):
42 """This is the main public API of z3c.rml"""50 """This is the main public API of z3c.rml"""
4351
=== added file 'src/z3c/rml/list.py'
--- src/z3c/rml/list.py 1970-01-01 00:00:00 +0000
+++ src/z3c/rml/list.py 2013-01-09 02:49:23 +0000
@@ -0,0 +1,181 @@
1##############################################################################
2#
3# Copyright (c) 2012 Zope Foundation and Contributors.
4# All Rights Reserved.
5#
6# This software is subject to the provisions of the Zope Public License,
7# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
8# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
9# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
11# FOR A PARTICULAR PURPOSE.
12#
13##############################################################################
14"""``ul``, ``ol``, and ``li`` directives.
15"""
16__docformat__ = "reStructuredText"
17import copy
18import reportlab.lib.styles
19import reportlab.platypus
20import zope.schema
21from reportlab.platypus import flowables
22
23from z3c.rml import attr, directive, flowable, interfaces, occurence, stylesheet
24
25
26class IListItem(stylesheet.IMinimalListStyle, flowable.IFlow):
27 """A list item in an ordered or unordered list."""
28
29 style = attr.Style(
30 title=u'Style',
31 description=u'The list style that is applied to the list.',
32 required=False)
33
34class ListItem(flowable.Flow):
35 signature = IListItem
36 klass = reportlab.platypus.ListItem
37 attrMapping = {}
38
39 styleAttributes = zope.schema.getFieldNames(stylesheet.IMinimalListStyle)
40
41 def processStyle(self, style):
42 attrs = self.getAttributeValues(select=self.styleAttributes)
43 if attrs or not hasattr(style, 'value'):
44 style = copy.deepcopy(style)
45 # Sigh, this is needed since unordered list items expect the value.
46 style.value = style.start
47 for name, value in attrs:
48 setattr(style, name, value)
49 return style
50
51 def process(self):
52 self.processSubDirectives()
53 args = dict(self.getAttributeValues(ignore=self.styleAttributes))
54 if 'style' not in args:
55 args['style'] = self.parent.baseStyle
56 args['style'] = self.processStyle(args['style'])
57 li = self.klass(self.flow, **args)
58 self.parent.flow.append(li)
59
60
61class IOrderedListItem(IListItem):
62 """An ordered list item."""
63
64 value = attr.Integer(
65 title=u'Bullet Value',
66 description=u'The counter value.',
67 required=False)
68
69class OrderedListItem(ListItem):
70 signature = IOrderedListItem
71
72
73class IUnorderedListItem(IListItem):
74 """An ordered list item."""
75
76 value = attr.Choice(
77 title=u'Bullet Value',
78 description=u'The type of bullet character.',
79 choices=interfaces.UNORDERED_BULLET_VALUES,
80 required=False)
81
82class UnorderedListItem(ListItem):
83 signature = IUnorderedListItem
84
85 styleAttributes = ListItem.styleAttributes + ['value']
86
87
88class IListBase(stylesheet.IBaseListStyle):
89
90 style = attr.Style(
91 title=u'Style',
92 description=u'The list style that is applied to the list.',
93 required=False)
94
95class ListBase(directive.RMLDirective):
96 klass = reportlab.platypus.ListFlowable
97 factories = {'li': ListItem}
98 attrMapping = {}
99
100 styleAttributes = zope.schema.getFieldNames(stylesheet.IBaseListStyle)
101
102 def __init__(self, *args, **kw):
103 super(ListBase, self).__init__(*args, **kw)
104 self.flow = []
105
106 def processStyle(self, style):
107 attrs = self.getAttributeValues(
108 select=self.styleAttributes, attrMapping=self.attrMapping)
109 if attrs:
110 style = copy.deepcopy(style)
111 for name, value in attrs:
112 setattr(style, name, value)
113 return style
114
115 def process(self):
116 args = dict(self.getAttributeValues(
117 ignore=self.styleAttributes, attrMapping=self.attrMapping))
118 if 'style' not in args:
119 args['style'] = reportlab.lib.styles.ListStyle('List')
120 args['style'] = self.baseStyle = self.processStyle(args['style'])
121 self.processSubDirectives()
122 li = self.klass(self.flow, **args)
123 self.parent.flow.append(li)
124
125
126class IOrderedList(IListBase):
127 """An ordered list."""
128 occurence.containing(
129 occurence.ZeroOrMore('li', IOrderedListItem),
130 )
131
132 bulletType = attr.Choice(
133 title=u'Bullet Type',
134 description=u'The type of bullet formatting.',
135 choices=interfaces.ORDERED_LIST_TYPES,
136 doLower=False,
137 required=False)
138
139class OrderedList(ListBase):
140 signature = IOrderedList
141 factories = {'li': OrderedListItem}
142
143 styleAttributes = ListBase.styleAttributes + ['bulletType']
144
145
146class IUnorderedList(IListBase):
147 """And unordered list."""
148 occurence.containing(
149 occurence.ZeroOrMore('li', IUnorderedListItem),
150 )
151
152 value = attr.Choice(
153 title=u'Bullet Value',
154 description=u'The type of bullet character.',
155 choices=interfaces.UNORDERED_BULLET_VALUES,
156 default='disc',
157 required=False)
158
159class UnorderedList(ListBase):
160 signature = IUnorderedList
161 attrMapping = {'value': 'start'}
162 factories = {'li': UnorderedListItem}
163
164 def getAttributeValues(self, *args, **kw):
165 res = super(UnorderedList, self).getAttributeValues(*args, **kw)
166 res.append(('bulletType', 'bullet'))
167 return res
168
169flowable.Flow.factories['ol'] = OrderedList
170flowable.IFlow.setTaggedValue(
171 'directives',
172 flowable.IFlow.getTaggedValue('directives') +
173 (occurence.ZeroOrMore('ol', IOrderedList),)
174 )
175
176flowable.Flow.factories['ul'] = UnorderedList
177flowable.IFlow.setTaggedValue(
178 'directives',
179 flowable.IFlow.getTaggedValue('directives') +
180 (occurence.ZeroOrMore('ul', IUnorderedList),)
181 )
0182
=== modified file 'src/z3c/rml/paraparser.py'
--- src/z3c/rml/paraparser.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/paraparser.py 2013-01-09 02:49:23 +0000
@@ -24,9 +24,12 @@
24import reportlab.platypus.paraparser24import reportlab.platypus.paraparser
2525
2626
27class DynamicFragment(reportlab.platypus.paraparser.ParaFrag):27class PageNumberFragment(reportlab.platypus.paraparser.ParaFrag):
28 """A fragment whose `text` is computed at access time."""28 """A fragment whose `text` is computed at access time."""
2929
30 def __init__(self, attributes):
31 reportlab.platypus.paraparser.ParaFrag.__init__(self)
32
30 @property33 @property
31 def text(self):34 def text(self):
32 # Guess 1: We're in a paragraph in a story.35 # Guess 1: We're in a paragraph in a story.
@@ -43,18 +46,54 @@
43 return str(canvas.getPageNumber())46 return str(canvas.getPageNumber())
4447
4548
49class GetNameFragment(reportlab.platypus.paraparser.ParaFrag):
50 """A fragment whose `text` is computed at access time."""
51
52 def __init__(self, attributes):
53 reportlab.platypus.paraparser.ParaFrag.__init__(self)
54 self.id = attributes['id']
55
56 @property
57 def text(self):
58 # Guess 1: We're in a paragraph in a story.
59 frame = inspect.currentframe(4)
60 canvas = frame.f_locals.get('canvas', None)
61
62 if canvas is None:
63 # Guess 2: We're in a template
64 canvas = frame.f_locals.get('canv', None)
65
66 if canvas is None:
67 raise Exception("Can't use <getName/> in this location.")
68
69 return canvas.manager.names[self.id]
70
71
46class Z3CParagraphParser(reportlab.platypus.paraparser.ParaParser):72class Z3CParagraphParser(reportlab.platypus.paraparser.ParaParser):
47 """Extensions to paragraph-internal XML parsing."""73 """Extensions to paragraph-internal XML parsing."""
4874
49 def start_pageNumber(self, attributes):75 def startDynamic(self, attributes, klass):
50 frag = DynamicFragment()76 frag = klass(attributes)
51 frag.__dict__.update(self._stack[-1].__dict__)77 frag.__dict__.update(self._stack[-1].__dict__)
52 frag.fontName = reportlab.lib.fonts.tt2ps(frag.fontName, frag.bold, frag.italic)78 frag.fontName = reportlab.lib.fonts.tt2ps(
79 frag.fontName, frag.bold, frag.italic)
53 self.fragList.append(frag)80 self.fragList.append(frag)
54 self._stack.append(frag)81 self._stack.append(frag)
5582
83 def endDynamic(self):
84 self._pop()
85
86 def start_pageNumber(self, attributes):
87 self.startDynamic(attributes, PageNumberFragment)
88
56 def end_pageNumber(self):89 def end_pageNumber(self):
57 self._pop()90 self.endDynamic()
91
92 def start_getName(self, attributes):
93 self.startDynamic(attributes, GetNameFragment)
94
95 def end_getName(self):
96 self.endDynamic()
5897
5998
60# Monkey-patch reportlabs global parser instance. Wah.99# Monkey-patch reportlabs global parser instance. Wah.
61100
=== added file 'src/z3c/rml/pdfinclude.py'
--- src/z3c/rml/pdfinclude.py 1970-01-01 00:00:00 +0000
+++ src/z3c/rml/pdfinclude.py 2013-01-09 02:49:23 +0000
@@ -0,0 +1,113 @@
1##############################################################################
2#
3# Copyright (c) 2012 Zope Foundation and Contributors.
4# All Rights Reserved.
5#
6# This software is subject to the provisions of the Zope Public License,
7# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
8# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
9# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
11# FOR A PARTICULAR PURPOSE.
12#
13##############################################################################
14"""``pdfInclude`` Directive.
15"""
16__docformat__ = "reStructuredText"
17try:
18 import pyPdf
19except ImportError:
20 pyPdf = None
21from reportlab.platypus import flowables
22
23from z3c.rml import attr, flowable, interfaces, occurence, page
24
25
26class IncludePdfPagesFlowable(flowables.Flowable):
27
28 def __init__(self, pdf_file, pages, mergeprocessor):
29 flowables.Flowable.__init__(self)
30 self.pdf_file = pdf_file
31 self.proc = mergeprocessor
32
33 pdf = pyPdf.PdfFileReader(pdf_file)
34 self.num_pages = pdf.getNumPages()
35 self.pages = pages if pages else range(1, self.num_pages+1)
36
37 self.width = 10<<32
38 self.height = 10<<32
39
40 def draw():
41 return NotImplementedError('PDFPages shall be drawn not me')
42
43 def split(self, availWidth, availheight):
44 result = []
45 for i in self.pages:
46 result.append(flowables.PageBreak())
47 result.append(PDFPageFlowable(self, i-1, availWidth, availheight))
48 return result
49
50
51class PDFPageFlowable(flowables.Flowable):
52
53 def __init__(self, parent, pagenumber, width, height):
54 flowables.Flowable.__init__(self)
55 self.parent = parent
56 self.pagenumber = pagenumber
57 self.width = width
58 self.height = height
59
60 def draw(self):
61 # FIXME : scale and rotate ?
62 # self.canv.addLiteral(self.page.getContents())
63 proc = self.parent.proc
64 outPage = self.canv.getPageNumber()-1
65 pageOperations = proc.operations.setdefault(outPage, [])
66 pageOperations.append((self.parent.pdf_file, self.pagenumber))
67 # flowable.NextPage()
68
69 def split(self, availWidth, availheight):
70 return [self]
71
72class IIncludePdfPages(interfaces.IRMLDirectiveSignature):
73 """Inserts a set of pages from a given PDF."""
74
75 filename = attr.File(
76 title=u'Path to file',
77 description=u'The pdf file to include.',
78 required=True)
79
80 pages = attr.IntegerSequence(
81 title=u'Pages',
82 description=u'A list of pages to insert.',
83 required=False)
84
85
86class IncludePdfPages(flowable.Flowable):
87 signature = IIncludePdfPages
88
89 def getProcessor(self):
90 manager = attr.getManager(self, interfaces.IPostProcessorManager)
91 procs = dict(manager.postProcessors)
92 if 'MERGE' not in procs:
93 proc = page.MergePostProcessor()
94 manager.postProcessors.append(('MERGE', proc))
95 return proc
96 return procs['MERGE']
97
98 def process(self):
99 if pyPdf is None:
100 raise Exception(
101 'pyPdf is not installed, so this feature is not available.')
102 args = dict(self.getAttributeValues())
103 proc = self.getProcessor()
104 self.parent.flow.append(
105 IncludePdfPagesFlowable(args['filename'], args.get('pages'), proc))
106
107
108flowable.Flow.factories['includePdfPages'] = IncludePdfPages
109flowable.IFlow.setTaggedValue(
110 'directives',
111 flowable.IFlow.getTaggedValue('directives') +
112 (occurence.ZeroOrMore('includePdfPages', IIncludePdfPages),)
113 )
0114
=== modified file 'src/z3c/rml/platypus.py'
--- src/z3c/rml/platypus.py 2012-04-02 15:47:51 +0000
+++ src/z3c/rml/platypus.py 2013-01-09 02:49:23 +0000
@@ -13,7 +13,7 @@
13##############################################################################13##############################################################################
14"""Style Related Element Processing14"""Style Related Element Processing
1515
16$Id: platypus.py 121449 2011-04-19 16:00:38Z menesis $16$Id: platypus.py 128833 2012-12-21 02:02:02Z srichter $
17"""17"""
18__docformat__ = "reStructuredText"18__docformat__ = "reStructuredText"
19import reportlab.platypus.flowables19import reportlab.platypus.flowables
@@ -79,6 +79,11 @@
79 self.canv.bookmarkPage(*self.args, **self.kw)79 self.canv.bookmarkPage(*self.args, **self.kw)
8080
8181
82class Bookmark(BaseFlowable):
83 def draw(self):
84 self.canv.bookmarkHorizontal(*self.args, **self.kw)
85
86
82class OutlineAdd(BaseFlowable):87class OutlineAdd(BaseFlowable):
83 def draw(self):88 def draw(self):
84 if self.kw.get('key', None) is None:89 if self.kw.get('key', None) is None:
8590
=== modified file 'src/z3c/rml/reference.pt'
--- src/z3c/rml/reference.pt 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/reference.pt 2013-01-09 02:49:23 +0000
@@ -112,7 +112,7 @@
112 </drawCenteredString>112 </drawCenteredString>
113 <setFont name="Helvetica" size="24" />113 <setFont name="Helvetica" size="24" />
114 <drawCenteredString x="10.5cm" y="18.5cm">114 <drawCenteredString x="10.5cm" y="18.5cm">
115 Version 0.9115 Version 2.0
116 </drawCenteredString>116 </drawCenteredString>
117 </pageGraphics>117 </pageGraphics>
118 <frame id="main" x1="3cm" y1="2cm" width="17cm" height="25.7cm" />118 <frame id="main" x1="3cm" y1="2cm" width="17cm" height="25.7cm" />
@@ -181,7 +181,7 @@
181 <outlineAdd level="1" tal:content="directive/name">181 <outlineAdd level="1" tal:content="directive/name">
182 Element Name182 Element Name
183 </outlineAdd>183 </outlineAdd>
184 <bookmark tal:attributes="name directive/id"/>184 <bookmarkPage tal:attributes="name directive/id"/>
185 <para style="deprecation"185 <para style="deprecation"
186 tal:condition="directive/deprecated">186 tal:condition="directive/deprecated">
187 <b>Deprecated:</b>187 <b>Deprecated:</b>
188188
=== modified file 'src/z3c/rml/reference.py'
--- src/z3c/rml/reference.py 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/reference.py 2013-01-09 02:49:23 +0000
@@ -13,23 +13,20 @@
13##############################################################################13##############################################################################
14"""RML Reference Generator14"""RML Reference Generator
1515
16$Id: reference.py 114907 2010-07-22 01:59:57Z srichter $16$Id: reference.py 128766 2012-12-19 01:37:16Z srichter $
17"""17"""
18__docformat__ = "reStructuredText"18__docformat__ = "reStructuredText"
19import copy19import copy
20import re20import re
21import os21import os
22import pygments.token
22import zope.schema23import zope.schema
23import zope.schema.interfaces24import zope.schema.interfaces
24from lxml import etree25from lxml import etree
25from xml.sax import saxutils26from xml.sax import saxutils
27from pygments.lexers import XmlLexer
26from z3c.rml import attr, document, interfaces, pagetemplate28from z3c.rml import attr, document, interfaces, pagetemplate
2729
28try:
29 import SilverCity
30except ImportError:
31 SilverCity = None
32
3330
34INPUT_URL = ('http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/'31INPUT_URL = ('http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/'
35 'rml/tests/input/%s')32 'rml/tests/input/%s')
@@ -41,10 +38,8 @@
41 attr.TextNode, attr.TextNodeSequence, attr.TextNodeGrid,38 attr.TextNode, attr.TextNodeSequence, attr.TextNodeGrid,
42 attr.RawXMLContent, attr.XMLContent)39 attr.RawXMLContent, attr.XMLContent)
43STYLES_FORMATTING = {40STYLES_FORMATTING = {
44 1 : ('<font textColor="red">', '</font>'),41 pygments.token.Name.Tag : ('<font textColor="red">', '</font>'),
45 #3 : ('<font textColor="blue">', '</font>'),42 pygments.token.Literal.String : ('<font textColor="blue">', '</font>'),
46 6 : ('<font textColor="blue">', '</font>'),
47 11 : ('<font textColor="red">', '</font>'),
48 }43 }
49EXAMPLE_NS = 'http://namespaces.zope.org/rml/doc'44EXAMPLE_NS = 'http://namespaces.zope.org/rml/doc'
50EXAMPLE_ATTR_NAME = '{%s}example' %EXAMPLE_NS45EXAMPLE_ATTR_NAME = '{%s}example' %EXAMPLE_NS
@@ -79,13 +74,11 @@
79 return '\n'.join(result)74 return '\n'.join(result)
8075
81def highlightRML(rml):76def highlightRML(rml):
82 if SilverCity is None:77 lexer = XmlLexer()
83 return saxutils.escape(rml)
84 lexer = SilverCity.XML.XMLLexer()
85 styledRml = ''78 styledRml = ''
86 for piece in lexer.tokenize_by_style(rml):79 for ttype, token in lexer.get_tokens(rml):
87 start, end = STYLES_FORMATTING.get(piece['style'], ('', ''))80 start, end = STYLES_FORMATTING.get(ttype, ('', ''))
88 styledRml += start + saxutils.escape(piece['text']) + end81 styledRml += start + saxutils.escape(token) + end
89 return styledRml82 return styledRml
9083
9184
@@ -228,6 +221,8 @@
228 for dirExamples in examples.values():221 for dirExamples in examples.values():
229 for example in dirExamples:222 for example in dirExamples:
230 xml = etree.tounicode(example['element']).strip()223 xml = etree.tounicode(example['element']).strip()
224 xml = re.sub(
225 ' ?xmlns:doc="http://namespaces.zope.org/rml/doc"', '', xml)
231 xml = dedent(xml)226 xml = dedent(xml)
232 xml = enforceColumns(xml, 80)227 xml = enforceColumns(xml, 80)
233 xml = highlightRML(xml)228 xml = highlightRML(xml)
234229
=== added file 'src/z3c/rml/rlfix.py'
--- src/z3c/rml/rlfix.py 1970-01-01 00:00:00 +0000
+++ src/z3c/rml/rlfix.py 2013-01-09 02:49:23 +0000
@@ -0,0 +1,42 @@
1##############################################################################
2#
3# Copyright (c) 2012 Zope Foundation and Contributors.
4# All Rights Reserved.
5#
6# This software is subject to the provisions of the Zope Public License,
7# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
8# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
9# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
11# FOR A PARTICULAR PURPOSE.
12#
13##############################################################################
14"""ReportLab fixups.
15"""
16__docformat__ = "reStructuredText"
17from reportlab.pdfbase import pdfform
18from reportlab.pdfbase.pdfpattern import PDFPattern
19from reportlab.graphics import testshapes
20
21def resetPdfForm():
22 pdfform.PDFDOCENC = PDFPattern(pdfform.PDFDocEncodingPattern)
23 pdfform.ENCODING = PDFPattern(
24 pdfform.EncodingPattern, PDFDocEncoding=pdfform.PDFDOCENC)
25 pdfform.GLOBALFONTSDICTIONARY = pdfform.FormFontsDictionary()
26 pdfform.GLOBALRESOURCES = pdfform.FormResources()
27 pdfform.ZADB = PDFPattern(pdfform.ZaDbPattern)
28
29def resetFonts():
30 for f in testshapes._setup():
31 if f not in testshapes._FONTS:
32 testshapes._FONTS.append(f)
33
34def setSideLabels():
35 from reportlab.graphics.charts import piecharts
36 piecharts.Pie3d.sideLabels = 0
37setSideLabels()
38
39from reportlab.rl_config import register_reset
40register_reset(resetPdfForm)
41register_reset(resetFonts)
42del register_reset
043
=== modified file 'src/z3c/rml/rml-reference.pdf'
--- src/z3c/rml/rml-reference.pdf 2011-01-05 22:34:45 +0000
+++ src/z3c/rml/rml-reference.pdf 2013-01-09 02:49:23 +0000
@@ -23,12 +23,12 @@
23% 'Page1': class PDFPage 23% 'Page1': class PDFPage
243 0 obj243 0 obj
25% Page dictionary25% Page dictionary
26<< /Contents 1007 0 R26<< /Contents 1248 0 R
27 /MediaBox [ 027 /MediaBox [ 0
28 028 0
29 595.275629 595.2756
30 841.8898 ]30 841.8898 ]
31 /Parent 1006 0 R31 /Parent 1247 0 R
32 /Resources << /Font 1 0 R32 /Resources << /Font 1 0 R
33 /ProcSet [ /PDF33 /ProcSet [ /PDF
34 /Text34 /Text
@@ -60,12 +60,12 @@
60% 'Page2': class PDFPage 60% 'Page2': class PDFPage
616 0 obj616 0 obj
62% Page dictionary62% Page dictionary
63<< /Contents 1008 0 R63<< /Contents 1249 0 R
64 /MediaBox [ 064 /MediaBox [ 0
65 065 0
66 595.275666 595.2756
67 841.8898 ]67 841.8898 ]
68 /Parent 1006 0 R68 /Parent 1247 0 R
69 /Resources << /Font 1 0 R69 /Resources << /Font 1 0 R
70 /ProcSet [ /PDF70 /ProcSet [ /PDF
71 /Text71 /Text
@@ -88,12 +88,12 @@
88% 'Page3': class PDFPage 88% 'Page3': class PDFPage
898 0 obj898 0 obj
90% Page dictionary90% Page dictionary
91<< /Contents 1009 0 R91<< /Contents 1250 0 R
92 /MediaBox [ 092 /MediaBox [ 0
93 093 0
94 595.275694 595.2756
95 841.8898 ]95 841.8898 ]
96 /Parent 1006 0 R96 /Parent 1247 0 R
97 /Resources << /Font 1 0 R97 /Resources << /Font 1 0 R
98 /ProcSet [ /PDF98 /ProcSet [ /PDF
99 /Text99 /Text
@@ -107,12 +107,12 @@
107% 'Page4': class PDFPage 107% 'Page4': class PDFPage
1089 0 obj1089 0 obj
109% Page dictionary109% Page dictionary
110<< /Contents 1010 0 R110<< /Contents 1251 0 R
111 /MediaBox [ 0111 /MediaBox [ 0
112 0112 0
113 595.2756113 595.2756
114 841.8898 ]114 841.8898 ]
115 /Parent 1006 0 R115 /Parent 1247 0 R
116 /Resources << /Font 1 0 R116 /Resources << /Font 1 0 R
117 /ProcSet [ /PDF117 /ProcSet [ /PDF
118 /Text118 /Text
@@ -159,9 +159,9 @@
159 0159 0
160 0 ]160 0 ]
161 /Rect [ 150.2861161 /Rect [ 150.2861
162 470.9469162 482.9469
163 241.3961163 241.3961
164 482.9469 ]164 494.9469 ]
165 /Subtype /Link165 /Subtype /Link
166 /Type /Annot >>166 /Type /Annot >>
167endobj167endobj
@@ -174,9 +174,9 @@
174 0174 0
175 0 ]175 0 ]
176 /Rect [ 297.6378176 /Rect [ 297.6378
177 470.9469177 482.9469
178 297.6378178 297.6378
179 482.9469 ]179 494.9469 ]
180 /Subtype /Link180 /Subtype /Link
181 /Type /Annot >>181 /Type /Annot >>
182endobj182endobj
@@ -189,9 +189,9 @@
189 0189 0
190 0 ]190 0 ]
191 /Rect [ 297.6378191 /Rect [ 297.6378
192 470.9469192 482.9469
193 322.6378193 323.1978
194 482.9469 ]194 494.9469 ]
195 /Subtype /Link195 /Subtype /Link
196 /Type /Annot >>196 /Type /Annot >>
197endobj197endobj
@@ -203,10 +203,10 @@
203 /Border [ 0203 /Border [ 0
204 0204 0
205 0 ]205 0 ]
206 /Rect [ 322.6378206 /Rect [ 323.1978
207 470.9469207 482.9469
208 322.6378208 323.1978
209 482.9469 ]209 494.9469 ]
210 /Subtype /Link210 /Subtype /Link
211 /Type /Annot >>211 /Type /Annot >>
212endobj212endobj
@@ -219,9 +219,9 @@
219 0219 0
220 0 ]220 0 ]
221 /Rect [ 150.2861221 /Rect [ 150.2861
222 282.9469222 306.9469
223 209.7361223 209.7361
224 294.9469 ]224 318.9469 ]
225 /Subtype /Link225 /Subtype /Link
226 /Type /Annot >>226 /Type /Annot >>
227endobj227endobj
@@ -234,9 +234,9 @@
234 0234 0
235 0 ]235 0 ]
236 /Rect [ 297.6378236 /Rect [ 297.6378
237 282.9469237 306.9469
238 297.6378238 297.6378
239 294.9469 ]239 318.9469 ]
240 /Subtype /Link240 /Subtype /Link
241 /Type /Annot >>241 /Type /Annot >>
242endobj242endobj
@@ -249,9 +249,9 @@
249 0249 0
250 0 ]250 0 ]
251 /Rect [ 297.6378251 /Rect [ 297.6378
252 282.9469252 306.9469
253 322.6378253 323.1978
254 294.9469 ]254 318.9469 ]
255 /Subtype /Link255 /Subtype /Link
256 /Type /Annot >>256 /Type /Annot >>
257endobj257endobj
@@ -263,10 +263,10 @@
263 /Border [ 0263 /Border [ 0
264 0264 0
265 0 ]265 0 ]
266 /Rect [ 322.6378266 /Rect [ 323.1978
267 282.9469267 306.9469
268 322.6378268 323.1978
269 294.9469 ]269 318.9469 ]
270 /Subtype /Link270 /Subtype /Link
271 /Type /Annot >>271 /Type /Annot >>
272endobj272endobj
@@ -279,9 +279,9 @@
279 0279 0
280 0 ]280 0 ]
281 /Rect [ 150.2861281 /Rect [ 150.2861
282 65.94685282 101.9469
283 227.5161283 227.5161
284 77.94685 ]284 113.9469 ]
285 /Subtype /Link285 /Subtype /Link
286 /Type /Annot >>286 /Type /Annot >>
287endobj287endobj
@@ -294,9 +294,9 @@
294 0294 0
295 0 ]295 0 ]
296 /Rect [ 297.6378296 /Rect [ 297.6378
297 65.94685297 101.9469
298 297.6378298 297.6378
299 77.94685 ]299 113.9469 ]
300 /Subtype /Link300 /Subtype /Link
301 /Type /Annot >>301 /Type /Annot >>
302endobj302endobj
@@ -309,9 +309,9 @@
309 0309 0
310 0 ]310 0 ]
311 /Rect [ 297.6378311 /Rect [ 297.6378
312 65.94685312 101.9469
313 322.6378313 323.1978
314 77.94685 ]314 113.9469 ]
315 /Subtype /Link315 /Subtype /Link
316 /Type /Annot >>316 /Type /Annot >>
317endobj317endobj
@@ -323,10 +323,10 @@
323 /Border [ 0323 /Border [ 0
324 0324 0
325 0 ]325 0 ]
326 /Rect [ 322.6378326 /Rect [ 323.1978
327 65.94685327 101.9469
328 322.6378328 323.1978
329 77.94685 ]329 113.9469 ]
330 /Subtype /Link330 /Subtype /Link
331 /Type /Annot >>331 /Type /Annot >>
332endobj332endobj
@@ -345,12 +345,12 @@
345 22 0 R345 22 0 R
346 23 0 R346 23 0 R
347 24 0 R ]347 24 0 R ]
348 /Contents 1011 0 R348 /Contents 1252 0 R
349 /MediaBox [ 0349 /MediaBox [ 0
350 0350 0
351 595.2756351 595.2756
352 841.8898 ]352 841.8898 ]
353 /Parent 1006 0 R353 /Parent 1247 0 R
354 /Resources << /Font 1 0 R354 /Resources << /Font 1 0 R
355 /ProcSet [ /PDF355 /ProcSet [ /PDF
356 /Text356 /Text
@@ -367,12 +367,12 @@
367 0367 0
368 0 ]368 0 ]
369 /Contents ()369 /Contents ()
370 /Dest [ 230 0 R370 /Dest [ 229 0 R
371 /Fit ]371 /Fit ]
372 /Rect [ 56.69291372 /Rect [ 56.69291
373 144.1969373 183.1969
374 538.5827374 538.5827
375 156.1969 ]375 195.1969 ]
376 /Subtype /Link376 /Subtype /Link
377 /Type /Annot >>377 /Type /Annot >>
378endobj378endobj
@@ -382,12 +382,12 @@
382 0382 0
383 0 ]383 0 ]
384 /Contents ()384 /Contents ()
385 /Dest [ 75 0 R385 /Dest [ 69 0 R
386 /Fit ]386 /Fit ]
387 /Rect [ 56.69291387 /Rect [ 56.69291
388 132.1969388 171.1969
389 538.5827389 538.5827
390 144.1969 ]390 183.1969 ]
391 /Subtype /Link391 /Subtype /Link
392 /Type /Annot >>392 /Type /Annot >>
393endobj393endobj
@@ -400,9 +400,9 @@
400 /Dest [ 166 0 R400 /Dest [ 166 0 R
401 /Fit ]401 /Fit ]
402 /Rect [ 56.69291402 /Rect [ 56.69291
403 120.1969403 159.1969
404 538.5827404 538.5827
405 132.1969 ]405 171.1969 ]
406 /Subtype /Link406 /Subtype /Link
407 /Type /Annot >>407 /Type /Annot >>
408endobj408endobj
@@ -412,12 +412,12 @@
412 0412 0
413 0 ]413 0 ]
414 /Contents ()414 /Contents ()
415 /Dest [ 815 0 R415 /Dest [ 1015 0 R
416 /Fit ]416 /Fit ]
417 /Rect [ 56.69291417 /Rect [ 56.69291
418 108.1969418 147.1969
419 538.5827419 538.5827
420 120.1969 ]420 159.1969 ]
421 /Subtype /Link421 /Subtype /Link
422 /Type /Annot >>422 /Type /Annot >>
423endobj423endobj
@@ -427,12 +427,12 @@
427 0427 0
428 0 ]428 0 ]
429 /Contents ()429 /Contents ()
430 /Dest [ 68 0 R430 /Dest [ 67 0 R
431 /Fit ]431 /Fit ]
432 /Rect [ 56.69291432 /Rect [ 56.69291
433 96.19685433 135.1969
434 538.5827434 538.5827
435 108.1969 ]435 147.1969 ]
436 /Subtype /Link436 /Subtype /Link
437 /Type /Annot >>437 /Type /Annot >>
438endobj438endobj
@@ -442,12 +442,12 @@
442 0442 0
443 0 ]443 0 ]
444 /Contents ()444 /Contents ()
445 /Dest [ 796 0 R445 /Dest [ 981 0 R
446 /Fit ]446 /Fit ]
447 /Rect [ 56.69291447 /Rect [ 56.69291
448 84.19685448 123.1969
449 538.5827449 538.5827
450 96.19685 ]450 135.1969 ]
451 /Subtype /Link451 /Subtype /Link
452 /Type /Annot >>452 /Type /Annot >>
453endobj453endobj
@@ -460,12 +460,12 @@
460 29 0 R460 29 0 R
461 30 0 R461 30 0 R
462 31 0 R ]462 31 0 R ]
463 /Contents 1012 0 R463 /Contents 1253 0 R
464 /MediaBox [ 0464 /MediaBox [ 0
465 0465 0
466 595.2756466 595.2756
467 841.8898 ]467 841.8898 ]
468 /Parent 1006 0 R468 /Parent 1247 0 R
469 /Resources << /Font 1 0 R469 /Resources << /Font 1 0 R
470 /ProcSet [ /PDF470 /ProcSet [ /PDF
471 /Text471 /Text
@@ -485,9 +485,9 @@
485 0485 0
486 0 ]486 0 ]
487 /Rect [ 150.2861487 /Rect [ 150.2861
488 470.9469488 518.9469
489 227.5161489 227.5161
490 482.9469 ]490 530.9469 ]
491 /Subtype /Link491 /Subtype /Link
492 /Type /Annot >>492 /Type /Annot >>
493endobj493endobj
@@ -500,9 +500,9 @@
500 0500 0
501 0 ]501 0 ]
502 /Rect [ 297.6378502 /Rect [ 297.6378
503 470.9469503 518.9469
504 297.6378504 297.6378
505 482.9469 ]505 530.9469 ]
506 /Subtype /Link506 /Subtype /Link
507 /Type /Annot >>507 /Type /Annot >>
508endobj508endobj
@@ -515,9 +515,9 @@
515 0515 0
516 0 ]516 0 ]
517 /Rect [ 297.6378517 /Rect [ 297.6378
518 470.9469518 518.9469
519 322.6378519 323.1978
520 482.9469 ]520 530.9469 ]
521 /Subtype /Link521 /Subtype /Link
522 /Type /Annot >>522 /Type /Annot >>
523endobj523endobj
@@ -529,10 +529,10 @@
529 /Border [ 0529 /Border [ 0
530 0530 0
531 0 ]531 0 ]
532 /Rect [ 322.6378532 /Rect [ 323.1978
533 470.9469533 518.9469
534 322.6378534 323.1978
535 482.9469 ]535 530.9469 ]
536 /Subtype /Link536 /Subtype /Link
537 /Type /Annot >>537 /Type /Annot >>
538endobj538endobj
@@ -543,12 +543,12 @@
543 34 0 R543 34 0 R
544 35 0 R544 35 0 R
545 36 0 R ]545 36 0 R ]
546 /Contents 1013 0 R546 /Contents 1254 0 R
547 /MediaBox [ 0547 /MediaBox [ 0
548 0548 0
549 595.2756549 595.2756
550 841.8898 ]550 841.8898 ]
551 /Parent 1006 0 R551 /Parent 1247 0 R
552 /Resources << /Font 1 0 R552 /Resources << /Font 1 0 R
553 /ProcSet [ /PDF553 /ProcSet [ /PDF
554 /Text554 /Text
@@ -565,12 +565,12 @@
565 0565 0
566 0 ]566 0 ]
567 /Contents ()567 /Contents ()
568 /Dest [ 230 0 R568 /Dest [ 229 0 R
569 /Fit ]569 /Fit ]
570 /Rect [ 56.69291570 /Rect [ 56.69291
571 432.1969571 473.1969
572 538.5827572 538.5827
573 444.1969 ]573 485.1969 ]
574 /Subtype /Link574 /Subtype /Link
575 /Type /Annot >>575 /Type /Annot >>
576endobj576endobj
@@ -580,12 +580,12 @@
580 0580 0
581 0 ]581 0 ]
582 /Contents ()582 /Contents ()
583 /Dest [ 75 0 R583 /Dest [ 69 0 R
584 /Fit ]584 /Fit ]
585 /Rect [ 56.69291585 /Rect [ 56.69291
586 420.1969586 461.1969
587 538.5827587 538.5827
588 432.1969 ]588 473.1969 ]
589 /Subtype /Link589 /Subtype /Link
590 /Type /Annot >>590 /Type /Annot >>
591endobj591endobj
@@ -598,9 +598,9 @@
598 /Dest [ 166 0 R598 /Dest [ 166 0 R
599 /Fit ]599 /Fit ]
600 /Rect [ 56.69291600 /Rect [ 56.69291
601 408.1969601 449.1969
602 538.5827602 538.5827
603 420.1969 ]603 461.1969 ]
604 /Subtype /Link604 /Subtype /Link
605 /Type /Annot >>605 /Type /Annot >>
606endobj606endobj
@@ -610,12 +610,12 @@
610 0610 0
611 0 ]611 0 ]
612 /Contents ()612 /Contents ()
613 /Dest [ 815 0 R613 /Dest [ 1015 0 R
614 /Fit ]614 /Fit ]
615 /Rect [ 56.69291615 /Rect [ 56.69291
616 396.1969616 437.1969
617 538.5827617 538.5827
618 408.1969 ]618 449.1969 ]
619 /Subtype /Link619 /Subtype /Link
620 /Type /Annot >>620 /Type /Annot >>
621endobj621endobj
@@ -625,12 +625,12 @@
625 0625 0
626 0 ]626 0 ]
627 /Contents ()627 /Contents ()
628 /Dest [ 68 0 R628 /Dest [ 67 0 R
629 /Fit ]629 /Fit ]
630 /Rect [ 56.69291630 /Rect [ 56.69291
631 384.1969631 425.1969
632 538.5827632 538.5827
633 396.1969 ]633 437.1969 ]
634 /Subtype /Link634 /Subtype /Link
635 /Type /Annot >>635 /Type /Annot >>
636endobj636endobj
@@ -640,12 +640,12 @@
640 0640 0
641 0 ]641 0 ]
642 /Contents ()642 /Contents ()
643 /Dest [ 796 0 R643 /Dest [ 981 0 R
644 /Fit ]644 /Fit ]
645 /Rect [ 56.69291645 /Rect [ 56.69291
646 372.1969646 413.1969
647 538.5827647 538.5827
648 384.1969 ]648 425.1969 ]
649 /Subtype /Link649 /Subtype /Link
650 /Type /Annot >>650 /Type /Annot >>
651endobj651endobj
@@ -658,9 +658,9 @@
658 0658 0
659 0 ]659 0 ]
660 /Rect [ 150.2861660 /Rect [ 150.2861
661 66.94685661 119.9469
662 237.5161662 237.5161
663 78.94685 ]663 131.9469 ]
664 /Subtype /Link664 /Subtype /Link
665 /Type /Annot >>665 /Type /Annot >>
666endobj666endobj
@@ -673,9 +673,9 @@
673 0673 0
674 0 ]674 0 ]
675 /Rect [ 297.6378675 /Rect [ 297.6378
676 66.94685676 119.9469
677 297.6378677 297.6378
678 78.94685 ]678 131.9469 ]
679 /Subtype /Link679 /Subtype /Link
680 /Type /Annot >>680 /Type /Annot >>
681endobj681endobj
@@ -688,9 +688,9 @@
688 0688 0
689 0 ]689 0 ]
690 /Rect [ 297.6378690 /Rect [ 297.6378
691 66.94685691 119.9469
692 322.6378692 323.1978
693 78.94685 ]693 131.9469 ]
694 /Subtype /Link694 /Subtype /Link
695 /Type /Annot >>695 /Type /Annot >>
696endobj696endobj
@@ -702,10 +702,10 @@
702 /Border [ 0702 /Border [ 0
703 0703 0
704 0 ]704 0 ]
705 /Rect [ 322.6378705 /Rect [ 323.1978
706 66.94685706 119.9469
707 322.6378707 323.1978
708 78.94685 ]708 131.9469 ]
709 /Subtype /Link709 /Subtype /Link
710 /Type /Annot >>710 /Type /Annot >>
711endobj711endobj
@@ -722,12 +722,12 @@
722 45 0 R722 45 0 R
723 46 0 R723 46 0 R
724 47 0 R ]724 47 0 R ]
725 /Contents 1014 0 R725 /Contents 1255 0 R
726 /MediaBox [ 0726 /MediaBox [ 0
727 0727 0
728 595.2756728 595.2756
729 841.8898 ]729 841.8898 ]
730 /Parent 1006 0 R730 /Parent 1247 0 R
731 /Resources << /Font 1 0 R731 /Resources << /Font 1 0 R
732 /ProcSet [ /PDF732 /ProcSet [ /PDF
733 /Text733 /Text
@@ -741,12 +741,12 @@
741% 'Page9': class PDFPage 741% 'Page9': class PDFPage
74249 0 obj74249 0 obj
743% Page dictionary743% Page dictionary
744<< /Contents 1015 0 R744<< /Contents 1256 0 R
745 /MediaBox [ 0745 /MediaBox [ 0
746 0746 0
747 595.2756747 595.2756
748 841.8898 ]748 841.8898 ]
749 /Parent 1006 0 R749 /Parent 1247 0 R
750 /Resources << /Font 1 0 R750 /Resources << /Font 1 0 R
751 /ProcSet [ /PDF751 /ProcSet [ /PDF
752 /Text752 /Text
@@ -766,9 +766,9 @@
766 0766 0
767 0 ]767 0 ]
768 /Rect [ 150.2861768 /Rect [ 150.2861
769 458.9469769 545.9469
770 223.0561770 223.0561
771 470.9469 ]771 557.9469 ]
772 /Subtype /Link772 /Subtype /Link
773 /Type /Annot >>773 /Type /Annot >>
774endobj774endobj
@@ -781,9 +781,9 @@
781 0781 0
782 0 ]782 0 ]
783 /Rect [ 297.6378783 /Rect [ 297.6378
784 458.9469784 545.9469
785 297.6378785 297.6378
786 470.9469 ]786 557.9469 ]
787 /Subtype /Link787 /Subtype /Link
788 /Type /Annot >>788 /Type /Annot >>
789endobj789endobj
@@ -796,9 +796,9 @@
796 0796 0
797 0 ]797 0 ]
798 /Rect [ 297.6378798 /Rect [ 297.6378
799 458.9469799 545.9469
800 322.6378800 323.1978
801 470.9469 ]801 557.9469 ]
802 /Subtype /Link802 /Subtype /Link
803 /Type /Annot >>803 /Type /Annot >>
804endobj804endobj
@@ -810,10 +810,10 @@
810 /Border [ 0810 /Border [ 0
811 0811 0
812 0 ]812 0 ]
813 /Rect [ 322.6378813 /Rect [ 323.1978
814 458.9469814 545.9469
815 322.6378815 323.1978
816 470.9469 ]816 557.9469 ]
817 /Subtype /Link817 /Subtype /Link
818 /Type /Annot >>818 /Type /Annot >>
819endobj819endobj
@@ -826,9 +826,9 @@
826 0826 0
827 0 ]827 0 ]
828 /Rect [ 150.2861828 /Rect [ 150.2861
829 356.9469829 455.9469
830 223.0561830 223.0561
831 368.9469 ]831 467.9469 ]
832 /Subtype /Link832 /Subtype /Link
833 /Type /Annot >>833 /Type /Annot >>
834endobj834endobj
@@ -841,9 +841,9 @@
841 0841 0
842 0 ]842 0 ]
843 /Rect [ 297.6378843 /Rect [ 297.6378
844 356.9469844 455.9469
845 297.6378845 297.6378
846 368.9469 ]846 467.9469 ]
847 /Subtype /Link847 /Subtype /Link
848 /Type /Annot >>848 /Type /Annot >>
849endobj849endobj
@@ -856,9 +856,9 @@
856 0856 0
857 0 ]857 0 ]
858 /Rect [ 297.6378858 /Rect [ 297.6378
859 356.9469859 455.9469
860 322.6378860 323.1978
861 368.9469 ]861 467.9469 ]
862 /Subtype /Link862 /Subtype /Link
863 /Type /Annot >>863 /Type /Annot >>
864endobj864endobj
@@ -870,10 +870,10 @@
870 /Border [ 0870 /Border [ 0
871 0871 0
872 0 ]872 0 ]
873 /Rect [ 322.6378873 /Rect [ 323.1978
874 356.9469874 455.9469
875 322.6378875 323.1978
876 368.9469 ]876 467.9469 ]
877 /Subtype /Link877 /Subtype /Link
878 /Type /Annot >>878 /Type /Annot >>
879endobj879endobj
@@ -888,12 +888,12 @@
888 55 0 R888 55 0 R
889 56 0 R889 56 0 R
890 57 0 R ]890 57 0 R ]
891 /Contents 1016 0 R891 /Contents 1257 0 R
892 /MediaBox [ 0892 /MediaBox [ 0
893 0893 0
894 595.2756894 595.2756
895 841.8898 ]895 841.8898 ]
896 /Parent 1006 0 R896 /Parent 1247 0 R
897 /Resources << /Font 1 0 R897 /Resources << /Font 1 0 R
898 /ProcSet [ /PDF898 /ProcSet [ /PDF
899 /Text899 /Text
@@ -913,9 +913,9 @@
913 0913 0
914 0 ]914 0 ]
915 /Rect [ 150.2861915 /Rect [ 150.2861
916 125.9469916 294.9469
917 263.0661917 263.0661
918 137.9469 ]918 306.9469 ]
919 /Subtype /Link919 /Subtype /Link
920 /Type /Annot >>920 /Type /Annot >>
921endobj921endobj
@@ -928,9 +928,9 @@
928 0928 0
929 0 ]929 0 ]
930 /Rect [ 297.6378930 /Rect [ 297.6378
931 113.9469931 282.9469
932 297.6378932 297.6378
933 125.9469 ]933 294.9469 ]
934 /Subtype /Link934 /Subtype /Link
935 /Type /Annot >>935 /Type /Annot >>
936endobj936endobj
@@ -943,9 +943,9 @@
943 0943 0
944 0 ]944 0 ]
945 /Rect [ 297.6378945 /Rect [ 297.6378
946 113.9469946 282.9469
947 322.6378947 323.1978
948 125.9469 ]948 294.9469 ]
949 /Subtype /Link949 /Subtype /Link
950 /Type /Annot >>950 /Type /Annot >>
951endobj951endobj
@@ -957,52 +957,44 @@
957 /Border [ 0957 /Border [ 0
958 0958 0
959 0 ]959 0 ]
960 /Rect [ 322.6378960 /Rect [ 323.1978
961 113.9469961 282.9469
962 322.6378962 323.1978
963 125.9469 ]963 294.9469 ]
964 /Subtype /Link964 /Subtype /Link
965 /Type /Annot >>965 /Type /Annot >>
966endobj966endobj
967% 'Page11': class PDFPage 967% 'Annot.NUMBER45': class PDFDictionary
96863 0 obj96863 0 obj
969% Page dictionary969<< /A << /S /URI
970<< /Annots [ 59 0 R970 /Type /Action
971 60 0 R971 /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-barCodeFlowable.rml) >>
972 61 0 R972 /Border [ 0
973 62 0 R ]
974 /Contents 1017 0 R
975 /MediaBox [ 0
976 0973 0
977 595.2756974 0 ]
978 841.8898 ]975 /Rect [ 150.2861
979 /Parent 1006 0 R976 216.9469
980 /Resources << /Font 1 0 R977 263.0661
981 /ProcSet [ /PDF978 228.9469 ]
982 /Text979 /Subtype /Link
983 /ImageB980 /Type /Annot >>
984 /ImageC
985 /ImageI ] >>
986 /Rotate 0
987 /Trans << >>
988 /Type /Page >>
989endobj981endobj
990% 'Annot.NUMBER45': class PDFDictionary 982% 'Annot.NUMBER46': class PDFDictionary
99164 0 obj98364 0 obj
992<< /A << /S /URI984<< /A << /S /URI
993 /Type /Action985 /Type /Action
994 /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-barCodeFlowable.rml) >>986 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-barCodeFlowable.pdf?view=auto) >>
995 /Border [ 0987 /Border [ 0
996 0988 0
997 0 ]989 0 ]
998 /Rect [ 150.2861990 /Rect [ 297.6378
999 770.9469991 204.9469
1000 263.0661992 297.6378
1001 782.9469 ]993 216.9469 ]
1002 /Subtype /Link994 /Subtype /Link
1003 /Type /Annot >>995 /Type /Annot >>
1004endobj996endobj
1005% 'Annot.NUMBER46': class PDFDictionary 997% 'Annot.NUMBER47': class PDFDictionary
100665 0 obj99865 0 obj
1007<< /A << /S /URI999<< /A << /S /URI
1008 /Type /Action1000 /Type /Action
@@ -1011,13 +1003,13 @@
1011 01003 0
1012 0 ]1004 0 ]
1013 /Rect [ 297.63781005 /Rect [ 297.6378
1014 758.94691006 204.9469
1015 297.63781007 323.1978
1016 770.9469 ]1008 216.9469 ]
1017 /Subtype /Link1009 /Subtype /Link
1018 /Type /Annot >>1010 /Type /Annot >>
1019endobj1011endobj
1020% 'Annot.NUMBER47': class PDFDictionary 1012% 'Annot.NUMBER48': class PDFDictionary
102166 0 obj101366 0 obj
1022<< /A << /S /URI1014<< /A << /S /URI
1023 /Type /Action1015 /Type /Action
@@ -1025,41 +1017,30 @@
1025 /Border [ 01017 /Border [ 0
1026 01018 0
1027 0 ]1019 0 ]
1028 /Rect [ 297.63781020 /Rect [ 323.1978
1029 758.94691021 204.9469
1030 322.63781022 323.1978
1031 770.9469 ]1023 216.9469 ]
1032 /Subtype /Link1024 /Subtype /Link
1033 /Type /Annot >>1025 /Type /Annot >>
1034endobj1026endobj
1035% 'Annot.NUMBER48': class PDFDictionary 1027% 'Page11': class PDFPage
103667 0 obj102867 0 obj
1037<< /A << /S /URI
1038 /Type /Action
1039 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-barCodeFlowable.pdf?view=auto) >>
1040 /Border [ 0
1041 0
1042 0 ]
1043 /Rect [ 322.6378
1044 758.9469
1045 322.6378
1046 770.9469 ]
1047 /Subtype /Link
1048 /Type /Annot >>
1049endobj
1050% 'Page12': class PDFPage
105168 0 obj
1052% Page dictionary1029% Page dictionary
1053<< /Annots [ 64 0 R1030<< /Annots [ 59 0 R
1031 60 0 R
1032 61 0 R
1033 62 0 R
1034 63 0 R
1035 64 0 R
1054 65 0 R1036 65 0 R
1055 66 0 R1037 66 0 R ]
1056 67 0 R ]1038 /Contents 1258 0 R
1057 /Contents 1018 0 R
1058 /MediaBox [ 01039 /MediaBox [ 0
1059 01040 0
1060 595.27561041 595.2756
1061 841.8898 ]1042 841.8898 ]
1062 /Parent 1006 0 R1043 /Parent 1247 0 R
1063 /Resources << /Font 1 0 R1044 /Resources << /Font 1 0 R
1064 /ProcSet [ /PDF1045 /ProcSet [ /PDF
1065 /Text1046 /Text
@@ -1071,19 +1052,39 @@
1071 /Type /Page >>1052 /Type /Page >>
1072endobj1053endobj
1073% 'Annot.NUMBER49': class LinkAnnotation 1054% 'Annot.NUMBER49': class LinkAnnotation
105568 0 obj
1056<< /Border [ 0
1057 0
1058 0 ]
1059 /Contents ()
1060 /Dest [ 449 0 R
1061 /Fit ]
1062 /Rect [ 56.69291
1063 154.1969
1064 538.5827
1065 166.1969 ]
1066 /Subtype /Link
1067 /Type /Annot >>
1068endobj
1069% 'Page12': class PDFPage
107469 0 obj107069 0 obj
1075<< /Border [ 01071% Page dictionary
1072<< /Annots [ 68 0 R ]
1073 /Contents 1259 0 R
1074 /MediaBox [ 0
1076 01075 0
1077 0 ]1076 595.2756
1078 /Contents ()1077 841.8898 ]
1079 /Dest [ 338 0 R1078 /Parent 1247 0 R
1080 /Fit ]1079 /Resources << /Font 1 0 R
1081 /Rect [ 56.692911080 /ProcSet [ /PDF
1082 705.19691081 /Text
1083 538.58271082 /ImageB
1084 717.1969 ]1083 /ImageC
1085 /Subtype /Link1084 /ImageI ] >>
1086 /Type /Annot >>1085 /Rotate 0
1086 /Trans << >>
1087 /Type /Page >>
1087endobj1088endobj
1088% 'Annot.NUMBER50': class LinkAnnotation 1089% 'Annot.NUMBER50': class LinkAnnotation
108970 0 obj109070 0 obj
@@ -1094,9 +1095,9 @@
1094 /Dest [ 25 0 R1095 /Dest [ 25 0 R
1095 /Fit ]1096 /Fit ]
1096 /Rect [ 56.692911097 /Rect [ 56.69291
1097 518.19691098 693.1969
1098 538.58271099 538.5827
1099 530.1969 ]1100 705.1969 ]
1100 /Subtype /Link1101 /Subtype /Link
1101 /Type /Annot >>1102 /Type /Annot >>
1102endobj1103endobj
@@ -1109,9 +1110,9 @@
1109 01110 0
1110 0 ]1111 0 ]
1111 /Rect [ 150.28611112 /Rect [ 150.2861
1112 304.94691113 491.9469
1113 254.16611114 254.1661
1114 316.9469 ]1115 503.9469 ]
1115 /Subtype /Link1116 /Subtype /Link
1116 /Type /Annot >>1117 /Type /Annot >>
1117endobj1118endobj
@@ -1124,9 +1125,9 @@
1124 01125 0
1125 0 ]1126 0 ]
1126 /Rect [ 297.63781127 /Rect [ 297.6378
1127 304.94691128 491.9469
1128 297.63781129 297.6378
1129 316.9469 ]1130 503.9469 ]
1130 /Subtype /Link1131 /Subtype /Link
1131 /Type /Annot >>1132 /Type /Annot >>
1132endobj1133endobj
@@ -1139,9 +1140,9 @@
1139 01140 0
1140 0 ]1141 0 ]
1141 /Rect [ 297.63781142 /Rect [ 297.6378
1142 304.94691143 491.9469
1143 322.63781144 323.1978
1144 316.9469 ]1145 503.9469 ]
1145 /Subtype /Link1146 /Subtype /Link
1146 /Type /Annot >>1147 /Type /Annot >>
1147endobj1148endobj
@@ -1153,54 +1154,44 @@
1153 /Border [ 01154 /Border [ 0
1154 01155 0
1155 0 ]1156 0 ]
1156 /Rect [ 322.63781157 /Rect [ 323.1978
1157 304.94691158 491.9469
1158 322.63781159 323.1978
1159 316.9469 ]1160 503.9469 ]
1160 /Subtype /Link1161 /Subtype /Link
1161 /Type /Annot >>1162 /Type /Annot >>
1162endobj1163endobj
1163% 'Page13': class PDFPage 1164% 'Annot.NUMBER55': class PDFDictionary
116475 0 obj116575 0 obj
1165% Page dictionary1166<< /A << /S /URI
1166<< /Annots [ 69 0 R1167 /Type /Action
1167 70 0 R1168 /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
1168 71 0 R1169 /Border [ 0
1169 72 0 R
1170 73 0 R
1171 74 0 R ]
1172 /Contents 1019 0 R
1173 /MediaBox [ 0
1174 01170 0
1175 595.27561171 0 ]
1176 841.8898 ]1172 /Rect [ 150.2861
1177 /Parent 1006 0 R1173 228.9469
1178 /Resources << /Font 1 0 R1174 254.1661
1179 /ProcSet [ /PDF1175 240.9469 ]
1180 /Text1176 /Subtype /Link
1181 /ImageB1177 /Type /Annot >>
1182 /ImageC
1183 /ImageI ] >>
1184 /Rotate 0
1185 /Trans << >>
1186 /Type /Page >>
1187endobj1178endobj
1188% 'Annot.NUMBER55': class PDFDictionary 1179% 'Annot.NUMBER56': class PDFDictionary
118976 0 obj118076 0 obj
1190<< /A << /S /URI1181<< /A << /S /URI
1191 /Type /Action1182 /Type /Action
1192 /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>1183 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
1193 /Border [ 01184 /Border [ 0
1194 01185 0
1195 0 ]1186 0 ]
1196 /Rect [ 150.28611187 /Rect [ 297.6378
1197 746.94691188 228.9469
1198 254.16611189 297.6378
1199 758.9469 ]1190 240.9469 ]
1200 /Subtype /Link1191 /Subtype /Link
1201 /Type /Annot >>1192 /Type /Annot >>
1202endobj1193endobj
1203% 'Annot.NUMBER56': class PDFDictionary 1194% 'Annot.NUMBER57': class PDFDictionary
120477 0 obj119577 0 obj
1205<< /A << /S /URI1196<< /A << /S /URI
1206 /Type /Action1197 /Type /Action
@@ -1209,13 +1200,13 @@
1209 01200 0
1210 0 ]1201 0 ]
1211 /Rect [ 297.63781202 /Rect [ 297.6378
1212 746.94691203 228.9469
1213 297.63781204 323.1978
1214 758.9469 ]1205 240.9469 ]
1215 /Subtype /Link1206 /Subtype /Link
1216 /Type /Annot >>1207 /Type /Annot >>
1217endobj1208endobj
1218% 'Annot.NUMBER57': class PDFDictionary 1209% 'Annot.NUMBER58': class PDFDictionary
121978 0 obj121078 0 obj
1220<< /A << /S /URI1211<< /A << /S /URI
1221 /Type /Action1212 /Type /Action
@@ -1223,27 +1214,40 @@
1223 /Border [ 01214 /Border [ 0
1224 01215 0
1225 0 ]1216 0 ]
1226 /Rect [ 297.63781217 /Rect [ 323.1978
1227 746.94691218 228.9469
1228 322.63781219 323.1978
1229 758.9469 ]1220 240.9469 ]
1230 /Subtype /Link1221 /Subtype /Link
1231 /Type /Annot >>1222 /Type /Annot >>
1232endobj1223endobj
1233% 'Annot.NUMBER58': class PDFDictionary 1224% 'Page13': class PDFPage
123479 0 obj122579 0 obj
1235<< /A << /S /URI1226% Page dictionary
1236 /Type /Action1227<< /Annots [ 70 0 R
1237 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>1228 71 0 R
1238 /Border [ 01229 72 0 R
1230 73 0 R
1231 74 0 R
1232 75 0 R
1233 76 0 R
1234 77 0 R
1235 78 0 R ]
1236 /Contents 1260 0 R
1237 /MediaBox [ 0
1239 01238 0
1240 0 ]1239 595.2756
1241 /Rect [ 322.63781240 841.8898 ]
1242 746.94691241 /Parent 1247 0 R
1243 322.63781242 /Resources << /Font 1 0 R
1244 758.9469 ]1243 /ProcSet [ /PDF
1245 /Subtype /Link1244 /Text
1246 /Type /Annot >>1245 /ImageB
1246 /ImageC
1247 /ImageI ] >>
1248 /Rotate 0
1249 /Trans << >>
1250 /Type /Page >>
1247endobj1251endobj
1248% 'Annot.NUMBER59': class PDFDictionary 1252% 'Annot.NUMBER59': class PDFDictionary
124980 0 obj125380 0 obj
@@ -1254,9 +1258,9 @@
1254 01258 0
1255 0 ]1259 0 ]
1256 /Rect [ 150.28611260 /Rect [ 150.2861
1257 529.94691261 741.9469
1258 254.16611262 254.1661
1259 541.9469 ]1263 753.9469 ]
1260 /Subtype /Link1264 /Subtype /Link
1261 /Type /Annot >>1265 /Type /Annot >>
1262endobj1266endobj
@@ -1269,9 +1273,9 @@
1269 01273 0
1270 0 ]1274 0 ]
1271 /Rect [ 297.63781275 /Rect [ 297.6378
1272 529.94691276 741.9469
1273 297.63781277 297.6378
1274 541.9469 ]1278 753.9469 ]
1275 /Subtype /Link1279 /Subtype /Link
1276 /Type /Annot >>1280 /Type /Annot >>
1277endobj1281endobj
@@ -1284,9 +1288,9 @@
1284 01288 0
1285 0 ]1289 0 ]
1286 /Rect [ 297.63781290 /Rect [ 297.6378
1287 529.94691291 741.9469
1288 322.63781292 323.1978
1289 541.9469 ]1293 753.9469 ]
1290 /Subtype /Link1294 /Subtype /Link
1291 /Type /Annot >>1295 /Type /Annot >>
1292endobj1296endobj
@@ -1298,10 +1302,10 @@
1298 /Border [ 01302 /Border [ 0
1299 01303 0
1300 0 ]1304 0 ]
1301 /Rect [ 322.63781305 /Rect [ 323.1978
1302 529.94691306 741.9469
1303 322.63781307 323.1978
1304 541.9469 ]1308 753.9469 ]
1305 /Subtype /Link1309 /Subtype /Link
1306 /Type /Annot >>1310 /Type /Annot >>
1307endobj1311endobj
@@ -1314,9 +1318,9 @@
1314 01318 0
1315 0 ]1319 0 ]
1316 /Rect [ 150.28611320 /Rect [ 150.2861
1317 312.94691321 536.9469
1318 254.16611322 254.1661
1319 324.9469 ]1323 548.9469 ]
1320 /Subtype /Link1324 /Subtype /Link
1321 /Type /Annot >>1325 /Type /Annot >>
1322endobj1326endobj
@@ -1329,9 +1333,9 @@
1329 01333 0
1330 0 ]1334 0 ]
1331 /Rect [ 297.63781335 /Rect [ 297.6378
1332 312.94691336 536.9469
1333 297.63781337 297.6378
1334 324.9469 ]1338 548.9469 ]
1335 /Subtype /Link1339 /Subtype /Link
1336 /Type /Annot >>1340 /Type /Annot >>
1337endobj1341endobj
@@ -1344,9 +1348,9 @@
1344 01348 0
1345 0 ]1349 0 ]
1346 /Rect [ 297.63781350 /Rect [ 297.6378
1347 312.94691351 536.9469
1348 322.63781352 323.1978
1349 324.9469 ]1353 548.9469 ]
1350 /Subtype /Link1354 /Subtype /Link
1351 /Type /Annot >>1355 /Type /Annot >>
1352endobj1356endobj
@@ -1358,60 +1362,44 @@
1358 /Border [ 01362 /Border [ 0
1359 01363 0
1360 0 ]1364 0 ]
1361 /Rect [ 322.63781365 /Rect [ 323.1978
1362 312.94691366 536.9469
1363 322.63781367 323.1978
1364 324.9469 ]1368 548.9469 ]
1365 /Subtype /Link1369 /Subtype /Link
1366 /Type /Annot >>1370 /Type /Annot >>
1367endobj1371endobj
1368% 'Page14': class PDFPage 1372% 'Annot.NUMBER67': class PDFDictionary
136988 0 obj137388 0 obj
1370% Page dictionary1374<< /A << /S /URI
1371<< /Annots [ 76 0 R1375 /Type /Action
1372 77 0 R1376 /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
1373 78 0 R1377 /Border [ 0
1374 79 0 R
1375 80 0 R
1376 81 0 R
1377 82 0 R
1378 83 0 R
1379 84 0 R
1380 85 0 R
1381 86 0 R
1382 87 0 R ]
1383 /Contents 1020 0 R
1384 /MediaBox [ 0
1385 01378 0
1386 595.27561379 0 ]
1387 841.8898 ]1380 /Rect [ 150.2861
1388 /Parent 1006 0 R1381 273.9469
1389 /Resources << /Font 1 0 R1382 254.1661
1390 /ProcSet [ /PDF1383 285.9469 ]
1391 /Text1384 /Subtype /Link
1392 /ImageB1385 /Type /Annot >>
1393 /ImageC
1394 /ImageI ] >>
1395 /Rotate 0
1396 /Trans << >>
1397 /Type /Page >>
1398endobj1386endobj
1399% 'Annot.NUMBER67': class PDFDictionary 1387% 'Annot.NUMBER68': class PDFDictionary
140089 0 obj138889 0 obj
1401<< /A << /S /URI1389<< /A << /S /URI
1402 /Type /Action1390 /Type /Action
1403 /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>1391 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
1404 /Border [ 01392 /Border [ 0
1405 01393 0
1406 0 ]1394 0 ]
1407 /Rect [ 150.28611395 /Rect [ 297.6378
1408 746.94691396 273.9469
1409 254.16611397 297.6378
1410 758.9469 ]1398 285.9469 ]
1411 /Subtype /Link1399 /Subtype /Link
1412 /Type /Annot >>1400 /Type /Annot >>
1413endobj1401endobj
1414% 'Annot.NUMBER68': class PDFDictionary 1402% 'Annot.NUMBER69': class PDFDictionary
141590 0 obj140390 0 obj
1416<< /A << /S /URI1404<< /A << /S /URI
1417 /Type /Action1405 /Type /Action
@@ -1420,13 +1408,13 @@
1420 01408 0
1421 0 ]1409 0 ]
1422 /Rect [ 297.63781410 /Rect [ 297.6378
1423 746.94691411 273.9469
1424 297.63781412 323.1978
1425 758.9469 ]1413 285.9469 ]
1426 /Subtype /Link1414 /Subtype /Link
1427 /Type /Annot >>1415 /Type /Annot >>
1428endobj1416endobj
1429% 'Annot.NUMBER69': class PDFDictionary 1417% 'Annot.NUMBER70': class PDFDictionary
143091 0 obj141891 0 obj
1431<< /A << /S /URI1419<< /A << /S /URI
1432 /Type /Action1420 /Type /Action
@@ -1434,44 +1422,44 @@
1434 /Border [ 01422 /Border [ 0
1435 01423 0
1436 0 ]1424 0 ]
1437 /Rect [ 297.63781425 /Rect [ 323.1978
1438 746.94691426 273.9469
1439 322.63781427 323.1978
1440 758.9469 ]1428 285.9469 ]
1441 /Subtype /Link1429 /Subtype /Link
1442 /Type /Annot >>1430 /Type /Annot >>
1443endobj1431endobj
1444% 'Annot.NUMBER70': class PDFDictionary 1432% 'Annot.NUMBER71': class PDFDictionary
144592 0 obj143392 0 obj
1446<< /A << /S /URI1434<< /A << /S /URI
1447 /Type /Action1435 /Type /Action
1448 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>1436 /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
1449 /Border [ 01437 /Border [ 0
1450 01438 0
1451 0 ]1439 0 ]
1452 /Rect [ 322.63781440 /Rect [ 150.2861
1453 746.94691441 68.94685
1454 322.63781442 254.1661
1455 758.9469 ]1443 80.94685 ]
1456 /Subtype /Link1444 /Subtype /Link
1457 /Type /Annot >>1445 /Type /Annot >>
1458endobj1446endobj
1459% 'Annot.NUMBER71': class PDFDictionary 1447% 'Annot.NUMBER72': class PDFDictionary
146093 0 obj144893 0 obj
1461<< /A << /S /URI1449<< /A << /S /URI
1462 /Type /Action1450 /Type /Action
1463 /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>1451 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
1464 /Border [ 01452 /Border [ 0
1465 01453 0
1466 0 ]1454 0 ]
1467 /Rect [ 150.28611455 /Rect [ 297.6378
1468 529.94691456 68.94685
1469 254.16611457 297.6378
1470 541.9469 ]1458 80.94685 ]
1471 /Subtype /Link1459 /Subtype /Link
1472 /Type /Annot >>1460 /Type /Annot >>
1473endobj1461endobj
1474% 'Annot.NUMBER72': class PDFDictionary 1462% 'Annot.NUMBER73': class PDFDictionary
147594 0 obj146394 0 obj
1476<< /A << /S /URI1464<< /A << /S /URI
1477 /Type /Action1465 /Type /Action
@@ -1480,13 +1468,13 @@
1480 01468 0
1481 0 ]1469 0 ]
1482 /Rect [ 297.63781470 /Rect [ 297.6378
1483 529.94691471 68.94685
1484 297.63781472 323.1978
1485 541.9469 ]1473 80.94685 ]
1486 /Subtype /Link1474 /Subtype /Link
1487 /Type /Annot >>1475 /Type /Annot >>
1488endobj1476endobj
1489% 'Annot.NUMBER73': class PDFDictionary 1477% 'Annot.NUMBER74': class PDFDictionary
149095 0 obj147895 0 obj
1491<< /A << /S /URI1479<< /A << /S /URI
1492 /Type /Action1480 /Type /Action
@@ -1494,27 +1482,47 @@
1494 /Border [ 01482 /Border [ 0
1495 01483 0
1496 0 ]1484 0 ]
1497 /Rect [ 297.63781485 /Rect [ 323.1978
1498 529.94691486 68.94685
1499 322.63781487 323.1978
1500 541.9469 ]1488 80.94685 ]
1501 /Subtype /Link1489 /Subtype /Link
1502 /Type /Annot >>1490 /Type /Annot >>
1503endobj1491endobj
1504% 'Annot.NUMBER74': class PDFDictionary 1492% 'Page14': class PDFPage
150596 0 obj149396 0 obj
1506<< /A << /S /URI1494% Page dictionary
1507 /Type /Action1495<< /Annots [ 80 0 R
1508 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>1496 81 0 R
1509 /Border [ 01497 82 0 R
1498 83 0 R
1499 84 0 R
1500 85 0 R
1501 86 0 R
1502 87 0 R
1503 88 0 R
1504 89 0 R
1505 90 0 R
1506 91 0 R
1507 92 0 R
1508 93 0 R
1509 94 0 R
1510 95 0 R ]
1511 /Contents 1261 0 R
1512 /MediaBox [ 0
1510 01513 0
1511 0 ]1514 595.2756
1512 /Rect [ 322.63781515 841.8898 ]
1513 529.94691516 /Parent 1247 0 R
1514 322.63781517 /Resources << /Font 1 0 R
1515 541.9469 ]1518 /ProcSet [ /PDF
1516 /Subtype /Link1519 /Text
1517 /Type /Annot >>1520 /ImageB
1521 /ImageC
1522 /ImageI ] >>
1523 /Rotate 0
1524 /Trans << >>
1525 /Type /Page >>
1518endobj1526endobj
1519% 'Annot.NUMBER75': class PDFDictionary 1527% 'Annot.NUMBER75': class PDFDictionary
152097 0 obj152897 0 obj
@@ -1525,9 +1533,9 @@
1525 01533 0
1526 0 ]1534 0 ]
1527 /Rect [ 150.28611535 /Rect [ 150.2861
1528 312.94691536 593.9469
1529 254.16611537 254.1661
1530 324.9469 ]1538 605.9469 ]
1531 /Subtype /Link1539 /Subtype /Link
1532 /Type /Annot >>1540 /Type /Annot >>
1533endobj1541endobj
@@ -1540,9 +1548,9 @@
1540 01548 0
1541 0 ]1549 0 ]
1542 /Rect [ 297.63781550 /Rect [ 297.6378
1543 312.94691551 593.9469
1544 297.63781552 297.6378
1545 324.9469 ]1553 605.9469 ]
1546 /Subtype /Link1554 /Subtype /Link
1547 /Type /Annot >>1555 /Type /Annot >>
1548endobj1556endobj
@@ -1555,9 +1563,9 @@
1555 01563 0
1556 0 ]1564 0 ]
1557 /Rect [ 297.63781565 /Rect [ 297.6378
1558 312.94691566 593.9469
1559 322.63781567 323.1978
1560 324.9469 ]1568 605.9469 ]
1561 /Subtype /Link1569 /Subtype /Link
1562 /Type /Annot >>1570 /Type /Annot >>
1563endobj1571endobj
@@ -1569,10 +1577,10 @@
1569 /Border [ 01577 /Border [ 0
1570 01578 0
1571 0 ]1579 0 ]
1572 /Rect [ 322.63781580 /Rect [ 323.1978
1573 312.94691581 593.9469
1574 322.63781582 323.1978
1575 324.9469 ]1583 605.9469 ]
1576 /Subtype /Link1584 /Subtype /Link
1577 /Type /Annot >>1585 /Type /Annot >>
1578endobj1586endobj
@@ -1585,9 +1593,9 @@
1585 01593 0
1586 0 ]1594 0 ]
1587 /Rect [ 150.28611595 /Rect [ 150.2861
1588 95.946851596 388.9469
1589 254.16611597 254.1661
1590 107.9469 ]1598 400.9469 ]
1591 /Subtype /Link1599 /Subtype /Link
1592 /Type /Annot >>1600 /Type /Annot >>
1593endobj1601endobj
@@ -1600,9 +1608,9 @@
1600 01608 0
1601 0 ]1609 0 ]
1602 /Rect [ 297.63781610 /Rect [ 297.6378
1603 95.946851611 388.9469
1604 297.63781612 297.6378
1605 107.9469 ]1613 400.9469 ]
1606 /Subtype /Link1614 /Subtype /Link
1607 /Type /Annot >>1615 /Type /Annot >>
1608endobj1616endobj
@@ -1615,9 +1623,9 @@
1615 01623 0
1616 0 ]1624 0 ]
1617 /Rect [ 297.63781625 /Rect [ 297.6378
1618 95.946851626 388.9469
1619 322.63781627 323.1978
1620 107.9469 ]1628 400.9469 ]
1621 /Subtype /Link1629 /Subtype /Link
1622 /Type /Annot >>1630 /Type /Annot >>
1623endobj1631endobj
@@ -1629,38 +1637,94 @@
1629 /Border [ 01637 /Border [ 0
1630 01638 0
1631 0 ]1639 0 ]
1632 /Rect [ 322.63781640 /Rect [ 323.1978
1633 95.946851641 388.9469
1634 322.63781642 323.1978
1635 107.9469 ]1643 400.9469 ]
1644 /Subtype /Link
1645 /Type /Annot >>
1646endobj
1647% 'Annot.NUMBER83': class PDFDictionary
1648105 0 obj
1649<< /A << /S /URI
1650 /Type /Action
1651 /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
1652 /Border [ 0
1653 0
1654 0 ]
1655 /Rect [ 150.2861
1656 183.9469
1657 254.1661
1658 195.9469 ]
1659 /Subtype /Link
1660 /Type /Annot >>
1661endobj
1662% 'Annot.NUMBER84': class PDFDictionary
1663106 0 obj
1664<< /A << /S /URI
1665 /Type /Action
1666 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
1667 /Border [ 0
1668 0
1669 0 ]
1670 /Rect [ 297.6378
1671 183.9469
1672 297.6378
1673 195.9469 ]
1674 /Subtype /Link
1675 /Type /Annot >>
1676endobj
1677% 'Annot.NUMBER85': class PDFDictionary
1678107 0 obj
1679<< /A << /S /URI
1680 /Type /Action
1681 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
1682 /Border [ 0
1683 0
1684 0 ]
1685 /Rect [ 297.6378
1686 183.9469
1687 323.1978
1688 195.9469 ]
1689 /Subtype /Link
1690 /Type /Annot >>
1691endobj
1692% 'Annot.NUMBER86': class PDFDictionary
1693108 0 obj
1694<< /A << /S /URI
1695 /Type /Action
1696 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
1697 /Border [ 0
1698 0
1699 0 ]
1700 /Rect [ 323.1978
1701 183.9469
1702 323.1978
1703 195.9469 ]
1636 /Subtype /Link1704 /Subtype /Link
1637 /Type /Annot >>1705 /Type /Annot >>
1638endobj1706endobj
1639% 'Page15': class PDFPage 1707% 'Page15': class PDFPage
1640105 0 obj1708109 0 obj
1641% Page dictionary1709% Page dictionary
1642<< /Annots [ 89 0 R1710<< /Annots [ 97 0 R
1643 90 0 R
1644 91 0 R
1645 92 0 R
1646 93 0 R
1647 94 0 R
1648 95 0 R
1649 96 0 R
1650 97 0 R
1651 98 0 R1711 98 0 R
1652 99 0 R1712 99 0 R
1653 100 0 R1713 100 0 R
1654 101 0 R1714 101 0 R
1655 102 0 R1715 102 0 R
1656 103 0 R1716 103 0 R
1657 104 0 R ]1717 104 0 R
1658 /Contents 1021 0 R1718 105 0 R
1719 106 0 R
1720 107 0 R
1721 108 0 R ]
1722 /Contents 1262 0 R
1659 /MediaBox [ 01723 /MediaBox [ 0
1660 01724 0
1661 595.27561725 595.2756
1662 841.8898 ]1726 841.8898 ]
1663 /Parent 1006 0 R1727 /Parent 1247 0 R
1664 /Resources << /Font 1 0 R1728 /Resources << /Font 1 0 R
1665 /ProcSet [ /PDF1729 /ProcSet [ /PDF
1666 /Text1730 /Text
@@ -1671,66 +1735,6 @@
1671 /Trans << >>1735 /Trans << >>
1672 /Type /Page >>1736 /Type /Page >>
1673endobj1737endobj
1674% 'Annot.NUMBER83': class PDFDictionary
1675106 0 obj
1676<< /A << /S /URI
1677 /Type /Action
1678 /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
1679 /Border [ 0
1680 0
1681 0 ]
1682 /Rect [ 150.2861
1683 598.9469
1684 254.1661
1685 610.9469 ]
1686 /Subtype /Link
1687 /Type /Annot >>
1688endobj
1689% 'Annot.NUMBER84': class PDFDictionary
1690107 0 obj
1691<< /A << /S /URI
1692 /Type /Action
1693 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
1694 /Border [ 0
1695 0
1696 0 ]
1697 /Rect [ 297.6378
1698 598.9469
1699 297.6378
1700 610.9469 ]
1701 /Subtype /Link
1702 /Type /Annot >>
1703endobj
1704% 'Annot.NUMBER85': class PDFDictionary
1705108 0 obj
1706<< /A << /S /URI
1707 /Type /Action
1708 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
1709 /Border [ 0
1710 0
1711 0 ]
1712 /Rect [ 297.6378
1713 598.9469
1714 322.6378
1715 610.9469 ]
1716 /Subtype /Link
1717 /Type /Annot >>
1718endobj
1719% 'Annot.NUMBER86': class PDFDictionary
1720109 0 obj
1721<< /A << /S /URI
1722 /Type /Action
1723 /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
1724 /Border [ 0
1725 0
1726 0 ]
1727 /Rect [ 322.6378
1728 598.9469
1729 322.6378
1730 610.9469 ]
1731 /Subtype /Link
1732 /Type /Annot >>
1733endobj
1734% 'Annot.NUMBER87': class PDFDictionary 1738% 'Annot.NUMBER87': class PDFDictionary
1735110 0 obj1739110 0 obj
1736<< /A << /S /URI1740<< /A << /S /URI
@@ -1740,9 +1744,9 @@
1740 01744 0
1741 0 ]1745 0 ]
1742 /Rect [ 150.28611746 /Rect [ 150.2861
1743 410.94691747 741.9469
1744 254.16611748 254.1661
1745 422.9469 ]1749 753.9469 ]
1746 /Subtype /Link1750 /Subtype /Link
1747 /Type /Annot >>1751 /Type /Annot >>
1748endobj1752endobj
@@ -1755,9 +1759,9 @@
1755 01759 0
1756 0 ]1760 0 ]
1757 /Rect [ 297.63781761 /Rect [ 297.6378
1758 410.94691762 741.9469
1759 297.63781763 297.6378
1760 422.9469 ]1764 753.9469 ]
1761 /Subtype /Link1765 /Subtype /Link
1762 /Type /Annot >>1766 /Type /Annot >>
1763endobj1767endobj
@@ -1770,9 +1774,9 @@
1770 01774 0
1771 0 ]1775 0 ]
1772 /Rect [ 297.63781776 /Rect [ 297.6378
1773 410.9469
1774 322.6378
1775 422.9469 ]
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: