Exemple #1
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 #2
0
 def process_text(node,new_node):
     if new_node.tag in ['story','tr','section']:
         new_node.attrib.clear()
     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.text  = utils._process_text(self, child.text)
                 new_child.tail  = utils._process_text(self, child.tail)
                 new_child.remove(n)
             process_text(child, new_child)
         else:
             if new_child.tag=='img' and new_child.get('name'):
                 if _regex.findall(new_child.get('name')) :
                     src =  utils._process_text(self, new_child.get('name'))
                     if src :
                         new_child.set('src','data:image/gif;base64,%s'%src)
                         output = cStringIO.StringIO(base64.decodestring(src))
                         img = ImageReader(output)
                         (width,height) = img.getSize()
                         if not new_child.get('width'):
                             new_child.set('width',str(width))
                         if not new_child.get('height') :
                             new_child.set('height',str(height))
                     else :
                         new_child.getparent().remove(new_child)
             new_child.text  = utils._process_text(self, child.text)
             new_child.tail  = utils._process_text(self, child.tail)
Exemple #3
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 #4
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'
         }))
Exemple #5
0
 def process_text(node, new_node):
     if new_node.tag in ['story', 'tr', 'section']:
         new_node.attrib.clear()
     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.text = utils._process_text(self, child.text)
                 new_child.tail = utils._process_text(self, child.tail)
                 new_child.remove(n)
             process_text(child, new_child)
         else:
             if new_child.tag == 'img' and new_child.get('name'):
                 if _regex.findall(new_child.get('name')):
                     src = utils._process_text(self,
                                               new_child.get('name'))
                     if src:
                         new_child.set('src',
                                       'data:image/gif;base64,%s' % src)
                         output = cStringIO.StringIO(
                             base64.decodestring(src))
                         img = ImageReader(output)
                         (width, height) = img.getSize()
                         if not new_child.get('width'):
                             new_child.set('width', str(width))
                         if not new_child.get('height'):
                             new_child.set('height', str(height))
                     else:
                         new_child.getparent().remove(new_child)
             new_child.text = utils._process_text(self, child.text)
             new_child.tail = utils._process_text(self, child.tail)
Exemple #6
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 #7
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 #8
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 #9
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 #10
0
 def process_text(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.text = utils._process_text(self, child.text)
                 new_child.tail = utils._process_text(self, child.tail)
                 new_child.remove(n)
             process_text(child, new_child)
         else:
             new_child.text = utils._process_text(self, child.text)
             new_child.tail = utils._process_text(self, child.tail)
Exemple #11
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 #12
0
 def process_text(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.text  = utils._process_text(self, child.text)
                 new_child.tail  = utils._process_text(self, child.tail)
                 new_child.remove(n)
             process_text(child, new_child)
         else:
             new_child.text  = utils._process_text(self, child.text)
             new_child.tail  = utils._process_text(self, child.tail)
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
Exemple #14
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 Exception:
                 pass
Exemple #15
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 Exception:
                 pass
Exemple #16
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)
Exemple #17
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 #18
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 #19
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 #20
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)
Exemple #21
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'}))
Exemple #22
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 #23
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 #24
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 #25
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 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
Exemple #26
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 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