Exemple #1
0
 def _tag_table(self, node):
     self.tb.fline()
     saved_tb = self.tb
     self.tb = None
     sizes = None
     if node.get('colWidths'):
         sizes = map(lambda x: utils.unit_get(x), node.get('colWidths').split(','))
     trs = []
     for n in utils._child_get(node,self):
         if n.tag == 'tr':
             tds = []
             for m in utils._child_get(n,self):
                 if m.tag == 'td':
                     self.tb = textbox()
                     self.rec_render_cnodes(m)
                     tds.append(self.tb)
                     self.tb = None
             if len(tds):
                 trs.append(tds)
     
     if not sizes:
         verbose("computing table sizes..")
     for tds in trs:
         trt = textbox()
         off=0
         for i in range(len(tds)):
             p = int(sizes[i]/Font_size)
             trl = tds[i].renderlines(pad=p)
             trt.haplines(trl,off)
             off += sizes[i]/Font_size
         saved_tb.curline = trt
         saved_tb.fline()
     
     self.tb = saved_tb
     return
Exemple #2
0
    def _tag_blockTable(self, node):
        self.tb.fline()
        saved_tb = self.tb
        self.tb = None
        sizes = None
        if node.get('colWidths'):
            sizes = map(self.template._conv_unit_width, node.get('colWidths').split(','))
        if not sizes:
            self._log.debug("computing table sizes..")
            raise NotImplementedError
        trs = []

        for n in utils._child_get(node, self):
            if n.tag == 'tr':
                tds = []
                tdi = 0
                for m in utils._child_get(n, self):
                    if m.tag == 'td':
                        colspan = int(m.get('colspan') or 1)
                        width = 0
                        if tdi + colspan > len(sizes):
                            raise ValueError("Table cell %d exceeds %d columns" % (tdi+colspan, len(sizes)))
                        for x in range(colspan):
                            width += sizes[tdi]
                            tdi += 1
                        self.tb = textbox(0,0, width)
                        self.rec_render_cnodes(m)
                        self.tb.fline()
                        tds.append(self.tb)
                        self.tb = None
                    else:
                        self.warn_nitag(m.tag)
                if len(tds):
                    trs.append(tds)
            else:
                self.warn_nitag(n.tag)

        self.tb = saved_tb

        for tds in trs:
            trt = textbox()
            off=0
            for td in tds:
                trl = td.renderlines(pad=td.width)
                trt.haplines(trl,off)
                off += td.width + 1
            self._reserve_flines(len(trt.lines))
            self.tb.curline = trt
            self.tb.fline()

        return
Exemple #3
0
 def _path(self, node):
     self.path = self.canvas.beginPath()
     self.path.moveTo(**utils.attr_get(node, ['x', 'y']))
     for n in utils._child_get(node, self):
         if not n.text:
             if n.tag == 'moveto':
                 vals = utils.text_get(n).split()
                 self.path.moveTo(utils.unit_get(vals[0]),
                                  utils.unit_get(vals[1]))
             elif n.tag == 'curvesto':
                 vals = utils.text_get(n).split()
                 while len(vals) > 5:
                     pos = []
                     while len(pos) < 6:
                         pos.append(utils.unit_get(vals.pop(0)))
                     self.path.curveTo(*pos)
         elif n.text:
             data = n.text.split(
             )  # Not sure if I must merge all TEXT_NODE ?
             while len(data) > 1:
                 x = utils.unit_get(data.pop(0))
                 y = utils.unit_get(data.pop(0))
                 self.path.lineTo(x, y)
     if (not node.get('close')) or utils.bool_get(node.get('close')):
         self.path.close()
     self.canvas.drawPath(
         self.path,
         **utils.attr_get(node, [], {
             'fill': 'bool',
             'stroke': 'bool'
         }))
    def render(self, out):
        el = self.etree.findall('.//docinit')
        if el:
            self.docinit(el)

        el = self.etree.findall('.//stylesheet')
        self.styles = _rml_styles(el,self.localcontext)

        el = self.etree.findall('.//images')
        if el:
            self.images.update( self._images(el[0]) )

        el = self.etree.findall('.//template')
        if len(el):
            pt_obj = _rml_template(self.localcontext, out, el[0], self, images=self.images, path=self.path, title=self.title)
            el = utils._child_get(self.etree, self, 'story')
            pt_obj.render(el)
        else:
            self.canvas = canvas.Canvas(out)
            pd = self.etree.find('pageDrawing')[0]
            pd_obj = _rml_canvas(self.canvas, self.localcontext, None, self, self.images, path=self.path, title=self.title)
            pd_obj.render(pd)

            self.canvas.showPage()
            self.canvas.save()
