20120420

How to generate chunks of ODF XML

The [pdf] button now produces a pdf with correct column widths. http://code.google.com/p/lino/source/detail?r=abf9ee80039f.

Now I’ll take some time to find the “best” method for generating chunks of ODF XML. Currently I’m using ODFPy which looks something like:

doc = OpenDocumentText()

tablecontents = Style(name="Table Contents", family="paragraph")
tablecontents.addElement(ParagraphProperties(numberlines="false",
    linenumber="0"))
doc.styles.addElement(tablecontents)

tableheader = Style(name="Table Column Header", family="paragraph")
tableheader.addElement(ParagraphProperties(numberlines="false",
    linenumber="0"))
doc.styles.addElement(tableheader)

table = Table()
doc.text.addElement(table)

for i,fld in enumerate(fields):
    cs = Style(name=fld.name, family="table-column")
    cs.addElement(TableColumnProperties(columnwidth=width_specs[i]))
    doc.automaticstyles.addElement(cs)
    table.addElement(TableColumn(stylename=cs))

# header
hr = TableRow()
table.addElement(hr)
for fld in fields:
    tc = TableCell()
    tc.addElement(P(
        stylename=tableheader,
        text=force_unicode(fld.field.verbose_name or fld.name)))
    hr.addElement(tc)

for row in ar.data_iterator:
    tr = TableRow()
    table.addElement(tr)

    for i,fld in enumerate(fields):
        tc = TableCell()
        v = fld.full_value_from_object(ar,row)
        tc.addElement(P(stylename=tablecontents,text=unicode(v)))
        tr.addElement(tc)
doc.save(output_file) # , True)

The problem with ODFPy is that it is not really used and probably will not be maintained. So I’m going to try and do the same using my own lino.utils.xmlgen.odf module (which in turn is in fact just a wrapper around lxml).