[Checkins] SVN: z3c.rml/trunk/src/z3c/rml/ * Added <hr> tag support.
Stephan Richter
srichter at cosmos.phy.tufts.edu
Fri Mar 16 03:19:19 EDT 2007
Log message for revision 73212:
* Added <hr> tag support.
* Worked a lot on tables cleaning up a lot of the style support to be almost
100% compatible with the commercial RML version.
Changed:
U z3c.rml/trunk/src/z3c/rml/attr.py
U z3c.rml/trunk/src/z3c/rml/flowable.py
U z3c.rml/trunk/src/z3c/rml/platypus.py
U z3c.rml/trunk/src/z3c/rml/stylesheet.py
A z3c.rml/trunk/src/z3c/rml/tests/input/rml-examples-008-tables.rml
-=-
Modified: z3c.rml/trunk/src/z3c/rml/attr.py
===================================================================
--- z3c.rml/trunk/src/z3c/rml/attr.py 2007-03-16 03:46:12 UTC (rev 73211)
+++ z3c.rml/trunk/src/z3c/rml/attr.py 2007-03-16 07:19:18 UTC (rev 73212)
@@ -32,8 +32,6 @@
from z3c.rml import interfaces
-ALL_COLORS = reportlab.lib.colors.getAllNamedColors()
-
DEFAULT = object()
@@ -54,6 +52,20 @@
return default
return self.convert(value, context)
+class Combination(Attribute):
+
+ def __init__(self, name=None, valueTypes=(), default=DEFAULT):
+ super(Combination, self).__init__(name, default)
+ self.valueTypes = valueTypes
+
+ def convert(self, value, context=None):
+ for valueType in self.valueTypes:
+ try:
+ return valueType.convert(value, context)
+ except ValueError:
+ pass
+ raise ValueError(value)
+
class Text(Attribute):
def convert(self, value, context=None):
@@ -83,7 +95,7 @@
class Sequence(Attribute):
- splitre = re.compile('[ \t\n,]*')
+ splitre = re.compile('[ \t\n,;]*')
minLength = None
maxLength = None
@@ -149,6 +161,12 @@
class Measurement(Attribute):
+ def __init__(self, name=None, default=DEFAULT,
+ allowPercentage=False, allowStar=False):
+ super(Measurement, self).__init__(name, default)
+ self.allowPercentage = allowPercentage
+ self.allowStar = allowStar
+
units = [
(re.compile('^(-?[0-9\.]+)\s*in$'), reportlab.lib.units.inch),
(re.compile('^(-?[0-9\.]+)\s*cm$'), reportlab.lib.units.cm),
@@ -156,14 +174,22 @@
(re.compile('^(-?[0-9\.]+)\s*$'), 1)
]
+ allowPercentage = False
+ allowStar = False
+
def convert(self, value, context=None):
+ if value == 'None':
+ return None
+ if value == '*' and self.allowStar:
+ return value
+ if value.endswith('%') and self.allowPercentage:
+ return value
for unit in self.units:
res = unit[0].search(value, 0)
if res:
return unit[1]*float(res.group(1))
raise ValueError('The value %r is not a valid measurement.' %value)
-
class File(Text):
open = staticmethod(urllib.urlopen)
@@ -208,17 +234,9 @@
class Color(Text):
def convert(self, value, context=None):
- # Color name
- if value in ALL_COLORS:
- return ALL_COLORS[value]
- # Decimal triplet
- rgb = Sequence(valueType=Float(), length=3).convert(value)
- if len(rgb) == 3:
- return [float(num) for num in rgb]
- # Hexdecimal triplet
- if value.startswith('#'):
- return [float(int(value[i:i+1], 16)) for i in range(1, 7, 2)]
- raise ValueError('%r not a valid color.' %value)
+ if value == 'None':
+ return None
+ return reportlab.lib.colors.toColor(value)
class Style(Text):
@@ -331,7 +349,6 @@
def convert(self, value, context=None):
result = super(TextNodeGrid, self).convert(value, context)
if len(result) % self.cols != 0:
- import pdb; pdb.set_trace()
raise ValueError(
'Number of elements must be divisible by %i.' %self.cols)
return [result[i*self.cols:(i+1)*self.cols]
Modified: z3c.rml/trunk/src/z3c/rml/flowable.py
===================================================================
--- z3c.rml/trunk/src/z3c/rml/flowable.py 2007-03-16 03:46:12 UTC (rev 73211)
+++ z3c.rml/trunk/src/z3c/rml/flowable.py 2007-03-16 07:19:18 UTC (rev 73212)
@@ -17,12 +17,13 @@
"""
__docformat__ = "reStructuredText"
import copy
+import re
import reportlab.platypus
import reportlab.platypus.doctemplate
import reportlab.platypus.flowables
import reportlab.platypus.tables
from reportlab.lib import styles
-from z3c.rml import attr, element, form, platypus, special
+from z3c.rml import attr, element, form, platypus, special, stylesheet
try:
import reportlab.graphics.barcode
@@ -40,7 +41,6 @@
kw = self.getKeywordArguments()
self.parent.flow.append(self.klass(*args, **kw))
-
class Spacer(Flowable):
klass = reportlab.platypus.Spacer
args = ( attr.Measurement('width', 100), attr.Measurement('length'), )
@@ -98,6 +98,7 @@
styleAttrs = (
('FONTNAME', (attr.Text('fontName'),)),
('FONTSIZE', (attr.Measurement('fontSize'),)),
+ ('TEXTCOLOR', (attr.Color('fontColor'),)),
('LEADING', (attr.Measurement('leading'),)),
('LEFTPADDING', (attr.Measurement('leftPadding'),)),
('RIGHTPADDING', (attr.Measurement('rightPadding'),)),
@@ -168,15 +169,38 @@
self.processSubElements(None)
self.parent.rows.append(self.cols)
+class TableBulkData(element.Element):
+
+ def process(self):
+ attribute = attr.TextNodeSequence(
+ splitre=re.compile('\n'),
+ valueType=attr.Sequence(
+ splitre=re.compile(','),
+ valueType=attr.Text()
+ ))
+ self.parent.rows = attribute.get(self.element)
+
+class BlockTableStyle(stylesheet.BlockTableStyle):
+
+ def setStyle(self, id, style):
+ self.parent.style = style
+
class BlockTable(element.ContainerElement, Flowable):
klass = reportlab.platypus.Table
kw = (
('rowHeights', attr.Sequence('rowHeights', attr.Measurement())),
- ('colWidths', attr.Sequence('colWidths', attr.Measurement())),
+ ('colWidths', attr.Sequence('colWidths',
+ attr.Measurement(allowPercentage=True, allowStar=True))),
)
- subElements = {'tr': TableRow}
+ attrs = ( ('repeatRows', attr.Int('repeatRows')), )
+
+ subElements = {
+ 'tr': TableRow,
+ 'bulkData': TableBulkData,
+ 'blockTableStyle': BlockTableStyle}
+
def process(self):
# Get the table style; create a new one, if none is found
self.style = attr.Style('style', 'table').get(self.element, None, self)
@@ -187,8 +211,13 @@
self.processSubElements(None)
# Create the table
kw = self.getKeywordArguments()
+
table = self.klass(self.rows, style=self.style, **kw)
+ attrs = element.extractKeywordArguments(self.attrs, self.element)
+ for name, value in attrs.items():
+ setattr(table, name, value)
+
self.parent.flow.append(table)
@@ -322,7 +351,34 @@
frame = self.klass(content=flow.flow, mode='shrink', *args)
self.parent.flow.append(frame)
+class Bookmark(Flowable):
+ klass = platypus.BookmarkPage
+ args = ( attr.Text('name'), )
+ kw = (
+ ('fitType', attr.Choice('fitType', ('Fit', 'FitH', 'FitV', 'FitR'))),
+ ('left', attr.Measurement('left')),
+ ('right', attr.Measurement('right')),
+ ('top', attr.Measurement('top')),
+ ('bottom', attr.Measurement('bottom')),
+ ('zoom', attr.Float('zoom')),
+ )
+class HorizontalRow(Flowable):
+ klass = reportlab.platypus.flowables.HRFlowable
+ kw = (
+ ('width', attr.Measurement('width', allowPercentage=True)),
+ ('thickness', attr.Measurement('thickness')),
+ ('color', attr.Color('color')),
+ ('lineCap', attr.Choice('lineCap', ('butt', 'round', 'square') )),
+ ('spaceBefore', attr.Measurement('spaceBefore')),
+ ('spaceAfter', attr.Measurement('spaceAfter')),
+ ('hAlign', attr.Choice(
+ 'align', ('left', 'right', 'center', 'centre', 'decimal') )),
+ ('vAlign', attr.Choice('vAlign', ('top', 'middle', 'bottom') )),
+ ('dash', attr.Sequence('dash', attr.Measurement())),
+ )
+
+
class Flow(element.ContainerElement):
subElements = {
@@ -352,6 +408,8 @@
'pto': PTO,
'indent': Indent,
'fixedSize': FixedSize,
+ 'bookmark': Bookmark,
+ 'hr': HorizontalRow,
# Special Elements
'name': special.Name,
}
Modified: z3c.rml/trunk/src/z3c/rml/platypus.py
===================================================================
--- z3c.rml/trunk/src/z3c/rml/platypus.py 2007-03-16 03:46:12 UTC (rev 73211)
+++ z3c.rml/trunk/src/z3c/rml/platypus.py 2007-03-16 07:19:18 UTC (rev 73212)
@@ -36,3 +36,14 @@
drawing.process()
self.canv.restoreState()
+
+class BookmarkPage(reportlab.platypus.flowables.Flowable):
+ def __init__(self, *args, **kw):
+ self.args = args
+ self.kw = kw
+
+ def wrap(self, *args):
+ return (0, 0)
+
+ def draw(self):
+ self.canv.bookmarkPage(*self.args, **self.kw)
Modified: z3c.rml/trunk/src/z3c/rml/stylesheet.py
===================================================================
--- z3c.rml/trunk/src/z3c/rml/stylesheet.py 2007-03-16 03:46:12 UTC (rev 73211)
+++ z3c.rml/trunk/src/z3c/rml/stylesheet.py 2007-03-16 07:19:18 UTC (rev 73212)
@@ -73,8 +73,14 @@
class TableStyleCommand(element.Element):
name = None
attrs = (
- attr.Sequence('start', attr.Int(), [0, 0], length=2),
- attr.Sequence('stop', attr.Int(), [-1, -1], length=2) )
+ attr.Sequence('start', attr.Combination(
+ valueTypes=(attr.Int(),
+ attr.Choice(choices=('splitfirst', 'splitlast')) )),
+ [0, 0], length=2),
+ attr.Sequence('stop', attr.Combination(
+ valueTypes=(attr.Int(),
+ attr.Choice(choices=('splitfirst', 'splitlast')) )),
+ [-1, -1], length=2) )
def process(self):
args = [self.name]
@@ -124,8 +130,24 @@
class BlockBackground(TableStyleCommand):
name = 'BACKGROUND'
- attrs = TableStyleCommand.attrs + (attr.Color('colorName'), )
+ attrs = TableStyleCommand.attrs + (
+ attr.Color('colorName'),
+ attr.Sequence('colorsByRow', attr.Color()),
+ attr.Sequence('colorsByCol', attr.Color()) )
+ def process(self):
+ args = [self.name]
+ if 'colorsByRow' in self.element.keys():
+ args = [BlockRowBackground.name]
+ elif 'colorsByCol' in self.element.keys():
+ args = [BlockColBackground.name]
+
+ for attribute in self.attrs:
+ value = attribute.get(self.element)
+ if value is not attr.DEFAULT:
+ args.append(value)
+ self.context.add(*args)
+
class BlockRowBackground(TableStyleCommand):
name = 'ROWBACKGROUNDS'
attrs = TableStyleCommand.attrs + (
@@ -147,8 +169,13 @@
class LineStyle(TableStyleCommand):
attrs = TableStyleCommand.attrs + (
- attr.Measurement('thickness', 1),
- attr.Color('colorName'), )
+ attr.Measurement('thickness', default=1),
+ attr.Color('colorName', default=None),
+ attr.Choice('cap', ('butt', 'round', 'square'), default=1),
+ attr.Sequence('dash', attr.Measurement(), default=None),
+ attr.Bool('join', default=1),
+ attr.Int('count', default=1),
+ )
@property
def name(self):
@@ -158,6 +185,14 @@
'kind', dict([(cmd.lower(), cmd) for cmd in cmds])
).get(self.element)
+ def process(self):
+ args = [self.name]
+ for attribute in self.attrs:
+ value = attribute.get(self.element)
+ if value is not attr.DEFAULT:
+ args.append(value)
+ self.context.add(*args)
+
class BlockTableStyle(element.ContainerElement):
subElements = {
@@ -177,11 +212,14 @@
'lineStyle': LineStyle,
}
+ def setStyle(self, id, style):
+ self.parent.parent.styles.setdefault('table', {})[id] = style
+
def process(self):
id = attr.Text('id').get(self.element)
style = reportlab.platypus.tables.TableStyle()
self.processSubElements(style)
- self.parent.parent.styles.setdefault('table', {})[id] = style
+ self.setStyle(id, style)
class Stylesheet(element.ContainerElement):
Added: z3c.rml/trunk/src/z3c/rml/tests/input/rml-examples-008-tables.rml
===================================================================
--- z3c.rml/trunk/src/z3c/rml/tests/input/rml-examples-008-tables.rml 2007-03-16 03:46:12 UTC (rev 73211)
+++ z3c.rml/trunk/src/z3c/rml/tests/input/rml-examples-008-tables.rml 2007-03-16 07:19:18 UTC (rev 73212)
@@ -0,0 +1,994 @@
+<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?>
+<!DOCTYPE document SYSTEM "rml_1_0.dtd">
+<document filename="test_008_tables.pdf">
+ <template pageSize="(595, 842)" leftMargin="72" showBoundary="1">
+ <pageTemplate id="main">
+ <frame id="first" x1="1in" y1="1in" width="6.27in" height="9.69in"/>
+ </pageTemplate>
+ </template>
+ <stylesheet>
+ <blockTableStyle id="temp001">
+ <blockAlignment value="left"/>
+ <blockFont name="Helvetica-Oblique"/>
+ <lineStyle kind="GRID" colorName="black"/>
+ <lineStyle kind="OUTLINE" colorName="black" thickness="2"/>
+ <blockBackground colorName="pink" start="0,0" stop="-1,0"/>
+ <blockBackground colorName="yellow" start="0,0" stop="-1,0"/>
+ </blockTableStyle>
+ <blockTableStyle id="span001">
+ <blockAlignment value="center"/>
+ <blockValign value="middle" start="-1,0" stop="-1,-1"/>
+ <blockSpan start="0,0" stop="2,0"/>
+ <blockSpan start="-1,0" stop="-1,-1"/>
+ <lineStyle kind="GRID" colorName="black" start="0,1" stop="-2,-1"/>
+ <lineStyle kind="GRID" colorName="black" start="3,0" stop="3,0"/>
+ <lineStyle kind="OUTLINE" colorName="black" thickness="2"/>
+ </blockTableStyle>
+ <blockTableStyle id="numeric">
+ <!--top row - centre and bold, easy-->
+ <blockFont name="Times-Bold" start="0,0" stop="-1,0"/>
+ <blockAlignment value="center" start="0,0" stop="-1,0"/>
+ <lineStyle kind="LINEABOVE" colorName="purple" start="0,0" stop="-1,0"/>
+ <lineStyle kind="LINEBELOW" colorName="purple" start="0,0" stop="-1,0"/>
+ <!--numeric region - decimal align and set right padding-->
+ <blockAlignment value="right" start="1,1" stop="-1,-1"/>
+ <!--bottom row - double underline-->
+ <blockFont name="Times-Bold" start="0,-1" stop="-1,-1"/>
+ <lineStyle kind="LINEABOVE" colorName="purple" start="0,-1" stop="-1,-1"/>
+ <lineStyle kind="LINEBELOW" colorName="purple" start="0,-1" stop="-1,-1" count="2"/>
+ </blockTableStyle>
+ </stylesheet>
+ <story>
+ <para>The email address should be a clickable mailto link built by creating a plugin within the cell. And Robin's job title
+ should be on a separate line to his name. In the third row, we use the newer and easier table cell properties "href" and "destination".</para>
+ <spacer length="24"/>
+ <blockTable colWidths="5cm,5cm" style="temp001">
+ <tr>
+ <td>Name</td>
+ <td>Email</td>
+ </tr>
+ <tr>
+ <td>Robin Becker
+(chief propellerhead)</td>
+ <td>
+ <plugInFlowable module="mymodule" function="linkURL">("mailto:robin at reportlab.com",)</plugInFlowable>
+ </td>
+ </tr>
+ <tr>
+ <td destination="BACK_PAGE">Internal link to back page</td>
+ <td href="http://www.reportlab.com/">Hyperlink to www.reportlab.com</td>
+
+ </tr>
+ </blockTable>
+ <spacer length="24"/>
+ <para>This should be a 5x5 table where some ranges span. Note that the grid and background
+ commands still work on the "underlying" grid; if you grid the whole table, it will show through
+ your 'spanned cells' </para>
+ <spacer length="12"/>
+ <blockTable colWidths="3cm,3cm,3cm,3cm,3cm" rowHeights="1cm,1cm,1cm,1cm,1cm" style="span001">
+ <tr>
+ <td>
+ <para>This should span the first 3 cells in the top row. It's ordinary left aligned
+ text but could be centred if you want.</para>
+ </td>
+ <td>B</td>
+ <td>C</td>
+ <td>D</td>
+ <td>
+ <para>This should span all five cells in the right column. We vertically centred the
+ text to make it look sensible using a separate stylesheet command.</para>
+ <hr spaceBefore="5"/>
+ <para>some more text</para>
+ </td>
+ </tr>
+ <tr>
+ <td>A</td>
+ <td>B</td>
+ <td>C</td>
+ <td>DB</td>
+ <td>E</td>
+ </tr>
+ <tr>
+ <td>A</td>
+ <td>B</td>
+ <td>C</td>
+ <td>DB</td>
+ <td>E</td>
+ </tr>
+ <tr>
+ <td>A</td>
+ <td>B</td>
+ <td>C</td>
+ <td>DB</td>
+ <td>E</td>
+ </tr>
+ <tr>
+ <td>A</td>
+ <td>B</td>
+ <td>C</td>
+ <td>DB</td>
+ <td>E</td>
+ </tr>
+ </blockTable>
+ <spacer length="24"/>
+ <para>This should be a 5x5 table where some ranges span. The column widths have been set as
+ 3cm,10%,10%,10%,30%. The percentage refers to unallocated width only.
+ </para>
+ <spacer length="12"/>
+ <blockTable colWidths="3cm,10%,10%,10%,30%" rowHeights="2cm,1cm,1cm,1cm,None" style="span001">
+ <tr>
+ <td vAlign="middle">
+ <para>This should span the first 3 cells in the top row. It's ordinary left aligned
+ text but could be centred if you want.</para>
+ </td>
+ <td>B</td>
+ <td>C</td>
+ <td>D</td>
+ <td leftPadding="0" rightPadding="0">
+ <para>This should span all five cells in the right column. We vertically centred the
+ text to make it look sensible using a separate stylesheet command.</para>
+ <hr spaceBefore="1" width="100%" thickness="1.5" color="pink"/>
+ <hr spaceBefore="1" width="100%" thickness="1.5" color="pink" lineCap="butt"/>
+ <hr spaceBefore="1" width="100%" thickness="1.5" color="pink" lineCap="square"/>
+ <hr spaceBefore="1" width="50%" thickness="1.5" color="pink" lineCap="square" align="right"/>
+ <hr spaceBefore="1" width="50%" thickness="1.5" color="pink" lineCap="square" align="left"/>
+ <hr spaceBefore="1" width="50%" thickness="1.5" color="pink" lineCap="square" align="centre"/>
+ <para>some more text</para>
+ </td>
+ </tr>
+ <tr>
+ <td>A</td>
+ <td>B</td>
+ <td>C</td>
+ <td>DB</td>
+ <td>E</td>
+ </tr>
+ <tr>
+ <td>A</td>
+ <td>B</td>
+ <td>C</td>
+ <td>DB</td>
+ <td>E</td>
+ </tr>
+ <tr>
+ <td>A</td>
+ <td>B</td>
+ <td>C</td>
+ <td>DB</td>
+ <td>E</td>
+ </tr>
+ <tr>
+ <td>A</td>
+ <td>B</td>
+ <td>C</td>
+ <td>DB</td>
+ <td>E</td>
+ </tr>
+ </blockTable>
+ <spacer length="24"/>
+ <nextPage/>
+ <bookmark name="PAGE_TWO"/>
+ <para>This shows some pointers on doing financial tables. It demonstrates the decimal alignment and
+ multiple lines. We also used a local <td color="red"> attribute for the negative cell; ideally one wants to make the data drive the colour,
+ so that generator apps don't need to make para tags in every cell if they want red negatives.
+ If we move to dynamic RML, then a number-and-cell-formatting function is possible, but static RML
+ sees everything as text.
+
+ Note that when the value does not contain the decimal character but there are non-digit characters at the
+ end, it tries to align the rightmost digits with other rows.
+ </para>
+ <spacer length="12"/>
+ <blockTable colWidths="8cm,4cm">
+ <blockTableStyle id="temp003">
+ <!--top row - centre and bold, easy-->
+ <blockFont name="Times-Bold" start="0,0" stop="-1,0"/>
+ <blockAlignment value="center" start="0,0" stop="-1,0"/>
+ <lineStyle kind="LINEABOVE" colorName="purple" start="0,0" stop="-1,0"/>
+ <lineStyle kind="LINEBELOW" colorName="purple" start="0,0" stop="-1,0"/>
+ <!--numeric region - decimal align and set right padding-->
+ <blockAlignment value="decimal" start="1,1" stop="-1,-1"/>
+ <blockRightPadding length="1.5cm" start="1,1" stop="-1,-1"/>
+ <blockTextColor colorName="red" start="1,-2" stop="1,-2"/>
+ <!--bottom row - double underline-->
+ <blockFont name="Times-Bold" start="0,-1" stop="-1,-1"/>
+ <lineStyle kind="LINEABOVE" colorName="purple" start="0,-1" stop="-1,-1"/>
+ <lineStyle kind="LINEBELOW" colorName="purple" start="0,-1" stop="-1,-1" count="2"/>
+ </blockTableStyle>
+ <tr>
+ <td>Corporate Assets</td>
+ <td>Amount</td>
+ </tr>
+ <tr>
+ <td>Fixed Assets</td>
+ <td>1,234,567.89</td>
+ </tr>
+ <tr>
+ <td>Legal Offense Fund</td>
+ <td>86,000,000</td>
+ </tr>
+ <tr>
+ <td>Company Vehicle</td>
+ <td>1,234.8901</td>
+ </tr>
+ <tr>
+ <td>Petty Cash</td>
+ <td>42</td>
+ </tr>
+ <tr>
+ <td>Intellectual Property</td>
+ <td>Questionable</td>
+ </tr>
+ <tr>
+ <td>Bank Overdraft</td>
+ <td fontColor="red">(13,029)</td>
+ </tr>
+ <tr>
+ <td>Goodwill</td>
+ <td fontColor="red">(742,078,231.56)</td>
+ </tr>
+ <tr>
+ <td>Flat Screen TV</td>
+ <td fontColor="red">27 inches</td>
+ </tr>
+ <tr>
+ <td>Net Position</td>
+ <td>Doomed. Really!</td>
+ </tr>
+ </blockTable>
+ <nextFrame/>
+ <para>Individual <td> tags that contain pure strings can override the following attributes:
+ <font face="Courier-Bold" size="9">fontName, fontSize, fontColor, leading, leftPadding, rightPadding,
+ topPadding, bottomPadding, background, align, vAlign,
+ lineBelowThickness, lineBelowColor, lineBelowCap, lineBelowCount, lineBelowSpace,
+ lineAboveThickness, lineAboveColor, lineAboveCap, lineAboveCount, lineAboveSpace,
+ lineLeftThickness, lineLeftColor, lineLeftCap, lineLeftCount, lineLeftSpace,
+ lineRightThickness, lineRightColor, lineRightCap, lineRightCount, lineRightSpace
+</font>.</para>
+ <spacer length="24"/>
+ <blockTable colWidths="5cm,5cm" style="temp001">
+ <tr>
+ <td>fontName</td>
+ <td fontName="Courier">Courier</td>
+ </tr>
+ <tr>
+ <td>fontName</td>
+ <td fontName="Helvetica">Helvetica</td>
+ </tr>
+ <tr>
+ <td>fontSize</td>
+ <td fontSize="8">8</td>
+ </tr>
+ <tr>
+ <td>fontSize</td>
+ <td fontSize="14">14</td>
+ </tr>
+ <tr>
+ <td>fontColor</td>
+ <td fontColor="red">red</td>
+ </tr>
+ <tr>
+ <td>fontColor</td>
+ <td fontColor="blue">blue</td>
+ </tr>
+ <tr>
+ <td>leading</td>
+ <td leading="16">leading
+is
+16</td>
+ </tr>
+ <tr>
+ <td>leading</td>
+ <td leading="12">leading
+is
+12</td>
+ </tr>
+ <tr>
+ <td>leftPadding</td>
+ <td leftPadding="10">10</td>
+ </tr>
+ <tr>
+ <td>leftPadding</td>
+ <td leftPadding="16">16</td>
+ </tr>
+ <tr>
+ <td>rightPadding</td>
+ <td rightPadding="10" align="right">10</td>
+ </tr>
+ <tr>
+ <td>rightPadding</td>
+ <td rightPadding="24" align="right">24</td>
+ </tr>
+ <tr>
+ <td>topPadding</td>
+ <td topPadding="10">10</td>
+ </tr>
+ <tr>
+ <td>topPadding</td>
+ <td topPadding="24">24</td>
+ </tr>
+ <tr>
+ <td>bottomPadding</td>
+ <td bottomPadding="10">10</td>
+ </tr>
+ <tr>
+ <td>bottomPadding</td>
+ <td bottomPadding="24">24</td>
+ </tr>
+ <tr>
+ <td>background</td>
+ <td background="pink">pink</td>
+ </tr>
+ <tr>
+ <td>background</td>
+ <td background="lightblue">lightblue</td>
+ </tr>
+ <tr>
+ <td>align</td>
+ <td align="left">left</td>
+ </tr>
+ <tr>
+ <td>align</td>
+ <td align="center">center</td>
+ </tr>
+ <tr>
+ <td>align</td>
+ <td align="right">right</td>
+ </tr>
+ <tr>
+ <td>-
+vAlign
+-</td>
+ <td vAlign="top">top</td>
+ </tr>
+ <tr>
+ <td>-
+vAlign
+-</td>
+ <td vAlign="middle">middle</td>
+ </tr>
+ <tr>
+ <td>-
+vAlign
+-</td>
+ <td vAlign="bottom">bottom</td>
+ </tr>
+ <tr>
+ <td>lineBelow</td>
+ <td lineBelowThickness="1" lineBelowColor="red">right</td>
+ </tr>
+ </blockTable>
+ <nextFrame/>
+ <para>This table is using <b><xpre></b> tags around the contents of the right hand column.</para>
+ <spacer length="24"/>
+ <blockTable colWidths="5cm,5cm" style="temp001">
+ <tr>
+ <td>fontName</td>
+ <td fontName="Courier">
+ <xpre>Courier</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>fontName</td>
+ <td fontName="Helvetica">
+ <xpre>Helvetica</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>fontSize</td>
+ <td fontSize="8">
+ <xpre>8</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>fontSize</td>
+ <td fontSize="14">
+ <xpre>14</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>fontColor</td>
+ <td fontColor="red">
+ <xpre>red</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>fontColor</td>
+ <td fontColor="blue">
+ <xpre>blue</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>leading</td>
+ <td leading="16">
+ <xpre>leading
+is
+16</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>leading</td>
+ <td leading="12">
+ <xpre>leading
+is
+12</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>leftPadding</td>
+ <td leftPadding="10">
+ <xpre>10</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>leftPadding</td>
+ <td leftPadding="16">
+ <xpre>16</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>rightPadding</td>
+ <td rightPadding="10" align="right">
+ <xpre>10</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>rightPadding</td>
+ <td rightPadding="24" align="right">
+ <xpre>24</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>topPadding</td>
+ <td topPadding="10">
+ <xpre>10</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>topPadding</td>
+ <td topPadding="24">
+ <xpre>24</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>bottomPadding</td>
+ <td bottomPadding="10">
+ <xpre>10</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>bottomPadding</td>
+ <td bottomPadding="24">
+ <xpre>24</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>background</td>
+ <td background="pink">
+ <xpre>pink</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>background</td>
+ <td background="lightblue">
+ <xpre>lightblue</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>align</td>
+ <td align="left">
+ <xpre>left</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>align</td>
+ <td align="center">
+ <xpre>center</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>align</td>
+ <td align="right">
+ <xpre>right</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>-
+vAlign
+-</td>
+ <td vAlign="top">
+ <xpre>top</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>-
+vAlign
+-</td>
+ <td vAlign="middle">
+ <xpre>middle</xpre>
+ </td>
+ </tr>
+ <tr>
+ <td>-
+vAlign
+-</td>
+ <td vAlign="bottom">
+ <xpre>bottom</xpre>
+ </td>
+ </tr>
+ </blockTable>
+ <nextFrame/>
+ <h2>Bulk Data Support</h2>
+ <para>Very often one wants to get quite a lot of text or numeric data into a table - for
+ example from a database query or imported data file. Quoting all of this correctly as
+ XML and wrapping in in td and tr tags is time and memory consumuing, unquoting and parsing it
+ all back even more so. Therefore, instead of explicitly creating row and cell tags, you
+ can now use a new <b>bulkData</b> tag. This lets you specify a delimiter for fields (default
+ is comma) and for records (default is newline), and rml2pdf will break this up.</para>
+ <para>If you want to avoid having to quote ampersands, wrap this in a CDATA escape sequence.</para>
+ <para>Of course if you want per-cell formatting or to put arbitrary flowables in a cell, you
+ must use the other tags.</para>
+ <spacer length="24"/>
+ <blockTable style="numeric">
+ <bulkData><![CDATA[
+Product,Profit
+Sprockets,26
+Widgets,34
+Thingummies,217
+Bits & Bobs,23
+Total,277
+ ]]></bulkData>
+ </blockTable>
+ <spacer length="24"/>
+ <para>You can specify a tab with <b>fieldDelim="\t"</b>, but we generally advise against using any
+ whitespace character as a delimiter if you have a choice. You can also specify fine-grained
+ "stripping" control; the default behaviour
+ is to strip whitespace off the top and bottom of the overall data block, so blank lines are
+ excluded, and off the ends of each row so line endings and indentation don't matter, but not off each
+ cell. Note that the strings in the cells may contain spaces
+ and these spaces will be respected in formatting. You are also advised to use a CDATA
+ escape sequence around your data so that "&","<" and ">", characters don't
+ need special handling.</para>
+ <h2>Excel Bulk Data Support</h2>
+ <para>The <b>excelData</b> tag is very similar to the bulk data support, but reads the bulk
+ data from an Excel file instead of from delimited textual data. The <b>range</b> attribute is
+ optional.</para>
+ <spacer length="24"/>
+ <h3><font color="red">
+ Sorry Ecel Bulk Support is not yet here
+ </font></h3>
+<!--
+ <blockTable style="numeric">
+ <excelData fileName="exceldata.xls" sheetName="Sheet1" range="A1:B7" />
+ </blockTable>
+-->
+ <spacer length="24"/>
+ <h2>Colour cycles by rows and columns</h2>
+ <para>It's sometimes nice to alternate colours by row (e.g. a pale color then
+ white) to visually break up a long table. The style lets you specify <b>cycles</b> as
+ well as single colours. Here we have created a style command which cycles through
+ pale green and white, like old stacks of fanfold paper...</para>
+ <blockTable align="LEFT">
+ <blockTableStyle id="repeater" spaceBefore="12">
+ <lineStyle kind="OUTLINE" colorName="black" thickness="0.5"/>
+ <blockFont name="Times-Bold" size="6" leading="7" start="0,0" stop="-1,0"/>
+ <blockBottomPadding length="1"/>
+ <blockBackground colorName="0xD0D0D0" start="0,0" stop="-1,0"/>
+ <lineStyle kind="LINEBELOW" colorName="black" start="0,0" stop="-1,0" thickness="0.5"/>
+ <!--body section-->
+ <blockFont name="Times-Roman" size="6" leading="7" start="0,1" stop="-1,-1"/>
+ <blockTopPadding length="1" start="0,1" stop="-1,-1"/>
+ <blockBackground colorsByRow="0xD0FFD0;None" start="0,1" stop="-1,-1"/>
+ </blockTableStyle>
+ <tr>
+ <td>Date</td>
+ <td>Item</td>
+ <td>Debit</td>
+ <td>Credit</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Bottom row should be greem</td>
+ <td>110</td>
+ <td>-</td>
+ </tr>
+ </blockTable>
+ <nextFrame/>
+ <para>Try again by column, with three colors this time. Also ensure some row heights
+ vary to check accuracy of drawing.</para>
+ <blockTable align="RIGHT">
+ <blockTableStyle id="repeater2" spaceBefore="12">
+ <lineStyle kind="OUTLINE" colorName="black" thickness="0.5"/>
+ <lineStyle kind="GRID" colorName="gray" thickness="0.25"/>
+ <blockFont name="Times-Bold" size="6" leading="7" start="0,0" stop="-1,0"/>
+ <blockBottomPadding length="1"/>
+ <blockBackground colorName="0xD0D0D0" start="0,0" stop="-1,0"/>
+ <lineStyle kind="LINEBELOW" colorName="black" start="0,0" stop="-1,0" thickness="0.5"/>
+ <!--body section-->
+ <blockFont name="Times-Roman" size="6" leading="7" start="0,1" stop="-1,-1"/>
+ <blockTopPadding length="1" start="0,1" stop="-1,-1"/>
+ <blockBackground colorsByRow="0xD0FFD0;0xFFD0FF;None" start="0,1" stop="-1,-1"/>
+ </blockTableStyle>
+ <tr>
+ <td>Date</td>
+ <td>Item</td>
+ <td>Debit</td>
+ <td>Credit</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients
+plus magnum of champagne</td>
+ <td>400</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ <tr>
+ <td>28-09-2004</td>
+ <td>Expensive lunch with clients</td>
+ <td>100</td>
+ <td>-</td>
+ </tr>
+ </blockTable>
+ <para>And now by column (although this may be used less...)</para>
+ <blockTable>
+ <blockTableStyle id="repeater3" spaceBefore="12">
+ <lineStyle kind="OUTLINE" colorName="black" thickness="0.5"/>
+ <lineStyle kind="GRID" colorName="gray" thickness="0.25"/>
+ <blockFont name="Times-Bold" size="6" leading="7" start="0,0" stop="-1,0"/>
+ <blockBottomPadding length="1"/>
+ <blockBackground colorName="0xD0D0D0" start="0,0" stop="-1,0"/>
+ <lineStyle kind="LINEBELOW" colorName="black" start="0,0" stop="-1,0" thickness="0.5"/>
+ <!--body section-->
+ <blockFont name="Times-Roman" size="6" leading="7" start="0,1" stop="-1,-1"/>
+ <blockTopPadding length="1" start="0,1" stop="-1,-1"/>
+ <blockBackground colorsByCol="0xD0FFD0;None" start="0,1" stop="-1,-1"/>
+ </blockTableStyle>
+ <tr>
+ <td>Date</td>
+ <td>Item</td>
+ <td>Jan</td>
+ <td>Feb</td>
+ <td>Mar</td>
+ <td>Apr</td>
+ <td>May</td>
+ <td>Jun</td>
+ <td>Jul</td>
+ <td>Aug</td>
+ <td>Sep</td>
+ <td>Oct</td>
+ <td>Nov</td>
+ <td>Dec</td>
+ <td>Total</td>
+ </tr>
+ <tr>
+ <td>Expenses</td>
+ <td>Entertainment</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>1200</td>
+ </tr>
+ <tr>
+ <td>Expenses</td>
+ <td>Entertainment</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>1200</td>
+ </tr>
+ <tr>
+ <td>Expenses</td>
+ <td>Entertainment</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>1200</td>
+ </tr>
+ <tr>
+ <td>Expenses</td>
+ <td>Entertainment</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>1200</td>
+ </tr>
+ <tr>
+ <td>Expenses</td>
+ <td>Entertainment</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>100</td>
+ <td>1200</td>
+ </tr>
+ </blockTable>
+
+
+ <h2>Splitting over pages - top and bottom rows</h2>
+ <para>Sometimes a table splits over a page and you don't have a grid, so the bottom part (and top of the
+ new page) have no line boxing them in. The splitfirst and splilast magic coordinates can be used to insert
+ a line drawing routine into the style for this. I used an ugly thick purple line!</para>
+ <blockTable repeatRows="1">
+ <blockTableStyle id="repeater" spaceBefore="12">
+ <lineStyle kind="OUTLINE" colorName="black" thickness="0.5"/>
+ <blockFont name="Times-Bold" size="6" leading="7" start="0,0" stop="-1,0"/>
+ <blockBottomPadding length="1"/>
+ <blockBackground colorName="0xD0D0D0" start="0,0" stop="-1,0"/>
+ <lineStyle kind="LINEBELOW" colorName="black" start="0,0" stop="-1,0" thickness="0.5"/>
+ <!--body section-->
+ <blockFont name="Times-Roman" size="6" leading="7" start="0,1" stop="-1,-1"/>
+ <blockTopPadding length="1" start="0,1" stop="-1,-1"/>
+ <blockBackground colorsByRow="0xD0FFD0;None" start="0,1" stop="-1,-1"/>
+ <blockAlignment value="right" start="1,1" stop="-1,-1"/>
+
+ <!-- ensure the bottom of the table is 'closed off' during the split. I've used an ugly red dashed line -->
+ <lineStyle kind="LINEBELOW" colorName="purple" start="0,splitlast" stop="-1,splitlast" thickness="3"/>
+
+
+ </blockTableStyle>
+ <tr> <td>Date</td><td>Item</td><td>Debit</td><td>Credit</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100</td><td>-</td></tr>
+ <tr> <td>28-09-2004</td><td>Expensive lunch with clients</td><td>100 </td><td>-</td></tr>
+
+ </blockTable>
+
+ <bookmark name="BACK_PAGE"/>
+ </story>
+</document>
More information about the Checkins
mailing list