Exemple #5
0
    def render(self, out):
        el = self.etree.findall('.//docinit')
        if el:
            self.docinit(el)

        el = self.etree.findall('.//stylesheet')
        self.styles = _rml_styles(el,self.localcontext)

        el = self.etree.findall('.//images')
        if el:
            self.images.update( self._images(el[0]) )

        el = self.etree.findall('.//template')
        if len(el):
            pt_obj = _rml_template(self.localcontext, out, el[0], self, images=self.images, path=self.path, title=self.title)
            el = utils._child_get(self.etree, self, 'story')
            pt_obj.render(el)
        else:
            self.canvas = canvas.Canvas(out)
            pd = self.etree.find('pageDrawing')[0]
            pd_obj = _rml_canvas(self.canvas, self.localcontext, None, self, self.images, path=self.path, title=self.title)
            pd_obj.render(pd)

            self.canvas.showPage()
            self.canvas.save()
Exemple #6
0
 def render(self, node):
     tags = {
         'drawCentredString': self._drawCenteredString,
         'drawRightString': self._drawRightString,
         'drawString': self._drawString,
         'rect': self._rect,
         'ellipse': self._ellipse,
         'lines': self._lines,
         'grid': self._grid,
         'curves': self._curves,
         'fill': lambda node: self.canvas.setFillColor(color.get(node.get('color'))),
         'stroke': lambda node: self.canvas.setStrokeColor(color.get(node.get('color'))),
         'setFont': self.setFont ,
         'place': self._place,
         'circle': self._circle,
         'lineMode': self._line_mode,
         'path': self._path,
         'rotate': lambda node: self.canvas.rotate(float(node.get('degrees'))),
         'translate': self._translate,
         'image': self._image
     }
     for n in utils._child_get(node, self):
         self.doc.tick()
         if n.tag in tags:
             tags[n.tag](n)
    def render(self, out):
        self.result += '''<!DOCTYPE HTML PUBLIC "-//w3c//DTD HTML 4.0 Frameset//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <style type="text/css">
        p {margin:0px; font-size:12px;}
        td {font-size:14px;}
'''
        style = self.dom.findall('stylesheet')[0]
        s = _rml_stylesheet(self.localcontext, style, self.dom)
        self.result += s.render()
        self.result+='''
    </style>
'''
        list_story =[]
        for story in utils._child_get(self.dom, self, 'story'):
            template = _rml_template(self.dom.findall('template')[0], self.localcontext)
            f = _flowable(template, self.dom, localcontext = self.localcontext)
            story_text = f.render(story)
            list_story.append(story_text)
        del f
        if template.data:
            tag = '''<img src = '%s' width=80 height=72/>'''%(template.data)
        else:
            tag = ''
        self.result +='''
            <script type="text/javascript">

            var indexer = 0;
            var aryTest = %s ;
            function nextData()
                {
                if(indexer < aryTest.length -1)
                    {
                    indexer += 1;
                    document.getElementById("tiny_data").innerHTML=aryTest[indexer];
                    }
                }
            function prevData()
                {
                if (indexer > 0)
                    {
                    indexer -= 1;
                    document.getElementById("tiny_data").innerHTML=aryTest[indexer];
                    }
                }
        </script>
        </head>
        <body>
            %s
            <div id="tiny_data">
                %s
            </div>
            <br>
            <input type="button" value="next" onclick="nextData();">
            <input type="button" value="prev" onclick="prevData();">

        </body></html>'''%(list_story,tag,list_story[0])
        out.write( self.result)
Exemple #8
0
    def render(self, out_fp):
        for tmpl in self.etree.findall('template'):
            self.templates.append( _rml_template(self.localcontext, tmpl, out_fp, page_limit=self.page_limit))

        for story in utils._child_get(self.etree, self, 'story'):
            self.tick()
            fable = _flowable_doc(self)
            fable.render(story)
