a
    ¥Q•h<u  ã                   @   s|  d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ d	d
lmZmZ d	dlmZmZmZmZmZ d	dlmZmZ d	dlmZ d	dlmZm Z m!Z!m"Z"m#Z#m$Z$ d	dl%m%Z% d	dl&m'Z'm&Z&m(Z(m)Z) d	dl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 e%eee ee!ee#e"e$ee%e%e%edœZ3e4dƒZ5e4dƒZ6e4dƒZ7G dd„ dƒZ8G dd„ dƒZ9G dd„ de9ƒZ:dS )zRender SVG images.é    N)Úsuppress)ÚcosÚhypotÚpiÚradiansÚsinÚsqrt)ÚElementTree)ÚElementWrapperé   ©Úget_url_attributeé   )Úparse_declarationsÚparse_stylesheets)Úapply_filtersÚ	clip_pathÚdraw_gradient_or_patternÚ
paint_maskÚuse)ÚimageÚsvg)Úpath)ÚcircleÚellipseÚlineÚpolygonÚpolylineÚrect)Útext)ÚEMPTY_BOUNDING_BOXÚbounding_boxÚextend_bounding_boxÚis_valid_bounding_box)Ú
PointErrorÚalpha_valueÚcolorÚ	normalizeÚ	parse_urlÚpreserve_ratioÚsizeÚ	transform)Úar   ÚclipPathr   r   r   r   r   r   r   r   r   ÚtextPathÚtspanr   )Úclipú	clip-pathÚfilterÚheightÚidÚmaskÚopacityÚoverflowÚrotateú
stop-colorzstop-opacityÚstyler+   ztransform-originÚviewBoxÚwidthÚxÚyÚdxÚdyú"{http://www.w3.org/1999/xlink}hrefÚhref)Úfillzflood-colorzlighting-colorr9   Ústroke)	r-   r2   Úgradientr   Úmarkerr5   r   ÚpatternÚsymbolc                   @   sÌ   e Zd ZdZdd„ Zdd„ Zd,dd„Zed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZdd „ Zd-d"d#„Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ ZdS ).ÚNodezAn SVG document node.c                 C   s2   || _ |j| _|| _|jj ¡ | _g | _d | _d S ©N)Ú_wrapperÚetree_elementÚ_etree_nodeÚ_styleÚattribÚcopyÚverticesr!   )ÚselfÚwrapperr:   © rT   úP/var/www/sistema_ama/venv/lib/python3.9/site-packages/weasyprint/svg/__init__.pyÚ__init__[   s    zNode.__init__c                 C   s   t | j| jƒS )z<Create a deep copy of the node as it was when first created.)rI   rK   rN   ©rR   rT   rT   rU   rP   e   s    z	Node.copyNc                 C   s   | j  ||¡S )zGet attribute.)rO   Úget)rR   ÚkeyÚdefaultrT   rT   rU   rX   i   s    zNode.getc                 C   s   | j j dd¡d S )zXML tag name with no namespace.Ú}r   éÿÿÿÿ)rM   ÚtagÚsplitrW   rT   rT   rU   r]   m   s    zNode.tagc                 C   s   | j jS )zXML node text.)rM   r   rW   rT   rT   rU   r   r   s    z	Node.textc                 C   s   | j jS )zText after the XML node.)rM   ÚtailrW   rT   rT   rU   r_   w   s    z	Node.tailc                 C   s   |   d¡dkS )z!Whether node should be displayed.ÚdisplayÚnone)rX   rW   rT   rT   rU   r`   |   s    zNode.displayc                 C   s   | j o|  d¡dkS )zWhether node is visible.Ú
visibilityÚhidden)r`   rX   rW   rT   rT   rU   Úvisible�   s    zNode.visiblec                 C   sv  |j }| j ¡ D ]$\}}|tvr||jvr||j|< q| d¡ }rRt|ƒ\}}n
g g  }}| j\}}	dd„ | |¡D ƒ}
dd„ |	 |¡D ƒ}|
|g||gfD ]*}|D ] }|D ]\}}| ¡ |j|< q®q¦qžt	D ]$}| |¡dkrÎ| dd¡|j|< qÎ|j 
¡  ¡ D ]<\}}|dk�r|  |¡}|d	u �r2|j|= n
||j|< �q|jd
v �rr|j|ddd�\}}dd„ |D ƒ|j _d	S )z>Apply CSS cascade and other related operations to given child.r:   c                 S   s   g | ]}|d  ‘qS ©r\   rT   ©Ú.0ÚrulerT   rT   rU   Ú
<listcomp>–   ó    z Node.cascade.<locals>.<listcomp>c                 S   s   g | ]}|d  ‘qS re   rT   rf   rT   rT   rU   ri   —   rj   ÚcurrentColorr&   ÚblackÚinheritN©r   r.   r,   T)Útrailing_spaceÚ	text_rootc                 S   s   g | ]
}|j ‘qS rT   )rM   )rg   ÚchildrT   rT   rU   ri   ¯   s   )rK   rO   ÚitemsÚNOT_INHERITED_ATTRIBUTESrX   r   rN   ÚmatchÚstripÚCOLOR_ATTRIBUTESrP   r]   Útext_childrenÚetree_children)rR   rq   rS   rY   ÚvalueZ
style_attrZnormal_attrZimportant_attrZnormal_matcherZimportant_matcherÚnormalÚ	importantZdeclarations_listÚdeclarationsÚnameÚchildrenÚ_rT   rT   rU   Úcascade†   s>    






ÿ
ÿzNode.cascadec                 c   s,   | j D ] }t|| jƒ}|  |¡ |V  qdS )z&Yield node children, handling cascade.N)rK   rI   rN   r€   )rR   rS   rq   rT   rT   rU   Ú__iter__³   s    

zNode.__iter__c                 C   s,   |   d¡}|r(tdd„ t|ƒ ¡ D ƒƒS dS )z&Get node viewBox as a tuple of floats.r;   c                 s   s   | ]}t |ƒV  qd S rJ   ©Úfloat)rg   ÚnumberrT   rT   rU   Ú	<genexpr>¾   rj   z#Node.get_viewbox.<locals>.<genexpr>N)rX   Útupler'   r^   )rR   ÚviewboxrT   rT   rU   Úget_viewboxº   s    
zNode.get_viewboxc                 C   s*   dD ] }t | ||dd� }r|  S qdS )z4Get the href attribute, with or without a namespace.©rA   rB   T)Úallow_relativeNr   )rR   Úbase_urlÚ	attr_nameÚurlrT   rT   rU   Úget_hrefÀ   s    zNode.get_hrefc                 C   s   dD ]}| j  |d¡ qdS )z8Remove the href attributes, with or without a namespace.r‰   N)rO   Úpop)rR   rŒ   rT   rT   rU   Údel_hrefÆ   s    zNode.del_hrefc                 C   sH   | sdS |rt  dd| ¡S t  dd| ¡} t  dd| ¡} t  dd| ¡S dS )z>Replace newlines by spaces, and merge spaces if not preserved.Ú z[
	]ú z[
]ú	z +N)ÚreÚsub)ÚstringÚpreserverT   rT   rU   Úprocess_whitespaceË   s    zNode.process_whitespacec                 C   s:   | D ]0}|  d¡|kr|  S | |¡}|r|  S qdS )z2Get a child with given id in the whole child tree.r4   N)rX   Ú	get_child)rR   Úid_rq   Z
grandchildrT   rT   rU   r™   Ø   s    
zNode.get_childFc                 C   s(  g }d}|   |¡dk}|  |jj|¡| j_|rB|sB| j d¡| j_dd„ t|   d¡ƒ ¡  d¡D ƒ}| 	¡ }|r||  
||¡ | jrŽ| j d¡}t| ¡ ƒ}	|	D �]\}
|
j}|jdv ræt|
| jƒ}d|j_|j}| ¡ |j_t |¡}
nt|
| jƒ}|  |¡dk}|  |j|¡|j_| |
|¡\|_}|j d¡}|�rLd|v�rL| 
||¡ | |¡ |  |j|¡}|�rˆ|
|	d	 u �rˆ|�sˆ| d¡}|ržt d
¡}tt |¡| jƒ}||j_|�rÂ| 
||¡ |�rÞ|�sÞ|j d¡|j_|j�rò|j d¡}| |¡ qž|�r |�s |�s | j d¡| j_||fS )z<Handle text node by fixing whitespaces and flattening tails.z+{http://www.w3.org/XML/1998/namespace}spacer—   r’   c                 S   s   g | ]}|rt |ƒ‘qS rT   r‚   ©rg   ÚirT   rT   rU   ri   ë   s   ÿz&Node.text_children.<locals>.<listcomp>r8   )z {http://www.w3.org/2000/svg}trefZtrefr/   r\   z!{http://www.w3.org/2000/svg}tspan)rX   r˜   rL   r   rM   Úlstripr'   ru   r^   rP   Úpop_rotationÚendswithr†   Úiter_childrenr]   rI   rN   Úflattenr
   Úfrom_xml_rootrw   r~   Úappendr_   Úrstripr	   ÚElement)rR   Úelementro   rp   r~   Úspacer—   Úoriginal_rotater8   Zelement_childrenÚchild_elementrq   Z
child_nodeZchild_preserver_   Zanonymous_etreeÚ	anonymousrT   rT   rU   rw   á   sv    ÿþ

ÿÿ


ÿÿzNode.text_childrenc                 C   sL   | j pdg}t| ƒD ],}| | ¡ ¡ | |jp2d¡ |  |¡ qd |¡S )z)Flatten text in node and in its children.r‘   )r   Úlistr£   r¡   r_   ÚremoveÚjoin)rR   Zflattened_textrq   rT   rT   rU   r¡      s    zNode.flattenc                    s.   d  ‡ ‡fdd„tt| jƒƒD ƒ¡| jd< dS )zMerge nested letter rotations.r’   c                 3   s(   | ] }t ˆrˆ d ¡nˆ d ƒV  qdS )r   r\   N)Ústrr�   r›   ©r¨   r8   rT   rU   r…   +  s   ÿz$Node.pop_rotation.<locals>.<genexpr>r8   N)r­   ÚrangeÚlenr   rO   )rR   r¨   r8   rT   r¯   rU   rž   )  s    þzNode.pop_rotationc                    s    t dtfd‡ fdd„iƒ| _dS )u$   Override nodeâ€™s children iterator.rI   r�   c                    s   ˆ S rJ   rT   )r   ©ÚiteratorrT   rU   Ú<lambda>4  rj   z$Node.override_iter.<locals>.<lambda>N)ÚtyperI   Ú	__class__)rR   r³   rT   r²   rU   Úoverride_iter/  s    ÿzNode.override_iterc                 C   sr   ||_ ||_t||ƒtdƒ |_|  ¡  }rD|d |d  |_|_n|j |j |_|_t|j|jƒtdƒ |_dS )z="Set SVG concrete and inner widths and heights from svg node.r   é   N)	Úconcrete_widthÚconcrete_heightr   r   Znormalized_diagonalrˆ   Úinner_widthÚinner_heightÚinner_diagonal)rR   r   r¹   rº   r‡   rT   rT   rU   Úset_svg_size6  s    zNode.set_svg_size)N)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rV   rP   rX   Úpropertyr]   r   r_   r`   rd   r€   r�   rˆ   rŽ   r�   Ústaticmethodr˜   r™   rw   r¡   rž   r·   r¾   rT   rT   rT   rU   rI   X   s6   






