a
    Qh<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|< 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 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 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 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}|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   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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.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|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.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