Skip to content

Commit d0ad5c1

Browse files
committed
Override use tag children instead of drawing their references
This change fixes cases when use tags are not supposed to be really drawn, for example when used to clip paths.
1 parent 0ff8692 commit d0ad5c1

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed

weasyprint/svg/__init__.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,13 @@ def pop_rotation(self, original_rotate, rotate):
284284
str(rotate.pop(0) if rotate else original_rotate[-1])
285285
for i in range(len(self.text)))
286286

287+
def override_iter(self, iterator):
288+
"""Override node’s children iterator."""
289+
# As special methods are bound to classes and not instances, we have to
290+
# create and assign a new type.
291+
self.__class__ = type(
292+
'Node', (Node,), {'__iter__': lambda _: iterator})
293+
287294

288295
class SVG:
289296
"""An SVG document."""
@@ -737,11 +744,7 @@ def inherit_element(self, element, defs):
737744
if key not in element.attrib:
738745
element.attrib[key] = value
739746
if next(iter(element), None) is None:
740-
# Override element’s __iter__ with parent’s __iter__. As special
741-
# methods are bound to classes and not instances, we have to create
742-
# and assign a new type.
743-
element.__class__ = type(
744-
'Node', (Node,), {'__iter__': lambda self: parent.__iter__()})
747+
element.override_iter(parent.__iter__())
745748

746749
def calculate_bounding_box(self, node, font_size, stroke=True):
747750
"""Calculate the bounding box of a node."""

weasyprint/svg/defs.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,8 @@ def use(svg, node, font_size):
6060
if key not in tree.attrib:
6161
tree.attrib[key] = value
6262

63-
svg.stream.push_state()
63+
node.override_iter(iter((tree,)))
6464
svg.stream.transform(e=x, f=y)
65-
svg.draw_node(tree, font_size)
66-
svg.stream.pop_state()
6765

6866

6967
def draw_gradient_or_pattern(svg, node, name, font_size, opacity, stroke):

0 commit comments

Comments
 (0)