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
1=== modified file '.pc/no-scripts.patch/setup.py'
2--- .pc/no-scripts.patch/setup.py 2012-04-02 19:19:22 +0000
3+++ .pc/no-scripts.patch/setup.py 2013-01-09 02:49:23 +0000
4@@ -21,7 +21,7 @@
5
6 setup (
7 name='z3c.rml',
8- version='1.0.0',
9+ version='2.0.0',
10 author = "Stephan Richter and the Zope Community",
11 author_email = "zope-dev@zope.org",
12 description = "An alternative implementation of RML",
13@@ -46,12 +46,12 @@
14 extras_require = dict(
15 test = [
16 'zope.pagetemplate',
17- 'zope.testing',
18- 'PIL'],
19+ 'Pillow'],
20 pagetemplate = [
21 'zope.pagetemplate']
22 ),
23 install_requires = [
24+ 'Pygments',
25 'lxml',
26 'pyPdf',
27 'reportlab',
28
29=== modified file 'CHANGES.txt'
30--- CHANGES.txt 2012-04-02 15:47:51 +0000
31+++ CHANGES.txt 2013-01-09 02:49:23 +0000
32@@ -2,6 +2,115 @@
33 CHANGES
34 =======
35
36+2.0.0 (2012-12-21)
37+------------------
38+
39+- Implemented ``saveState`` and ``restoreState`` directives. (LP #666194)
40+
41+- Implemented ``storyPlace`` directive. (LP #665941)
42+
43+- Implemented ``clip`` attribute of ``path`` directive. See RML example 041.
44+
45+- Added ``h4``, ``h5``, and ``h6`` directives.
46+
47+- Implemented ``codesnippet`` directive.
48+
49+- Implemented ``pageBreakBefore``, ``frameBreakBefore``, ``textTransform``,
50+ and ``endDots`` attributes for paragraph styles.
51+
52+- Added ``maxLineLength`` and ``newLineChars`` attributes to the ``pre``
53+ directive.
54+
55+- Implemented ``pageNumber`` element for all ``draw*String`` elements.
56+
57+- Implemented ``NamedString`` directive.
58+
59+- Implemented ``startIndex`` and ``showIndex`` directive. Also hooked up
60+ ``index`` in paragraphs properly. You can now create real book indexes.
61+
62+- Implemented ``ol``, ``ul``, and ``li`` directives, which allow highly
63+ flexible lists to be created. Also implemented a complimentary ``listStyle``
64+ directive.
65+
66+- Implemented the following doc-programming directives:
67+
68+ * docAssert
69+ * docAssign
70+ * docElse
71+ * docIf
72+ * docExec
73+ * docPara
74+ * docWhile
75+
76+- Added ``encName`` attribute to ``registerCidFont`` directive.
77+
78+- Renamed ``bookmark`` to ``bookmarkPage``.
79+
80+- Created a new canvas directive called ``bookmark``.
81+
82+- Added ``img`` directive, which is a simple image flowable.
83+
84+- Implemented crop marks support fully.
85+
86+- Added ``pageLayout`` and ``pageMode`` to ``docInit`` directive.
87+
88+- Implemented all logging related directives.
89+
90+- Implemented ``color`` directive inside the ``initialize`` directive.
91+
92+- Renamed ``pdfInclude`` to documented ``includePdfPages`` and added `pages`
93+ attribute, so that you can only include specific pages.
94+
95+- Don't show "doc" namespace in reference snippets.
96+
97+- Create a list of RML2PDF and z3c.rml differences.
98+
99+- Implemented the ``ABORT_ON_INVALID_DIRECTIVE`` flag, that when set ``True``
100+ will raise a ``ValueError`` error on the first occurence of a bad tag.
101+
102+- Implemented ``setFontSize`` directive for page drawings.
103+
104+- Implemented ``plugInGraphic`` which allows inserting graphics rendered in
105+ Python.
106+
107+- Added `href` and `destination` to table cells and rectangles.
108+
109+- Bug: Due to a logic error, bad directives were never properly detected and
110+ logged about.
111+
112+- Bug: Overwriting the default paragraph styles did not work properly.
113+
114+- Bug: Specifying a color in any tag inside the paragraph would fail, if the
115+ color was a referenced name.
116+
117+- Bug: Moved premature ``getName`` evaluation into runtime to properly handle
118+ synamic content now. This is now properly done for any paragraph and
119+ draw string variant.
120+
121+- Bug: Fixed DTD generator to properly ignore Text Nodes as attributes. Also
122+ text nodes were not properly documented as element PCDATA.
123+
124+
125+1.1.0 (2012-12-18)
126+------------------
127+
128+- Upgrade to ReportLab 2.6. This required some font changes and several
129+ generated PDFs did not match, since some default fonts changed to sans-serif.
130+
131+- Added ``pdfInclude`` directive from Alex Garel. (LP #969399).
132+
133+- Switched to Pillow (from PIL).
134+
135+- Switched RML highlighting in RML Reference from SilverCity to Pygments.
136+
137+- Bug: Addressed a bug in ReportLab 2.6 that disallowed 3-D pie charts from
138+ rendering.
139+
140+- Bug: Properly reset pdfform before rendering a document.
141+
142+- Bug: Reset fonts properly before a rendering.
143+
144+
145 1.0.0 (2012-04-02)
146 ------------------
147
148@@ -16,6 +125,7 @@
149 is updated, the border supports a border radius and the tag-para.rml sample
150 has been updated.
151
152+
153 0.9.0 (2010-07-22)
154 ------------------
155
156
157=== modified file 'PKG-INFO'
158--- PKG-INFO 2012-04-02 15:47:51 +0000
159+++ PKG-INFO 2013-01-09 02:49:23 +0000
160@@ -1,6 +1,6 @@
161 Metadata-Version: 1.1
162 Name: z3c.rml
163-Version: 1.0.0
164+Version: 2.0.0
165 Summary: An alternative implementation of RML
166 Home-page: http://pypi.python.org/pypi/z3c.rml
167 Author: Stephan Richter and the Zope Community
168@@ -22,6 +22,115 @@
169 CHANGES
170 =======
171
172+ 2.0.0 (2012-12-21)
173+ ------------------
174+
175+ - Implemented ``saveState`` and ``restoreState`` directives. (LP #666194)
176+
177+ - Implemented ``storyPlace`` directive. (LP #665941)
178+
179+ - Implemented ``clip`` attribute of ``path`` directive. See RML example 041.
180+
181+ - Added ``h4``, ``h5``, and ``h6`` directives.
182+
183+ - Implemented ``codesnippet`` directive.
184+
185+ - Implemented ``pageBreakBefore``, ``frameBreakBefore``, ``textTransform``,
186+ and ``endDots`` attributes for paragraph styles.
187+
188+ - Added ``maxLineLength`` and ``newLineChars`` attributes to the ``pre``
189+ directive.
190+
191+ - Implemented ``pageNumber`` element for all ``draw*String`` elements.
192+
193+ - Implemented ``NamedString`` directive.
194+
195+ - Implemented ``startIndex`` and ``showIndex`` directive. Also hooked up
196+ ``index`` in paragraphs properly. You can now create real book indexes.
197+
198+ - Implemented ``ol``, ``ul``, and ``li`` directives, which allow highly
199+ flexible lists to be created. Also implemented a complimentary ``listStyle``
200+ directive.
201+
202+ - Implemented the following doc-programming directives:
203+
204+ * docAssert
205+ * docAssign
206+ * docElse
207+ * docIf
208+ * docExec
209+ * docPara
210+ * docWhile
211+
212+ - Added ``encName`` attribute to ``registerCidFont`` directive.
213+
214+ - Renamed ``bookmark`` to ``bookmarkPage``.
215+
216+ - Created a new canvas directive called ``bookmark``.
217+
218+ - Added ``img`` directive, which is a simple image flowable.
219+
220+ - Implemented crop marks support fully.
221+
222+ - Added ``pageLayout`` and ``pageMode`` to ``docInit`` directive.
223+
224+ - Implemented all logging related directives.
225+
226+ - Implemented ``color`` directive inside the ``initialize`` directive.
227+
228+ - Renamed ``pdfInclude`` to documented ``includePdfPages`` and added `pages`
229+ attribute, so that you can only include specific pages.
230+
231+ - Don't show "doc" namespace in reference snippets.
232+
233+ - Create a list of RML2PDF and z3c.rml differences.
234+
235+ - Implemented the ``ABORT_ON_INVALID_DIRECTIVE`` flag, that when set ``True``
236+ will raise a ``ValueError`` error on the first occurence of a bad tag.
237+
238+ - Implemented ``setFontSize`` directive for page drawings.
239+
240+ - Implemented ``plugInGraphic`` which allows inserting graphics rendered in
241+ Python.
242+
243+ - Added `href` and `destination` to table cells and rectangles.
244+
245+ - Bug: Due to a logic error, bad directives were never properly detected and
246+ logged about.
247+
248+ - Bug: Overwriting the default paragraph styles did not work properly.
249+
250+ - Bug: Specifying a color in any tag inside the paragraph would fail, if the
251+ color was a referenced name.
252+
253+ - Bug: Moved premature ``getName`` evaluation into runtime to properly handle
254+ synamic content now. This is now properly done for any paragraph and
255+ draw string variant.
256+
257+ - Bug: Fixed DTD generator to properly ignore Text Nodes as attributes. Also
258+ text nodes were not properly documented as element PCDATA.
259+
260+
261+ 1.1.0 (2012-12-18)
262+ ------------------
263+
264+ - Upgrade to ReportLab 2.6. This required some font changes and several
265+ generated PDFs did not match, since some default fonts changed to sans-serif.
266+
267+ - Added ``pdfInclude`` directive from Alex Garel. (LP #969399).
268+
269+ - Switched to Pillow (from PIL).
270+
271+ - Switched RML highlighting in RML Reference from SilverCity to Pygments.
272+
273+ - Bug: Addressed a bug in ReportLab 2.6 that disallowed 3-D pie charts from
274+ rendering.
275+
276+ - Bug: Properly reset pdfform before rendering a document.
277+
278+ - Bug: Reset fonts properly before a rendering.
279+
280+
281 1.0.0 (2012-04-02)
282 ------------------
283
284@@ -36,6 +145,7 @@
285 is updated, the border supports a border radius and the tag-para.rml sample
286 has been updated.
287
288+
289 0.9.0 (2010-07-22)
290 ------------------
291
292
293=== modified file 'buildout.cfg'
294--- buildout.cfg 2012-04-02 15:47:51 +0000
295+++ buildout.cfg 2013-01-09 02:49:23 +0000
296@@ -21,7 +21,6 @@
297 eggs = ${test:eggs}
298
299 [versions]
300-# tag-textField test fails with reportlab 2.5, because of this change to PDFPattern:
301-# http://two.pairlist.net/pipermail/reportlab-users/2010-January/009216.html
302-reportlab = 2.4
303-PIL = 1.1.7
304+reportlab = 2.6
305+Pillow = 1.7.8
306+lxml = 3.0.2
307
308=== modified file 'debian/changelog'
309--- debian/changelog 2012-09-27 17:31:39 +0000
310+++ debian/changelog 2013-01-09 02:49:23 +0000
311@@ -1,3 +1,10 @@
312+z3c.rml (2.0.0-0ubuntu1) raring; urgency=low
313+
314+ * New upstream release.
315+ * debian/control: Bump Standards-Version to 3.9.4.
316+
317+ -- Logan Rosen <logatronico@gmail.com> Tue, 08 Jan 2013 21:40:32 -0500
318+
319 z3c.rml (1.0.0-0ubuntu2) quantal; urgency=low
320
321 * debian/control: added the Homepage field.
322
323=== modified file 'debian/control'
324--- debian/control 2012-09-27 17:31:39 +0000
325+++ debian/control 2013-01-09 02:49:23 +0000
326@@ -7,7 +7,7 @@
327 python-all (>= 2.6.6-3~),
328 python-setuptools,
329 python-van.pydeb (>= 1.3.0-4)
330-Standards-Version: 3.9.3
331+Standards-Version: 3.9.4
332 X-Python-Version: >= 2.5
333 Homepage: http://pypi.python.org/pypi/z3c.rml/
334
335
336=== modified file 'setup.py'
337--- setup.py 2012-04-02 19:19:22 +0000
338+++ setup.py 2013-01-09 02:49:23 +0000
339@@ -21,7 +21,7 @@
340
341 setup (
342 name='z3c.rml',
343- version='1.0.0',
344+ version='2.0.0',
345 author = "Stephan Richter and the Zope Community",
346 author_email = "zope-dev@zope.org",
347 description = "An alternative implementation of RML",
348@@ -46,12 +46,12 @@
349 extras_require = dict(
350 test = [
351 'zope.pagetemplate',
352- 'zope.testing',
353- 'PIL'],
354+ 'Pillow'],
355 pagetemplate = [
356 'zope.pagetemplate']
357 ),
358 install_requires = [
359+ 'Pygments',
360 'lxml',
361 'pyPdf',
362 'reportlab',
363
364=== modified file 'src/z3c.rml.egg-info/PKG-INFO'
365--- src/z3c.rml.egg-info/PKG-INFO 2012-04-02 15:47:51 +0000
366+++ src/z3c.rml.egg-info/PKG-INFO 2013-01-09 02:49:23 +0000
367@@ -1,6 +1,6 @@
368 Metadata-Version: 1.1
369 Name: z3c.rml
370-Version: 1.0.0
371+Version: 2.0.0
372 Summary: An alternative implementation of RML
373 Home-page: http://pypi.python.org/pypi/z3c.rml
374 Author: Stephan Richter and the Zope Community
375@@ -22,6 +22,115 @@
376 CHANGES
377 =======
378
379+ 2.0.0 (2012-12-21)
380+ ------------------
381+
382+ - Implemented ``saveState`` and ``restoreState`` directives. (LP #666194)
383+
384+ - Implemented ``storyPlace`` directive. (LP #665941)
385+
386+ - Implemented ``clip`` attribute of ``path`` directive. See RML example 041.
387+
388+ - Added ``h4``, ``h5``, and ``h6`` directives.
389+
390+ - Implemented ``codesnippet`` directive.
391+
392+ - Implemented ``pageBreakBefore``, ``frameBreakBefore``, ``textTransform``,
393+ and ``endDots`` attributes for paragraph styles.
394+
395+ - Added ``maxLineLength`` and ``newLineChars`` attributes to the ``pre``
396+ directive.
397+
398+ - Implemented ``pageNumber`` element for all ``draw*String`` elements.
399+
400+ - Implemented ``NamedString`` directive.
401+
402+ - Implemented ``startIndex`` and ``showIndex`` directive. Also hooked up
403+ ``index`` in paragraphs properly. You can now create real book indexes.
404+
405+ - Implemented ``ol``, ``ul``, and ``li`` directives, which allow highly
406+ flexible lists to be created. Also implemented a complimentary ``listStyle``
407+ directive.
408+
409+ - Implemented the following doc-programming directives:
410+
411+ * docAssert
412+ * docAssign
413+ * docElse
414+ * docIf
415+ * docExec
416+ * docPara
417+ * docWhile
418+
419+ - Added ``encName`` attribute to ``registerCidFont`` directive.
420+
421+ - Renamed ``bookmark`` to ``bookmarkPage``.
422+
423+ - Created a new canvas directive called ``bookmark``.
424+
425+ - Added ``img`` directive, which is a simple image flowable.
426+
427+ - Implemented crop marks support fully.
428+
429+ - Added ``pageLayout`` and ``pageMode`` to ``docInit`` directive.
430+
431+ - Implemented all logging related directives.
432+
433+ - Implemented ``color`` directive inside the ``initialize`` directive.
434+
435+ - Renamed ``pdfInclude`` to documented ``includePdfPages`` and added `pages`
436+ attribute, so that you can only include specific pages.
437+
438+ - Don't show "doc" namespace in reference snippets.
439+
440+ - Create a list of RML2PDF and z3c.rml differences.
441+
442+ - Implemented the ``ABORT_ON_INVALID_DIRECTIVE`` flag, that when set ``True``
443+ will raise a ``ValueError`` error on the first occurence of a bad tag.
444+
445+ - Implemented ``setFontSize`` directive for page drawings.
446+
447+ - Implemented ``plugInGraphic`` which allows inserting graphics rendered in
448+ Python.
449+
450+ - Added `href` and `destination` to table cells and rectangles.
451+
452+ - Bug: Due to a logic error, bad directives were never properly detected and
453+ logged about.
454+
455+ - Bug: Overwriting the default paragraph styles did not work properly.
456+
457+ - Bug: Specifying a color in any tag inside the paragraph would fail, if the
458+ color was a referenced name.
459+
460+ - Bug: Moved premature ``getName`` evaluation into runtime to properly handle
461+ synamic content now. This is now properly done for any paragraph and
462+ draw string variant.
463+
464+ - Bug: Fixed DTD generator to properly ignore Text Nodes as attributes. Also
465+ text nodes were not properly documented as element PCDATA.
466+
467+
468+ 1.1.0 (2012-12-18)
469+ ------------------
470+
471+ - Upgrade to ReportLab 2.6. This required some font changes and several
472+ generated PDFs did not match, since some default fonts changed to sans-serif.
473+
474+ - Added ``pdfInclude`` directive from Alex Garel. (LP #969399).
475+
476+ - Switched to Pillow (from PIL).
477+
478+ - Switched RML highlighting in RML Reference from SilverCity to Pygments.
479+
480+ - Bug: Addressed a bug in ReportLab 2.6 that disallowed 3-D pie charts from
481+ rendering.
482+
483+ - Bug: Properly reset pdfform before rendering a document.
484+
485+ - Bug: Reset fonts properly before a rendering.
486+
487+
488 1.0.0 (2012-04-02)
489 ------------------
490
491@@ -36,6 +145,7 @@
492 is updated, the border supports a border radius and the tag-para.rml sample
493 has been updated.
494
495+
496 0.9.0 (2010-07-22)
497 ------------------
498
499
500=== modified file 'src/z3c.rml.egg-info/SOURCES.txt'
501--- src/z3c.rml.egg-info/SOURCES.txt 2012-04-02 15:47:51 +0000
502+++ src/z3c.rml.egg-info/SOURCES.txt 2013-01-09 02:49:23 +0000
503@@ -16,37 +16,42 @@
504 src/z3c.rml.egg-info/not-zip-safe
505 src/z3c.rml.egg-info/requires.txt
506 src/z3c.rml.egg-info/top_level.txt
507-src/z3c/rml/DEPENDENCIES.cfg
508 src/z3c/rml/README.txt
509 src/z3c/rml/__init__.py
510 src/z3c/rml/attr.py
511 src/z3c/rml/canvas.py
512 src/z3c/rml/chart.py
513 src/z3c/rml/directive.py
514+src/z3c/rml/doclogic.py
515 src/z3c/rml/document.py
516 src/z3c/rml/dtd.py
517 src/z3c/rml/error.py
518 src/z3c/rml/flowable.py
519 src/z3c/rml/form.py
520 src/z3c/rml/interfaces.py
521+src/z3c/rml/list.py
522 src/z3c/rml/occurence.py
523 src/z3c/rml/page.py
524 src/z3c/rml/pagetemplate.py
525 src/z3c/rml/pagetemplate.txt
526 src/z3c/rml/paraparser.py
527+src/z3c/rml/pdfinclude.py
528 src/z3c/rml/platypus.py
529 src/z3c/rml/reference.pt
530 src/z3c/rml/reference.py
531+src/z3c/rml/rlfix.py
532 src/z3c/rml/rml-reference.pdf
533 src/z3c/rml/rml.dtd
534 src/z3c/rml/rml2pdf.py
535 src/z3c/rml/rml2pdfscript.py
536 src/z3c/rml/special.py
537+src/z3c/rml/storyplace.py
538 src/z3c/rml/stylesheet.py
539 src/z3c/rml/template.py
540 src/z3c/rml/tests/__init__.py
541 src/z3c/rml/tests/flowable.py
542 src/z3c/rml/tests/module.py
543+src/z3c/rml/tests/test_directive.py
544 src/z3c/rml/tests/test_pagetemplate.py
545 src/z3c/rml/tests/test_rml.py
546 src/z3c/rml/tests/test_subprocess.py
547
548=== modified file 'src/z3c.rml.egg-info/requires.txt'
549--- src/z3c.rml.egg-info/requires.txt 2012-04-02 19:19:22 +0000
550+++ src/z3c.rml.egg-info/requires.txt 2013-01-09 02:49:23 +0000
551@@ -1,3 +1,4 @@
552+Pygments
553 lxml
554 pyPdf
555 reportlab
556@@ -7,8 +8,7 @@
557
558 [test]
559 zope.pagetemplate
560-zope.testing
561-PIL
562+Pillow
563
564 [pagetemplate]
565 zope.pagetemplate
566\ No newline at end of file
567
568=== removed file 'src/z3c/rml/DEPENDENCIES.cfg'
569--- src/z3c/rml/DEPENDENCIES.cfg 2011-01-05 22:34:45 +0000
570+++ src/z3c/rml/DEPENDENCIES.cfg 1970-01-01 00:00:00 +0000
571@@ -1,5 +0,0 @@
572-zope.interface
573-zope.pagetemplate
574-zope.testing
575-reportlab
576-reportlab.graphics.barcode
577
578=== modified file 'src/z3c/rml/README.txt'
579--- src/z3c/rml/README.txt 2011-01-05 22:34:45 +0000
580+++ src/z3c/rml/README.txt 2013-01-09 02:49:23 +0000
581@@ -2,10 +2,10 @@
582 Reportlab Markup Language
583 =========================
584
585-This pacakge is a free implementation of the RML markup language developed by
586+This package is a free implementation of the RML markup language developed by
587 Reportlab. Unfortunately, full compliance cannot be immediately verified,
588 since the RML User Guide is ambiguous, incomplete and even incorrect. This
589-pacakge can also not support the commercial extensions to Reportlab.
590+package can also not support the commercial extensions to Reportlab.
591
592 In the course of implementing the specification, I made already some
593 improvements for various tags and added others fully. I also tried hard to
594
595=== modified file 'src/z3c/rml/__init__.py'
596--- src/z3c/rml/__init__.py 2011-01-05 22:34:45 +0000
597+++ src/z3c/rml/__init__.py 2013-01-09 02:49:23 +0000
598@@ -1,3 +1,4 @@
599
600 # Hook up our custom paragraph parser.
601 import z3c.rml.paraparser
602+import z3c.rml.rlfix
603
604=== modified file 'src/z3c/rml/attr.py'
605--- src/z3c/rml/attr.py 2012-04-02 15:47:51 +0000
606+++ src/z3c/rml/attr.py 2013-01-09 02:49:23 +0000
607@@ -13,7 +13,7 @@
608 ##############################################################################
609 """RML Attribute Implementation
610
611-$Id: attr.py 121449 2011-04-19 16:00:38Z menesis $
612+$Id: attr.py 128842 2012-12-21 05:38:51Z srichter $
613 """
614 __docformat__ = "reStructuredText"
615 import cStringIO
616@@ -37,12 +37,12 @@
617 logger = logging.getLogger("z3c.rml")
618
619
620-def getFileInfo(attr):
621- root = attr.context
622+def getFileInfo(directive):
623+ root = directive
624 while root.parent:
625 root = root.parent
626 return '(file %s, line %i)' % (
627- root.filename, attr.context.element.sourceline)
628+ root.filename, directive.element.sourceline)
629
630
631 def getManager(context, interface=None):
632@@ -87,7 +87,7 @@
633 name = self.deprecatedName
634 logger.warn(
635 u'Deprecated attribute "%s": %s %s' % (
636- name, self.deprecatedReason, getFileInfo(self)))
637+ name, self.deprecatedReason, getFileInfo(self.context)))
638 else:
639 name = self.__name__
640 # Extract the value.
641@@ -102,14 +102,16 @@
642
643 class BaseChoice(RMLAttribute):
644 choices = {}
645+ doLower = True
646
647 def fromUnicode(self, value):
648- value = value.lower()
649+ if self.doLower:
650+ value = value.lower()
651 if value in self.choices:
652 return self.choices[value]
653 raise ValueError(
654 '%r not a valid value for attribute "%s". %s' % (
655- value, self.__name__, getFileInfo(self)))
656+ value, self.__name__, getFileInfo(self.context)))
657
658
659 class Combination(RMLAttribute):
660@@ -127,7 +129,8 @@
661 except ValueError:
662 pass
663 raise ValueError(
664- '"%s" is not a valid value. %s' %(value, getFileInfo(self)))
665+ '"%s" is not a valid value. %s' %(
666+ value, getFileInfo(self.context)))
667
668
669 class String(RMLAttribute, zope.schema.Bytes):
670@@ -185,18 +188,46 @@
671 (self.max_length is not None and len(result) > self.max_length)):
672 raise ValueError(
673 'Length of sequence must be at least %s and at most %i. %s' % (
674- self.min_length, self.max_length, getFileInfo(self)))
675+ self.min_length, self.max_length,
676+ getFileInfo(self.context)))
677 return result
678
679
680+class IntegerSequence(Sequence):
681+ """A sequence of integers."""
682+
683+ def fromUnicode(self, ustr):
684+ ustr = ustr.strip()
685+ pieces = self.splitre.split(ustr)
686+ numbers = set([])
687+ for piece in pieces:
688+ # Ignore empty pieces.
689+ if not piece:
690+ continue
691+ # The piece is a range.
692+ if '-' in piece:
693+ start, end = piece.split('-')
694+ # Make range lower and upper bound inclusive.
695+ numbers.update(range(int(start), int(end)+1))
696+ continue
697+ # The piece is just a number
698+ numbers.add(int(piece))
699+ return list(numbers)
700+
701 class Choice(BaseChoice):
702 """A choice of several values. The values are always case-insensitive."""
703
704- def __init__(self, choices=None, *args, **kw):
705+ def __init__(self, choices=None, doLower=True, *args, **kw):
706 super(Choice, self).__init__(*args, **kw)
707 if isinstance(choices, (tuple, list)):
708- choices = dict([(val.lower(), val) for val in choices])
709+ choices = dict(
710+ [(val.lower() if doLower else val, val) for val in choices])
711+ else:
712+ choices = dict(
713+ [(key.lower() if doLower else key, val)
714+ for key, val in choices.items()])
715 self.choices = choices
716+ self.doLower = doLower
717
718
719 class Boolean(BaseChoice):
720@@ -220,7 +251,7 @@
721 class Measurement(RMLAttribute):
722 '''This field represents a length value.
723
724- The units "in" (inch), "cm", and "mm" are allowed. If no units are
725+ The units "in" (inch), "cm", "mm", and "pt" are allowed. If no units are
726 specified, the value is given in points/pixels.
727 '''
728 def __init__(self, allowPercentage=False, allowStar=False, *args, **kw):
729@@ -232,6 +263,7 @@
730 (re.compile('^(-?[0-9\.]+)\s*in$'), reportlab.lib.units.inch),
731 (re.compile('^(-?[0-9\.]+)\s*cm$'), reportlab.lib.units.cm),
732 (re.compile('^(-?[0-9\.]+)\s*mm$'), reportlab.lib.units.mm),
733+ (re.compile('^(-?[0-9\.]+)\s*pt$'), 1),
734 (re.compile('^(-?[0-9\.]+)\s*$'), 1)
735 ]
736
737@@ -251,7 +283,7 @@
738 return unit[1]*float(res.group(1))
739 raise ValueError(
740 'The value %r is not a valid measurement. %s' % (
741- value, getFileInfo(self)))
742+ value, getFileInfo(self.context)))
743
744
745 class File(Text):
746@@ -277,7 +309,7 @@
747 if result is None:
748 raise ValueError(
749 'The package-path-pair you specified was incorrect. %s' %(
750- getFileInfo(self)))
751+ getFileInfo(self.context)))
752 modulepath, path = result.groups()
753 module = __import__(modulepath, {}, {}, (modulepath))
754 value = os.path.join(os.path.dirname(module.__file__), path)
755@@ -325,9 +357,13 @@
756 self.acceptNone = acceptNone
757
758 def fromUnicode(self, value):
759- if self.acceptNone and value == 'None':
760+ if self.acceptNone and value.lower() == 'none':
761 return None
762 manager = getManager(self.context)
763+
764+ if value.startswith('rml:'):
765+ value = manager.names[value[4:]]
766+
767 if value in manager.colors:
768 return manager.colors[value]
769 try:
770@@ -336,7 +372,20 @@
771 except:
772 raise ValueError(
773 'The color specification "%s" is not valid. %s' % (
774- value, getFileInfo(self)))
775+ value, getFileInfo(self.context)))
776+
777+def _getStyle(context, value):
778+ manager = getManager(context)
779+ for styles in (manager.styles,
780+ reportlab.lib.styles.getSampleStyleSheet().byName):
781+ if value in styles:
782+ return styles[value]
783+ elif 'style.' + value in styles:
784+ return styles['style.' + value]
785+ elif value.startswith('style.') and value[6:] in styles:
786+ return styles[value[6:]]
787+ raise ValueError('Style %r could not be found. %s' % (
788+ value, getFileInfo(context)))
789
790 class Style(String):
791 """Requires a valid style to be entered.
792@@ -347,17 +396,23 @@
793 default = reportlab.lib.styles.getSampleStyleSheet().byName['Normal']
794
795 def fromUnicode(self, value):
796- manager = getManager(self.context)
797- for styles in (manager.styles,
798- reportlab.lib.styles.getSampleStyleSheet().byName):
799- if value in styles:
800- return styles[value]
801- elif 'style.' + value in styles:
802- return styles['style.' + value]
803- elif value.startswith('style.') and value[6:] in styles:
804- return styles[value[6:]]
805- raise ValueError('Style %r could not be found. %s' % (
806- value, getFileInfo(self)))
807+ return _getStyle(self.context, value)
808+
809+
810+class Padding(Sequence):
811+ """This attribute is specific for padding and will produce the proper
812+ length of the padding sequence."""
813+
814+ def __init__(self, *args, **kw):
815+ kw.update(dict(value_type=Integer(), min_length=1, max_length=4))
816+ super(Padding, self).__init__(*args, **kw)
817+
818+ def fromUnicode(self, value):
819+ seq = super(Padding, self).fromUnicode(value)
820+ # pdfgen does not like a single paddign value.
821+ if len(seq) == 1:
822+ seq.append(seq[0])
823+ return seq
824
825
826 class Symbol(Text):
827@@ -420,7 +475,7 @@
828 return text.strip()
829
830
831-class TextNodeSequence(Sequence):
832+class TextNodeSequence(Sequence, TextNode):
833 """A sequence of values retrieved from the element's content."""
834
835 def get(self):
836@@ -443,7 +498,7 @@
837 if len(result) % self.columns != 0:
838 raise ValueError(
839 'Number of elements must be divisible by %i. %s' %(
840- self.columns, getFileInfo(self)))
841+ self.columns, getFileInfo(self.context)))
842 return [result[i*self.columns:(i+1)*self.columns]
843 for i in range(len(result)/self.columns)]
844
845@@ -456,28 +511,17 @@
846
847 def __init__(self, *args, **kw):
848 super(RawXMLContent, self).__init__(*args, **kw)
849- # Do it in here, since we have a recursive problem otherwise
850- from z3c.rml import special
851- self.handleElements = {'getName': special.GetName}
852
853 def get(self):
854- # Replace what we can replace
855- for subElement in self.context.element.iterdescendants():
856- if subElement.tag in self.handleElements:
857- substitute = self.handleElements[subElement.tag](
858- subElement, self.context)
859- substitute.process()
860- # Now create the text
861 # ReportLab's paragraph parser does not like attributes from other
862 # namespaces; sigh. So we have to improvize.
863 text = etree.tounicode(self.context.element)
864 text = text[text.find('>')+1:text.rfind('<')]
865 return text
866
867-
868 class XMLContent(RawXMLContent):
869 """Same as 'RawXMLContent', except that the whitespace is normalized."""
870
871 def get(self):
872- result = super(XMLContent, self).get()
873- return result.strip().replace('\t', ' ')
874+ text = super(XMLContent, self).get()
875+ return text.strip().replace('\t', ' ')
876
877=== modified file 'src/z3c/rml/canvas.py'
878--- src/z3c/rml/canvas.py 2011-01-05 22:34:45 +0000
879+++ src/z3c/rml/canvas.py 2013-01-09 02:49:23 +0000
880@@ -13,7 +13,7 @@
881 ##############################################################################
882 """Page Drawing Related Element Processing
883
884-$Id: canvas.py 114908 2010-07-22 02:23:18Z srichter $
885+$Id: canvas.py 128843 2012-12-21 06:58:39Z srichter $
886 """
887 __docformat__ = "reStructuredText"
888 import zope.interface
889@@ -59,6 +59,22 @@
890 getattr(canvas, self.callable)(**kwargs)
891
892
893+class ISaveState(interfaces.IRMLDirectiveSignature):
894+ """Saves the current canvas state."""
895+
896+class SaveState(CanvasRMLDirective):
897+ signature = ISaveState
898+ callable = 'saveState'
899+
900+
901+class IRestoreState(interfaces.IRMLDirectiveSignature):
902+ """Saves the current canvas state."""
903+
904+class RestoreState(CanvasRMLDirective):
905+ signature = IRestoreState
906+ callable = 'restoreState'
907+
908+
909 class IDrawString(interfaces.IRMLDirectiveSignature):
910 """Draws a simple string (left aligned) onto the canvas at the specified
911 location."""
912@@ -75,7 +91,7 @@
913 u'string.'),
914 required=True)
915
916- text = attr.TextNode(
917+ text = attr.RawXMLContent(
918 title=u'Text',
919 description=(u'The string/text that is put onto the canvas.'),
920 required=True)
921@@ -84,6 +100,31 @@
922 signature = IDrawString
923 callable = 'drawString'
924
925+ def getPageNumber(self, elem, canvas):
926+ return str(canvas.getPageNumber() + int(elem.get('countingFrom', 1)) - 1)
927+
928+ def getName(self, elem, canvas):
929+ return attr.getManager(self).names[elem.get('id')]
930+
931+ handleElements = {'pageNumber': getPageNumber,
932+ 'getName': getName}
933+
934+ def _getText(self, node, canvas):
935+ text = node.text or u''
936+ for sub in node.iterdescendants():
937+ if sub.tag in self.handleElements:
938+ text += self.handleElements[sub.tag](self, sub, canvas)
939+ else:
940+ self._getText(sub, canvas)
941+ text += node.tail or u''
942+ return text
943+
944+ def process(self):
945+ canvas = attr.getManager(self, interfaces.ICanvasManager).canvas
946+ kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping))
947+ kwargs['text'] = self._getText(self.element, canvas).strip()
948+ getattr(canvas, self.callable)(**kwargs)
949+
950 class IDrawRightString(IDrawString):
951 """Draws a simple string (right aligned) onto the canvas at the specified
952 location."""
953@@ -180,6 +221,17 @@
954 description=u'The radius of the rounded corners.',
955 required=False)
956
957+ href = attr.Text(
958+ title=u'Link URL',
959+ description=u'When specified, the rectangle becomes a link to that URL.',
960+ required=False)
961+
962+ destination = attr.Text(
963+ title=u'Link Destination',
964+ description=(u'When specified, the rectangle becomes a link to that '
965+ u'destination.'),
966+ required=False)
967+
968 class Rectangle(CanvasRMLDirective):
969 signature = IRectangle
970 callable = 'rect'
971@@ -188,8 +240,24 @@
972 def process(self):
973 if 'round' in self.element.keys():
974 self.callable = 'roundRect'
975- super(Rectangle, self).process()
976+ kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping))
977+ canvas = attr.getManager(self, interfaces.ICanvasManager).canvas
978+ # Create a link
979+ url = kwargs.pop('href', None)
980+ if url:
981+ canvas.linkURL(
982+ url,
983+ (kwargs['x'], kwargs['y'],
984+ kwargs['x']+kwargs['width'], kwargs['y']+kwargs['height']))
985+ dest = kwargs.pop('destination', None)
986+ if dest:
987+ canvas.linkRect(
988+ '', dest,
989+ (kwargs['x'], kwargs['y'],
990+ kwargs['x']+kwargs['width'], kwargs['y']+kwargs['height']))
991
992+ # Render the rectangle
993+ getattr(canvas, self.callable)(**kwargs)
994
995 class IGrid(interfaces.IRMLDirectiveSignature):
996 """A shape to be drawn on the canvas."""
997@@ -490,6 +558,13 @@
998 default=False,
999 required=False)
1000
1001+ clip = attr.Boolean(
1002+ title=u'Clip Path',
1003+ description=(u"A flag specifying whether the path should clip "
1004+ u"overlapping elements."),
1005+ default=False,
1006+ required=False)
1007+
1008 class Path(CanvasRMLDirective):
1009 signature = IPath
1010 factories = {
1011@@ -527,7 +602,10 @@
1012 if kwargs.pop('close', False):
1013 self.path.close()
1014
1015- canvas.drawPath(self.path, **kwargs)
1016+ if kwargs.pop('clip', False):
1017+ canvas.clipPath(self.path, **kwargs)
1018+ else:
1019+ canvas.drawPath(self.path, **kwargs)
1020
1021
1022 class IFill(interfaces.IRMLDirectiveSignature):
1023@@ -582,18 +660,38 @@
1024 attrMapping = {'name': 'psfontname'}
1025
1026
1027+class ISetFontSize(interfaces.IRMLDirectiveSignature):
1028+ """Set the font size."""
1029+
1030+ size = attr.Measurement(
1031+ title=u'Size',
1032+ description=(u'The font size.'),
1033+ required=True)
1034+
1035+ leading = attr.Measurement(
1036+ title=u'Leading',
1037+ description=(u'The font leading.'),
1038+ required=False)
1039+
1040+class SetFontSize(CanvasRMLDirective):
1041+ signature = ISetFontSize
1042+ callable = 'setFontSize'
1043+
1044+
1045 class IScale(interfaces.IRMLDirectiveSignature):
1046 """Scale the drawing using x and y scaling factors."""
1047
1048 sx = attr.Float(
1049 title=u'X-Scaling-Factor',
1050 description=(u'The scaling factor applied on x-coordinates.'),
1051- required=True)
1052+ default=1,
1053+ required=False)
1054
1055 sy = attr.Float(
1056 title=u'Y-Scaling-Factor',
1057 description=(u'The scaling factor applied on y-coordinates.'),
1058- required=True)
1059+ default=1,
1060+ required=False)
1061
1062 class Scale(CanvasRMLDirective):
1063 signature = IScale
1064@@ -720,10 +818,87 @@
1065 canvas.setDash(kw['dash'])
1066
1067
1068+class IBookmark(interfaces.IRMLDirectiveSignature):
1069+ """
1070+ This creates a bookmark to the current page which can be referred to with
1071+ the given key elsewhere. (Used inside a page drawing.)
1072+ """
1073+
1074+ name = attr.Text(
1075+ title=u'Name',
1076+ description=u'The name of the bookmark.',
1077+ required=True)
1078+
1079+ fit = attr.Choice(
1080+ title=u'Fit',
1081+ description=u'The Fit Type.',
1082+ choices=('XYZ', 'Fit', 'FitH', 'FitV', 'FitR'),
1083+ required=False)
1084+
1085+ zoom = attr.Float(
1086+ title=u'Zoom',
1087+ description=u'The zoom level when clicking on the bookmark.',
1088+ required=False)
1089+
1090+ x = attr.Measurement(
1091+ title=u'X-Position',
1092+ description=u'The x-position.',
1093+ required=False)
1094+
1095+ y = attr.Measurement(
1096+ title=u'Y-Position',
1097+ description=u'The y-position.',
1098+ required=False)
1099+
1100+class Bookmark(CanvasRMLDirective):
1101+ signature = IBookmark
1102+
1103+ def process(self):
1104+ args = dict(self.getAttributeValues())
1105+ canvas = attr.getManager(self, interfaces.ICanvasManager).canvas
1106+ args['left'], args['top'] = canvas.absolutePosition(args['x'], args['y'])
1107+ canvas.bookmarkPage(**args)
1108+
1109+
1110+class IPlugInGraphic(interfaces.IRMLDirectiveSignature):
1111+ """Inserts a custom graphic developed in Python."""
1112+
1113+ module = attr.String(
1114+ title=u'Module',
1115+ description=u'The Python module in which the flowable is located.',
1116+ required=True)
1117+
1118+ function = attr.String(
1119+ title=u'Function',
1120+ description=(u'The name of the factory function within the module '
1121+ u'that returns the custom flowable.'),
1122+ required=True)
1123+
1124+ params = attr.TextNode(
1125+ title=u'Parameters',
1126+ description=(u'A list of parameters encoded as a long string.'),
1127+ required=False)
1128+
1129+class PlugInGraphic(CanvasRMLDirective):
1130+ signature = IPlugInGraphic
1131+
1132+ def process(self):
1133+ modulePath, functionName, params = self.getAttributeValues(
1134+ valuesOnly=True)
1135+ module = __import__(modulePath, {}, {}, [modulePath])
1136+ function = getattr(module, functionName)
1137+ canvas = attr.getManager(self, interfaces.ICanvasManager).canvas
1138+ function(canvas, params)
1139+
1140+
1141 class IDrawing(interfaces.IRMLDirectiveSignature):
1142 """A container directive for all directives that draw directly on the
1143 cnavas."""
1144 occurence.containing(
1145+ # State Manipulation
1146+ occurence.ZeroOrMore('saveState', ISaveState),
1147+ occurence.ZeroOrMore('restoreState', IRestoreState),
1148+ # String Drawing
1149 occurence.ZeroOrMore('drawString', IDrawString),
1150 occurence.ZeroOrMore('drawRightString', IDrawRightString),
1151 occurence.ZeroOrMore('drawCenteredString', IDrawCenteredString),
1152@@ -744,6 +919,7 @@
1153 occurence.ZeroOrMore('fill', IFill),
1154 occurence.ZeroOrMore('stroke', IStroke),
1155 occurence.ZeroOrMore('setFont', ISetFont),
1156+ occurence.ZeroOrMore('setFontSize', ISetFontSize),
1157 occurence.ZeroOrMore('scale', IScale),
1158 occurence.ZeroOrMore('translate', ITranslate),
1159 occurence.ZeroOrMore('rotate', IRotate),
1160@@ -763,12 +939,19 @@
1161 occurence.ZeroOrMore('pieChart', chart.IPieChart),
1162 occurence.ZeroOrMore('pieChart3D', chart.IPieChart3D),
1163 occurence.ZeroOrMore('spiderChart', chart.ISpiderChart),
1164+ # Misc
1165+ occurence.ZeroOrMore('bookmark', IBookmark),
1166+ occurence.ZeroOrMore('plugInGraphic', IPlugInGraphic),
1167 )
1168
1169 class Drawing(directive.RMLDirective):
1170 signature = IDrawing
1171
1172 factories = {
1173+ # State Management
1174+ 'saveState': SaveState,
1175+ 'restoreState': RestoreState,
1176+ # Drawing Strings
1177 'drawString': DrawString,
1178 'drawRightString': DrawRightString,
1179 'drawCenteredString': DrawCenteredString,
1180@@ -794,6 +977,7 @@
1181 'fill': Fill,
1182 'stroke': Stroke,
1183 'setFont': SetFont,
1184+ 'setFontSize': SetFontSize,
1185 'scale': Scale,
1186 'translate': Translate,
1187 'rotate': Rotate,
1188@@ -807,7 +991,10 @@
1189 'linePlot3D': chart.LinePlot3D,
1190 'pieChart': chart.PieChart,
1191 'pieChart3D': chart.PieChart3D,
1192- 'spiderChart': chart.SpiderChart
1193+ 'spiderChart': chart.SpiderChart,
1194+ # Misc
1195+ 'bookmark': Bookmark,
1196+ 'plugInGraphic': PlugInGraphic,
1197 }
1198
1199
1200
1201=== modified file 'src/z3c/rml/chart.py'
1202--- src/z3c/rml/chart.py 2011-01-05 22:34:45 +0000
1203+++ src/z3c/rml/chart.py 2013-01-09 02:49:23 +0000
1204@@ -13,7 +13,7 @@
1205 ##############################################################################
1206 """Chart Element Processing
1207
1208-$Id: chart.py 114908 2010-07-22 02:23:18Z srichter $
1209+$Id: chart.py 128763 2012-12-18 21:44:52Z srichter $
1210 """
1211 __docformat__ = "reStructuredText"
1212 import reportlab.lib.formatters
1213@@ -1621,7 +1621,6 @@
1214 'slices': Slices3D,
1215 })
1216
1217-
1218 class ISpiderChart(IChart):
1219 """A spider chart."""
1220 occurence.containing(
1221
1222=== modified file 'src/z3c/rml/directive.py'
1223--- src/z3c/rml/directive.py 2011-01-05 22:34:45 +0000
1224+++ src/z3c/rml/directive.py 2013-01-09 02:49:23 +0000
1225@@ -13,7 +13,7 @@
1226 ##############################################################################
1227 """RML Directive Implementation
1228
1229-$Id: directive.py 78750 2007-08-12 01:50:06Z rogerineichen $
1230+$Id: directive.py 128767 2012-12-19 02:00:30Z srichter $
1231 """
1232 __docformat__ = "reStructuredText"
1233 import logging
1234@@ -26,6 +26,7 @@
1235 logging.raiseExceptions = False
1236 logger = logging.getLogger("z3c.rml")
1237
1238+ABORT_ON_INVALID_DIRECTIVE = False
1239
1240 def DeprecatedDirective(iface, reason):
1241 zope.interface.directlyProvides(iface, interfaces.IDeprecatedDirective)
1242@@ -92,18 +93,21 @@
1243 # Ignore all comments
1244 if isinstance(element, etree._Comment):
1245 continue
1246+ # Raise an error/log any unknown directive.
1247+ if element.tag not in self.factories:
1248+ msg = "Directive %r could not be processed and was " \
1249+ "ignored. %s" %(element.tag, getFileInfo(self))
1250+ # Record any tags/elements that could not be processed.
1251+ logger.warn(msg)
1252+ if ABORT_ON_INVALID_DIRECTIVE:
1253+ raise ValueError(msg)
1254+ continue
1255 if select is not None and element.tag not in select:
1256 continue
1257 if ignore is not None and element.tag in ignore:
1258 continue
1259- # If the element is a directive, process it
1260- if element.tag in self.factories:
1261- directive = self.factories[element.tag](element, self)
1262- directive.process()
1263- else:
1264- # Record any tags/elements that could not be processed.
1265- logger.warn("Directive %r could not be processed and was "
1266- "ignored. %s" %(element.tag, getFileInfo(self)))
1267+ directive = self.factories[element.tag](element, self)
1268+ directive.process()
1269
1270 def process(self):
1271 self.processSubDirectives()
1272
1273=== added file 'src/z3c/rml/doclogic.py'
1274--- src/z3c/rml/doclogic.py 1970-01-01 00:00:00 +0000
1275+++ src/z3c/rml/doclogic.py 2013-01-09 02:49:23 +0000
1276@@ -0,0 +1,169 @@
1277+##############################################################################
1278+#
1279+# Copyright (c) 2012 Zope Foundation and Contributors.
1280+# All Rights Reserved.
1281+#
1282+# This software is subject to the provisions of the Zope Public License,
1283+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
1284+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
1285+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1286+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
1287+# FOR A PARTICULAR PURPOSE.
1288+#
1289+##############################################################################
1290+"""``doc*`` directives.
1291+"""
1292+import reportlab.platypus
1293+from z3c.rml import attr, directive, flowable, interfaces, occurence
1294+
1295+class IDocAssign(interfaces.IRMLDirectiveSignature):
1296+ """Assign a value to the namesapce."""
1297+
1298+ var = attr.String(
1299+ title=u'Variable Name',
1300+ description=u'The name under which the value is stored.',
1301+ required=True)
1302+
1303+ expr = attr.String(
1304+ title=u'Expression',
1305+ description=u'The expression that creates the value when evaluated.',
1306+ required=True)
1307+
1308+class DocAssign(flowable.Flowable):
1309+ signature = IDocAssign
1310+ klass = reportlab.platypus.flowables.DocAssign
1311+
1312+
1313+class IDocExec(interfaces.IRMLDirectiveSignature):
1314+ """Execute a statement."""
1315+
1316+ stmt = attr.String(
1317+ title=u'Statement',
1318+ description=u'The statement to be executed.',
1319+ required=True)
1320+
1321+class DocExec(flowable.Flowable):
1322+ signature = IDocExec
1323+ klass = reportlab.platypus.flowables.DocExec
1324+
1325+
1326+class IDocPara(interfaces.IRMLDirectiveSignature):
1327+ """Create a paragraph with the value returned from the expression."""
1328+
1329+ expr = attr.String(
1330+ title=u'Expression',
1331+ description=u'The expression to be executed.',
1332+ required=True)
1333+
1334+ format = attr.String(
1335+ title=u'Format',
1336+ description=u'The format used to render the expression value.',
1337+ required=False)
1338+
1339+ style = attr.Style(
1340+ title=u'Style',
1341+ description=u'The style of the paragraph.',
1342+ required=False)
1343+
1344+ escape = attr.Boolean(
1345+ title=u'Escape Text',
1346+ description=u'When set (default) the expression value is escaped.',
1347+ required=False)
1348+
1349+class DocPara(flowable.Flowable):
1350+ signature = IDocPara
1351+ klass = reportlab.platypus.flowables.DocPara
1352+
1353+
1354+class IDocAssert(interfaces.IRMLDirectiveSignature):
1355+ """Assert a certain condition."""
1356+
1357+ cond = attr.String(
1358+ title=u'Condition',
1359+ description=u'The condition to be asserted.',
1360+ required=True)
1361+
1362+ format = attr.String(
1363+ title=u'Format',
1364+ description=u'The text displayed if assertion fails.',
1365+ required=False)
1366+
1367+class DocAssert(flowable.Flowable):
1368+ signature = IDocAssert
1369+ klass = reportlab.platypus.flowables.DocAssert
1370+
1371+
1372+class IDocElse(interfaces.IRMLDirectiveSignature):
1373+ """Starts 'else' block."""
1374+
1375+class DocElse(flowable.Flowable):
1376+ signature = IDocElse
1377+
1378+ def process(self):
1379+ if not isinstance(self.parent, DocIf):
1380+ raise ValueError("<docElse> can only be placed inside a <docIf>")
1381+ self.parent.flow = self.parent.elseFlow
1382+
1383+
1384+class IDocIf(flowable.IFlow):
1385+ """Display story flow based on the value of the condition."""
1386+
1387+ cond = attr.String(
1388+ title=u'Condition',
1389+ description=u'The condition to be tested.',
1390+ required=True)
1391+
1392+class DocIf(flowable.Flow):
1393+ signature = IDocAssert
1394+ klass = reportlab.platypus.flowables.DocIf
1395+
1396+ def __init__(self, *args, **kw):
1397+ super(flowable.Flow, self).__init__(*args, **kw)
1398+ self.thenFlow = self.flow = []
1399+ self.elseFlow = []
1400+
1401+ def process(self):
1402+ args = dict(self.getAttributeValues())
1403+ self.processSubDirectives()
1404+ dif = self.klass(
1405+ thenBlock = self.thenFlow, elseBlock = self.elseFlow, **args)
1406+ self.parent.flow.append(dif)
1407+
1408+class IDocWhile(flowable.IFlow):
1409+ """Repeat the included directives as long as the condition is true."""
1410+
1411+ cond = attr.String(
1412+ title=u'Condition',
1413+ description=u'The condition to be tested.',
1414+ required=True)
1415+
1416+class DocWhile(flowable.Flow):
1417+ signature = IDocAssert
1418+ klass = reportlab.platypus.flowables.DocWhile
1419+
1420+ def process(self):
1421+ args = dict(self.getAttributeValues())
1422+ self.processSubDirectives()
1423+ dwhile = self.klass(whileBlock = self.flow, **args)
1424+ self.parent.flow.append(dwhile)
1425+
1426+
1427+flowable.Flow.factories['docAssign'] = DocAssign
1428+flowable.Flow.factories['docExec'] = DocExec
1429+flowable.Flow.factories['docPara'] = DocPara
1430+flowable.Flow.factories['docAssert'] = DocAssert
1431+flowable.Flow.factories['docIf'] = DocIf
1432+flowable.Flow.factories['docElse'] = DocElse
1433+flowable.Flow.factories['docWhile'] = DocWhile
1434+
1435+flowable.IFlow.setTaggedValue(
1436+ 'directives',
1437+ flowable.IFlow.getTaggedValue('directives') +
1438+ (occurence.ZeroOrMore('docAssign', IDocAssign),
1439+ occurence.ZeroOrMore('docExec', IDocExec),
1440+ occurence.ZeroOrMore('docPara', IDocPara),
1441+ occurence.ZeroOrMore('docIf', IDocIf),
1442+ occurence.ZeroOrMore('docElse', IDocElse),
1443+ occurence.ZeroOrMore('docWhile', IDocWhile),
1444+ )
1445+ )
1446
1447=== modified file 'src/z3c/rml/document.py'
1448--- src/z3c/rml/document.py 2011-01-05 22:34:45 +0000
1449+++ src/z3c/rml/document.py 2013-01-09 02:49:23 +0000
1450@@ -13,19 +13,23 @@
1451 ##############################################################################
1452 """RML ``document`` element
1453
1454-$Id: document.py 114907 2010-07-22 01:59:57Z srichter $
1455+$Id: document.py 128841 2012-12-21 05:02:18Z srichter $
1456 """
1457 __docformat__ = "reStructuredText"
1458 import cStringIO
1459+import logging
1460 import sys
1461 import zope.interface
1462 import reportlab.pdfgen.canvas
1463 from reportlab.pdfbase import pdfmetrics, ttfonts, cidfonts
1464-from reportlab.lib import fonts
1465-
1466-from z3c.rml import attr, directive, interfaces, occurence
1467-from z3c.rml import canvas, stylesheet, template
1468-
1469+from reportlab.lib import colors, fonts
1470+from reportlab.platypus import tableofcontents
1471+
1472+from z3c.rml import attr, canvas, directive, doclogic, interfaces, list
1473+from z3c.rml import occurence, pdfinclude, special, storyplace, stylesheet
1474+from z3c.rml import template
1475+
1476+LOGGER_NAME = 'z3c.rml.render'
1477
1478 class IRegisterType1Face(interfaces.IRMLDirectiveSignature):
1479 """Register a new Type 1 font face."""
1480@@ -141,13 +145,58 @@
1481 u'be previously registered.'),
1482 required=True)
1483
1484+ encName = attr.String(
1485+ title=u'Encoding Name',
1486+ description=(u'The name of the encoding to use for the font.'),
1487+ required=False)
1488+
1489 class RegisterCidFont(directive.RMLDirective):
1490 signature = IRegisterCidFont
1491+ attrMapping = {'faceName': 'face', 'encName': 'encoding'}
1492+
1493+ def process(self):
1494+ args = dict(self.getAttributeValues(attrMapping=self.attrMapping))
1495+ if 'encoding' in args:
1496+ font = cidfonts.CIDFont(**args)
1497+ else:
1498+ font = cidfonts.UnicodeCIDFont(**args)
1499+ pdfmetrics.registerFont(font)
1500+
1501+
1502+class IRegisterFontFamily(interfaces.IRMLDirectiveSignature):
1503+ """Register a new font family."""
1504+
1505+ name = attr.String(
1506+ title=u'Name',
1507+ description=(u'The name of the font family.'),
1508+ required=True)
1509+
1510+ normal = attr.String(
1511+ title=u'Normal Font Name',
1512+ description=(u'The name of the normal font variant.'),
1513+ required=False)
1514+
1515+ bold = attr.String(
1516+ title=u'Bold Font Name',
1517+ description=(u'The name of the bold font variant.'),
1518+ required=False)
1519+
1520+ italic = attr.String(
1521+ title=u'Italic Font Name',
1522+ description=(u'The name of the italic font variant.'),
1523+ required=False)
1524+
1525+ boldItalic = attr.String(
1526+ title=u'Bold/Italic Font Name',
1527+ description=(u'The name of the bold/italic font variant.'),
1528+ required=True)
1529+
1530+class RegisterFontFamily(directive.RMLDirective):
1531+ signature = IRegisterFontFamily
1532
1533 def process(self):
1534 args = self.getAttributeValues(valuesOnly=True)
1535- font = cidfonts.UnicodeCIDFont(*args)
1536- pdfmetrics.registerFont(font)
1537+ pdfmetrics.registerFontFamily(*args)
1538
1539
1540 class IColorDefinition(interfaces.IRMLDirectiveSignature):
1541@@ -158,45 +207,264 @@
1542 description=(u'The id/name the color will be available under.'),
1543 required=True)
1544
1545+ RGB = attr.Color(
1546+ title=u'RGB Color',
1547+ description=(u'The color value that is represented.'),
1548+ required=False)
1549+
1550+ CMYK = attr.Color(
1551+ title=u'CMYK Color',
1552+ description=(u'The color value that is represented.'),
1553+ required=False)
1554+
1555 value = attr.Color(
1556 title=u'Color',
1557 description=(u'The color value that is represented.'),
1558- required=True)
1559- attr.deprecated(
1560- 'RGB', value,
1561- (u'Ensures compatibility with ReportLab RML. Please use '
1562- u'the "value" attribute.'))
1563+ required=False)
1564+
1565+ spotName = attr.String(
1566+ title=u'Spot Name',
1567+ description=(u'The Spot Name of the CMYK color.'),
1568+ required=False)
1569+
1570+ density = attr.Float(
1571+ title=u'Density',
1572+ description=(u'The color density of the CMYK color.'),
1573+ min=0.0,
1574+ max=1.0,
1575+ required=False)
1576+
1577+ knockout = attr.String(
1578+ title=u'Knockout',
1579+ description=(u'The knockout of the CMYK color.'),
1580+ required=False)
1581+
1582+ alpha = attr.Float(
1583+ title=u'Alpha',
1584+ description=(u'The alpha channel of the color.'),
1585+ min=0.0,
1586+ max=1.0,
1587+ required=False)
1588
1589 class ColorDefinition(directive.RMLDirective):
1590 signature = IColorDefinition
1591
1592 def process(self):
1593- id, value = self.getAttributeValues(valuesOnly=True)
1594+ kwargs = dict(self.getAttributeValues())
1595+ id = kwargs.pop('id')
1596+ for attrName in ('RGB', 'CMYK', 'value'):
1597+ color = kwargs.pop(attrName, None)
1598+ if color is not None:
1599+ # CMYK has additional attributes.
1600+ for name, value in kwargs.items():
1601+ setattr(color, name, value)
1602+ manager = attr.getManager(self)
1603+ manager.colors[id] = color
1604+ return
1605+ raise ValueError('At least one color definition must be specified.')
1606+
1607+# Initialize also supports the <color> tag.
1608+stylesheet.Initialize.factories['color'] = ColorDefinition
1609+stylesheet.IInitialize.setTaggedValue(
1610+ 'directives',
1611+ stylesheet.IInitialize.getTaggedValue('directives') +
1612+ (occurence.ZeroOrMore('color', IColorDefinition),)
1613+ )
1614+
1615+
1616+class IStartIndex(interfaces.IRMLDirectiveSignature):
1617+ """Start a new index."""
1618+
1619+ name = attr.String(
1620+ title=u'Name',
1621+ description=u'The name of the index.',
1622+ default='index',
1623+ required=True)
1624+
1625+ offset = attr.Integer(
1626+ title=u'Offset',
1627+ description=u'The counting offset.',
1628+ min=0,
1629+ required=False)
1630+
1631+ format = attr.Choice(
1632+ title=u'Format',
1633+ description=(u'The format the index is going to use.'),
1634+ choices=interfaces.LIST_FORMATS,
1635+ required=False)
1636+
1637+class StartIndex(directive.RMLDirective):
1638+ signature = IStartIndex
1639+
1640+ def process(self):
1641+ kwargs = dict(self.getAttributeValues())
1642+ name = kwargs['name']
1643 manager = attr.getManager(self)
1644- manager.colors[id] = value
1645+ manager.indexes[name] = tableofcontents.SimpleIndex(**kwargs)
1646+
1647+
1648+class ICropMarks(interfaces.IRMLDirectiveSignature):
1649+ """Crop Marks specification"""
1650+
1651+ name = attr.String(
1652+ title=u'Name',
1653+ description=u'The name of the index.',
1654+ default='index',
1655+ required=True)
1656+
1657+ borderWidth = attr.Measurement(
1658+ title=u'Border Width',
1659+ description=u'The width of the crop mark border.',
1660+ required=False)
1661+
1662+ markColor = attr.Color(
1663+ title=u'Mark Color',
1664+ description=u'The color of the crop marks.',
1665+ required=False)
1666+
1667+ markWidth = attr.Measurement(
1668+ title=u'Mark Width',
1669+ description=u'The line width of the actual crop marks.',
1670+ required=False)
1671+
1672+ markLength = attr.Measurement(
1673+ title=u'Mark Length',
1674+ description=u'The length of the actual crop marks.',
1675+ required=False)
1676+
1677+ markLast = attr.Boolean(
1678+ title=u'Mark Last',
1679+ description=u'If set, marks are drawn after the content is rendered.',
1680+ required=False)
1681+
1682+ bleedWidth = attr.Measurement(
1683+ title=u'Bleed Width',
1684+ description=(u'The width of the page bleed.'),
1685+ required=False)
1686+
1687+class CropMarksProperties(object):
1688+ borderWidth = 36
1689+ markWidth = 0.5
1690+ markColor = colors.toColor('green')
1691+ markLength = 18
1692+ markLast = True
1693+ bleedWidth = 0
1694+
1695+class CropMarks(directive.RMLDirective):
1696+ signature = ICropMarks
1697+
1698+ def process(self):
1699+ cmp = CropMarksProperties()
1700+ for name, value in self.getAttributeValues():
1701+ setattr(cmp, name, value)
1702+ self.parent.parent.cropMarks = cmp
1703+
1704+class ILogConfig(interfaces.IRMLDirectiveSignature):
1705+ """Configure the render logger."""
1706+
1707+ level = attr.Choice(
1708+ title=u'Level',
1709+ description=u'The default log level.',
1710+ choices=interfaces.LOG_LEVELS,
1711+ doLower=False,
1712+ required=False)
1713+
1714+ format = attr.String(
1715+ title=u'Format',
1716+ description=u'The format of the log messages.',
1717+ required=False)
1718+
1719+ filename = attr.File(
1720+ title=u'File Name',
1721+ description=u'The path to the file that is being logged.',
1722+ doNotOpen=True,
1723+ required=True)
1724+
1725+ filemode = attr.Choice(
1726+ title=u'File Mode',
1727+ description=u'The mode to open the file in.',
1728+ choices={'WRITE': 'w', 'APPEND': 'a'},
1729+ default='a',
1730+ required=False)
1731+
1732+ datefmt = attr.String(
1733+ title=u'Date Format',
1734+ description=u'The format of the log message date.',
1735+ required=False)
1736+
1737+class LogConfig(directive.RMLDirective):
1738+ signature = ILogConfig
1739+
1740+ def process(self):
1741+ args = dict(self.getAttributeValues())
1742+ logger = logging.Logger(LOGGER_NAME)
1743+ handler = logging.FileHandler(args['filename'], args['filemode'])
1744+ formatter = logging.Formatter(
1745+ args.get('format'), args.get('datefmt'))
1746+ handler.setFormatter(formatter)
1747+ logger.addHandler(handler)
1748+ if 'level' in args:
1749+ logger.setLevel(args['level'])
1750+ self.parent.parent.logger = logger
1751
1752
1753 class IDocInit(interfaces.IRMLDirectiveSignature):
1754 occurence.containing(
1755+ occurence.ZeroOrMore('color', IColorDefinition),
1756+ occurence.ZeroOrMore('name', special.IName),
1757 occurence.ZeroOrMore('registerType1Face', IRegisterType1Face),
1758 occurence.ZeroOrMore('registerFont', IRegisterFont),
1759+ occurence.ZeroOrMore('registerCidFont', IRegisterCidFont),
1760 occurence.ZeroOrMore('registerTTFont', IRegisterTTFont),
1761- occurence.ZeroOrMore('registerCidFont', IRegisterCidFont),
1762- occurence.ZeroOrMore('color', IColorDefinition),
1763+ occurence.ZeroOrMore('registerFontFamily', IRegisterFontFamily),
1764 occurence.ZeroOrMore('addMapping', IAddMapping),
1765+ occurence.ZeroOrMore('logConfig', ILogConfig),
1766+ occurence.ZeroOrMore('cropMarks', ICropMarks),
1767+ occurence.ZeroOrMore('startIndex', IStartIndex),
1768 )
1769
1770+ pageMode = attr.Choice(
1771+ title=u'Page Mode',
1772+ description=(u'The page mode in which the document is opened in '
1773+ u'the viewer.'),
1774+ choices=('UseNone', 'UseOutlines', 'UseThumbs', 'FullScreen'),
1775+ required=False)
1776+
1777+ pageLayout = attr.Choice(
1778+ title=u'Page Layout',
1779+ description=(u'The layout in which the pages are displayed in '
1780+ u'the viewer.'),
1781+ choices=('SinglePage', 'OneColumn', 'TwoColumnLeft', 'TwoColumnRight'),
1782+ required=False)
1783+
1784+ useCropMarks = attr.Boolean(
1785+ title=u'Use Crop Marks',
1786+ description=u'A flag when set shows crop marks on the page.',
1787+ required=False)
1788+
1789+
1790 class DocInit(directive.RMLDirective):
1791 signature = IDocInit
1792 factories = {
1793+ 'name': special.Name,
1794+ 'color': ColorDefinition,
1795 'registerType1Face': RegisterType1Face,
1796 'registerFont': RegisterFont,
1797 'registerTTFont': RegisterTTFont,
1798 'registerCidFont': RegisterCidFont,
1799- 'color': ColorDefinition,
1800 'addMapping': AddMapping,
1801+ 'logConfig': LogConfig,
1802+ 'cropMarks': CropMarks,
1803+ 'startIndex': StartIndex,
1804 }
1805
1806+ def process(self):
1807+ kwargs = dict(self.getAttributeValues())
1808+ self.parent.cropMarks = kwargs.get('useCropMarks', False)
1809+ self.parent.pageMode = kwargs.get('pageMode')
1810+ self.parent.pageLayout = kwargs.get('pageLayout')
1811+ super(DocInit, self).process()
1812+
1813
1814 class IDocument(interfaces.IRMLDirectiveSignature):
1815 occurence.containing(
1816@@ -252,11 +520,38 @@
1817 self.names = {}
1818 self.styles = {}
1819 self.colors = {}
1820+ self.indexes = {}
1821 self.postProcessors = []
1822- self.filename = '<unknwon>'
1823+ self.filename = '<unknown>'
1824+ self.cropMarks = False
1825+ self.pageLayout = None
1826+ self.pageMode = None
1827+ self.logger = None
1828+
1829+ def _indexAdd(self, canvas, name, label):
1830+ self.indexes[name](canvas, name, label)
1831+
1832+ def _beforeDocument(self):
1833+ self._initCanvas(self.doc.canv)
1834+ self.canvas = self.doc.canv
1835+
1836+ def _initCanvas(self, canvas):
1837+ canvas._indexAdd = self._indexAdd
1838+ canvas.manager = self
1839+ if self.pageLayout:
1840+ canvas._doc._catalog.setPageLayout(self.pageLayout)
1841+ if self.pageMode:
1842+ canvas._doc._catalog.setPageMode(self.pageMode)
1843
1844 def process(self, outputFile=None):
1845 """Process document"""
1846+ # Reset all reportlab global variables. This is very important for
1847+ # ReportLab not to fail.
1848+ reportlab.rl_config._reset()
1849+
1850+ # Add our colors mapping to the default ones.
1851+ colors.toColor.setExtraColorsNameSpace(self.colors)
1852+
1853 if outputFile is None:
1854 # TODO: This is relative to the input file *not* the CWD!!!
1855 outputFile = open(self.element.get('filename'), 'wb')
1856@@ -275,14 +570,17 @@
1857 attrMapping={'compression': 'pageCompression',
1858 'debug': 'verbosity'}
1859 ))
1860+ kwargs['cropMarks'] = self.cropMarks
1861
1862 self.canvas = reportlab.pdfgen.canvas.Canvas(tempOutput, **kwargs)
1863+ self._initCanvas(self.canvas)
1864 self.processSubDirectives(select=('pageInfo', 'pageDrawing'))
1865 self.canvas.save()
1866
1867 # Handle Flowable-based documents.
1868 elif self.element.find('template') is not None:
1869 self.processSubDirectives(select=('template', 'story'))
1870+ self.doc.beforeDocument = self._beforeDocument
1871 self.doc.multiBuild(self.flowables)
1872
1873 # Process all post processors
1874@@ -294,3 +592,6 @@
1875 tempOutput.seek(0)
1876 outputFile.write(tempOutput.getvalue())
1877
1878+ # Cleanup.
1879+ colors.toColor.setExtraColorsNameSpace({})
1880+
1881
1882=== modified file 'src/z3c/rml/dtd.py'
1883--- src/z3c/rml/dtd.py 2011-01-05 22:34:45 +0000
1884+++ src/z3c/rml/dtd.py 2013-01-09 02:49:23 +0000
1885@@ -13,7 +13,7 @@
1886 ##############################################################################
1887 """Generate a DTD from the code
1888
1889-$Id: dtd.py 76810 2007-06-19 19:49:26Z srichter $
1890+$Id: dtd.py 128803 2012-12-20 14:19:44Z srichter $
1891 """
1892 __docformat__ = "reStructuredText"
1893 import zope.schema
1894@@ -36,15 +36,20 @@
1895 subElementList.append(
1896 occurence.tag + occurence2Symbol.get(occurence.__class__, '')
1897 )
1898- fields = zope.schema.getFields(signature).keys()
1899- if len(fields) == 1 and isinstance(fields[0], attr.TextNode):
1900- subElementList.append('#PCDATA')
1901+ fields = zope.schema.getFieldsInOrder(signature)
1902+ for attrName, field in fields:
1903+ if isinstance(field, attr.TextNode):
1904+ subElementList.append('#PCDATA')
1905+ break
1906 subElementList = ','.join(subElementList)
1907 if subElementList:
1908 subElementList = ' (' + subElementList + ')'
1909 text = '\n<!ELEMENT %s%s>' %(name, subElementList)
1910 # Create a list of attributes for this element.
1911- for attrName, field in zope.schema.getFieldsInOrder(signature):
1912+ for attrName, field in fields:
1913+ # Ignore text nodes, since they are not attributes.
1914+ if isinstance(field, attr.TextNode):
1915+ continue
1916 # Create the type
1917 if isinstance(field, attr.Choice):
1918 type = '(' + '|'.join(field.choices.keys()) + ')'
1919
1920=== modified file 'src/z3c/rml/flowable.py'
1921--- src/z3c/rml/flowable.py 2011-01-05 22:34:45 +0000
1922+++ src/z3c/rml/flowable.py 2013-01-09 02:49:23 +0000
1923@@ -13,10 +13,11 @@
1924 ##############################################################################
1925 """Flowable Element Processing
1926
1927-$Id: flowable.py 84838 2008-03-21 12:32:58Z rogerineichen $
1928+$Id: flowable.py 128843 2012-12-21 06:58:39Z srichter $
1929 """
1930 __docformat__ = "reStructuredText"
1931 import copy
1932+import logging
1933 import re
1934 import reportlab.lib.styles
1935 import reportlab.platypus
1936@@ -24,7 +25,8 @@
1937 import reportlab.platypus.flowables
1938 import reportlab.platypus.tables
1939 import zope.schema
1940-from reportlab.lib import styles
1941+from reportlab.lib import styles, pygments2xpre
1942+from xml.sax.saxutils import unescape
1943 from z3c.rml import attr, directive, interfaces, occurence
1944 from z3c.rml import form, platypus, special, stylesheet
1945
1946@@ -141,8 +143,7 @@
1947 description=(u'The paragraph style that is applied to the paragraph. '
1948 u'See the ``paraStyle`` tag for creating a paragraph '
1949 u'style.'),
1950- default=reportlab.lib.styles.getSampleStyleSheet()['Normal'],
1951- required=True)
1952+ required=False)
1953
1954 bulletText = attr.String(
1955 title=u'Bullet Character',
1956@@ -185,19 +186,44 @@
1957 class IPreformatted(IMinimalParagraphBase):
1958 """A preformatted text, similar to the <pre> tag in HTML."""
1959
1960+ style = attr.Style(
1961+ title=u'Style',
1962+ description=(u'The paragraph style that is applied to the paragraph. '
1963+ u'See the ``paraStyle`` tag for creating a paragraph '
1964+ u'style.'),
1965+ default=reportlab.lib.styles.getSampleStyleSheet()['Code'],
1966+ required=False)
1967+
1968 text = attr.RawXMLContent(
1969 title=u'Text',
1970 description=(u'The text that will be layed out.'),
1971 required=True)
1972
1973+ maxLineLength = attr.Integer(
1974+ title=u'Max Line Length',
1975+ description=(u'The maximum number of characters on one line.'),
1976+ required=False)
1977+
1978+ newLineChars = attr.Text(
1979+ title=u'New Line Characters',
1980+ description=u'The characters placed at the beginning of a wrapped line',
1981+ required=False)
1982+
1983 class Preformatted(Flowable):
1984 signature = IPreformatted
1985 klass = reportlab.platypus.Preformatted
1986
1987-
1988 class IXPreformatted(IParagraphBase):
1989 """A preformatted text that allows paragraph markup."""
1990
1991+ style = attr.Style(
1992+ title=u'Style',
1993+ description=(u'The paragraph style that is applied to the paragraph. '
1994+ u'See the ``paraStyle`` tag for creating a paragraph '
1995+ u'style.'),
1996+ default=reportlab.lib.styles.getSampleStyleSheet()['Normal'],
1997+ required=False)
1998+
1999 text = attr.RawXMLContent(
2000 title=u'Text',
2001 description=(u'The text that will be layed out.'),
2002@@ -208,6 +234,36 @@
2003 klass = reportlab.platypus.XPreformatted
2004
2005
2006+class ICodeSnippet(IXPreformatted):
2007+ """A code snippet with text highlighting."""
2008+
2009+ style = attr.Style(
2010+ title=u'Style',
2011+ description=(u'The paragraph style that is applied to the paragraph. '
2012+ u'See the ``paraStyle`` tag for creating a paragraph '
2013+ u'style.'),
2014+ required=False)
2015+
2016+ language = attr.String(
2017+ title=u'Language',
2018+ description=u'The language the code snippet is written in.',
2019+ required=False)
2020+
2021+class CodeSnippet(XPreformatted):
2022+ signature = ICodeSnippet
2023+
2024+ def process(self):
2025+ args = dict(self.getAttributeValues())
2026+ lang = args.pop('language', None)
2027+ args['text'] = unescape(args['text'])
2028+ if lang is not None:
2029+ args['text'] = pygments2xpre.pygments2xpre(
2030+ args['text'], lang.lower())
2031+ if 'style' not in args:
2032+ args['style'] = attr._getStyle(self, 'Code')
2033+ self.parent.flow.append(self.klass(**args))
2034+
2035+
2036 class IParagraph(IParagraphBase, stylesheet.IBaseParagraphStyle):
2037 """Lays out an entire paragraph."""
2038
2039@@ -219,6 +275,7 @@
2040 class Paragraph(Flowable):
2041 signature = IParagraph
2042 klass = reportlab.platypus.Paragraph
2043+ defaultStyle = 'Normal'
2044
2045 styleAttributes = zope.schema.getFieldNames(stylesheet.IBaseParagraphStyle)
2046
2047@@ -232,6 +289,8 @@
2048
2049 def process(self):
2050 args = dict(self.getAttributeValues(ignore=self.styleAttributes))
2051+ if 'style' not in args:
2052+ args['style'] = attr._getStyle(self, self.defaultStyle)
2053 args['style'] = self.processStyle(args['style'])
2054 self.parent.flow.append(self.klass(**args))
2055
2056@@ -239,61 +298,56 @@
2057 class ITitle(IParagraph):
2058 """The title is a simple paragraph with a special title style."""
2059
2060- style = attr.Style(
2061- title=u'Style',
2062- description=(u'The paragraph style that is applied to the paragraph. '
2063- u'See the ``paraStyle`` tag for creating a paragraph '
2064- u'style.'),
2065- default=reportlab.lib.styles.getSampleStyleSheet()['Title'],
2066- required=True)
2067-
2068 class Title(Paragraph):
2069 signature = ITitle
2070-
2071+ defaultStyle = 'Title'
2072
2073 class IHeading1(IParagraph):
2074 """Heading 1 is a simple paragraph with a special heading 1 style."""
2075
2076- style = attr.Style(
2077- title=u'Style',
2078- description=(u'The paragraph style that is applied to the paragraph. '
2079- u'See the ``paraStyle`` tag for creating a paragraph '
2080- u'style.'),
2081- default=reportlab.lib.styles.getSampleStyleSheet()['Heading1'],
2082- required=True)
2083-
2084 class Heading1(Paragraph):
2085 signature = IHeading1
2086+ defaultStyle = 'Heading1'
2087
2088
2089 class IHeading2(IParagraph):
2090 """Heading 2 is a simple paragraph with a special heading 2 style."""
2091
2092- style = attr.Style(
2093- title=u'Style',
2094- description=(u'The paragraph style that is applied to the paragraph. '
2095- u'See the ``paraStyle`` tag for creating a paragraph '
2096- u'style.'),
2097- default=reportlab.lib.styles.getSampleStyleSheet()['Heading2'],
2098- required=True)
2099-
2100 class Heading2(Paragraph):
2101 signature = IHeading2
2102+ defaultStyle = 'Heading2'
2103
2104
2105 class IHeading3(IParagraph):
2106 """Heading 3 is a simple paragraph with a special heading 3 style."""
2107
2108- style = attr.Style(
2109- title=u'Style',
2110- description=(u'The paragraph style that is applied to the paragraph. '
2111- u'See the ``paraStyle`` tag for creating a paragraph '
2112- u'style.'),
2113- default=reportlab.lib.styles.getSampleStyleSheet()['Heading3'],
2114- required=True)
2115-
2116 class Heading3(Paragraph):
2117 signature = IHeading3
2118+ defaultStyle = 'Heading3'
2119+
2120+
2121+class IHeading4(IParagraph):
2122+ """Heading 4 is a simple paragraph with a special heading 4 style."""
2123+
2124+class Heading4(Paragraph):
2125+ signature = IHeading4
2126+ defaultStyle = 'Heading4'
2127+
2128+
2129+class IHeading5(IParagraph):
2130+ """Heading 5 is a simple paragraph with a special heading 5 style."""
2131+
2132+class Heading5(Paragraph):
2133+ signature = IHeading5
2134+ defaultStyle = 'Heading5'
2135+
2136+
2137+class IHeading6(IParagraph):
2138+ """Heading 6 is a simple paragraph with a special heading 6 style."""
2139+
2140+class Heading6(Paragraph):
2141+ signature = IHeading6
2142+ defaultStyle = 'Heading6'
2143
2144
2145 class ITableCell(interfaces.IRMLDirectiveSignature):
2146@@ -470,6 +524,18 @@
2147 description=u'The space of the line right of the cell.',
2148 required=False)
2149
2150+ href = attr.Text(
2151+ title=u'Link URL',
2152+ description=u'When specified, the cell becomes a link to that URL.',
2153+ required=False)
2154+
2155+ destination = attr.Text(
2156+ title=u'Link Destination',
2157+ description=(u'When specified, the cell becomes a link to that '
2158+ u'destination.'),
2159+ required=False)
2160+
2161+
2162 class TableCell(directive.RMLDirective):
2163 signature = ITableCell
2164 styleAttributesMapping = (
2165@@ -492,6 +558,8 @@
2166 'lineLeftCap', 'lineLeftCount', 'lineLeftSpace')),
2167 ('LINEAFTER', ('lineRightThickness', 'lineRightColor',
2168 'lineRightCap', 'lineRightCount', 'lineRightSpace')),
2169+ ('HREF', ('href',)),
2170+ ('DESTINATION', ('destination',)),
2171 )
2172
2173 def processStyle(self):
2174@@ -755,7 +823,7 @@
2175 description=u'The maximum height the flowables are allotted.',
2176 default=None,
2177 required=False)
2178-
2179+
2180 class KeepTogether(Flowable):
2181 signature = IKeepTogether
2182 klass = reportlab.platypus.flowables.KeepTogether
2183@@ -771,6 +839,50 @@
2184 frame = self.klass(flow.flow, **args)
2185 self.parent.flow.append(frame)
2186
2187+class IImage(interfaces.IRMLDirectiveSignature):
2188+ """An image."""
2189+
2190+ src = attr.Image(
2191+ title=u'Image Source',
2192+ description=u'The file that is used to extract the image data.',
2193+ onlyOpen=True,
2194+ required=True)
2195+
2196+ width = attr.Measurement(
2197+ title=u'Image Width',
2198+ description=u'The width of the image.',
2199+ required=False)
2200+
2201+ height = attr.Measurement(
2202+ title=u'Image Height',
2203+ description=u'The height the image.',
2204+ required=False)
2205+
2206+ mask = attr.Color(
2207+ title=u'Mask',
2208+ description=u'The color mask used to render the image.',
2209+ required=False)
2210+
2211+ vAlign = attr.Choice(
2212+ title=u'Vertical Alignment',
2213+ description=u'The vertical alignment of the image.',
2214+ choices=interfaces.VALIGN_TEXT_CHOICES,
2215+ required=False)
2216+
2217+class Image(Flowable):
2218+ signature = IImage
2219+ klass = reportlab.platypus.flowables.Image
2220+ attrMapping = {'src': 'filename'}
2221+
2222+ def process(self):
2223+ args = dict(self.getAttributeValues(attrMapping=self.attrMapping))
2224+ vAlign = args.pop('vAlign', None)
2225+ img = self.klass(**args)
2226+ if vAlign:
2227+ img.vAlign = vAlign
2228+ self.parent.flow.append(img)
2229+
2230+
2231 class IImageAndFlowables(interfaces.IRMLDirectiveSignature):
2232 """An image with flowables around it."""
2233
2234@@ -931,7 +1043,7 @@
2235 self.parent.flow.append(frame)
2236
2237
2238-class IBookmark(interfaces.IRMLDirectiveSignature):
2239+class IBookmarkPage(interfaces.IRMLDirectiveSignature):
2240 """
2241 This creates a bookmark to the current page which can be referred to with
2242 the given key elsewhere.
2243@@ -947,20 +1059,10 @@
2244 description=u'The name of the bookmark.',
2245 required=True)
2246
2247- fitType = attr.Choice(
2248- title=u'Fit Type',
2249+ fit = attr.Choice(
2250+ title=u'Fit',
2251 description=u'The Fit Type.',
2252- choices=('Fit', 'FitH', 'FitV', 'FitR'),
2253- required=False)
2254-
2255- left = attr.Measurement(
2256- title=u'Left',
2257- description=u'The left position.',
2258- required=False)
2259-
2260- right = attr.Measurement(
2261- title=u'Right',
2262- description=u'The right position.',
2263+ choices=('XYZ', 'Fit', 'FitH', 'FitV', 'FitR'),
2264 required=False)
2265
2266 top = attr.Measurement(
2267@@ -968,6 +1070,16 @@
2268 description=u'The top position.',
2269 required=False)
2270
2271+ bottom = attr.Measurement(
2272+ title=u'Bottom',
2273+ description=u'The bottom position.',
2274+ required=False)
2275+
2276+ left = attr.Measurement(
2277+ title=u'Left',
2278+ description=u'The left position.',
2279+ required=False)
2280+
2281 right = attr.Measurement(
2282 title=u'Right',
2283 description=u'The right position.',
2284@@ -978,10 +1090,39 @@
2285 description=u'The zoom level when clicking on the bookmark.',
2286 required=False)
2287
2288+class BookmarkPage(Flowable):
2289+ signature = IBookmarkPage
2290+ klass = platypus.BookmarkPage
2291+ attrMapping = {'name': 'key', 'fitType': 'fit'}
2292+
2293+
2294+class IBookmark(interfaces.IRMLDirectiveSignature):
2295+ """
2296+ This creates a bookmark to the current page which can be referred to with
2297+ the given key elsewhere. (Used inside a story.)
2298+ """
2299+
2300+ name = attr.Text(
2301+ title=u'Name',
2302+ description=u'The name of the bookmark.',
2303+ required=True)
2304+
2305+ x = attr.Measurement(
2306+ title=u'X Coordinate',
2307+ description=u'The x-position of the bookmark.',
2308+ default=0,
2309+ required=False)
2310+
2311+ y = attr.Measurement(
2312+ title=u'Y Coordinate',
2313+ description=u'The y-position of the bookmark.',
2314+ default=0,
2315+ required=False)
2316+
2317 class Bookmark(Flowable):
2318 signature = IBookmark
2319- klass = platypus.BookmarkPage
2320- attrMapping = {'name': 'key', 'fitType': 'fit'}
2321+ klass = platypus.Bookmark
2322+ attrMapping = {'name': 'key', 'x': 'relativeX', 'y': 'relativeY'}
2323
2324
2325 class ILink(interfaces.IRMLDirectiveSignature):
2326@@ -1118,6 +1259,170 @@
2327 klass = platypus.OutlineAdd
2328
2329
2330+class NamedStringFlowable(reportlab.platypus.flowables.Flowable):
2331+
2332+ def __init__(self, manager, id, value):
2333+ reportlab.platypus.flowables.Flowable.__init__(self)
2334+ self.manager = manager
2335+ self.id = id
2336+ self.value = value
2337+
2338+ def wrap(self, *args):
2339+ return (0, 0)
2340+
2341+ def draw(self):
2342+ self.manager.names[self.id] = self.value
2343+
2344+
2345+class INamedString(interfaces.IRMLDirectiveSignature):
2346+ """Defines a name for a string."""
2347+
2348+ id = attr.String(
2349+ title=u'Id',
2350+ description=u'The id under which the value will be known.',
2351+ required=True)
2352+
2353+ value = attr.XMLContent(
2354+ title=u'Value',
2355+ description=u'The text that is displayed if the id is called.',
2356+ required=True)
2357+
2358+class NamedString(directive.RMLDirective):
2359+ signature = INamedString
2360+
2361+ def process(self):
2362+ id, value = self.getAttributeValues(valuesOnly=True)
2363+ manager = attr.getManager(self)
2364+ # We have to delay assigning values, otherwise the last one wins.
2365+ self.parent.flow.append(NamedStringFlowable(manager, id, value))
2366+
2367+
2368+class IShowIndex(interfaces.IRMLDirectiveSignature):
2369+ """Creates an index in the document."""
2370+
2371+ name = attr.String(
2372+ title=u'Name',
2373+ description=u'The name of the index.',
2374+ default='index',
2375+ required=False)
2376+
2377+ dot = attr.String(
2378+ title=u'Dot',
2379+ description=u'The character to use as a dot.',
2380+ required=False)
2381+
2382+ style = attr.Style(
2383+ title=u'Style',
2384+ description=u'The paragraph style that is applied to the index. ',
2385+ required=False)
2386+
2387+ tableStyle = attr.Style(
2388+ title=u'Table Style',
2389+ description=u'The table style that is applied to the index layout. ',
2390+ required=False)
2391+
2392+class ShowIndex(directive.RMLDirective):
2393+ signature = IShowIndex
2394+
2395+ def process(self):
2396+ args = dict(self.getAttributeValues())
2397+ manager = attr.getManager(self)
2398+ index = manager.indexes[args['name']]
2399+ args['format'] = index.formatFunc.__name__[8:]
2400+ args['offset'] = index.offset
2401+ index.setup(**args)
2402+ self.parent.flow.append(index)
2403+
2404+
2405+class IBaseLogCall(interfaces.IRMLDirectiveSignature):
2406+
2407+ message = attr.RawXMLContent(
2408+ title=u'Message',
2409+ description=u'The message to be logged.',
2410+ required=True)
2411+
2412+class LogCallFlowable(reportlab.platypus.flowables.Flowable):
2413+
2414+ def __init__(self, logger, level, message):
2415+ self.logger = logger
2416+ self.level = level
2417+ self.message = message
2418+
2419+ def wrap(self, *args):
2420+ return (0, 0)
2421+
2422+ def draw(self):
2423+ self.logger.log(self.level, self.message)
2424+
2425+class BaseLogCall(directive.RMLDirective):
2426+ signature = IBaseLogCall
2427+ level = None
2428+
2429+ def process(self):
2430+ message = self.getAttributeValues(
2431+ select=('message',), valuesOnly=True)[0]
2432+ manager = attr.getManager(self)
2433+ self.parent.flow.append(
2434+ LogCallFlowable(manager.logger, self.level, message))
2435+
2436+class ILog(IBaseLogCall):
2437+ """Log message at DEBUG level."""
2438+
2439+ level = attr.Choice(
2440+ title=u'Level',
2441+ description=u'The default log level.',
2442+ choices=interfaces.LOG_LEVELS,
2443+ doLower=False,
2444+ default=logging.INFO,
2445+ required=True)
2446+
2447+class Log(BaseLogCall):
2448+ signature = ILog
2449+
2450+ @property
2451+ def level(self):
2452+ return self.getAttributeValues(select=('level',), valuesOnly=True)[0]
2453+
2454+class IDebug(IBaseLogCall):
2455+ """Log message at DEBUG level."""
2456+
2457+class Debug(BaseLogCall):
2458+ signature = IDebug
2459+ level = logging.DEBUG
2460+
2461+
2462+class IInfo(IBaseLogCall):
2463+ """Log message at INFO level."""
2464+
2465+class Info(BaseLogCall):
2466+ signature = IInfo
2467+ level = logging.INFO
2468+
2469+
2470+class IWarning(IBaseLogCall):
2471+ """Log message at WARNING level."""
2472+
2473+class Warning(BaseLogCall):
2474+ signature = IWarning
2475+ level = logging.WARNING
2476+
2477+
2478+class IError(IBaseLogCall):
2479+ """Log message at ERROR level."""
2480+
2481+class Error(BaseLogCall):
2482+ signature = IError
2483+ level = logging.ERROR
2484+
2485+
2486+class ICritical(IBaseLogCall):
2487+ """Log message at CRITICAL level."""
2488+
2489+class Critical(BaseLogCall):
2490+ signature = ICritical
2491+ level = logging.CRITICAL
2492+
2493+
2494 class IFlow(interfaces.IRMLDirectiveSignature):
2495 """A list of flowables."""
2496 occurence.containing(
2497@@ -1125,6 +1430,7 @@
2498 occurence.ZeroOrMore('illustration', IIllustration),
2499 occurence.ZeroOrMore('pre', IPreformatted),
2500 occurence.ZeroOrMore('xpre', IXPreformatted),
2501+ occurence.ZeroOrMore('codesnippet', ICodeSnippet),
2502 occurence.ZeroOrMore('plugInFlowable', IPluginFlowable),
2503 occurence.ZeroOrMore('barCodeFlowable', IBarCodeFlowable),
2504 occurence.ZeroOrMore('outlineAdd', IOutlineAdd),
2505@@ -1132,6 +1438,9 @@
2506 occurence.ZeroOrMore('h1', IHeading1),
2507 occurence.ZeroOrMore('h2', IHeading2),
2508 occurence.ZeroOrMore('h3', IHeading3),
2509+ occurence.ZeroOrMore('h4', IHeading4),
2510+ occurence.ZeroOrMore('h5', IHeading5),
2511+ occurence.ZeroOrMore('h6', IHeading6),
2512 occurence.ZeroOrMore('para', IParagraph),
2513 occurence.ZeroOrMore('blockTable', IBlockTable),
2514 occurence.ZeroOrMore('nextFrame', INextFrame),
2515@@ -1141,14 +1450,24 @@
2516 occurence.ZeroOrMore('condPageBreak', IConditionalPageBreak),
2517 occurence.ZeroOrMore('keepInFrame', IKeepInFrame),
2518 occurence.ZeroOrMore('keepTogether', IKeepTogether),
2519+ occurence.ZeroOrMore('img', IImage),
2520 occurence.ZeroOrMore('imageAndFlowables', IImageAndFlowables),
2521 occurence.ZeroOrMore('pto', IPTO),
2522 occurence.ZeroOrMore('indent', IIndent),
2523 occurence.ZeroOrMore('fixedSize', IFixedSize),
2524+ occurence.ZeroOrMore('bookmarkPage', IBookmarkPage),
2525 occurence.ZeroOrMore('bookmark', IBookmark),
2526 occurence.ZeroOrMore('link', ILink),
2527 occurence.ZeroOrMore('hr', IHorizontalRow),
2528+ occurence.ZeroOrMore('showIndex', IShowIndex),
2529 occurence.ZeroOrMore('name', special.IName),
2530+ occurence.ZeroOrMore('namedString', INamedString),
2531+ occurence.ZeroOrMore('log', ILog),
2532+ occurence.ZeroOrMore('debug', IDebug),
2533+ occurence.ZeroOrMore('info', IInfo),
2534+ occurence.ZeroOrMore('warning', IWarning),
2535+ occurence.ZeroOrMore('error', IError),
2536+ occurence.ZeroOrMore('critical', ICritical),
2537 )
2538
2539 class Flow(directive.RMLDirective):
2540@@ -1159,6 +1478,7 @@
2541 'illustration': Illustration,
2542 'pre': Preformatted,
2543 'xpre': XPreformatted,
2544+ 'codesnippet': CodeSnippet,
2545 'plugInFlowable': PluginFlowable,
2546 'barCodeFlowable': BarCodeFlowable,
2547 'outlineAdd': OutlineAdd,
2548@@ -1167,6 +1487,9 @@
2549 'h1': Heading1,
2550 'h2': Heading2,
2551 'h3': Heading3,
2552+ 'h4': Heading4,
2553+ 'h5': Heading5,
2554+ 'h6': Heading6,
2555 'para': Paragraph,
2556 # Table Flowable
2557 'blockTable': BlockTable,
2558@@ -1178,15 +1501,26 @@
2559 'condPageBreak': ConditionalPageBreak,
2560 'keepInFrame': KeepInFrame,
2561 'keepTogether': KeepTogether,
2562+ 'img': Image,
2563 'imageAndFlowables': ImageAndFlowables,
2564 'pto': PTO,
2565 'indent': Indent,
2566 'fixedSize': FixedSize,
2567+ 'bookmarkPage': BookmarkPage,
2568 'bookmark': Bookmark,
2569 'link': Link,
2570 'hr': HorizontalRow,
2571+ 'showIndex': ShowIndex,
2572 # Special Elements
2573 'name': special.Name,
2574+ 'namedString': NamedString,
2575+ # Logging
2576+ 'log': Log,
2577+ 'debug': Debug,
2578+ 'info': Info,
2579+ 'warning': Warning,
2580+ 'error': Error,
2581+ 'critical': Critical,
2582 }
2583
2584 def __init__(self, *args, **kw):
2585
2586=== modified file 'src/z3c/rml/form.py'
2587--- src/z3c/rml/form.py 2011-01-05 22:34:45 +0000
2588+++ src/z3c/rml/form.py 2013-01-09 02:49:23 +0000
2589@@ -13,7 +13,7 @@
2590 ##############################################################################
2591 """Page Drawing Related Element Processing
2592
2593-$Id: form.py 74162 2007-04-16 04:16:37Z srichter $
2594+$Id: form.py 128806 2012-12-20 16:34:40Z srichter $
2595 """
2596 __docformat__ = "reStructuredText"
2597 import types
2598@@ -54,21 +54,6 @@
2599 description=u'The height of the barcode.',
2600 required=False)
2601
2602- strokeColor = attr.Color(
2603- title=u'Stroke Color',
2604- description=(u'The color of the line strokes in the area.'),
2605- required=False)
2606-
2607- strokeWidth = attr.Measurement(
2608- title=u'Stroke Width',
2609- description=u'The width of the line strokes in the area.',
2610- required=False)
2611-
2612- fillColor = attr.Color(
2613- title=u'Fill Color',
2614- description=(u'The color of the filled shapes in the area.'),
2615- required=False)
2616-
2617 barStrokeColor = attr.Color(
2618 title=u'Bar Stroke Color',
2619 description=(u'The color of the line strokes in the barcode.'),
2620@@ -196,6 +181,12 @@
2621 description=(u'The color of human readable text.'),
2622 required=False)
2623
2624+ # USPS4S
2625+ routing = attr.String(
2626+ title=u'Routing',
2627+ description=u'The routing information string.',
2628+ required=False)
2629+
2630
2631 class IBarCode(IBarCodeBase):
2632 """A barcode graphic."""
2633@@ -212,7 +203,10 @@
2634 default=0,
2635 required=False)
2636
2637-
2638+ isoScale = attr.Boolean(
2639+ title=u'Isometric Scaling',
2640+ description=u'When set, the aspect ration of the barcode is enforced.',
2641+ required=False)
2642
2643 class BarCode(directive.RMLDirective):
2644 signature = IBarCode
2645
2646=== modified file 'src/z3c/rml/interfaces.py'
2647--- src/z3c/rml/interfaces.py 2011-01-05 22:34:45 +0000
2648+++ src/z3c/rml/interfaces.py 2013-01-09 02:49:23 +0000
2649@@ -12,10 +12,9 @@
2650 #
2651 ##############################################################################
2652 """RML to PDF Converter Interfaces
2653-
2654-$Id: interfaces.py 74195 2007-04-16 22:41:24Z srichter $
2655 """
2656 __docformat__ = "reStructuredText"
2657+import logging
2658 import reportlab.lib.enums
2659 import zope.interface
2660 import zope.schema
2661@@ -36,7 +35,16 @@
2662 VALIGN_TEXT_CHOICES = {
2663 'top': 'TOP', 'middle': 'MIDDLE', 'bottom': 'BOTTOM'}
2664 SPLIT_CHOICES = ('splitfirst', 'splitlast')
2665-
2666+TEXT_TRANSFORM_CHOICES = ('uppercase', 'lowercase')
2667+LIST_FORMATS = ('I', 'i', '123', 'ABC', 'abc')
2668+ORDERED_LIST_TYPES = ('I', 'i', '1', 'A', 'a')
2669+UNORDERED_BULLET_VALUES = ('circle', 'square', 'disc', 'diamond', 'rarrowhead')
2670+LOG_LEVELS = {
2671+ 'DEBUG': logging.DEBUG,
2672+ 'INFO': logging.INFO,
2673+ 'WARNING': logging.WARNING,
2674+ 'ERROR': logging.ERROR,
2675+ 'CRITICAL': logging.CRITICAL}
2676
2677 class IRML2PDF(zope.interface.Interface):
2678 """This is the main public API of z3c.rml"""
2679
2680=== added file 'src/z3c/rml/list.py'
2681--- src/z3c/rml/list.py 1970-01-01 00:00:00 +0000
2682+++ src/z3c/rml/list.py 2013-01-09 02:49:23 +0000
2683@@ -0,0 +1,181 @@
2684+##############################################################################
2685+#
2686+# Copyright (c) 2012 Zope Foundation and Contributors.
2687+# All Rights Reserved.
2688+#
2689+# This software is subject to the provisions of the Zope Public License,
2690+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
2691+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
2692+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2693+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
2694+# FOR A PARTICULAR PURPOSE.
2695+#
2696+##############################################################################
2697+"""``ul``, ``ol``, and ``li`` directives.
2698+"""
2699+__docformat__ = "reStructuredText"
2700+import copy
2701+import reportlab.lib.styles
2702+import reportlab.platypus
2703+import zope.schema
2704+from reportlab.platypus import flowables
2705+
2706+from z3c.rml import attr, directive, flowable, interfaces, occurence, stylesheet
2707+
2708+
2709+class IListItem(stylesheet.IMinimalListStyle, flowable.IFlow):
2710+ """A list item in an ordered or unordered list."""
2711+
2712+ style = attr.Style(
2713+ title=u'Style',
2714+ description=u'The list style that is applied to the list.',
2715+ required=False)
2716+
2717+class ListItem(flowable.Flow):
2718+ signature = IListItem
2719+ klass = reportlab.platypus.ListItem
2720+ attrMapping = {}
2721+
2722+ styleAttributes = zope.schema.getFieldNames(stylesheet.IMinimalListStyle)
2723+
2724+ def processStyle(self, style):
2725+ attrs = self.getAttributeValues(select=self.styleAttributes)
2726+ if attrs or not hasattr(style, 'value'):
2727+ style = copy.deepcopy(style)
2728+ # Sigh, this is needed since unordered list items expect the value.
2729+ style.value = style.start
2730+ for name, value in attrs:
2731+ setattr(style, name, value)
2732+ return style
2733+
2734+ def process(self):
2735+ self.processSubDirectives()
2736+ args = dict(self.getAttributeValues(ignore=self.styleAttributes))
2737+ if 'style' not in args:
2738+ args['style'] = self.parent.baseStyle
2739+ args['style'] = self.processStyle(args['style'])
2740+ li = self.klass(self.flow, **args)
2741+ self.parent.flow.append(li)
2742+
2743+
2744+class IOrderedListItem(IListItem):
2745+ """An ordered list item."""
2746+
2747+ value = attr.Integer(
2748+ title=u'Bullet Value',
2749+ description=u'The counter value.',
2750+ required=False)
2751+
2752+class OrderedListItem(ListItem):
2753+ signature = IOrderedListItem
2754+
2755+
2756+class IUnorderedListItem(IListItem):
2757+ """An ordered list item."""
2758+
2759+ value = attr.Choice(
2760+ title=u'Bullet Value',
2761+ description=u'The type of bullet character.',
2762+ choices=interfaces.UNORDERED_BULLET_VALUES,
2763+ required=False)
2764+
2765+class UnorderedListItem(ListItem):
2766+ signature = IUnorderedListItem
2767+
2768+ styleAttributes = ListItem.styleAttributes + ['value']
2769+
2770+
2771+class IListBase(stylesheet.IBaseListStyle):
2772+
2773+ style = attr.Style(
2774+ title=u'Style',
2775+ description=u'The list style that is applied to the list.',
2776+ required=False)
2777+
2778+class ListBase(directive.RMLDirective):
2779+ klass = reportlab.platypus.ListFlowable
2780+ factories = {'li': ListItem}
2781+ attrMapping = {}
2782+
2783+ styleAttributes = zope.schema.getFieldNames(stylesheet.IBaseListStyle)
2784+
2785+ def __init__(self, *args, **kw):
2786+ super(ListBase, self).__init__(*args, **kw)
2787+ self.flow = []
2788+
2789+ def processStyle(self, style):
2790+ attrs = self.getAttributeValues(
2791+ select=self.styleAttributes, attrMapping=self.attrMapping)
2792+ if attrs:
2793+ style = copy.deepcopy(style)
2794+ for name, value in attrs:
2795+ setattr(style, name, value)
2796+ return style
2797+
2798+ def process(self):
2799+ args = dict(self.getAttributeValues(
2800+ ignore=self.styleAttributes, attrMapping=self.attrMapping))
2801+ if 'style' not in args:
2802+ args['style'] = reportlab.lib.styles.ListStyle('List')
2803+ args['style'] = self.baseStyle = self.processStyle(args['style'])
2804+ self.processSubDirectives()
2805+ li = self.klass(self.flow, **args)
2806+ self.parent.flow.append(li)
2807+
2808+
2809+class IOrderedList(IListBase):
2810+ """An ordered list."""
2811+ occurence.containing(
2812+ occurence.ZeroOrMore('li', IOrderedListItem),
2813+ )
2814+
2815+ bulletType = attr.Choice(
2816+ title=u'Bullet Type',
2817+ description=u'The type of bullet formatting.',
2818+ choices=interfaces.ORDERED_LIST_TYPES,
2819+ doLower=False,
2820+ required=False)
2821+
2822+class OrderedList(ListBase):
2823+ signature = IOrderedList
2824+ factories = {'li': OrderedListItem}
2825+
2826+ styleAttributes = ListBase.styleAttributes + ['bulletType']
2827+
2828+
2829+class IUnorderedList(IListBase):
2830+ """And unordered list."""
2831+ occurence.containing(
2832+ occurence.ZeroOrMore('li', IUnorderedListItem),
2833+ )
2834+
2835+ value = attr.Choice(
2836+ title=u'Bullet Value',
2837+ description=u'The type of bullet character.',
2838+ choices=interfaces.UNORDERED_BULLET_VALUES,
2839+ default='disc',
2840+ required=False)
2841+
2842+class UnorderedList(ListBase):
2843+ signature = IUnorderedList
2844+ attrMapping = {'value': 'start'}
2845+ factories = {'li': UnorderedListItem}
2846+
2847+ def getAttributeValues(self, *args, **kw):
2848+ res = super(UnorderedList, self).getAttributeValues(*args, **kw)
2849+ res.append(('bulletType', 'bullet'))
2850+ return res
2851+
2852+flowable.Flow.factories['ol'] = OrderedList
2853+flowable.IFlow.setTaggedValue(
2854+ 'directives',
2855+ flowable.IFlow.getTaggedValue('directives') +
2856+ (occurence.ZeroOrMore('ol', IOrderedList),)
2857+ )
2858+
2859+flowable.Flow.factories['ul'] = UnorderedList
2860+flowable.IFlow.setTaggedValue(
2861+ 'directives',
2862+ flowable.IFlow.getTaggedValue('directives') +
2863+ (occurence.ZeroOrMore('ul', IUnorderedList),)
2864+ )
2865
2866=== modified file 'src/z3c/rml/paraparser.py'
2867--- src/z3c/rml/paraparser.py 2011-01-05 22:34:45 +0000
2868+++ src/z3c/rml/paraparser.py 2013-01-09 02:49:23 +0000
2869@@ -24,9 +24,12 @@
2870 import reportlab.platypus.paraparser
2871
2872
2873-class DynamicFragment(reportlab.platypus.paraparser.ParaFrag):
2874+class PageNumberFragment(reportlab.platypus.paraparser.ParaFrag):
2875 """A fragment whose `text` is computed at access time."""
2876
2877+ def __init__(self, attributes):
2878+ reportlab.platypus.paraparser.ParaFrag.__init__(self)
2879+
2880 @property
2881 def text(self):
2882 # Guess 1: We're in a paragraph in a story.
2883@@ -43,18 +46,54 @@
2884 return str(canvas.getPageNumber())
2885
2886
2887+class GetNameFragment(reportlab.platypus.paraparser.ParaFrag):
2888+ """A fragment whose `text` is computed at access time."""
2889+
2890+ def __init__(self, attributes):
2891+ reportlab.platypus.paraparser.ParaFrag.__init__(self)
2892+ self.id = attributes['id']
2893+
2894+ @property
2895+ def text(self):
2896+ # Guess 1: We're in a paragraph in a story.
2897+ frame = inspect.currentframe(4)
2898+ canvas = frame.f_locals.get('canvas', None)
2899+
2900+ if canvas is None:
2901+ # Guess 2: We're in a template
2902+ canvas = frame.f_locals.get('canv', None)
2903+
2904+ if canvas is None:
2905+ raise Exception("Can't use <getName/> in this location.")
2906+
2907+ return canvas.manager.names[self.id]
2908+
2909+
2910 class Z3CParagraphParser(reportlab.platypus.paraparser.ParaParser):
2911 """Extensions to paragraph-internal XML parsing."""
2912
2913- def start_pageNumber(self, attributes):
2914- frag = DynamicFragment()
2915+ def startDynamic(self, attributes, klass):
2916+ frag = klass(attributes)
2917 frag.__dict__.update(self._stack[-1].__dict__)
2918- frag.fontName = reportlab.lib.fonts.tt2ps(frag.fontName, frag.bold, frag.italic)
2919+ frag.fontName = reportlab.lib.fonts.tt2ps(
2920+ frag.fontName, frag.bold, frag.italic)
2921 self.fragList.append(frag)
2922 self._stack.append(frag)
2923
2924+ def endDynamic(self):
2925+ self._pop()
2926+
2927+ def start_pageNumber(self, attributes):
2928+ self.startDynamic(attributes, PageNumberFragment)
2929+
2930 def end_pageNumber(self):
2931- self._pop()
2932+ self.endDynamic()
2933+
2934+ def start_getName(self, attributes):
2935+ self.startDynamic(attributes, GetNameFragment)
2936+
2937+ def end_getName(self):
2938+ self.endDynamic()
2939
2940
2941 # Monkey-patch reportlabs global parser instance. Wah.
2942
2943=== added file 'src/z3c/rml/pdfinclude.py'
2944--- src/z3c/rml/pdfinclude.py 1970-01-01 00:00:00 +0000
2945+++ src/z3c/rml/pdfinclude.py 2013-01-09 02:49:23 +0000
2946@@ -0,0 +1,113 @@
2947+##############################################################################
2948+#
2949+# Copyright (c) 2012 Zope Foundation and Contributors.
2950+# All Rights Reserved.
2951+#
2952+# This software is subject to the provisions of the Zope Public License,
2953+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
2954+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
2955+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2956+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
2957+# FOR A PARTICULAR PURPOSE.
2958+#
2959+##############################################################################
2960+"""``pdfInclude`` Directive.
2961+"""
2962+__docformat__ = "reStructuredText"
2963+try:
2964+ import pyPdf
2965+except ImportError:
2966+ pyPdf = None
2967+from reportlab.platypus import flowables
2968+
2969+from z3c.rml import attr, flowable, interfaces, occurence, page
2970+
2971+
2972+class IncludePdfPagesFlowable(flowables.Flowable):
2973+
2974+ def __init__(self, pdf_file, pages, mergeprocessor):
2975+ flowables.Flowable.__init__(self)
2976+ self.pdf_file = pdf_file
2977+ self.proc = mergeprocessor
2978+
2979+ pdf = pyPdf.PdfFileReader(pdf_file)
2980+ self.num_pages = pdf.getNumPages()
2981+ self.pages = pages if pages else range(1, self.num_pages+1)
2982+
2983+ self.width = 10<<32
2984+ self.height = 10<<32
2985+
2986+ def draw():
2987+ return NotImplementedError('PDFPages shall be drawn not me')
2988+
2989+ def split(self, availWidth, availheight):
2990+ result = []
2991+ for i in self.pages:
2992+ result.append(flowables.PageBreak())
2993+ result.append(PDFPageFlowable(self, i-1, availWidth, availheight))
2994+ return result
2995+
2996+
2997+class PDFPageFlowable(flowables.Flowable):
2998+
2999+ def __init__(self, parent, pagenumber, width, height):
3000+ flowables.Flowable.__init__(self)
3001+ self.parent = parent
3002+ self.pagenumber = pagenumber
3003+ self.width = width
3004+ self.height = height
3005+
3006+ def draw(self):
3007+ # FIXME : scale and rotate ?
3008+ # self.canv.addLiteral(self.page.getContents())
3009+ proc = self.parent.proc
3010+ outPage = self.canv.getPageNumber()-1
3011+ pageOperations = proc.operations.setdefault(outPage, [])
3012+ pageOperations.append((self.parent.pdf_file, self.pagenumber))
3013+ # flowable.NextPage()
3014+
3015+ def split(self, availWidth, availheight):
3016+ return [self]
3017+
3018+class IIncludePdfPages(interfaces.IRMLDirectiveSignature):
3019+ """Inserts a set of pages from a given PDF."""
3020+
3021+ filename = attr.File(
3022+ title=u'Path to file',
3023+ description=u'The pdf file to include.',
3024+ required=True)
3025+
3026+ pages = attr.IntegerSequence(
3027+ title=u'Pages',
3028+ description=u'A list of pages to insert.',
3029+ required=False)
3030+
3031+
3032+class IncludePdfPages(flowable.Flowable):
3033+ signature = IIncludePdfPages
3034+
3035+ def getProcessor(self):
3036+ manager = attr.getManager(self, interfaces.IPostProcessorManager)
3037+ procs = dict(manager.postProcessors)
3038+ if 'MERGE' not in procs:
3039+ proc = page.MergePostProcessor()
3040+ manager.postProcessors.append(('MERGE', proc))
3041+ return proc
3042+ return procs['MERGE']
3043+
3044+ def process(self):
3045+ if pyPdf is None:
3046+ raise Exception(
3047+ 'pyPdf is not installed, so this feature is not available.')
3048+ args = dict(self.getAttributeValues())
3049+ proc = self.getProcessor()
3050+ self.parent.flow.append(
3051+ IncludePdfPagesFlowable(args['filename'], args.get('pages'), proc))
3052+
3053+
3054+flowable.Flow.factories['includePdfPages'] = IncludePdfPages
3055+flowable.IFlow.setTaggedValue(
3056+ 'directives',
3057+ flowable.IFlow.getTaggedValue('directives') +
3058+ (occurence.ZeroOrMore('includePdfPages', IIncludePdfPages),)
3059+ )
3060
3061=== modified file 'src/z3c/rml/platypus.py'
3062--- src/z3c/rml/platypus.py 2012-04-02 15:47:51 +0000
3063+++ src/z3c/rml/platypus.py 2013-01-09 02:49:23 +0000
3064@@ -13,7 +13,7 @@
3065 ##############################################################################
3066 """Style Related Element Processing
3067
3068-$Id: platypus.py 121449 2011-04-19 16:00:38Z menesis $
3069+$Id: platypus.py 128833 2012-12-21 02:02:02Z srichter $
3070 """
3071 __docformat__ = "reStructuredText"
3072 import reportlab.platypus.flowables
3073@@ -79,6 +79,11 @@
3074 self.canv.bookmarkPage(*self.args, **self.kw)
3075
3076
3077+class Bookmark(BaseFlowable):
3078+ def draw(self):
3079+ self.canv.bookmarkHorizontal(*self.args, **self.kw)
3080+
3081+
3082 class OutlineAdd(BaseFlowable):
3083 def draw(self):
3084 if self.kw.get('key', None) is None:
3085
3086=== modified file 'src/z3c/rml/reference.pt'
3087--- src/z3c/rml/reference.pt 2011-01-05 22:34:45 +0000
3088+++ src/z3c/rml/reference.pt 2013-01-09 02:49:23 +0000
3089@@ -112,7 +112,7 @@
3090 </drawCenteredString>
3091 <setFont name="Helvetica" size="24" />
3092 <drawCenteredString x="10.5cm" y="18.5cm">
3093- Version 0.9
3094+ Version 2.0
3095 </drawCenteredString>
3096 </pageGraphics>
3097 <frame id="main" x1="3cm" y1="2cm" width="17cm" height="25.7cm" />
3098@@ -181,7 +181,7 @@
3099 <outlineAdd level="1" tal:content="directive/name">
3100 Element Name
3101 </outlineAdd>
3102- <bookmark tal:attributes="name directive/id"/>
3103+ <bookmarkPage tal:attributes="name directive/id"/>
3104 <para style="deprecation"
3105 tal:condition="directive/deprecated">
3106 <b>Deprecated:</b>
3107
3108=== modified file 'src/z3c/rml/reference.py'
3109--- src/z3c/rml/reference.py 2011-01-05 22:34:45 +0000
3110+++ src/z3c/rml/reference.py 2013-01-09 02:49:23 +0000
3111@@ -13,23 +13,20 @@
3112 ##############################################################################
3113 """RML Reference Generator
3114
3115-$Id: reference.py 114907 2010-07-22 01:59:57Z srichter $
3116+$Id: reference.py 128766 2012-12-19 01:37:16Z srichter $
3117 """
3118 __docformat__ = "reStructuredText"
3119 import copy
3120 import re
3121 import os
3122+import pygments.token
3123 import zope.schema
3124 import zope.schema.interfaces
3125 from lxml import etree
3126 from xml.sax import saxutils
3127+from pygments.lexers import XmlLexer
3128 from z3c.rml import attr, document, interfaces, pagetemplate
3129
3130-try:
3131- import SilverCity
3132-except ImportError:
3133- SilverCity = None
3134-
3135
3136 INPUT_URL = ('http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/'
3137 'rml/tests/input/%s')
3138@@ -41,10 +38,8 @@
3139 attr.TextNode, attr.TextNodeSequence, attr.TextNodeGrid,
3140 attr.RawXMLContent, attr.XMLContent)
3141 STYLES_FORMATTING = {
3142- 1 : ('<font textColor="red">', '</font>'),
3143- #3 : ('<font textColor="blue">', '</font>'),
3144- 6 : ('<font textColor="blue">', '</font>'),
3145- 11 : ('<font textColor="red">', '</font>'),
3146+ pygments.token.Name.Tag : ('<font textColor="red">', '</font>'),
3147+ pygments.token.Literal.String : ('<font textColor="blue">', '</font>'),
3148 }
3149 EXAMPLE_NS = 'http://namespaces.zope.org/rml/doc'
3150 EXAMPLE_ATTR_NAME = '{%s}example' %EXAMPLE_NS
3151@@ -79,13 +74,11 @@
3152 return '\n'.join(result)
3153
3154 def highlightRML(rml):
3155- if SilverCity is None:
3156- return saxutils.escape(rml)
3157- lexer = SilverCity.XML.XMLLexer()
3158+ lexer = XmlLexer()
3159 styledRml = ''
3160- for piece in lexer.tokenize_by_style(rml):
3161- start, end = STYLES_FORMATTING.get(piece['style'], ('', ''))
3162- styledRml += start + saxutils.escape(piece['text']) + end
3163+ for ttype, token in lexer.get_tokens(rml):
3164+ start, end = STYLES_FORMATTING.get(ttype, ('', ''))
3165+ styledRml += start + saxutils.escape(token) + end
3166 return styledRml
3167
3168
3169@@ -228,6 +221,8 @@
3170 for dirExamples in examples.values():
3171 for example in dirExamples:
3172 xml = etree.tounicode(example['element']).strip()
3173+ xml = re.sub(
3174+ ' ?xmlns:doc="http://namespaces.zope.org/rml/doc"', '', xml)
3175 xml = dedent(xml)
3176 xml = enforceColumns(xml, 80)
3177 xml = highlightRML(xml)
3178
3179=== added file 'src/z3c/rml/rlfix.py'
3180--- src/z3c/rml/rlfix.py 1970-01-01 00:00:00 +0000
3181+++ src/z3c/rml/rlfix.py 2013-01-09 02:49:23 +0000
3182@@ -0,0 +1,42 @@
3183+##############################################################################
3184+#
3185+# Copyright (c) 2012 Zope Foundation and Contributors.
3186+# All Rights Reserved.
3187+#
3188+# This software is subject to the provisions of the Zope Public License,
3189+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
3190+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
3191+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
3192+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
3193+# FOR A PARTICULAR PURPOSE.
3194+#
3195+##############################################################################
3196+"""ReportLab fixups.
3197+"""
3198+__docformat__ = "reStructuredText"
3199+from reportlab.pdfbase import pdfform
3200+from reportlab.pdfbase.pdfpattern import PDFPattern
3201+from reportlab.graphics import testshapes
3202+
3203+def resetPdfForm():
3204+ pdfform.PDFDOCENC = PDFPattern(pdfform.PDFDocEncodingPattern)
3205+ pdfform.ENCODING = PDFPattern(
3206+ pdfform.EncodingPattern, PDFDocEncoding=pdfform.PDFDOCENC)
3207+ pdfform.GLOBALFONTSDICTIONARY = pdfform.FormFontsDictionary()
3208+ pdfform.GLOBALRESOURCES = pdfform.FormResources()
3209+ pdfform.ZADB = PDFPattern(pdfform.ZaDbPattern)
3210+
3211+def resetFonts():
3212+ for f in testshapes._setup():
3213+ if f not in testshapes._FONTS:
3214+ testshapes._FONTS.append(f)
3215+
3216+def setSideLabels():
3217+ from reportlab.graphics.charts import piecharts
3218+ piecharts.Pie3d.sideLabels = 0
3219+setSideLabels()
3220+
3221+from reportlab.rl_config import register_reset
3222+register_reset(resetPdfForm)
3223+register_reset(resetFonts)
3224+del register_reset
3225
3226=== modified file 'src/z3c/rml/rml-reference.pdf'
3227--- src/z3c/rml/rml-reference.pdf 2011-01-05 22:34:45 +0000
3228+++ src/z3c/rml/rml-reference.pdf 2013-01-09 02:49:23 +0000
3229@@ -23,12 +23,12 @@
3230 % 'Page1': class PDFPage
3231 3 0 obj
3232 % Page dictionary
3233-<< /Contents 1007 0 R
3234+<< /Contents 1248 0 R
3235 /MediaBox [ 0
3236 0
3237 595.2756
3238 841.8898 ]
3239- /Parent 1006 0 R
3240+ /Parent 1247 0 R
3241 /Resources << /Font 1 0 R
3242 /ProcSet [ /PDF
3243 /Text
3244@@ -60,12 +60,12 @@
3245 % 'Page2': class PDFPage
3246 6 0 obj
3247 % Page dictionary
3248-<< /Contents 1008 0 R
3249+<< /Contents 1249 0 R
3250 /MediaBox [ 0
3251 0
3252 595.2756
3253 841.8898 ]
3254- /Parent 1006 0 R
3255+ /Parent 1247 0 R
3256 /Resources << /Font 1 0 R
3257 /ProcSet [ /PDF
3258 /Text
3259@@ -88,12 +88,12 @@
3260 % 'Page3': class PDFPage
3261 8 0 obj
3262 % Page dictionary
3263-<< /Contents 1009 0 R
3264+<< /Contents 1250 0 R
3265 /MediaBox [ 0
3266 0
3267 595.2756
3268 841.8898 ]
3269- /Parent 1006 0 R
3270+ /Parent 1247 0 R
3271 /Resources << /Font 1 0 R
3272 /ProcSet [ /PDF
3273 /Text
3274@@ -107,12 +107,12 @@
3275 % 'Page4': class PDFPage
3276 9 0 obj
3277 % Page dictionary
3278-<< /Contents 1010 0 R
3279+<< /Contents 1251 0 R
3280 /MediaBox [ 0
3281 0
3282 595.2756
3283 841.8898 ]
3284- /Parent 1006 0 R
3285+ /Parent 1247 0 R
3286 /Resources << /Font 1 0 R
3287 /ProcSet [ /PDF
3288 /Text
3289@@ -159,9 +159,9 @@
3290 0
3291 0 ]
3292 /Rect [ 150.2861
3293- 470.9469
3294+ 482.9469
3295 241.3961
3296- 482.9469 ]
3297+ 494.9469 ]
3298 /Subtype /Link
3299 /Type /Annot >>
3300 endobj
3301@@ -174,9 +174,9 @@
3302 0
3303 0 ]
3304 /Rect [ 297.6378
3305- 470.9469
3306+ 482.9469
3307 297.6378
3308- 482.9469 ]
3309+ 494.9469 ]
3310 /Subtype /Link
3311 /Type /Annot >>
3312 endobj
3313@@ -189,9 +189,9 @@
3314 0
3315 0 ]
3316 /Rect [ 297.6378
3317- 470.9469
3318- 322.6378
3319- 482.9469 ]
3320+ 482.9469
3321+ 323.1978
3322+ 494.9469 ]
3323 /Subtype /Link
3324 /Type /Annot >>
3325 endobj
3326@@ -203,10 +203,10 @@
3327 /Border [ 0
3328 0
3329 0 ]
3330- /Rect [ 322.6378
3331- 470.9469
3332- 322.6378
3333- 482.9469 ]
3334+ /Rect [ 323.1978
3335+ 482.9469
3336+ 323.1978
3337+ 494.9469 ]
3338 /Subtype /Link
3339 /Type /Annot >>
3340 endobj
3341@@ -219,9 +219,9 @@
3342 0
3343 0 ]
3344 /Rect [ 150.2861
3345- 282.9469
3346+ 306.9469
3347 209.7361
3348- 294.9469 ]
3349+ 318.9469 ]
3350 /Subtype /Link
3351 /Type /Annot >>
3352 endobj
3353@@ -234,9 +234,9 @@
3354 0
3355 0 ]
3356 /Rect [ 297.6378
3357- 282.9469
3358+ 306.9469
3359 297.6378
3360- 294.9469 ]
3361+ 318.9469 ]
3362 /Subtype /Link
3363 /Type /Annot >>
3364 endobj
3365@@ -249,9 +249,9 @@
3366 0
3367 0 ]
3368 /Rect [ 297.6378
3369- 282.9469
3370- 322.6378
3371- 294.9469 ]
3372+ 306.9469
3373+ 323.1978
3374+ 318.9469 ]
3375 /Subtype /Link
3376 /Type /Annot >>
3377 endobj
3378@@ -263,10 +263,10 @@
3379 /Border [ 0
3380 0
3381 0 ]
3382- /Rect [ 322.6378
3383- 282.9469
3384- 322.6378
3385- 294.9469 ]
3386+ /Rect [ 323.1978
3387+ 306.9469
3388+ 323.1978
3389+ 318.9469 ]
3390 /Subtype /Link
3391 /Type /Annot >>
3392 endobj
3393@@ -279,9 +279,9 @@
3394 0
3395 0 ]
3396 /Rect [ 150.2861
3397- 65.94685
3398+ 101.9469
3399 227.5161
3400- 77.94685 ]
3401+ 113.9469 ]
3402 /Subtype /Link
3403 /Type /Annot >>
3404 endobj
3405@@ -294,9 +294,9 @@
3406 0
3407 0 ]
3408 /Rect [ 297.6378
3409- 65.94685
3410+ 101.9469
3411 297.6378
3412- 77.94685 ]
3413+ 113.9469 ]
3414 /Subtype /Link
3415 /Type /Annot >>
3416 endobj
3417@@ -309,9 +309,9 @@
3418 0
3419 0 ]
3420 /Rect [ 297.6378
3421- 65.94685
3422- 322.6378
3423- 77.94685 ]
3424+ 101.9469
3425+ 323.1978
3426+ 113.9469 ]
3427 /Subtype /Link
3428 /Type /Annot >>
3429 endobj
3430@@ -323,10 +323,10 @@
3431 /Border [ 0
3432 0
3433 0 ]
3434- /Rect [ 322.6378
3435- 65.94685
3436- 322.6378
3437- 77.94685 ]
3438+ /Rect [ 323.1978
3439+ 101.9469
3440+ 323.1978
3441+ 113.9469 ]
3442 /Subtype /Link
3443 /Type /Annot >>
3444 endobj
3445@@ -345,12 +345,12 @@
3446 22 0 R
3447 23 0 R
3448 24 0 R ]
3449- /Contents 1011 0 R
3450+ /Contents 1252 0 R
3451 /MediaBox [ 0
3452 0
3453 595.2756
3454 841.8898 ]
3455- /Parent 1006 0 R
3456+ /Parent 1247 0 R
3457 /Resources << /Font 1 0 R
3458 /ProcSet [ /PDF
3459 /Text
3460@@ -367,12 +367,12 @@
3461 0
3462 0 ]
3463 /Contents ()
3464- /Dest [ 230 0 R
3465+ /Dest [ 229 0 R
3466 /Fit ]
3467 /Rect [ 56.69291
3468- 144.1969
3469+ 183.1969
3470 538.5827
3471- 156.1969 ]
3472+ 195.1969 ]
3473 /Subtype /Link
3474 /Type /Annot >>
3475 endobj
3476@@ -382,12 +382,12 @@
3477 0
3478 0 ]
3479 /Contents ()
3480- /Dest [ 75 0 R
3481+ /Dest [ 69 0 R
3482 /Fit ]
3483 /Rect [ 56.69291
3484- 132.1969
3485+ 171.1969
3486 538.5827
3487- 144.1969 ]
3488+ 183.1969 ]
3489 /Subtype /Link
3490 /Type /Annot >>
3491 endobj
3492@@ -400,9 +400,9 @@
3493 /Dest [ 166 0 R
3494 /Fit ]
3495 /Rect [ 56.69291
3496- 120.1969
3497+ 159.1969
3498 538.5827
3499- 132.1969 ]
3500+ 171.1969 ]
3501 /Subtype /Link
3502 /Type /Annot >>
3503 endobj
3504@@ -412,12 +412,12 @@
3505 0
3506 0 ]
3507 /Contents ()
3508- /Dest [ 815 0 R
3509+ /Dest [ 1015 0 R
3510 /Fit ]
3511 /Rect [ 56.69291
3512- 108.1969
3513+ 147.1969
3514 538.5827
3515- 120.1969 ]
3516+ 159.1969 ]
3517 /Subtype /Link
3518 /Type /Annot >>
3519 endobj
3520@@ -427,12 +427,12 @@
3521 0
3522 0 ]
3523 /Contents ()
3524- /Dest [ 68 0 R
3525+ /Dest [ 67 0 R
3526 /Fit ]
3527 /Rect [ 56.69291
3528- 96.19685
3529+ 135.1969
3530 538.5827
3531- 108.1969 ]
3532+ 147.1969 ]
3533 /Subtype /Link
3534 /Type /Annot >>
3535 endobj
3536@@ -442,12 +442,12 @@
3537 0
3538 0 ]
3539 /Contents ()
3540- /Dest [ 796 0 R
3541+ /Dest [ 981 0 R
3542 /Fit ]
3543 /Rect [ 56.69291
3544- 84.19685
3545+ 123.1969
3546 538.5827
3547- 96.19685 ]
3548+ 135.1969 ]
3549 /Subtype /Link
3550 /Type /Annot >>
3551 endobj
3552@@ -460,12 +460,12 @@
3553 29 0 R
3554 30 0 R
3555 31 0 R ]
3556- /Contents 1012 0 R
3557+ /Contents 1253 0 R
3558 /MediaBox [ 0
3559 0
3560 595.2756
3561 841.8898 ]
3562- /Parent 1006 0 R
3563+ /Parent 1247 0 R
3564 /Resources << /Font 1 0 R
3565 /ProcSet [ /PDF
3566 /Text
3567@@ -485,9 +485,9 @@
3568 0
3569 0 ]
3570 /Rect [ 150.2861
3571- 470.9469
3572+ 518.9469
3573 227.5161
3574- 482.9469 ]
3575+ 530.9469 ]
3576 /Subtype /Link
3577 /Type /Annot >>
3578 endobj
3579@@ -500,9 +500,9 @@
3580 0
3581 0 ]
3582 /Rect [ 297.6378
3583- 470.9469
3584+ 518.9469
3585 297.6378
3586- 482.9469 ]
3587+ 530.9469 ]
3588 /Subtype /Link
3589 /Type /Annot >>
3590 endobj
3591@@ -515,9 +515,9 @@
3592 0
3593 0 ]
3594 /Rect [ 297.6378
3595- 470.9469
3596- 322.6378
3597- 482.9469 ]
3598+ 518.9469
3599+ 323.1978
3600+ 530.9469 ]
3601 /Subtype /Link
3602 /Type /Annot >>
3603 endobj
3604@@ -529,10 +529,10 @@
3605 /Border [ 0
3606 0
3607 0 ]
3608- /Rect [ 322.6378
3609- 470.9469
3610- 322.6378
3611- 482.9469 ]
3612+ /Rect [ 323.1978
3613+ 518.9469
3614+ 323.1978
3615+ 530.9469 ]
3616 /Subtype /Link
3617 /Type /Annot >>
3618 endobj
3619@@ -543,12 +543,12 @@
3620 34 0 R
3621 35 0 R
3622 36 0 R ]
3623- /Contents 1013 0 R
3624+ /Contents 1254 0 R
3625 /MediaBox [ 0
3626 0
3627 595.2756
3628 841.8898 ]
3629- /Parent 1006 0 R
3630+ /Parent 1247 0 R
3631 /Resources << /Font 1 0 R
3632 /ProcSet [ /PDF
3633 /Text
3634@@ -565,12 +565,12 @@
3635 0
3636 0 ]
3637 /Contents ()
3638- /Dest [ 230 0 R
3639+ /Dest [ 229 0 R
3640 /Fit ]
3641 /Rect [ 56.69291
3642- 432.1969
3643+ 473.1969
3644 538.5827
3645- 444.1969 ]
3646+ 485.1969 ]
3647 /Subtype /Link
3648 /Type /Annot >>
3649 endobj
3650@@ -580,12 +580,12 @@
3651 0
3652 0 ]
3653 /Contents ()
3654- /Dest [ 75 0 R
3655+ /Dest [ 69 0 R
3656 /Fit ]
3657 /Rect [ 56.69291
3658- 420.1969
3659+ 461.1969
3660 538.5827
3661- 432.1969 ]
3662+ 473.1969 ]
3663 /Subtype /Link
3664 /Type /Annot >>
3665 endobj
3666@@ -598,9 +598,9 @@
3667 /Dest [ 166 0 R
3668 /Fit ]
3669 /Rect [ 56.69291
3670- 408.1969
3671+ 449.1969
3672 538.5827
3673- 420.1969 ]
3674+ 461.1969 ]
3675 /Subtype /Link
3676 /Type /Annot >>
3677 endobj
3678@@ -610,12 +610,12 @@
3679 0
3680 0 ]
3681 /Contents ()
3682- /Dest [ 815 0 R
3683+ /Dest [ 1015 0 R
3684 /Fit ]
3685 /Rect [ 56.69291
3686- 396.1969
3687+ 437.1969
3688 538.5827
3689- 408.1969 ]
3690+ 449.1969 ]
3691 /Subtype /Link
3692 /Type /Annot >>
3693 endobj
3694@@ -625,12 +625,12 @@
3695 0
3696 0 ]
3697 /Contents ()
3698- /Dest [ 68 0 R
3699+ /Dest [ 67 0 R
3700 /Fit ]
3701 /Rect [ 56.69291
3702- 384.1969
3703+ 425.1969
3704 538.5827
3705- 396.1969 ]
3706+ 437.1969 ]
3707 /Subtype /Link
3708 /Type /Annot >>
3709 endobj
3710@@ -640,12 +640,12 @@
3711 0
3712 0 ]
3713 /Contents ()
3714- /Dest [ 796 0 R
3715+ /Dest [ 981 0 R
3716 /Fit ]
3717 /Rect [ 56.69291
3718- 372.1969
3719+ 413.1969
3720 538.5827
3721- 384.1969 ]
3722+ 425.1969 ]
3723 /Subtype /Link
3724 /Type /Annot >>
3725 endobj
3726@@ -658,9 +658,9 @@
3727 0
3728 0 ]
3729 /Rect [ 150.2861
3730- 66.94685
3731+ 119.9469
3732 237.5161
3733- 78.94685 ]
3734+ 131.9469 ]
3735 /Subtype /Link
3736 /Type /Annot >>
3737 endobj
3738@@ -673,9 +673,9 @@
3739 0
3740 0 ]
3741 /Rect [ 297.6378
3742- 66.94685
3743+ 119.9469
3744 297.6378
3745- 78.94685 ]
3746+ 131.9469 ]
3747 /Subtype /Link
3748 /Type /Annot >>
3749 endobj
3750@@ -688,9 +688,9 @@
3751 0
3752 0 ]
3753 /Rect [ 297.6378
3754- 66.94685
3755- 322.6378
3756- 78.94685 ]
3757+ 119.9469
3758+ 323.1978
3759+ 131.9469 ]
3760 /Subtype /Link
3761 /Type /Annot >>
3762 endobj
3763@@ -702,10 +702,10 @@
3764 /Border [ 0
3765 0
3766 0 ]
3767- /Rect [ 322.6378
3768- 66.94685
3769- 322.6378
3770- 78.94685 ]
3771+ /Rect [ 323.1978
3772+ 119.9469
3773+ 323.1978
3774+ 131.9469 ]
3775 /Subtype /Link
3776 /Type /Annot >>
3777 endobj
3778@@ -722,12 +722,12 @@
3779 45 0 R
3780 46 0 R
3781 47 0 R ]
3782- /Contents 1014 0 R
3783+ /Contents 1255 0 R
3784 /MediaBox [ 0
3785 0
3786 595.2756
3787 841.8898 ]
3788- /Parent 1006 0 R
3789+ /Parent 1247 0 R
3790 /Resources << /Font 1 0 R
3791 /ProcSet [ /PDF
3792 /Text
3793@@ -741,12 +741,12 @@
3794 % 'Page9': class PDFPage
3795 49 0 obj
3796 % Page dictionary
3797-<< /Contents 1015 0 R
3798+<< /Contents 1256 0 R
3799 /MediaBox [ 0
3800 0
3801 595.2756
3802 841.8898 ]
3803- /Parent 1006 0 R
3804+ /Parent 1247 0 R
3805 /Resources << /Font 1 0 R
3806 /ProcSet [ /PDF
3807 /Text
3808@@ -766,9 +766,9 @@
3809 0
3810 0 ]
3811 /Rect [ 150.2861
3812- 458.9469
3813+ 545.9469
3814 223.0561
3815- 470.9469 ]
3816+ 557.9469 ]
3817 /Subtype /Link
3818 /Type /Annot >>
3819 endobj
3820@@ -781,9 +781,9 @@
3821 0
3822 0 ]
3823 /Rect [ 297.6378
3824- 458.9469
3825+ 545.9469
3826 297.6378
3827- 470.9469 ]
3828+ 557.9469 ]
3829 /Subtype /Link
3830 /Type /Annot >>
3831 endobj
3832@@ -796,9 +796,9 @@
3833 0
3834 0 ]
3835 /Rect [ 297.6378
3836- 458.9469
3837- 322.6378
3838- 470.9469 ]
3839+ 545.9469
3840+ 323.1978
3841+ 557.9469 ]
3842 /Subtype /Link
3843 /Type /Annot >>
3844 endobj
3845@@ -810,10 +810,10 @@
3846 /Border [ 0
3847 0
3848 0 ]
3849- /Rect [ 322.6378
3850- 458.9469
3851- 322.6378
3852- 470.9469 ]
3853+ /Rect [ 323.1978
3854+ 545.9469
3855+ 323.1978
3856+ 557.9469 ]
3857 /Subtype /Link
3858 /Type /Annot >>
3859 endobj
3860@@ -826,9 +826,9 @@
3861 0
3862 0 ]
3863 /Rect [ 150.2861
3864- 356.9469
3865+ 455.9469
3866 223.0561
3867- 368.9469 ]
3868+ 467.9469 ]
3869 /Subtype /Link
3870 /Type /Annot >>
3871 endobj
3872@@ -841,9 +841,9 @@
3873 0
3874 0 ]
3875 /Rect [ 297.6378
3876- 356.9469
3877+ 455.9469
3878 297.6378
3879- 368.9469 ]
3880+ 467.9469 ]
3881 /Subtype /Link
3882 /Type /Annot >>
3883 endobj
3884@@ -856,9 +856,9 @@
3885 0
3886 0 ]
3887 /Rect [ 297.6378
3888- 356.9469
3889- 322.6378
3890- 368.9469 ]
3891+ 455.9469
3892+ 323.1978
3893+ 467.9469 ]
3894 /Subtype /Link
3895 /Type /Annot >>
3896 endobj
3897@@ -870,10 +870,10 @@
3898 /Border [ 0
3899 0
3900 0 ]
3901- /Rect [ 322.6378
3902- 356.9469
3903- 322.6378
3904- 368.9469 ]
3905+ /Rect [ 323.1978
3906+ 455.9469
3907+ 323.1978
3908+ 467.9469 ]
3909 /Subtype /Link
3910 /Type /Annot >>
3911 endobj
3912@@ -888,12 +888,12 @@
3913 55 0 R
3914 56 0 R
3915 57 0 R ]
3916- /Contents 1016 0 R
3917+ /Contents 1257 0 R
3918 /MediaBox [ 0
3919 0
3920 595.2756
3921 841.8898 ]
3922- /Parent 1006 0 R
3923+ /Parent 1247 0 R
3924 /Resources << /Font 1 0 R
3925 /ProcSet [ /PDF
3926 /Text
3927@@ -913,9 +913,9 @@
3928 0
3929 0 ]
3930 /Rect [ 150.2861
3931- 125.9469
3932+ 294.9469
3933 263.0661
3934- 137.9469 ]
3935+ 306.9469 ]
3936 /Subtype /Link
3937 /Type /Annot >>
3938 endobj
3939@@ -928,9 +928,9 @@
3940 0
3941 0 ]
3942 /Rect [ 297.6378
3943- 113.9469
3944+ 282.9469
3945 297.6378
3946- 125.9469 ]
3947+ 294.9469 ]
3948 /Subtype /Link
3949 /Type /Annot >>
3950 endobj
3951@@ -943,9 +943,9 @@
3952 0
3953 0 ]
3954 /Rect [ 297.6378
3955- 113.9469
3956- 322.6378
3957- 125.9469 ]
3958+ 282.9469
3959+ 323.1978
3960+ 294.9469 ]
3961 /Subtype /Link
3962 /Type /Annot >>
3963 endobj
3964@@ -957,52 +957,44 @@
3965 /Border [ 0
3966 0
3967 0 ]
3968- /Rect [ 322.6378
3969- 113.9469
3970- 322.6378
3971- 125.9469 ]
3972+ /Rect [ 323.1978
3973+ 282.9469
3974+ 323.1978
3975+ 294.9469 ]
3976 /Subtype /Link
3977 /Type /Annot >>
3978 endobj
3979-% 'Page11': class PDFPage
3980+% 'Annot.NUMBER45': class PDFDictionary
3981 63 0 obj
3982-% Page dictionary
3983-<< /Annots [ 59 0 R
3984- 60 0 R
3985- 61 0 R
3986- 62 0 R ]
3987- /Contents 1017 0 R
3988- /MediaBox [ 0
3989+<< /A << /S /URI
3990+ /Type /Action
3991+ /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-barCodeFlowable.rml) >>
3992+ /Border [ 0
3993 0
3994- 595.2756
3995- 841.8898 ]
3996- /Parent 1006 0 R
3997- /Resources << /Font 1 0 R
3998- /ProcSet [ /PDF
3999- /Text
4000- /ImageB
4001- /ImageC
4002- /ImageI ] >>
4003- /Rotate 0
4004- /Trans << >>
4005- /Type /Page >>
4006+ 0 ]
4007+ /Rect [ 150.2861
4008+ 216.9469
4009+ 263.0661
4010+ 228.9469 ]
4011+ /Subtype /Link
4012+ /Type /Annot >>
4013 endobj
4014-% 'Annot.NUMBER45': class PDFDictionary
4015+% 'Annot.NUMBER46': class PDFDictionary
4016 64 0 obj
4017 << /A << /S /URI
4018 /Type /Action
4019- /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-barCodeFlowable.rml) >>
4020+ /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-barCodeFlowable.pdf?view=auto) >>
4021 /Border [ 0
4022 0
4023 0 ]
4024- /Rect [ 150.2861
4025- 770.9469
4026- 263.0661
4027- 782.9469 ]
4028+ /Rect [ 297.6378
4029+ 204.9469
4030+ 297.6378
4031+ 216.9469 ]
4032 /Subtype /Link
4033 /Type /Annot >>
4034 endobj
4035-% 'Annot.NUMBER46': class PDFDictionary
4036+% 'Annot.NUMBER47': class PDFDictionary
4037 65 0 obj
4038 << /A << /S /URI
4039 /Type /Action
4040@@ -1011,13 +1003,13 @@
4041 0
4042 0 ]
4043 /Rect [ 297.6378
4044- 758.9469
4045- 297.6378
4046- 770.9469 ]
4047+ 204.9469
4048+ 323.1978
4049+ 216.9469 ]
4050 /Subtype /Link
4051 /Type /Annot >>
4052 endobj
4053-% 'Annot.NUMBER47': class PDFDictionary
4054+% 'Annot.NUMBER48': class PDFDictionary
4055 66 0 obj
4056 << /A << /S /URI
4057 /Type /Action
4058@@ -1025,41 +1017,30 @@
4059 /Border [ 0
4060 0
4061 0 ]
4062- /Rect [ 297.6378
4063- 758.9469
4064- 322.6378
4065- 770.9469 ]
4066+ /Rect [ 323.1978
4067+ 204.9469
4068+ 323.1978
4069+ 216.9469 ]
4070 /Subtype /Link
4071 /Type /Annot >>
4072 endobj
4073-% 'Annot.NUMBER48': class PDFDictionary
4074+% 'Page11': class PDFPage
4075 67 0 obj
4076-<< /A << /S /URI
4077- /Type /Action
4078- /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-barCodeFlowable.pdf?view=auto) >>
4079- /Border [ 0
4080- 0
4081- 0 ]
4082- /Rect [ 322.6378
4083- 758.9469
4084- 322.6378
4085- 770.9469 ]
4086- /Subtype /Link
4087- /Type /Annot >>
4088-endobj
4089-% 'Page12': class PDFPage
4090-68 0 obj
4091 % Page dictionary
4092-<< /Annots [ 64 0 R
4093+<< /Annots [ 59 0 R
4094+ 60 0 R
4095+ 61 0 R
4096+ 62 0 R
4097+ 63 0 R
4098+ 64 0 R
4099 65 0 R
4100- 66 0 R
4101- 67 0 R ]
4102- /Contents 1018 0 R
4103+ 66 0 R ]
4104+ /Contents 1258 0 R
4105 /MediaBox [ 0
4106 0
4107 595.2756
4108 841.8898 ]
4109- /Parent 1006 0 R
4110+ /Parent 1247 0 R
4111 /Resources << /Font 1 0 R
4112 /ProcSet [ /PDF
4113 /Text
4114@@ -1071,19 +1052,39 @@
4115 /Type /Page >>
4116 endobj
4117 % 'Annot.NUMBER49': class LinkAnnotation
4118+68 0 obj
4119+<< /Border [ 0
4120+ 0
4121+ 0 ]
4122+ /Contents ()
4123+ /Dest [ 449 0 R
4124+ /Fit ]
4125+ /Rect [ 56.69291
4126+ 154.1969
4127+ 538.5827
4128+ 166.1969 ]
4129+ /Subtype /Link
4130+ /Type /Annot >>
4131+endobj
4132+% 'Page12': class PDFPage
4133 69 0 obj
4134-<< /Border [ 0
4135+% Page dictionary
4136+<< /Annots [ 68 0 R ]
4137+ /Contents 1259 0 R
4138+ /MediaBox [ 0
4139 0
4140- 0 ]
4141- /Contents ()
4142- /Dest [ 338 0 R
4143- /Fit ]
4144- /Rect [ 56.69291
4145- 705.1969
4146- 538.5827
4147- 717.1969 ]
4148- /Subtype /Link
4149- /Type /Annot >>
4150+ 595.2756
4151+ 841.8898 ]
4152+ /Parent 1247 0 R
4153+ /Resources << /Font 1 0 R
4154+ /ProcSet [ /PDF
4155+ /Text
4156+ /ImageB
4157+ /ImageC
4158+ /ImageI ] >>
4159+ /Rotate 0
4160+ /Trans << >>
4161+ /Type /Page >>
4162 endobj
4163 % 'Annot.NUMBER50': class LinkAnnotation
4164 70 0 obj
4165@@ -1094,9 +1095,9 @@
4166 /Dest [ 25 0 R
4167 /Fit ]
4168 /Rect [ 56.69291
4169- 518.1969
4170+ 693.1969
4171 538.5827
4172- 530.1969 ]
4173+ 705.1969 ]
4174 /Subtype /Link
4175 /Type /Annot >>
4176 endobj
4177@@ -1109,9 +1110,9 @@
4178 0
4179 0 ]
4180 /Rect [ 150.2861
4181- 304.9469
4182+ 491.9469
4183 254.1661
4184- 316.9469 ]
4185+ 503.9469 ]
4186 /Subtype /Link
4187 /Type /Annot >>
4188 endobj
4189@@ -1124,9 +1125,9 @@
4190 0
4191 0 ]
4192 /Rect [ 297.6378
4193- 304.9469
4194+ 491.9469
4195 297.6378
4196- 316.9469 ]
4197+ 503.9469 ]
4198 /Subtype /Link
4199 /Type /Annot >>
4200 endobj
4201@@ -1139,9 +1140,9 @@
4202 0
4203 0 ]
4204 /Rect [ 297.6378
4205- 304.9469
4206- 322.6378
4207- 316.9469 ]
4208+ 491.9469
4209+ 323.1978
4210+ 503.9469 ]
4211 /Subtype /Link
4212 /Type /Annot >>
4213 endobj
4214@@ -1153,54 +1154,44 @@
4215 /Border [ 0
4216 0
4217 0 ]
4218- /Rect [ 322.6378
4219- 304.9469
4220- 322.6378
4221- 316.9469 ]
4222+ /Rect [ 323.1978
4223+ 491.9469
4224+ 323.1978
4225+ 503.9469 ]
4226 /Subtype /Link
4227 /Type /Annot >>
4228 endobj
4229-% 'Page13': class PDFPage
4230+% 'Annot.NUMBER55': class PDFDictionary
4231 75 0 obj
4232-% Page dictionary
4233-<< /Annots [ 69 0 R
4234- 70 0 R
4235- 71 0 R
4236- 72 0 R
4237- 73 0 R
4238- 74 0 R ]
4239- /Contents 1019 0 R
4240- /MediaBox [ 0
4241+<< /A << /S /URI
4242+ /Type /Action
4243+ /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
4244+ /Border [ 0
4245 0
4246- 595.2756
4247- 841.8898 ]
4248- /Parent 1006 0 R
4249- /Resources << /Font 1 0 R
4250- /ProcSet [ /PDF
4251- /Text
4252- /ImageB
4253- /ImageC
4254- /ImageI ] >>
4255- /Rotate 0
4256- /Trans << >>
4257- /Type /Page >>
4258+ 0 ]
4259+ /Rect [ 150.2861
4260+ 228.9469
4261+ 254.1661
4262+ 240.9469 ]
4263+ /Subtype /Link
4264+ /Type /Annot >>
4265 endobj
4266-% 'Annot.NUMBER55': class PDFDictionary
4267+% 'Annot.NUMBER56': class PDFDictionary
4268 76 0 obj
4269 << /A << /S /URI
4270 /Type /Action
4271- /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
4272+ /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4273 /Border [ 0
4274 0
4275 0 ]
4276- /Rect [ 150.2861
4277- 746.9469
4278- 254.1661
4279- 758.9469 ]
4280+ /Rect [ 297.6378
4281+ 228.9469
4282+ 297.6378
4283+ 240.9469 ]
4284 /Subtype /Link
4285 /Type /Annot >>
4286 endobj
4287-% 'Annot.NUMBER56': class PDFDictionary
4288+% 'Annot.NUMBER57': class PDFDictionary
4289 77 0 obj
4290 << /A << /S /URI
4291 /Type /Action
4292@@ -1209,13 +1200,13 @@
4293 0
4294 0 ]
4295 /Rect [ 297.6378
4296- 746.9469
4297- 297.6378
4298- 758.9469 ]
4299+ 228.9469
4300+ 323.1978
4301+ 240.9469 ]
4302 /Subtype /Link
4303 /Type /Annot >>
4304 endobj
4305-% 'Annot.NUMBER57': class PDFDictionary
4306+% 'Annot.NUMBER58': class PDFDictionary
4307 78 0 obj
4308 << /A << /S /URI
4309 /Type /Action
4310@@ -1223,27 +1214,40 @@
4311 /Border [ 0
4312 0
4313 0 ]
4314- /Rect [ 297.6378
4315- 746.9469
4316- 322.6378
4317- 758.9469 ]
4318+ /Rect [ 323.1978
4319+ 228.9469
4320+ 323.1978
4321+ 240.9469 ]
4322 /Subtype /Link
4323 /Type /Annot >>
4324 endobj
4325-% 'Annot.NUMBER58': class PDFDictionary
4326+% 'Page13': class PDFPage
4327 79 0 obj
4328-<< /A << /S /URI
4329- /Type /Action
4330- /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4331- /Border [ 0
4332+% Page dictionary
4333+<< /Annots [ 70 0 R
4334+ 71 0 R
4335+ 72 0 R
4336+ 73 0 R
4337+ 74 0 R
4338+ 75 0 R
4339+ 76 0 R
4340+ 77 0 R
4341+ 78 0 R ]
4342+ /Contents 1260 0 R
4343+ /MediaBox [ 0
4344 0
4345- 0 ]
4346- /Rect [ 322.6378
4347- 746.9469
4348- 322.6378
4349- 758.9469 ]
4350- /Subtype /Link
4351- /Type /Annot >>
4352+ 595.2756
4353+ 841.8898 ]
4354+ /Parent 1247 0 R
4355+ /Resources << /Font 1 0 R
4356+ /ProcSet [ /PDF
4357+ /Text
4358+ /ImageB
4359+ /ImageC
4360+ /ImageI ] >>
4361+ /Rotate 0
4362+ /Trans << >>
4363+ /Type /Page >>
4364 endobj
4365 % 'Annot.NUMBER59': class PDFDictionary
4366 80 0 obj
4367@@ -1254,9 +1258,9 @@
4368 0
4369 0 ]
4370 /Rect [ 150.2861
4371- 529.9469
4372+ 741.9469
4373 254.1661
4374- 541.9469 ]
4375+ 753.9469 ]
4376 /Subtype /Link
4377 /Type /Annot >>
4378 endobj
4379@@ -1269,9 +1273,9 @@
4380 0
4381 0 ]
4382 /Rect [ 297.6378
4383- 529.9469
4384+ 741.9469
4385 297.6378
4386- 541.9469 ]
4387+ 753.9469 ]
4388 /Subtype /Link
4389 /Type /Annot >>
4390 endobj
4391@@ -1284,9 +1288,9 @@
4392 0
4393 0 ]
4394 /Rect [ 297.6378
4395- 529.9469
4396- 322.6378
4397- 541.9469 ]
4398+ 741.9469
4399+ 323.1978
4400+ 753.9469 ]
4401 /Subtype /Link
4402 /Type /Annot >>
4403 endobj
4404@@ -1298,10 +1302,10 @@
4405 /Border [ 0
4406 0
4407 0 ]
4408- /Rect [ 322.6378
4409- 529.9469
4410- 322.6378
4411- 541.9469 ]
4412+ /Rect [ 323.1978
4413+ 741.9469
4414+ 323.1978
4415+ 753.9469 ]
4416 /Subtype /Link
4417 /Type /Annot >>
4418 endobj
4419@@ -1314,9 +1318,9 @@
4420 0
4421 0 ]
4422 /Rect [ 150.2861
4423- 312.9469
4424+ 536.9469
4425 254.1661
4426- 324.9469 ]
4427+ 548.9469 ]
4428 /Subtype /Link
4429 /Type /Annot >>
4430 endobj
4431@@ -1329,9 +1333,9 @@
4432 0
4433 0 ]
4434 /Rect [ 297.6378
4435- 312.9469
4436+ 536.9469
4437 297.6378
4438- 324.9469 ]
4439+ 548.9469 ]
4440 /Subtype /Link
4441 /Type /Annot >>
4442 endobj
4443@@ -1344,9 +1348,9 @@
4444 0
4445 0 ]
4446 /Rect [ 297.6378
4447- 312.9469
4448- 322.6378
4449- 324.9469 ]
4450+ 536.9469
4451+ 323.1978
4452+ 548.9469 ]
4453 /Subtype /Link
4454 /Type /Annot >>
4455 endobj
4456@@ -1358,60 +1362,44 @@
4457 /Border [ 0
4458 0
4459 0 ]
4460- /Rect [ 322.6378
4461- 312.9469
4462- 322.6378
4463- 324.9469 ]
4464+ /Rect [ 323.1978
4465+ 536.9469
4466+ 323.1978
4467+ 548.9469 ]
4468 /Subtype /Link
4469 /Type /Annot >>
4470 endobj
4471-% 'Page14': class PDFPage
4472+% 'Annot.NUMBER67': class PDFDictionary
4473 88 0 obj
4474-% Page dictionary
4475-<< /Annots [ 76 0 R
4476- 77 0 R
4477- 78 0 R
4478- 79 0 R
4479- 80 0 R
4480- 81 0 R
4481- 82 0 R
4482- 83 0 R
4483- 84 0 R
4484- 85 0 R
4485- 86 0 R
4486- 87 0 R ]
4487- /Contents 1020 0 R
4488- /MediaBox [ 0
4489+<< /A << /S /URI
4490+ /Type /Action
4491+ /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
4492+ /Border [ 0
4493 0
4494- 595.2756
4495- 841.8898 ]
4496- /Parent 1006 0 R
4497- /Resources << /Font 1 0 R
4498- /ProcSet [ /PDF
4499- /Text
4500- /ImageB
4501- /ImageC
4502- /ImageI ] >>
4503- /Rotate 0
4504- /Trans << >>
4505- /Type /Page >>
4506+ 0 ]
4507+ /Rect [ 150.2861
4508+ 273.9469
4509+ 254.1661
4510+ 285.9469 ]
4511+ /Subtype /Link
4512+ /Type /Annot >>
4513 endobj
4514-% 'Annot.NUMBER67': class PDFDictionary
4515+% 'Annot.NUMBER68': class PDFDictionary
4516 89 0 obj
4517 << /A << /S /URI
4518 /Type /Action
4519- /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
4520+ /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4521 /Border [ 0
4522 0
4523 0 ]
4524- /Rect [ 150.2861
4525- 746.9469
4526- 254.1661
4527- 758.9469 ]
4528+ /Rect [ 297.6378
4529+ 273.9469
4530+ 297.6378
4531+ 285.9469 ]
4532 /Subtype /Link
4533 /Type /Annot >>
4534 endobj
4535-% 'Annot.NUMBER68': class PDFDictionary
4536+% 'Annot.NUMBER69': class PDFDictionary
4537 90 0 obj
4538 << /A << /S /URI
4539 /Type /Action
4540@@ -1420,13 +1408,13 @@
4541 0
4542 0 ]
4543 /Rect [ 297.6378
4544- 746.9469
4545- 297.6378
4546- 758.9469 ]
4547+ 273.9469
4548+ 323.1978
4549+ 285.9469 ]
4550 /Subtype /Link
4551 /Type /Annot >>
4552 endobj
4553-% 'Annot.NUMBER69': class PDFDictionary
4554+% 'Annot.NUMBER70': class PDFDictionary
4555 91 0 obj
4556 << /A << /S /URI
4557 /Type /Action
4558@@ -1434,44 +1422,44 @@
4559 /Border [ 0
4560 0
4561 0 ]
4562- /Rect [ 297.6378
4563- 746.9469
4564- 322.6378
4565- 758.9469 ]
4566+ /Rect [ 323.1978
4567+ 273.9469
4568+ 323.1978
4569+ 285.9469 ]
4570 /Subtype /Link
4571 /Type /Annot >>
4572 endobj
4573-% 'Annot.NUMBER70': class PDFDictionary
4574+% 'Annot.NUMBER71': class PDFDictionary
4575 92 0 obj
4576 << /A << /S /URI
4577 /Type /Action
4578- /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4579+ /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
4580 /Border [ 0
4581 0
4582 0 ]
4583- /Rect [ 322.6378
4584- 746.9469
4585- 322.6378
4586- 758.9469 ]
4587+ /Rect [ 150.2861
4588+ 68.94685
4589+ 254.1661
4590+ 80.94685 ]
4591 /Subtype /Link
4592 /Type /Annot >>
4593 endobj
4594-% 'Annot.NUMBER71': class PDFDictionary
4595+% 'Annot.NUMBER72': class PDFDictionary
4596 93 0 obj
4597 << /A << /S /URI
4598 /Type /Action
4599- /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
4600+ /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4601 /Border [ 0
4602 0
4603 0 ]
4604- /Rect [ 150.2861
4605- 529.9469
4606- 254.1661
4607- 541.9469 ]
4608+ /Rect [ 297.6378
4609+ 68.94685
4610+ 297.6378
4611+ 80.94685 ]
4612 /Subtype /Link
4613 /Type /Annot >>
4614 endobj
4615-% 'Annot.NUMBER72': class PDFDictionary
4616+% 'Annot.NUMBER73': class PDFDictionary
4617 94 0 obj
4618 << /A << /S /URI
4619 /Type /Action
4620@@ -1480,13 +1468,13 @@
4621 0
4622 0 ]
4623 /Rect [ 297.6378
4624- 529.9469
4625- 297.6378
4626- 541.9469 ]
4627+ 68.94685
4628+ 323.1978
4629+ 80.94685 ]
4630 /Subtype /Link
4631 /Type /Annot >>
4632 endobj
4633-% 'Annot.NUMBER73': class PDFDictionary
4634+% 'Annot.NUMBER74': class PDFDictionary
4635 95 0 obj
4636 << /A << /S /URI
4637 /Type /Action
4638@@ -1494,27 +1482,47 @@
4639 /Border [ 0
4640 0
4641 0 ]
4642- /Rect [ 297.6378
4643- 529.9469
4644- 322.6378
4645- 541.9469 ]
4646+ /Rect [ 323.1978
4647+ 68.94685
4648+ 323.1978
4649+ 80.94685 ]
4650 /Subtype /Link
4651 /Type /Annot >>
4652 endobj
4653-% 'Annot.NUMBER74': class PDFDictionary
4654+% 'Page14': class PDFPage
4655 96 0 obj
4656-<< /A << /S /URI
4657- /Type /Action
4658- /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4659- /Border [ 0
4660+% Page dictionary
4661+<< /Annots [ 80 0 R
4662+ 81 0 R
4663+ 82 0 R
4664+ 83 0 R
4665+ 84 0 R
4666+ 85 0 R
4667+ 86 0 R
4668+ 87 0 R
4669+ 88 0 R
4670+ 89 0 R
4671+ 90 0 R
4672+ 91 0 R
4673+ 92 0 R
4674+ 93 0 R
4675+ 94 0 R
4676+ 95 0 R ]
4677+ /Contents 1261 0 R
4678+ /MediaBox [ 0
4679 0
4680- 0 ]
4681- /Rect [ 322.6378
4682- 529.9469
4683- 322.6378
4684- 541.9469 ]
4685- /Subtype /Link
4686- /Type /Annot >>
4687+ 595.2756
4688+ 841.8898 ]
4689+ /Parent 1247 0 R
4690+ /Resources << /Font 1 0 R
4691+ /ProcSet [ /PDF
4692+ /Text
4693+ /ImageB
4694+ /ImageC
4695+ /ImageI ] >>
4696+ /Rotate 0
4697+ /Trans << >>
4698+ /Type /Page >>
4699 endobj
4700 % 'Annot.NUMBER75': class PDFDictionary
4701 97 0 obj
4702@@ -1525,9 +1533,9 @@
4703 0
4704 0 ]
4705 /Rect [ 150.2861
4706- 312.9469
4707+ 593.9469
4708 254.1661
4709- 324.9469 ]
4710+ 605.9469 ]
4711 /Subtype /Link
4712 /Type /Annot >>
4713 endobj
4714@@ -1540,9 +1548,9 @@
4715 0
4716 0 ]
4717 /Rect [ 297.6378
4718- 312.9469
4719+ 593.9469
4720 297.6378
4721- 324.9469 ]
4722+ 605.9469 ]
4723 /Subtype /Link
4724 /Type /Annot >>
4725 endobj
4726@@ -1555,9 +1563,9 @@
4727 0
4728 0 ]
4729 /Rect [ 297.6378
4730- 312.9469
4731- 322.6378
4732- 324.9469 ]
4733+ 593.9469
4734+ 323.1978
4735+ 605.9469 ]
4736 /Subtype /Link
4737 /Type /Annot >>
4738 endobj
4739@@ -1569,10 +1577,10 @@
4740 /Border [ 0
4741 0
4742 0 ]
4743- /Rect [ 322.6378
4744- 312.9469
4745- 322.6378
4746- 324.9469 ]
4747+ /Rect [ 323.1978
4748+ 593.9469
4749+ 323.1978
4750+ 605.9469 ]
4751 /Subtype /Link
4752 /Type /Annot >>
4753 endobj
4754@@ -1585,9 +1593,9 @@
4755 0
4756 0 ]
4757 /Rect [ 150.2861
4758- 95.94685
4759+ 388.9469
4760 254.1661
4761- 107.9469 ]
4762+ 400.9469 ]
4763 /Subtype /Link
4764 /Type /Annot >>
4765 endobj
4766@@ -1600,9 +1608,9 @@
4767 0
4768 0 ]
4769 /Rect [ 297.6378
4770- 95.94685
4771+ 388.9469
4772 297.6378
4773- 107.9469 ]
4774+ 400.9469 ]
4775 /Subtype /Link
4776 /Type /Annot >>
4777 endobj
4778@@ -1615,9 +1623,9 @@
4779 0
4780 0 ]
4781 /Rect [ 297.6378
4782- 95.94685
4783- 322.6378
4784- 107.9469 ]
4785+ 388.9469
4786+ 323.1978
4787+ 400.9469 ]
4788 /Subtype /Link
4789 /Type /Annot >>
4790 endobj
4791@@ -1629,38 +1637,94 @@
4792 /Border [ 0
4793 0
4794 0 ]
4795- /Rect [ 322.6378
4796- 95.94685
4797- 322.6378
4798- 107.9469 ]
4799+ /Rect [ 323.1978
4800+ 388.9469
4801+ 323.1978
4802+ 400.9469 ]
4803+ /Subtype /Link
4804+ /Type /Annot >>
4805+endobj
4806+% 'Annot.NUMBER83': class PDFDictionary
4807+105 0 obj
4808+<< /A << /S /URI
4809+ /Type /Action
4810+ /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
4811+ /Border [ 0
4812+ 0
4813+ 0 ]
4814+ /Rect [ 150.2861
4815+ 183.9469
4816+ 254.1661
4817+ 195.9469 ]
4818+ /Subtype /Link
4819+ /Type /Annot >>
4820+endobj
4821+% 'Annot.NUMBER84': class PDFDictionary
4822+106 0 obj
4823+<< /A << /S /URI
4824+ /Type /Action
4825+ /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4826+ /Border [ 0
4827+ 0
4828+ 0 ]
4829+ /Rect [ 297.6378
4830+ 183.9469
4831+ 297.6378
4832+ 195.9469 ]
4833+ /Subtype /Link
4834+ /Type /Annot >>
4835+endobj
4836+% 'Annot.NUMBER85': class PDFDictionary
4837+107 0 obj
4838+<< /A << /S /URI
4839+ /Type /Action
4840+ /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4841+ /Border [ 0
4842+ 0
4843+ 0 ]
4844+ /Rect [ 297.6378
4845+ 183.9469
4846+ 323.1978
4847+ 195.9469 ]
4848+ /Subtype /Link
4849+ /Type /Annot >>
4850+endobj
4851+% 'Annot.NUMBER86': class PDFDictionary
4852+108 0 obj
4853+<< /A << /S /URI
4854+ /Type /Action
4855+ /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4856+ /Border [ 0
4857+ 0
4858+ 0 ]
4859+ /Rect [ 323.1978
4860+ 183.9469
4861+ 323.1978
4862+ 195.9469 ]
4863 /Subtype /Link
4864 /Type /Annot >>
4865 endobj
4866 % 'Page15': class PDFPage
4867-105 0 obj
4868+109 0 obj
4869 % Page dictionary
4870-<< /Annots [ 89 0 R
4871- 90 0 R
4872- 91 0 R
4873- 92 0 R
4874- 93 0 R
4875- 94 0 R
4876- 95 0 R
4877- 96 0 R
4878- 97 0 R
4879+<< /Annots [ 97 0 R
4880 98 0 R
4881 99 0 R
4882 100 0 R
4883 101 0 R
4884 102 0 R
4885 103 0 R
4886- 104 0 R ]
4887- /Contents 1021 0 R
4888+ 104 0 R
4889+ 105 0 R
4890+ 106 0 R
4891+ 107 0 R
4892+ 108 0 R ]
4893+ /Contents 1262 0 R
4894 /MediaBox [ 0
4895 0
4896 595.2756
4897 841.8898 ]
4898- /Parent 1006 0 R
4899+ /Parent 1247 0 R
4900 /Resources << /Font 1 0 R
4901 /ProcSet [ /PDF
4902 /Text
4903@@ -1671,66 +1735,6 @@
4904 /Trans << >>
4905 /Type /Page >>
4906 endobj
4907-% 'Annot.NUMBER83': class PDFDictionary
4908-106 0 obj
4909-<< /A << /S /URI
4910- /Type /Action
4911- /URI (http://svn.zope.org/*checkout*/z3c.rml/trunk/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >>
4912- /Border [ 0
4913- 0
4914- 0 ]
4915- /Rect [ 150.2861
4916- 598.9469
4917- 254.1661
4918- 610.9469 ]
4919- /Subtype /Link
4920- /Type /Annot >>
4921-endobj
4922-% 'Annot.NUMBER84': class PDFDictionary
4923-107 0 obj
4924-<< /A << /S /URI
4925- /Type /Action
4926- /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4927- /Border [ 0
4928- 0
4929- 0 ]
4930- /Rect [ 297.6378
4931- 598.9469
4932- 297.6378
4933- 610.9469 ]
4934- /Subtype /Link
4935- /Type /Annot >>
4936-endobj
4937-% 'Annot.NUMBER85': class PDFDictionary
4938-108 0 obj
4939-<< /A << /S /URI
4940- /Type /Action
4941- /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4942- /Border [ 0
4943- 0
4944- 0 ]
4945- /Rect [ 297.6378
4946- 598.9469
4947- 322.6378
4948- 610.9469 ]
4949- /Subtype /Link
4950- /Type /Annot >>
4951-endobj
4952-% 'Annot.NUMBER86': class PDFDictionary
4953-109 0 obj
4954-<< /A << /S /URI
4955- /Type /Action
4956- /URI (http://svn.zope.org/z3c.rml/trunk/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?view=auto) >>
4957- /Border [ 0
4958- 0
4959- 0 ]
4960- /Rect [ 322.6378
4961- 598.9469
4962- 322.6378
4963- 610.9469 ]
4964- /Subtype /Link
4965- /Type /Annot >>
4966-endobj
4967 % 'Annot.NUMBER87': class PDFDictionary
4968 110 0 obj
4969 << /A << /S /URI
4970@@ -1740,9 +1744,9 @@
4971 0
4972 0 ]
4973 /Rect [ 150.2861
4974- 410.9469
4975+ 741.9469
4976 254.1661
4977- 422.9469 ]
4978+ 753.9469 ]
4979 /Subtype /Link
4980 /Type /Annot >>
4981 endobj
4982@@ -1755,9 +1759,9 @@
4983 0
4984 0 ]
4985 /Rect [ 297.6378
4986- 410.9469
4987+ 741.9469
4988 297.6378
4989- 422.9469 ]
4990+ 753.9469 ]
4991 /Subtype /Link
4992 /Type /Annot >>
4993 endobj
4994@@ -1770,9 +1774,9 @@
4995 0
4996 0 ]
4997 /Rect [ 297.6378
4998- 410.9469
4999- 322.6378
5000- 422.9469 ]
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: