Merge lp:~logan/ubuntu/raring/z3c.rml/2.0.0 into lp:ubuntu/raring/z3c.rml
- Raring (13.04)
- 2.0.0
- Merge into raring
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Daniel Holbach (community) | Approve | ||
Ubuntu branches | Pending | ||
Review via email:
|
Commit message
Description of the change
To post a comment you must log in.
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.
Thanks. Uploaded.