Exemple #9
0
 def rec_render(self, node):
     txts = []
     t = node.text
     if t:
         txts.append(utils._process_text(self, t))
     for n in utils._child_get(node, self):
         txts += self.rec_render(n)
     t = node.tail
     if t:
         txts.append(utils._process_text(self, t))
     return txts
 def render(self, node):
     result = self.template.start()
     result += self.template.frame_start()
     for n in utils._child_get(node, self):
         if n.tag in self._tags:
             result += self._tags[n.tag](n)
         else:
             pass
     result += self.template.frame_stop()
     result += self.template.end()
     return result.encode('utf-8').replace('"',"\'").replace('°','&deg;')
Exemple #11
0
 def render(self, node):
     result = self.template.start()
     result += self.template.frame_start()
     for n in utils._child_get(node, self):
         if n.tag in self._tags:
             result += self._tags[n.tag](n)
         else:
             pass
     result += self.template.frame_stop()
     result += self.template.end()
     return result.encode('utf-8').replace('"', "\'").replace('°', '&deg;')
Exemple #12
0
 def _textual(self, node):
     rc1 = utils._process_text(self, node.text or '')
     for n in utils._child_get(node,self):
         txt_n = copy.deepcopy(n)
         for key in txt_n.attrib.keys():
             if key in ('rml_except', 'rml_loop', 'rml_tag'):
                 del txt_n.attrib[key]
         if not n.tag == 'bullet':
             txt_n.text = utils.xml2str(self._textual(n))
         txt_n.tail = n.tail and utils.xml2str(utils._process_text(self, n.tail.replace('\n',''))) or ''
         rc1 += etree.tostring(txt_n)
     return rc1
Exemple #13
0
 def _textual(self, node):
     rc1 = utils._process_text(self, node.text or '')
     for n in utils._child_get(node,self):
         txt_n = copy.deepcopy(n)
         for key in txt_n.attrib.keys():
             if key in ('rml_except', 'rml_loop', 'rml_tag'):
                 del txt_n.attrib[key]
         if not n.tag == 'bullet':
             txt_n.text = utils.xml2str(self._textual(n))
         txt_n.tail = n.tail and utils.xml2str(utils._process_text(self, n.tail.replace('\n',''))) or ''
         rc1 += etree.tostring(txt_n)
     return rc1
 def process_story(node_story):
     sub_story = []
     for node in utils._child_get(node_story, self):
         if node.tag == etree.Comment:
             node.text = ''
             continue
         flow = self._flowable(node)
         if flow:
             if isinstance(flow,list):
                 sub_story = sub_story + flow
             else:
                 sub_story.append(flow)
     return sub_story
Exemple #15
0
 def process_story(node_story):
     sub_story = []
     for node in utils._child_get(node_story, self):
         if node.tag == etree.Comment:
             node.text = ''
             continue
         flow = self._flowable(node)
         if flow:
             if isinstance(flow,list):
                 sub_story = sub_story + flow
             else:
                 sub_story.append(flow)
     return sub_story
Exemple #16
0
 def _textual(self, node):
     rc1 = utils._process_text(self, node.text or "")
     for n in utils._child_get(node, self):
         txt_n = copy.deepcopy(n)
         for key in txt_n.attrib.keys():
             if key in ("rml_except", "rml_loop", "rml_tag"):
                 del txt_n.attrib[key]
         if not n.tag == "bullet":
             if n.tag == "pageNumber":
                 txt_n.text = self.canvas and str(self.canvas.getPageNumber()) or ""
             else:
                 txt_n.text = utils.xml2str(self._textual(n))
         txt_n.tail = n.tail and utils.xml2str(utils._process_text(self, n.tail.replace("\n", ""))) or ""
         rc1 += etree.tostring(txt_n)
     return rc1
