Skip to content

Commit

Permalink
Refs #328 - Make <symbol> rendered only when referenced
Browse files Browse the repository at this point in the history
  • Loading branch information
claudep committed Apr 9, 2022
1 parent 80f40a5 commit d1abe3c
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 6 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ Unreleased
----------

- Support mmult import from reportlab < 3.5.61 (#316).
- ``<symbol>`` nodes now only appears in documents when they are
referenced, not on their initial appearance.

1.2.1 (2022-01-27)
------------------
Expand Down
15 changes: 9 additions & 6 deletions svglib/svglib.py
Original file line number Diff line number Diff line change
Expand Up @@ -588,7 +588,12 @@ def renderNode(self, node, parent=None):
self.renderStyle(n)
elif name == "symbol":
item = self.renderSymbol(n)
parent.add(item)
# First time the symbol node is rendered, it should not be part of a group.
# It is only rendered to be part of definitions.
if n.attrib.get('_rendered'):
parent.add(item)
else:
n.set('_rendered', '1')
elif name == "use":
item = self.renderUse(n, clipping=clipping)
parent.add(item)
Expand Down Expand Up @@ -852,16 +857,14 @@ def renderSvg(self, node, outermost=False):

return group

def renderG(self, node, clipping=None, display=1):
def renderG(self, node, clipping=None):
getAttr = node.getAttribute
id, transform = map(getAttr, ("id", "transform"))
gr = Group()
if clipping:
gr.add(clipping)
for child in node.getchildren():
item = self.renderNode(child, parent=gr)
if item and display:
gr.add(item)
self.renderNode(child, parent=gr)

if transform:
self.shape_converter.applyTransformOnGroup(transform, gr)
Expand All @@ -872,7 +875,7 @@ def renderStyle(self, node):
self.attrConverter.css_rules.add_styles(node.text or "")

def renderSymbol(self, node):
return self.renderG(node, display=0)
return self.renderG(node)

def renderA(self, node):
# currently nothing but a group...
Expand Down
13 changes: 13 additions & 0 deletions tests/test_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -938,6 +938,19 @@ def test_use_node_with_unclosed_path(self):


class TestSymbolNode:
def test_symbol_unused(self):
"""<symbol> by itself should not be rendered."""
drawing = svglib.svg2rlg(io.StringIO(textwrap.dedent('''\
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg"
width="900" height="600" viewBox="0 0 100 100">
<symbol id="X">
<path d="M 0,0100 V 0 H 50"/>
</symbol>
</svg>
''')))
assert drawing.contents[0].contents == []

def test_symbol_node(self):
drawing = svglib.svg2rlg(io.StringIO(textwrap.dedent('''\
<?xml version="1.0"?>
Expand Down

0 comments on commit d1abe3c

Please sign in to comment.