a
    [Xh<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yZdxZdy"{http://www.w3.org/1999/xlink}hrefhref)fillzflood-colorzlighting-colorr9   stroke)	r-   r2   Z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:    rQ   \/var/www/viveiro_mudafortebrasil/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.)rF   rH   rK   rO   rQ   rQ   rR   rM   e   s    z	Node.copyNc                 C   s   | j ||S )zGet attribute.)rL   get)rO   keydefaultrQ   rQ   rR   rU   i   s    zNode.getc                 C   s   | j jddd S )zXML tag name with no namespace.}r   )rJ   tagsplitrT   rQ   rQ   rR   rZ   m   s    zNode.tagc                 C   s   | j jS )zXML node text.)rJ   r   rT   rQ   rQ   rR   r   r   s    z	Node.textc                 C   s   | j jS )zText after the XML node.)rJ   tailrT   rQ   rQ   rR   r\   w   s    z	Node.tailc                 C   s   |  ddkS )z!Whether node should be displayed.displaynone)rU   rT   rQ   rQ   rR   r]   |   s    zNode.displayc                 C   s   | j o| ddkS )zWhether node is visible.Z
visibilityhidden)r]   rU   rT   rQ   rQ   rR   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|< qqqt	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 rY   rQ   .0ZrulerQ   rQ   rR   
<listcomp>       z Node.cascade.<locals>.<listcomp>c                 S   s   g | ]}|d  qS ra   rQ   rb   rQ   rQ   rR   rd      re   ZcurrentColorr&   blackZinheritNr   r.   r,   T)trailing_space	text_rootc                 S   s   g | ]
}|j qS rQ   )rJ   )rc   childrQ   rQ   rR   rd      s   )rH   rL   itemsNOT_INHERITED_ATTRIBUTESrU   r   rK   matchstripCOLOR_ATTRIBUTESrM   rZ   text_childrenZetree_children)rO   rj   rP   rV   valueZ
style_attrZnormal_attrZimportant_attrZnormal_matcherZimportant_matchernormalZ	importantZdeclarations_listZdeclarationsnamechildren_rQ   rQ   rR   cascade   s>    







zNode.cascadec                 c   s,   | j D ] }t|| j}| | |V  qdS )z&Yield node children, handling cascade.N)rH   rF   rK   rv   )rO   rP   rj   rQ   rQ   rR   __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 rG   float)rc   numberrQ   rQ   rR   	<genexpr>   re   z#Node.get_viewbox.<locals>.<genexpr>N)rU   tupler'   r[   )rO   viewboxrQ   rQ   rR   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.r?   r@   T)Zallow_relativeNr   )rO   base_url	attr_nameurlrQ   rQ   rR   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)rL   pop)rO   r   rQ   rQ   rR   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preserverQ   rQ   rR   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)rU   	get_child)rO   Zid_rj   Z
grandchildrQ   rQ   rR   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 rt|
| 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}|rt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 rQ   rx   rc   irQ   rQ   rR   rd      s   z&Node.text_children.<locals>.<listcomp>r8   )z {http://www.w3.org/2000/svg}trefZtrefr/   rY   z!{http://www.w3.org/2000/svg}tspan)rU   r   rI   r   rJ   lstripr'   rn   r[   rM   pop_rotationendswithr|   iter_childrenrZ   rF   rK   flattenr
   from_xml_rootrp   rt   appendr\   rstripr	   Element)rO   elementrh   ri   rt   spacer   original_rotater8   Zelement_childrenZchild_elementrj   Z
child_nodeZchild_preserver\   Zanonymous_etreeZ	anonymousrQ   rQ   rR   rp      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)rO   Zflattened_textrj   rQ   rQ   rR   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   rY   N)strr   r   r   r8   rQ   rR   r{   +  s   z$Node.pop_rotation.<locals>.<genexpr>r8   N)r   rangelenr   rL   )rO   r   r8   rQ   r   rR   r   )  s    zNode.pop_rotationc                    s    t dtfd fddi| _dS )u$   Override node’s children iterator.rF   rw   c                    s    S rG   rQ   )ru   iteratorrQ   rR   <lambda>4  re   z$Node.override_iter.<locals>.<lambda>N)typerF   	__class__)rO   r   rQ   r   rR   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)rO   r   r   r   r}   rQ   rQ   rR   set_svg_size6  s    zNode.set_svg_size)N)F)__name__
__module____qualname____doc__rS   rM   rU   propertyrZ   r   r\   r]   r`   rv   rw   r~   r   r   staticmethodr   r   rp   r   r   r   r   rQ   rQ   rQ   rR   rF   X   s6   






-
	
?	rF   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   rF   treer   filters	gradientsimagesmarkersmaskspatternspathssymbolsZ	use_cachecursor_positioncursor_d_positiontext_path_widthrv   
parse_defsinherit_defs)rO   r   r   rP   r:   rQ   rQ   rR   rS   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   rU   r*   )rO   	font_sizeZintrinsic_widthZintrinsic_heightrQ   rQ   rR   get_intrinsic_size_  s    

zSVG.get_intrinsic_sizec                 C   s
   | j  S )z*Get document viewBox as a tuple of floats.)r   r~   rT   rQ   rQ   rR   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   )rO   r=   r>   r   rQ   rQ   rR   points  s    z	SVG.pointc                 C   s   t ||| jS )z'Compute size of an arbirtary attribute.)r*   r   )rO   lengthr   rQ   rQ   rR   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*   )rO   r   r   r   r   r   r   rQ   rQ   rR   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}|rd	|  krdk rn n>|| j | ||}t|sd	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 rt$t%" t|j  | || W d   n1 s0    Y  |jr|j t&vr|D ]}|o|j dkpd|j'v pd|j'v }|r| j}|d | _| ||| |r|| _t|j tkoDt|j tkoD|j#}|rt|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}|rt2| ||| |r| 3|| | 4||| |r0d	|  krd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   rY   r   r   ZBBoxr   )r   r5   )rB   rA   )9rZ   r*   rU   r   
push_stater   r(   fragmentr   r+   r%   r   calculate_bounding_boxr#   r   r   	add_groupr   Zctmr   rJ   r   	rectangler0   r   determinantinvertvaluesr]   TAGSr   r    Ztext_bounding_boxr   r   r`   r   r$   	DEF_TYPESrL   r"   r   r   r   r4   r   extraZdraw_x_object	pop_stater   r   r   draw_markersZ	set_alphar   r   r   ) rO   noder   r   Zoriginal_streamsZfilter_r6   boxr   Zold_ctmr=   r>   r<   r3   Zoriginal_tagZnew_ctmZtext_anchor_shiftZtext_anchorgroupr   r   rj   Z	new_chunkZ
new_streamZvisible_text_childx1y1Zx2y2Zgroup_idZx_alignr5   rQ   rQ   rR   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rt|d  }n|	t |d  d }|\}}	n|	}d	}| j||  }s|rd
nd}qf| |d|d|\}}| |dd|dd|\}}d|jv r:t	| ||||\}}}}|
 \}}}}|dddd }|dkrd }}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rt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|rd