Exemple #17
0
 def process(node, new_node):
     for child in utils._child_get(node, self):
         new_child = copy.deepcopy(child)
         new_node.append(new_child)
         if len(child):
             for n in new_child:
                 new_child.remove(n)
             process(child, new_child)
         else:
             new_child.text = utils._process_text(self, child.text)
             new_child.tag = 'p'
             try:
                 if new_child.get('style').find('terp_tblheader') != -1:
                     new_node.tag = 'th'
             except:
                 pass
 def process(node,new_node):
     for child in utils._child_get(node,self):
         new_child = copy.deepcopy(child)
         new_node.append(new_child)
         if len(child):
             for n in new_child:
                 new_child.remove(n)
             process(child, new_child)
         else:
             new_child.text  = utils._process_text(self, child.text)
             new_child.tag = 'p'
             try:
                 if new_child.get('style').find('terp_tblheader')!= -1:
                     new_node.tag = 'th'
             except:
                 pass
 def _pto(self, node):
     sub_story = []
     pto_header = None
     pto_trailer = None
     for node in utils._child_get(node, self):
         if node.tag == etree.Comment:
             node.text = ''
             continue
         elif node.tag=='pto_header':
             pto_header = self.render(node)
         elif node.tag=='pto_trailer':
             pto_trailer = self.render(node)
         else:
             flow = self._flowable(node)
             if flow:
                 if isinstance(flow,list):
                     sub_story = sub_story + flow
                 else:
                     sub_story.append(flow)
     return platypus.flowables.PTOContainer(sub_story, trailer=pto_trailer, header=pto_header)
Exemple #20
0
 def _pto(self, node):
     sub_story = []
     pto_header = None
     pto_trailer = None
     for node in utils._child_get(node, self):
         if node.tag == etree.Comment:
             node.text = ''
             continue
         elif node.tag=='pto_header':
             pto_header = self.render(node)
         elif node.tag=='pto_trailer':
             pto_trailer = self.render(node)
         else:
             flow = self._flowable(node)
             if flow:
                 if isinstance(flow,list):
                     sub_story = sub_story + flow
                 else:
                     sub_story.append(flow)
     return platypus.flowables.PTOContainer(sub_story, trailer=pto_trailer, header=pto_header)
Exemple #21
0
    def render(self, out):
        #el = self.etree.findall('docinit')
        #if el:
            #self.docinit(el)

        #el = self.etree.findall('stylesheet')
        #self.styles = _rml_styles(el,self.localcontext)

        el = self.etree.findall('template')
        self.result =""
        if len(el):
            pt_obj = _rml_template(self.localcontext, out, el[0], self)
            stories = utils._child_get(self.etree, self, 'story')
            for story in stories:
                if self.result:
                    self.result += '\f'
                f = _flowable(pt_obj,story,self.localcontext)
                self.result += f.render(story)
                del f
        else:
            self.result = "<cannot render w/o template>"
        self.result += '\n'
        out.write( self.result)
 def render(self, node):
     tags = {
         'drawCentredString': self._drawCenteredString,
         'drawRightString': self._drawRightString,
         'drawString': self._drawString,
         'rect': self._rect,
         'ellipse': self._ellipse,
         'lines': self._lines,
         'grid': self._grid,
         'curves': self._curves,
         'fill': lambda node: self.canvas.setFillColor(color.get(node.get('color'))),
         'stroke': lambda node: self.canvas.setStrokeColor(color.get(node.get('color'))),
         'setFont': self.setFont ,
         'place': self._place,
         'circle': self._circle,
         'lineMode': self._line_mode,
         'path': self._path,
         'rotate': lambda node: self.canvas.rotate(float(node.get('degrees'))),
         'translate': self._translate,
         'image': self._image
     }
     for n in utils._child_get(node, self):
         if n.tag in tags:
             tags[n.tag](n)
 def _path(self, node):
     self.path = self.canvas.beginPath()
     self.path.moveTo(**utils.attr_get(node, ['x','y']))
     for n in utils._child_get(node, self):
         if not n.text :
             if n.tag=='moveto':
                 vals = utils.text_get(n).split()
                 self.path.moveTo(utils.unit_get(vals[0]), utils.unit_get(vals[1]))
             elif n.tag=='curvesto':
                 vals = utils.text_get(n).split()
                 while len(vals)>5:
                     pos=[]
                     while len(pos)<6:
                         pos.append(utils.unit_get(vals.pop(0)))
                     self.path.curveTo(*pos)
         elif n.text:
             data = n.text.split()               # Not sure if I must merge all TEXT_NODE ?
             while len(data)>1:
                 x = utils.unit_get(data.pop(0))
                 y = utils.unit_get(data.pop(0))
                 self.path.lineTo(x,y)
     if (not node.get('close')) or utils.bool_get(node.get('close')):
         self.path.close()
     self.canvas.drawPath(self.path, **utils.attr_get(node, [], {'fill':'bool','stroke':'bool'}))
