Browse Source

WIP on tables

pull/130/head
Florian Mounier 11 years ago
parent
commit
836f77d256
  1. 3
      demo/moulinrouge/templates/table.jinja2
  2. 84
      pygal/table.py

3
demo/moulinrouge/templates/table.jinja2

@ -7,6 +7,9 @@
<h3>Total</h3> <h3>Total</h3>
{{ chart.render_table(total=True) }} {{ chart.render_table(total=True) }}
<h3>Style</h3>
{{ chart.render_table(total=True, style=True) }}
<h3>Transposed</h3> <h3>Transposed</h3>
{{ chart.render_table(transpose=True) }} {{ chart.render_table(transpose=True) }}

84
pygal/table.py

@ -22,7 +22,9 @@ Table maker
""" """
from pygal.graph.base import BaseGraph from pygal.graph.base import BaseGraph
from pygal.util import template
from lxml.html import builder, tostring from lxml.html import builder, tostring
import uuid
class HTML(object): class HTML(object):
@ -42,26 +44,30 @@ class Table(BaseGraph):
self.__dict__.update(config.to_dict()) self.__dict__.update(config.to_dict())
self.config = config self.config = config
def render(self, total=False, transpose=False): def render(self, total=False, transpose=False, style=False):
html = HTML() html = HTML()
attrs = {}
if style:
attrs['id'] = 'table-%s' % uuid.uuid4()
table = [] table = []
_ = lambda x: x if x is not None else '' _ = lambda x: x if x is not None else ''
table.append([None])
labels = []
if self.x_labels: if self.x_labels:
labels += self.x_labels labels = list(self.x_labels)
if len(labels) < self._len: if len(labels) < self._len:
labels += [None] * (self._len - len(labels)) labels += [None] * (self._len - len(labels))
if len(labels) > self._len: if len(labels) > self._len:
labels = labels[:self._len] labels = labels[:self._len]
table.append(labels)
for label in labels:
table[0].append(label)
if total: if total:
table[0].append('Total') if len(table):
table[0].append('Total')
else:
table.append([None] * (self._len + 1) + ['Total'])
acc = [0] * (self._len + 1) acc = [0] * (self._len + 1)
for i, serie in enumerate(self.series): for i, serie in enumerate(self.series):
@ -96,15 +102,63 @@ class Table(BaseGraph):
if not transpose: if not transpose:
table = list(zip(*table)) table = list(zip(*table))
table = tostring( thead = []
html.table( tbody = []
tfoot = []
if not transpose or self.x_labels:
# There's always series title but not always x_labels
thead = [table[0]]
tbody = table[1:]
else:
tbody = table
parts = []
if thead:
parts.append(
html.thead(
*[html.tr(
*[html.th(_(col)) for col in r]
) for r in thead]
)
)
if tbody:
parts.append(
html.tbody( html.tbody(
*[html.tr( *[html.tr(
*[html.td(_(col)) for col in r] *[html.td(_(col)) for col in r]
) for r in table] ) for r in tbody]
) )
) )
if tfoot:
parts.append(
html.tfoot(
*[html.tr(
*[html.th(_(col)) for col in r]
) for r in tfoot]
)
)
table = tostring(
html.table(
*parts, **attrs
)
) )
if style:
if style is True:
css = '''
#{{ id }}{
width: 100%;
}
#{{ id }} tbody tr:nth-child(odd) td {
background-color: #f9f9f9;
}
'''
else:
css = style
table = tostring(html.style(
template(css, **attrs),
scoped='scoped')) + table
if self.disable_xml_declaration: if self.disable_xml_declaration:
table = table.decode('utf-8') table = table.decode('utf-8')
return table return table

Loading…
Cancel
Save