-
	
?	rI   c                   @   s’   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	d#dd„Z
dd„ Zedd„ ƒZd$dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd%d d!„Zd"S )&ÚSVGzAn SVG document.c                 C   sœ   t  |¡}t||ƒ}t||ƒ| _|| _i | _i | _i | _i | _	i | _
i | _i | _i | _i | _ddg| _ddg| _d| _| j | j¡ |  | j¡ |  ¡  d S )Nr   )r
   r¢   r   rI   Útreer�   ÚfiltersÚ	gradientsÚimagesÚmarkersÚmasksÚpatternsÚpathsÚsymbolsZ	use_cacheÚcursor_positionÚcursor_d_positionÚtext_path_widthr€   Ú
parse_defsÚinherit_defs)rR   rÆ   r�   rS   r:   rT   rT   rU   rV   G  s&    



zSVG.__init__c                 C   sT   | j  dd¡}d|v rd}n
t||ƒ}| j  dd¡}d|v rBd}n
t||ƒ}||fS )z Get intrinsic size of the image.r<   z100%ú%Nr3   )rÆ   rX   r*   )rR   Ú	font_sizeÚintrinsic_widthÚintrinsic_heightrT   rT   rU   Úget_intrinsic_size_  s    

zSVG.get_intrinsic_sizec                 C   s
   | j  ¡ S )z*Get document viewBox as a tuple of floats.)rÆ   rˆ   rW   rT   rT   rU   rˆ   o  s    zSVG.get_viewboxc                 C   s   t ||| jƒt ||| jƒfS )z.Compute size of an x/y or width/height couple.)r*   r»   r¼   )rR   r=   r>   rÕ   rT   rT   rU   Úpoints  s    þz	SVG.pointc                 C   s   t ||| jƒS )z'Compute size of an arbirtary attribute.)r*   r½   )rR   ÚlengthrÕ   rT   rT   rU   rÚ   y  s    z