Exemple #24
0
 def render(self, node):
     tags = {
         "drawCentredString": self._drawCenteredString,
         "drawRightString": self._drawRightString,
         "drawString": self._drawString,
         "rect": self._rect,
         "ellipse": self._ellipse,
         "lines": self._lines,
         "grid": self._grid,
         "curves": self._curves,
         "fill": lambda node: self.canvas.setFillColor(color.get(node.get("color"))),
         "stroke": lambda node: self.canvas.setStrokeColor(color.get(node.get("color"))),
         "setFont": self.setFont,
         "place": self._place,
         "circle": self._circle,
         "lineMode": self._line_mode,
         "path": self._path,
         "rotate": lambda node: self.canvas.rotate(float(node.get("degrees"))),
         "translate": self._translate,
         "image": self._image,
     }
     for n in utils._child_get(node, self):
         if n.tag in tags:
             tags[n.tag](n)
 def _section(self, node):
     result = ''
     for child in utils._child_get(node, self):
         if child.tag in self._tags:
             result += self._tags[child.tag](child)
     return result
Exemple #26
0
    def render(self, out):
        self.result += '''<!DOCTYPE HTML PUBLIC "-//w3c//DTD HTML 4.0 Frameset//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <style type="text/css">
        p {margin:0px; font-size:12px;}
        td {font-size:14px;}
'''
        style = self.dom.findall('stylesheet')[0]
        s = _rml_stylesheet(self.localcontext, style, self.dom)
        self.result += s.render()
        self.result += '''
    </style>
'''
        list_story = []
        for story in utils._child_get(self.dom, self, 'story'):
            template = _rml_template(
                self.dom.findall('template')[0], self.localcontext)
            f = _flowable(template, self.dom, localcontext=self.localcontext)
            story_text = f.render(story)
            list_story.append(story_text)
        del f
        if template.data:
            tag = '''<img src = '%s' width=80 height=72/>''' % (template.data)
        else:
            tag = ''
        self.result += '''
            <script type="text/javascript">

            var indexer = 0;
            var aryTest = %s ;
            function nextData()
                {
                if(indexer < aryTest.length -1)
                    {
                    indexer += 1;
                    document.getElementById("tiny_data").innerHTML=aryTest[indexer];
                    }
                }
            function prevData()
                {
                if (indexer > 0)
                    {
                    indexer -= 1;
                    document.getElementById("tiny_data").innerHTML=aryTest[indexer];
                    }
                }
        </script>
        </head>
        <body>
            %s
            <div id="tiny_data">
                %s
            </div>
            <br>
            <input type="button" value="next" onclick="nextData();">
            <input type="button" value="prev" onclick="prevData();">

        </body></html>''' % (list_story, tag, list_story[0])
        out.write(self.result)
