svv/pdf.py
author Tero Marttila <terom@fixme.fi>
Mon, 10 Jan 2011 18:33:15 +0200
changeset 55 433842c04ab1
parent 31 e1b63e4d10f4
permissions -rw-r--r--
items: inventory table #id links, fix up DeleteItemForm
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
# coding: utf-8
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
    PDF output
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
"""
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
from reportlab import platypus as rlpp
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
from reportlab.lib.units import inch
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
from reportlab.lib import pagesizes, styles
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
from cStringIO import StringIO
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
import itertools
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
import logging
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
import datetime
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
log = logging.getLogger('svv.pdf')
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
class Styles (object) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        Simple stylesheet
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    samplestyles = styles.getSampleStyleSheet()
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    26
    # default
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    27
    default = styles.ParagraphStyle('Text', samplestyles['Normal'],
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    28
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    29
    )
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    30
    
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    # normal text
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    32
    text = p = default
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    33
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    34
    # headers
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    h1 = styles.ParagraphStyle('Heading1', samplestyles['h1'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
            fontName        = 'Times-Bold',
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
            fontSize        = 22,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
            spaceBefore     = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
            spaceAfter      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    h2 = styles.ParagraphStyle('Heading2', samplestyles['h2'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
            fontName        = 'Times-Bold',
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
            fontSize        = 14,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
            spaceBefore     = 6,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
            spaceAfter      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    h3 = styles.ParagraphStyle('Heading3', samplestyles['h3'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
            fontName        = 'Times-Italic',
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
            fontSize        = 12,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
            spaceBefore     = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
            spaceAfter      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    # list indent level
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    list_indent = inch / 4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    # root title
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    list_h1 = styles.ParagraphStyle('ListHeading1', samplestyles['h1'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
            bulletIndent    = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
            leftIndent      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    # section
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    list_h2 = styles.ParagraphStyle('ListHeading2', samplestyles['h2'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
            bulletIndent    = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
            leftIndent      = list_indent,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
            fontName        = 'Times-Bold',
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
            fontSize        = 10,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
            leading         = 12,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
            spaceBefore     = 6,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
            spaceAfter      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    # segment
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    list_h3 = styles.ParagraphStyle('ListHeading3', samplestyles['h3'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
            bulletIndent    = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
            leftIndent      = list_indent,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
            fontName        = 'Times-Italic',
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
            fontSize        = 10,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
            leading         = 12,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
            spaceBefore     = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
            spaceAfter      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    # infot
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    90
    list_p = styles.ParagraphStyle('ListText', samplestyles['Normal'],
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
            bulletIndent    = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
            leftIndent      = list_indent,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    )
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    94
    list_text = list_p
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    96
    # lookup styles by rule
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    97
    # searched in order, first match against end of node_path wins
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    98
    RULES = (
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    99
        ('li p',        list_p),
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   100
        ('li h1',       list_h1),
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   101
        ('li h2',       list_h2),
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   102
        ('li h3',       list_h3),
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   103
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   104
        ('p',           p),
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   105
        ('h1',          h1),
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   106
        ('h2',          h2),
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   107
        ('h3',          h3),
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   108
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   109
    )
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   110
    
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
    @classmethod
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   112
    def match (cls, name=None) :
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
        """
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   114
            Return appropriate style.
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   117
        if name :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   118
            return getattr(cls, name, cls.default)
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   120
        else :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   121
            return cls.default
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   123
    def lookup (self, node_path) :
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        """
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   125
            Return a suitable ParagraphStyle to use for a node
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   126
                
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   127
                node_path   - tag-path to node (list of tags as ancestry of node)
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   130
        # XXX: find a better hack
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   131
        nodepath = ' '.join(node_path)
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   133
        for rule, style in self.RULES :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   134
            if nodepath.endswith(rule) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   135
                return style
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   137
        # default
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   138
        return self.default
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
class SignatureBlock (rlpp.Flowable) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
        A signature block, with multiple sets of multiple pre-fillied fields.
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
    # vertical space per field
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
    FIELD_HEIGHT = 2 * inch / 4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
    # horizontal offset from top of field to field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
    FIELD_OFFSET = FIELD_HEIGHT / 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
    # maximum width to scale columns to
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
    COL_WIDTH_MAX = 4 * inch
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
    # empty space to leave below the fields
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    PADDING_BOTTOM = inch / 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
23
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   157
    def __init__ (self, cols, fields, values={}, fullheight=None) :
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
        """
