From c5aba2048f7075b16a430ca20a47a4ed7675c9c2 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Thu, 24 Dec 2015 12:17:33 +0100 Subject: [PATCH] Use custom xml_declaration avoiding conflict with processing instructions --- demo/moulinrouge/tests.py | 63 +++++++++++++++++++++++++++++++++++++++ docs/changelog.rst | 6 ++++ pygal/__init__.py | 2 +- pygal/svg.py | 19 ++++++------ 4 files changed, 79 insertions(+), 11 deletions(-) diff --git a/demo/moulinrouge/tests.py b/demo/moulinrouge/tests.py index f2aea9b..c641c01 100644 --- a/demo/moulinrouge/tests.py +++ b/demo/moulinrouge/tests.py @@ -893,6 +893,69 @@ def get_test_routes(app): line.add('_', [1, 32, 12, .4, .009]) return line.render_response() + @app.route('/test/custom_css_file') + def test_custom_css_file(): + from tempfile import NamedTemporaryFile + custom_css = ''' + {{ id }}text { + fill: green; + font-family: monospace; + } + {{ id }}.legends .legend text { + font-size: {{ font_sizes.legend }}; + } + {{ id }}.axis { + stroke: #666; + } + {{ id }}.axis text { + font-size: {{ font_sizes.label }}; + font-family: sans; + stroke: none; + } + {{ id }}.axis.y text { + text-anchor: end; + } + {{ id }}#tooltip text { + font-size: {{ font_sizes.tooltip }}; + } + {{ id }}.dot { + fill: yellow; + } + {{ id }}.color-0 { + stroke: #ff1100; + fill: #ff1100; + } + {{ id }}.color-1 { + stroke: #ffee00; + fill: #ffee00; + } + {{ id }}.color-2 { + stroke: #66bb44; + fill: #66bb44; + } + {{ id }}.color-3 { + stroke: #88bbdd; + fill: #88bbdd; + } + {{ id }}.color-4 { + stroke: #0000ff; + fill: #0000ff; + } + ''' + custom_css_file = '/tmp/pygal_custom_style.css' + with open(custom_css_file, 'w') as f: + f.write(custom_css) + config = Config(fill=True, interpolate='cubic') + config.css.append(custom_css_file) + chart = StackedLine(config) + chart.add('A', [1, 3, 5, 16, 13, 3, 7]) + chart.add('B', [5, 2, 3, 2, 5, 7, 17]) + chart.add('C', [6, 10, 9, 7, 3, 1, 0]) + chart.add('D', [2, 3, 5, 9, 12, 9, 5]) + chart.add('E', [7, 4, 2, 1, 2, 10, 0]) + return chart.render_response() + + @app.route('/test/legendlink/') def test_legend_link_for(chart): chart = CHARTS_BY_NAME[chart]() diff --git a/docs/changelog.rst b/docs/changelog.rst index 8dcc69f..d2450c4 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,6 +2,12 @@ Changelog ========= +2.0.12 +====== + +* Use custom xml_declaration avoiding conflict with processing instructions + + 2.0.11 ====== diff --git a/pygal/__init__.py b/pygal/__init__.py index d567fc5..18320d0 100644 --- a/pygal/__init__.py +++ b/pygal/__init__.py @@ -24,7 +24,7 @@ and the maps extensions namespace module. """ -__version__ = '2.0.11' +__version__ = '2.0.12' import pkg_resources import sys diff --git a/pygal/svg.py b/pygal/svg.py index 8608a79..c485545 100644 --- a/pygal/svg.py +++ b/pygal/svg.py @@ -321,25 +321,24 @@ class Svg(object): args = { 'encoding': 'utf-8' } + svg = b'' if etree.lxml: args['pretty_print'] = pretty_print - args['xml_declaration'] = not self.graph.disable_xml_declaration - else: - if not self.graph.disable_xml_declaration: - svg = b"\n" - svg += etree.tostring( - self.root, **args) - if 'xml_declaration' in args: - args.pop('xml_declaration') + if not self.graph.disable_xml_declaration: + svg = b"\n" if not self.graph.disable_xml_declaration: - svg = b'\n'.join( + svg += b'\n'.join( [etree.tostring( pi, **args) - for pi in self.processing_instructions] + [svg] + for pi in self.processing_instructions] ) + + svg += etree.tostring( + self.root, **args) + if self.graph.disable_xml_declaration or is_unicode: svg = svg.decode('utf-8') return svg