Exemple #27
0
    def _table(self, node):
        children = utils._child_get(node,self,'tr')
        if not children:
            return None
        length = 0
        colwidths = None
        rowheights = None
        data = []
        styles = []
        posy = 0
        for tr in children:
            paraStyle = None
            if tr.get('style'):
                st = copy.deepcopy(self.styles.table_styles[tr.get('style')])
                for s in st._cmds:
                    s[1][1] = posy
                    s[2][1] = posy
                styles.append(st)
            if tr.get('paraStyle'):
                paraStyle = self.styles.styles[tr.get('paraStyle')]
            data2 = []
            posx = 0
            for td in utils._child_get(tr, self,'td'):
                if td.get('style'):
                    st = copy.deepcopy(self.styles.table_styles[td.get('style')])
                    for s in st._cmds:
                        s[1][1] = posy
                        s[2][1] = posy
                        s[1][0] = posx
                        s[2][0] = posx
                    styles.append(st)
                if td.get('paraStyle'):
                    # TODO: merge styles
                    paraStyle = self.styles.styles[td.get('paraStyle')]
                posx += 1

                flow = []
                for n in utils._child_get(td, self):
                    if n.tag == etree.Comment:
                        n.text = ''
                        continue
                    fl = self._flowable(n, extra_style=paraStyle)
                    if isinstance(fl,list):
                        flow  += fl
                    else:
                        flow.append( fl )

                if not len(flow):
                    flow = self._textual(td)
                data2.append( flow )
            if len(data2)>length:
                length=len(data2)
                for ab in data:
                    while len(ab)<length:
                        ab.append('')
            while len(data2)<length:
                data2.append('')
            data.append( data2 )
            posy += 1

        if node.get('colWidths'):
            assert length == len(node.get('colWidths').split(','))
            colwidths = [utils.unit_get(f.strip()) for f in node.get('colWidths').split(',')]
        if node.get('rowHeights'):
            rowheights = [utils.unit_get(f.strip()) for f in node.get('rowHeights').split(',')]
            if len(rowheights) == 1:
                rowheights = rowheights[0]
        table = platypus.LongTable(data = data, colWidths=colwidths, rowHeights=rowheights, **(utils.attr_get(node, ['splitByRow'] ,{'repeatRows':'int','repeatCols':'int'})))
        if node.get('style'):
            table.setStyle(self.styles.table_styles[node.get('style')])
        for s in styles:
            table.setStyle(s)
        return table
Exemple #28
0
 def _section(self, node):
     result = ''
     for child in utils._child_get(node, self):
         if child.tag in self._tags:
             result += self._tags[child.tag](child)
     return result
Exemple #29
0
 def rec_render_cnodes(self,node):
     self.tb.appendtxt(utils._process_text(self, node.text or ''))
     for n in utils._child_get(node,self):
         self.rec_render(n)
     self.tb.appendtxt(utils._process_text(self, node.tail or ''))
    def _table(self, node):
        children = utils._child_get(node,self,'tr')
        if not children:
            return None
        length = 0
        colwidths = None
        rowheights = None
        data = []
        styles = []
        posy = 0
        for tr in children:
            paraStyle = None
            if tr.get('style'):
                st = copy.deepcopy(self.styles.table_styles[tr.get('style')])
                for si in range(len(st._cmds)):
                    s = list(st._cmds[si])
                    s[1] = (s[1][0],posy)
                    s[2] = (s[2][0],posy)
                    st._cmds[si] = tuple(s)
                styles.append(st)
            if tr.get('paraStyle'):
                paraStyle = self.styles.styles[tr.get('paraStyle')]
            data2 = []
            posx = 0
            for td in utils._child_get(tr, self,'td'):
                if td.get('style'):
                    st = copy.deepcopy(self.styles.table_styles[td.get('style')])
                    for s in st._cmds:
                        s[1][1] = posy
                        s[2][1] = posy
                        s[1][0] = posx
                        s[2][0] = posx
                    styles.append(st)
                if td.get('paraStyle'):
                    # TODO: merge styles
                    paraStyle = self.styles.styles[td.get('paraStyle')]
                posx += 1

                flow = []
                for n in utils._child_get(td, self):
                    if n.tag == etree.Comment:
                        n.text = ''
                        continue
                    fl = self._flowable(n, extra_style=paraStyle)
                    if isinstance(fl,list):
                        flow  += fl
                    else:
                        flow.append( fl )

                if not len(flow):
                    flow = self._textual(td)
                data2.append( flow )
            if len(data2)>length:
                length=len(data2)
                for ab in data:
                    while len(ab)<length:
                        ab.append('')
            while len(data2)<length:
                data2.append('')
            data.append( data2 )
            posy += 1

        if node.get('colWidths'):
            assert length == len(node.get('colWidths').split(','))
            colwidths = [utils.unit_get(f.strip()) for f in node.get('colWidths').split(',')]
        if node.get('rowHeights'):
            rowheights = [utils.unit_get(f.strip()) for f in node.get('rowHeights').split(',')]
            if len(rowheights) == 1:
                rowheights = rowheights[0]
        table = platypus.LongTable(data = data, colWidths=colwidths, rowHeights=rowheights, **(utils.attr_get(node, ['splitByRow'] ,{'repeatRows':'int','repeatCols':'int'})))
        if node.get('style'):
            table.setStyle(self.styles.table_styles[node.get('style')])
        for s in styles:
            table.setStyle(s)
        return table