23
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   159
            cols        - Column titles
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   160
            fields      - Fields titles, describing the horizontal fields
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   161
            values      - Pre-filled values as a {(col, field): value} dict
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   162
            fullheight  - Consume full vertical height to place at bottom of page
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
            desc/value strings can contain formatting codes:
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
                column      - title of the current column
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
                today       - today's date in %d/%m/%Y format
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
        self.cols = cols
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
        self.fields = fields
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
        self.values = values
23
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   173
        self.fullheight = fullheight
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    def wrap (self, width, height) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
            Calculate how much space we use up, returning (width, height)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
        self.width = width
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
23
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   182
        self.height = len(self.fields) * self.FIELD_HEIGHT
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   183
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   184
        if self.fullheight :
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   185
            # consume all available height, to place us at the bottom
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   186
            self.height = max(self.height, height)
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
        return self.width, self.height
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    def formatString (self, text, col_title) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
            Format display string using context parameters
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
        """
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   194
        
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   195
        # XXX: the canvas.drawString we use here does support unicode?
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
        return text % dict(
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
                column      = col_title,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
                today       = datetime.date.today().strftime("%d/%m/%Y"),
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
        )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
    # text above field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
    VALUE_FONT = "Courier-Bold"
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
    VALUE_FONT_SIZE = 14
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
    VALUE_OFFSET = inch / 12
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
    # text below field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
    TITLE_FONT = "Times-Italic"
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
    TITLE_FONT_SIZE = 10
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
    TITLE_OFFSET = inch / 8
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
    def draw (self) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
            Render full block onto our canvas
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
        # target canvas
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
        canvas = self.canv
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
        col_width = min(self.width / len(self.cols), self.COL_WIDTH_MAX)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
        col_margin = col_width * 0.1
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
        col_height = len(self.fields) * self.FIELD_HEIGHT + self.PADDING_BOTTOM
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
        for field_idx, (field_title) in enumerate(self.fields) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
            h = self.FIELD_HEIGHT
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
            y = col_height - h * (field_idx + 1)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
            for col_idx, (col_title) in enumerate(self.cols) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
                w = col_width
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
                x = w * col_idx
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
                value = self.values.get((col_title, field_title))
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
                title = field_title
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
                value = self.formatString(value, col_title) if value else None
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
                title = self.formatString(title, col_title) if title else None
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
                if value :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
                    canvas.setFont(self.VALUE_FONT, self.VALUE_FONT_SIZE)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
                    canvas.drawString(x + col_margin + self.VALUE_OFFSET, y - self.FIELD_OFFSET + 2, value)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
                
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
                # field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
                canvas.line(x + col_margin, y - self.FIELD_OFFSET, x + w - col_margin, y - h / 2)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
                # desc text
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
                canvas.setFont(self.TITLE_FONT, self.TITLE_FONT_SIZE)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
                canvas.drawString(x + col_margin + self.TITLE_OFFSET, y - self.FIELD_OFFSET - self.TITLE_FONT_SIZE, title)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
class PageTemplate (rlpp.PageTemplate) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
        A single-frame page with header and footer.
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
    # vertical space available for footer/header, fixed because we can't really flow text vertically
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
    HEADER_HEIGHT = 1 * inch
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
    FOOTER_HEIGHT = 1 * inch
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
    COL_FONT_SIZE = 8
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
    COL_TITLE_FONT_NAME, COL_TITLE_FONT_SIZE = COL_TITLE_FONT = ("Times-Bold", COL_FONT_SIZE)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
    COL_TEXT_FONT_NAME, COL_TEXT_FONT_SIZE = COL_TEXT_FONT = ("Times-Roman", COL_FONT_SIZE)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
    def __init__ (self, id='page', page_size=pagesizes.A4, margin=inch, header_columns=None, footer_columns=None) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
                id          - identifier for this page template
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
                page_size   - the (width, height) of this page
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
                margin      - the base margin to use between elements
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
                header_columns  - (title, text) list of header columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
                footer_columnss - (title, text) list of footer columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
        self.page_width, self.page_height = self.page_size = page_size
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
        self.margin = margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
        self.header_height = self.HEADER_HEIGHT
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
        self.footer_height = self.FOOTER_HEIGHT
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
        # calculate frame
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
        self.frame_left = self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
        self.frame_bottom = self.footer_height + self.margin / 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
        self.frame_top = self.page_height - self.header_height - self.margin / 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
        self.frame_right = self.page_width - self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
        self.frame = rlpp.Frame(self.frame_left, self.frame_bottom, self.frame_right - self.frame_left, self.frame_top - self.frame_bottom)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
        # init base template
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
        rlpp.PageTemplate.__init__(self, id, frames=[self.frame])
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
        self.header_columns = header_columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
        self.footer_columns = footer_columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
    def fmt_string (self, text) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
            Prepare a string for display by handling format codes
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
        """
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   296
        
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   297
        return unicode(text % dict(
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
            today = datetime.date.today().strftime("%d / %m / %Y"),
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
        ))
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
    def draw_column (self, canvas, x, y, width, title, lines, gray=None) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
            Draw a column in the specified position, with the specified lines of text
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   306
        text = canvas.beginText(x, y)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   307
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   308
        # grayscale text?
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   309
        if gray :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   310
            text.setFillGray(gray)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   311
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
        # title
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   313
        text.setFont(*self.COL_TITLE_FONT)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   314
        text.textLine(self.fmt_string(title))
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   316
        # lines
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   317
        text.setFont(*self.COL_TEXT_FONT)
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   318
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   319
        # XXX: textobject's textLine fails at unicode, but textLine should work...
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   320
        for line in lines :
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   321
            text.textLine(self.fmt_string(line))
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   322
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   323
        # draw out
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   324
        canvas.drawText(text)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   325
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   326
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   327
    def draw_columns (self, canvas, x, y, width, columns, **opts) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   328
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   329
            Draw a series of columns in the specified position
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   330
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   331
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   332
        col_count = len(columns)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   333
        col_width = width / col_count
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   334
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   335
        x_base = x
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   336
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   337
        for col_idx, (col_data) in enumerate(columns) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   338
            x = x_base + (col_idx * col_width)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   339
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   340
            # draw column data at correct offset inside our space
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   341
            self.draw_column(canvas, x, y - self.COL_FONT_SIZE, col_width, *col_data, **opts)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   342
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   343
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   344
    def draw_header (self, canvas) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
            Draw page header
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   348
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   349
        # offsets
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
        x = self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
        h = self.footer_height - self.margin / 4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   352
        w = self.page_width - self.margin * 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   354
        # spacer
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   355
        y = self.page_height - self.footer_height
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   356
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   357
        canvas.setLineWidth(0.5)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   358
        canvas.line(x - self.margin / 2, y, self.page_width - self.margin / 2, y)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   359
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
        # columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   361
        y = self.page_height - self.margin / 4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   362
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   363
        self.draw_columns(canvas, x, y, w, self.header_columns)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   364
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   365
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   366
    def draw_footer (self, canvas) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   367
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   368
            Draw page footer
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   369
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   370
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   371
        # offsets
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   372
        x = self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   373
        y = self.footer_height
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   374
        w = self.page_width - self.margin * 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   375
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   376
        # spacer
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   377
        canvas.setLineWidth(0.5)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   378
        canvas.line(x - self.margin / 2, y, self.page_width - self.margin / 2, y)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   379
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   380
        # columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   381
        self.draw_columns(canvas, x, y - inch / 8, w, self.footer_columns, gray=0.4)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   382
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   383
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   384
    def beforeDrawPage (self, canvas, document) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   385
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   386
            Draw page headers/footers
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   387
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   388
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   389
        self.draw_header(canvas)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   390
        self.draw_footer(canvas)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   392