nd}qfdS )%zDraw markers defined in a node.NrC   )startmidr   zmarker-NNr   r   r   r   r   refXrefYmarkerWidthr   markerHeightr;   preserveAspectRatioZxMidYMidr   r^   minr         maxmarkerUnitsZuserSpaceOnUsestroke-widthZorient)autoauto-start-reverser      )r   r   r7   r_   )r_   Zscroll)rN   r(   rU   r   rL   r   r   r   r   r)   r~   r[   lowerr   r   ry   r   r   r+   r   r   r   r0   r   r   r   )!rO   r   r   r   r   Zcommon_markerposition	attributeZangle1Zangle2r   ZanglesZangleZmarker_nodeZtranslate_xZtranslate_yZmarker_widthZmarker_heightZscale_xZscale_yru   Zclip_xZclip_yZviewbox_widthZviewbox_heightZalignZ
x_positionZ
y_positionZclip_boxZscaleZ
node_anglerj   r7   rQ   rQ   rR   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.r^   r   z(url\(.+\)) *(.*)r   r   N)rn   r   compilesearchr(   r   r   )rq   rm   sourcer&   rQ   rQ   rR   	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|st|}| 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 rtdd |D }|t||  }j|| |dd}|dkrd}n|dkrd}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|	rd}n|rd}n|	rd}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.rg   NrA   rf   zfill-opacityr   F)rB   rB   zstroke-opacityTr   Z1pxc                 3   s"   | ]}|d kr | V  qdS )r^   N)r   rc   rq   r   rO   rQ   rR   r{     s   z"SVG.fill_stroke.<locals>.<genexpr>zstroke-dasharrayc                 s   s   | ]}|d kV  qdS r   NrQ   r  rQ   rQ   rR   r{     re   c                 s   s   | ]}|d k V  qdS r  rQ   r  rQ   rQ   rR   r{     re   zstroke-dashoffsetr   c                 s   s   | ]}t |V  qd S rG   rx   r  rQ   rQ   rR   r{     re   zstroke-linecapZbuttroundZsquarer   zstroke-linejoinZmiterZbevelzstroke-miterlimitr   z	fill-ruleZevenoddr   )rZ   r  rU   r%   r   r&   alphar   Z	set_colorr   Zset_line_widthr|   r'   r[   allanysumabsZset_dashZset_line_capZset_line_joinry   Zset_miter_limitZset_text_renderingZfill_and_strokerB   rA   r   )rO   r   r   r   Zfill_sourceZ
fill_colorZfill_opacityZ
fill_drawnZstream_colorrA   Zstroke_sourceZstroke_colorZstroke_opacityZstroke_drawnrB   Zstroke_widthZ
dash_arrayZdash_conditionoffsetZ
sum_dashesZline_capZ	line_joinZmiter_limitZeven_oddZtext_renderingrQ   r  rR   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   )rO   Ztransform_stringr   ZmatrixrQ   rQ   rR   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   rZ   r   rL   getattrr   )rO   r   Zdef_typerj   rQ   rQ   rR   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)rO   r   r   rQ   rQ   rR   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   rU   r(   r   r  rL   rk   nextiterr   rw   )rO   r   r   r@   parentrV   rq   rQ   rQ   rR   r    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#   )rO   r   r   rB   r   rQ   rQ   rR   r   "  s    zSVG.calculate_bounding_boxN)T)F)T)r   r   r   r   rS   r   r~   r   r   r   r   r   r   r  r   r+   r   r   r  r   rQ   rQ   rQ   rR   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 rG   )superrS   rJ   r   r   r   )rO   r   r   r   rQ   rR   rS   /  s    zPattern.__init__Tc                    s*   || j kr| jj | _ t j||dd d S )NTr   )r   r   r  r   )rO   r   r   r   r  rQ   rR   r   4  s    

zPattern.draw_node)T)r   r   r   r   rS   r   __classcell__rQ   rQ   r  rR   r  -  s   r  );r   r   
contextlibr   mathr   r   r   r   r   r   Z	xml.etreer	   Z
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   	frozensetrl   ro   r   rF   r   r  rQ   rQ   rQ   rR   <module>   sP     ( m   l