SVG.lengthc                 C   s>   || _ | j | ||¡ || _|| _|| _|  | jtdƒ¡ dS )zDraw image on a stream.Z12ptN)ÚstreamrÆ   r¾   r‹   Úurl_fetcherÚcontextÚ	draw_noder*   )rR   rÛ   r¹   rº   r‹   rÜ   rÝ   rT   rT   rU   Údraw}  s    zSVG.drawTc                  C   sj  |j dkrdS t| dd¡||ƒ}g }|r4| j ¡  | j t| d¡ƒj¡}|r^t| |||ƒ |  	| d¡|¡ t
| dd¡ƒ}|rÚd	|  kr˜dk rÚn n>| | j¡ |  ||¡}t|ƒsÌd	d	| j| jf}| jj|Ž | _t| d
¡ƒj}|�rà|| jv �rà| jj}	| j| }| d¡dk�rn|  | d¡| d¡|¡\}
}|  | d¡| d¡|¡\}}| jj	|||
|d� |jj }d|j_ | j||dd� ||j_ | j d	d	d	d	¡ | j ¡  | j ¡  | jj}|j�rà| jj	|	|j jŽ  d}|j�r@t |j ¡tk�r@| d¡ }dv �r:d}| j d	d	d	d	¡}| | j¡ || _t|_ |j dk�rX| j!}| j"}|j#�r¨|j tv �r¨t$t%ƒ�" t|j  | ||ƒ W d  ƒ n1 �sž0    Y  |j�r¨|j t&v�r¨|D ]æ}|�oê|j dk�pêd|j'v �pêd|j'v }|�r| j}|d | _|  |||¡ |�r|| _t |j ¡tk�oDt |j ¡tk�oD|j#}|�rÀt|j ƒ�s\�qÀ|j dd… \}}||j d  }||j d  }t(|j ||f||ffƒ|_ �qÀ|j dk�rÄ| j) *t+||¡ |�r’| jj,}| -¡ | _| j ¡  t|j ƒ�r||j \}
}}}|
| || |
| | || | f|j.d dd…< |dk�rD|d n|}|j dk�sld|j'v �sld|j'v �r|| jj	| d� | j /|¡ | j 0¡  | j1 t| d ¡ƒj¡}|�r¾t2| |||ƒ |�rÐ|  3||¡ |  4|||¡ |�r0d	|  k�rüdk �r0n n0| jj,}| -¡ | _| jj5|ddd!� | j /|¡ |j dk�rVd	d	g| _6d	d	g| _7d	| _8|�rf| j 0¡  dS )"zDraw a node.ÚdefsNz	font-sizeZ1emr2   r+   r6   r   r   r1   ÚclipPathUnitsZobjectBoundingBoxr=   r>   r<   r3   )r,   ÚdÚeÚfÚgF©Úfill_strokeztext-anchor)ÚmiddleÚendTr   r   r\   r   r¸   ÚBBoxrè   )rã   r5   )rD   rC   )9r]   r*   rX   rÛ   Ú
push_staterÇ   r(   Úfragmentr   r+   r%   r£   Úcalculate_bounding_boxr#   r»   r¼   Ú	add_grouprÍ   ÚctmrÙ   rM   rÞ   Ú	rectangler0   ré   ÚdeterminantÚinvertÚvaluesr`   ÚTAGSr   r    Ztext_bounding_boxr¹   rº   rd   r   r$   Ú	DEF_TYPESrO   r"   rÆ   r¾   r   r4   r�   ÚextraÚdraw_x_objectÚ	pop_staterË   r   rç   Údraw_markersZ	set_alpharÏ   rÐ   rÑ   ) rR   ÚnoderÕ   rç   Zoriginal_streamsÚfilter_r6   Úboxr   Zold_ctmr=   r>   r<   r3   Zoriginal_tagZnew_ctmZtext_anchor_shiftZtext_anchorÚgroupr¹   rº   rq   Z	new_chunkZ
new_streamZvisible_text_childÚx1Úy1Úx2Úy2Úgroup_idZx_alignr5   rT   rT   rU   rÞ   Š  sÚ    


ÿ


2 ÿ
ÿýÿ


þ$
"


zSVG.draw_nodec           !      C   sŽ  |j s
dS i }t| d¡ƒj}dD ]6}d|› �}||jv rPt|j| ƒj||< q"|||< q"d\}}	d}|j �rŠ|j  d¡}
|j rŒ|j  d¡nd}|rÈ|dkrªt|d  }n|	t |d  d }|\}}	n|	}d	}| j || ¡ }sò|rìd
nd}qf|  | d¡| d¡|¡\}}|  | dd¡| dd¡|¡\}}d|jv �r:t	| ||||ƒ\}}}}| 
¡ \}}}}| dd¡ d¡d }|dk�r�d }}n |dd…  ¡ }|dd…  ¡ }|d
k�rÐ||||  d 7 }n|dk�rê||||  7 }|d
k�r
||||  d 7 }n|dk�r$||||  7 }|||| || f}nd }}dd||f}| d¡dk�r‚|  | dd¡|¡}||9 }||9 }| dd¡}|dv�r¦tt|ƒƒ}n |dk�rÆ|dk�rÆ|td ƒ7 }|D ]®}| j ¡  | jj|t|ƒ |t|ƒ | t|ƒ |t|ƒ g|
¢R Ž  | jj| | d!� | d"d#¡} | d$v �r^| jj|Ž  | j ¡  | j ¡  |  |||¡ | j ¡  �qÊ|�r„d
nd}qfdS )%zDraw markers defined in a node.NrF   )ÚstartÚmidré   zmarker-©NNr  r   r   ré   r  ÚrefXÚrefYÚmarkerWidthr¸   ÚmarkerHeightr;   ÚpreserveAspectRatioZxMidYMidr’   ra   Úminr   é   é   ÚmaxÚmarkerUnitsZuserSpaceOnUseústroke-widthZorient)Úautoúauto-start-reverser  é´   )rã   rä   r7   rc   )rc   Úscroll)rQ   r(   rX   rì   rO   r�   r   rÊ   rÙ   r)   rˆ   r^   ÚlowerrÚ   r   rƒ   rÛ   rë   r+   r   r   rð   r0   ré   rÞ   rø   )!rR   rú   rÕ   rç   rÊ   Zcommon_markerÚpositionÚ	attributeZangle1Zangle2rÙ   ÚanglesÚangleZmarker_nodeÚtranslate_xÚtranslate_yZmarker_widthZmarker_heightÚscale_xÚscale_yr   Zclip_xZclip_yZviewbox_widthZviewbox_heightÚalignZ
x_positionZ
y_positionZclip_boxÚscaleZ
node_anglerq   r7   rT   rT   rU   rù     s¶    