class DocumentTemplate (rlpp.BaseDocTemplate) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   393
    def __init__ (self, page_templates, title, author, page_size=pagesizes.A4) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   394
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   395
            Initialize with fixed list of needed PageTemplates.
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   396
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   397
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   398
        # we supply the file later
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   399
        rlpp.BaseDocTemplate.__init__(self, filename=None, 
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   400
                pageTemplates=page_templates, title=title, author=author,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   401
                pageSize=page_size
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   402
        )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   403
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   404
    def render_buf (self, elements) :
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   405
        """
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   406
            Build the document using the given list of Flowables, returning a StringIO containing the PDF.
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   407
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   408
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   409
        buf = StringIO()
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   410
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   411
        # build
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
        self.build(elements, buf)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   413
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   414
        # prepare for read
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   415
        buf.seek(0)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   416
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   417
        return buf
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   418
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   419
    def render_string (self, elements) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   420
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   421
            Build the document using the given list of Flowables, returning the PDF as a single str.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   422
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   423
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   424
        # render
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   425
        buf = self.render_buf(elements)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   426
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
        # binary data out
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
        return buf.getvalue()
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   429
31
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   430
class Markup (object) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   431
    """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   432
        Generate Paragraphs from Markup docs.
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   433
    """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   434
    
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   435
    def __init__ (self, styles) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   436
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   437
            Initialize render state.
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   438
                
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   439
                styles          - Style instance to use
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   440
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   441
            This class is stateful and single-use.
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   442
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   443
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   444
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   445
        # elment stack
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   446
        self.stack = []
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   447
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   448
        # styles
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   449
        self.styles = styles
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   450
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   451
    def lookup_style (self, elem=None) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   452
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   453
            Lookup style for given element, which must be at the top of the stack.
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   454
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   455
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   456
        # path to element
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   457
        path = self.stack
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   458
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   459
        if elem is not None and path[-1] is not elem :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   460
            # XXX: sub-elem?
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   461
            path = path + [elem]
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   462
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   463
        # lookup
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   464
        return self.styles.lookup([elem.tag for elem in path])
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   465
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   466
    ## Basic text
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   467
    def render_p (self, elem, bullet=None) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   468
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   469
            Normal paragraph.
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   470
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   471
            XXX: inline markup?
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   472
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   473
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   474
        style = self.lookup_style(elem)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   475
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   476
        yield rlpp.Paragraph(elem.text, style, bullet)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   477
    
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   478
    def _render_hx (self, elem, bullet=None) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   479
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   480
            Render given h1/h2/h3 element
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   481
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   482
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   483
        # get style for <hX> tag
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   484
        style = self.lookup_style(elem)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   485
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   486
        # styled text
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   487
        yield rlpp.Paragraph(elem.text, style, bullet)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   488
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   489
    render_h1 = render_h2 = render_h3 = _render_hx
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   490
    
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   491
    ## Lists
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   492
    def list_ol_seq (self) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   493
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   494
            Numeric ordered list numbering.
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   495
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   496
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   497
        for idx in itertools.count(1) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   498
            yield "%d." % (idx, )
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   499
    
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   500
    def list_ul_seq (self) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   501
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   502
            Bulleted unordered list numbering.
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   503
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   504
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   505
        while True :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   506
            yield "&bull;"
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   507
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   508
    def _render_list (self, elem, seq, bullet=None) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   509
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   510
            Render <ul>/<ol> containing <li>s
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   511
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   512
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   513
        indent = self.styles.list_indent
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   514
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   515
        # following lines, indented
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   516
        yield rlpp.Indenter(indent)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   517
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   518
        # children
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   519
        for sub in elem :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   520
            # get (optional) bullet for item
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   521
            bullet = next(seq, None) if seq else None
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   522
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   523
            # sub-render
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   524
            for ff in self.render(sub, bullet) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   525
                yield ff
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   526
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   527
        # de-dent
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   528
        yield rlpp.Indenter(-indent)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   529
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   530
    def render_ul (self, elem, bullet=None) : return self._render_list(elem, self.list_ul_seq(), bullet)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   531
    def render_ol (self, elem, bullet=None) : return self._render_list(elem, self.list_ol_seq(), bullet)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   532
 
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   533
    def render_li (self, elem, bullet) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   534
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   535
            Render <li>, with given bullet on first line of text
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   536
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   537
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   538
        children = list(elem)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   539
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   540
        # render bullet on first item
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   541
        if elem.text :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   542
            # style for text pseudo-element
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   543
            style = self.lookup_style(elem.makeelement('text', {}))
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   544
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   545
            # direct text, no sub-p or such
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   546
            yield rlpp.Paragraph(elem.text, style, bullet)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   547
        
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   548
        elif children :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   549
            sub = children.pop(0)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   550
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   551
            # render first sub with bullet
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   552
            for ff in self.render(sub, bullet) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   553
                yield ff
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   554
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   555
        # render remaining elements
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   556
        for sub in children :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   557
            for ff in self.render(sub) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   558
                yield ff
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   559
 
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   560
    ## Root element
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   561
    def render_root (self, elem, bullet) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   562
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   563
            Render the given root element's children, ignoring the root element itself.
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   564
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   565
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   566
        for sub in elem :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   567
            for ff in self.render(sub) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   568
                yield ff
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   569
           
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   570
    ## Top-level element render dispatch
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   571
    def render (self, elem, bullet=None) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   572
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   573
            Yield a series of Flowables for the given element and its children.
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   574
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   575
                elem            - Element to (recursively) render
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   576
                bullet          - optional bullet text to use for this element
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   577
        """
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   578
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   579
        log.debug("%r, bullet=%r", elem, bullet)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   580
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   581
        try :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   582
            # lookup
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   583
            func = getattr(self, 'render_%s' % elem.tag)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   584
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   585
        except AttributeError, ex :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   586
            raise Exception("Unhandled tag %r" % elem)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   587
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   588
        # enter element
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   589
        self.stack.append(elem)
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   590
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   591
        # dispatch
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   592
        for ff in func(elem, bullet) :
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   593
            yield ff
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   594
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   595
        # exit element
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   596
        assert self.stack.pop(-1) is elem
e1b63e4d10f4 Implement Markup rendering for PDFs, and use that for order terms
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   597