diff --git a/docs/documentation/table.rst b/docs/documentation/table.rst
index ac918aa7..11b3c31d 100644
--- a/docs/documentation/table.rst
+++ b/docs/documentation/table.rst
@@ -79,3 +79,21 @@ Transposed
line_chart.value_formatter = lambda x: '%.2f%%' % x if x is not None else '∅'
line_chart.render_table(style=True, total=True, transpose=True)
+
+Value Attribute (for CSS Conditional Formatting)
+------------------------------------------------
+
+Add to each
element the `value` attribute with the same content of the element itself.
+This can be useful for applying CSS conditional formatting rules.
+
+.. pygal-table-code::
+
+ line_chart = pygal.Bar()
+ line_chart.title = 'Browser usage evolution (in %)'
+ line_chart.x_labels = map(str, range(2002, 2013))
+ line_chart.add('Firefox', [None, None, 0, 16.6, 25, 31, 36.4, 45.5, 46.3, 42.8, 37.1])
+ line_chart.add('Chrome', [None, None, None, None, None, None, 0, 3.9, 10.8, 23.8, 35.3])
+ line_chart.add('IE', [85.8, 84.6, 84.7, 74.5, 66, 58.6, 54.7, 44.8, 36.2, 26.6, 20.1])
+ line_chart.add('Others', [14.2, 15.4, 15.3, 8.9, 9, 10.4, 8.9, 5.8, 6.7, 6.8, 7.5])
+ line_chart.value_formatter = lambda x: '%.2f%%' % x if x is not None else '∅'
+ line_chart.render_table(style=True, total=True, value_attribute=True)
\ No newline at end of file
diff --git a/pygal/table.py b/pygal/table.py
index a7c03dc5..f1c5be7a 100644
--- a/pygal/table.py
+++ b/pygal/table.py
@@ -28,6 +28,10 @@
from pygal.util import template
+def _default_value_attribute_fn(value):
+ return value
+
+
class HTML(object):
"""Lower case adapter of lxml builder"""
@@ -45,14 +49,21 @@ def __init__(self, chart):
"""Init the table"""
self.chart = chart
- def render(self, total=False, transpose=False, style=False):
+ def render(self, total=False, transpose=False, style=False, value_attribute=None):
"""Render the HTMTL table of the chart.
`total` can be specified to include data sums
`transpose` make labels becomes columns
`style` include scoped style for the table
+ `value_attribute` replicate element value into `value` attribute ( | elements)
"""
+ if value_attribute is True:
+ value_attribute_fn = _default_value_attribute_fn
+ elif callable(value_attribute):
+ value_attribute_fn = value_attribute
+ else:
+ value_attribute_fn = None
self.chart.setup()
ln = self.chart._len
html = HTML()
@@ -138,13 +149,19 @@ def render(self, total=False, transpose=False, style=False):
if tbody:
parts.append(
html.tbody(
- *[html.tr(*[html.td(_(col)) for col in r]) for r in tbody]
+ *[html.tr(*(
+ [html.td(_(col), value=_(value_attribute_fn(col))) for col in r]
+ if value_attribute_fn else [html.td(_(col)) for col in r]
+ )) for r in tbody]
)
)
if tfoot:
parts.append(
html.tfoot(
- *[html.tr(*[html.th(_(col)) for col in r]) for r in tfoot]
+ *[html.tr(*(
+ [html.th(_(col), value=_(value_attribute_fn(col))) for col in r]
+ if value_attribute_fn else [html.td(_(col)) for col in r]
+ )) for r in tfoot]
)
)
|