þ

ý
ÿÿ
ÿÿÿ




ÿ
þ

þý


zSVG.draw_markersc                 C   s`   | r| dkrdS |   ¡ } t d¡ | ¡}|rLt| d¡ƒj}| d¡pHd}nd}| pVd}||fS )z9Get paint fill or stroke attribute with a color or a URL.ra   r  z(url\(.+\)) *(.*)r   r   N)ru   r”   ÚcompileÚsearchr(   rý   rì   )ry   rt   Úsourcer&   rT   rT   rU   Ú	get_paint‹  s    zSVG.get_paintFc                    s   |j dv r|sdS ˆ | dd¡¡\}}t| dd¡ƒ}tˆ||ˆ |dd�}|rv|svt|ƒ}| j|9  _ˆj |¡ |p||}	ˆ | d	¡¡\}
}t| d
d¡ƒ}tˆ||
ˆ |dd�}|rä|sät|ƒ}| j|9  _ˆjj|dd� |pê|}ˆ 	| dd¡ˆ ¡}|�rˆj 
|¡ nd}t‡ ‡fdd„t| d¡ƒ ¡ D ƒƒ}|�oltdd„ |D ƒƒ �oltdd„ |D ƒƒ }|�rÀˆ 	| d¡ˆ ¡}|dk �r²tdd„ |D ƒƒ}|t|ƒ|  }ˆj ||¡ | dd¡}|dk�rÜd}n|dk�rìd}nd}ˆj |¡ | dd¡}|dk�rd}n|dk�r(d}nd}ˆj |¡ t| dd¡ƒ}|dk �rVd}ˆj |¡ | d ¡d!k}|�r²|�rˆ|	�rˆd}n|�r”d}n|	�r d}nd"}ˆj |¡ nJ|	�rÌ|�rÌˆj |¡ n0|�rÞˆj ¡  n|	�ròˆj |¡ n
ˆj ¡  dS )#z!Paint fill and stroke for a node.rn   NrC   rl   zfill-opacityr   F)rD   rD   zstroke-opacityTr  Z1pxc                 3   s"   | ]}|d krˆ  |ˆ ¡V  qdS )ra   N)rÚ   ©rg   ry   ©rÕ   rR   rT   rU   r…   ½  s   ÿz"SVG.fill_stroke.<locals>.<genexpr>zstroke-dasharrayc                 s   s   | ]}|d kV  qdS ©r   NrT   r$  rT   rT   rU   r…   Â  rj   c                 s   s   | ]}|d k V  qdS r&  rT   r$  rT   rT   rU   r…   Ã  rj   zstroke-dashoffsetr   c                 s   s   | ]}t |ƒV  qd S rJ   r‚   r$  rT   rT   rU   r…   Ç  rj   zstroke-linecapÚbuttÚroundÚsquarer   zstroke-linejoinÚmiterÚbevelzstroke-miterlimitr  z	fill-ruleZevenoddr¸   )r]   r#  rX   r%   r   r&   ÚalpharÛ   Ú	set_colorrÚ   Úset_line_widthr†   r'   r^   ÚallÚanyÚsumÚabsÚset_dashÚset_line_capÚset_line_joinrƒ   Úset_miter_limitÚset_text_renderingÚfill_and_strokerD   rC   ré   )rR   rú   rÕ   r   Zfill_sourceZ
fill_colorZfill_opacityZ
fill_drawnZstream_colorrC   Zstroke_sourceZstroke_colorZstroke_opacityZstroke_drawnrD   Zstroke_widthÚ
dash_arrayZdash_conditionÚoffsetZ
sum_dashesÚline_capÚ	line_joinÚmiter_limitÚeven_oddZtext_renderingrT   r%  rU   rç   œ  s–    ÿÿþÿý





zSVG.fill_strokec                 C   s.   |sdS t ||| jƒ}|jr*| jj |jŽ  dS )z*Apply a transformation string to the node.N)r+   r½   rñ   rÛ   ró   )rR   Ztransform_stringrÕ   ÚmatrixrT   rT   rU   r+   û  s
    zSVG.transformc                 C   sT   t D ]6}||j ¡ v rd|jv r|t| |› d�ƒ|jd < q|D ]}|  |¡ q@dS )zParse defs included in a tree.r4   ÚsN)rõ   r]   r  rO   ÚgetattrrÒ   )rR   rú   Zdef_typerq   rT   rT   rU   rÒ     s
    zSVG.parse_defsc                 C   s0   | j | jfD ]}| ¡ D ]}|  ||¡ qqdS )z7Handle inheritance of different defined elements lists.N)rÈ   rÌ   ró   Úinherit_element)rR   rà   r¦   rT   rT   rU   rÓ     s    zSVG.inherit_defsc                 C   sŒ   |  | j¡}|sdS | ¡  | t|ƒj¡}|s4dS |  ||¡ |j ¡ D ]\}}||jvrJ||j|< qJt	t
|ƒdƒdu rˆ| | ¡ ¡ dS )z2Recursively handle inheritance of defined element.N)rŽ   r�   r�   rX   r(   rì   rB  rO   rr   ÚnextÚiterr·   r�   )rR   r¦   rà   rB   ÚparentrY   ry   rT   rT   rU   rB    s    
zSVG.inherit_elementc                 C   sH   |s|j du rBt | |||ƒ}t|ƒrBd|dd… vrB|r<|S ||_ |j S )z%Calculate the bounding box of a node.Nr   r   )r!   r#   )rR   rú   rÕ   rD   rü   rT   rT   rU   rí   "  s    zSVG.calculate_bounding_boxN)T)F)T)r¿   rÀ   rÁ   rÂ   rV   rØ   rˆ   rÙ   rÚ   rß   rÞ   rù   rÄ   r#  rç   r+   rÒ   rÓ   rB  rí   rT   rT   rT   rU   rÅ   D  s$   
 o

_	rÅ   c                       s.   e Zd ZdZ‡ fdd„Zd‡ fdd„	Z‡  ZS )ÚPatternzSVG node applied as a pattern.c                    s"   t ƒ  |j|j¡ || _|| _d S rJ   )ÚsuperrV   rM   r�   r   rÆ   )rR   rÆ   r   ©r¶   rT   rU   rV   /  s    zPattern.__init__Tc                    s*   || j kr| jj | _ tƒ j||dd� d S )NTræ   )rÆ   r   rG  rÞ   )rR   rú   rÕ   rç   rH  rT   rU   rÞ   4  s    

zPattern.draw_node)T)r¿   rÀ   rÁ   rÂ   rV   rÞ   Ú__classcell__rT   rT   rH  rU   rF  -  s   rF  );rÂ   r”   Ú
contextlibr   Úmathr   r   r   r   r   r   Ú	xml.etreer	   Ú
cssselect2r
   Úurlsr   Úcssr   r   rà   r   r   r   r   r   rÉ   r   r   r   Zshapesr   r   r   r   r   r   r   r!   r    r"   r#   Úutilsr$   r%   r&   r'   r(   r)   r*   r+   rô   Ú	frozensetrs   rv   rõ   rI   rÅ   rF  rT   rT   rT   rU   Ú<module>   sP     (ñ m   l