o
    %e,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mZ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.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   )EMPTY_BOUNDING_BOXbounding_boxextend_bounding_boxis_valid_bounding_box)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)
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   patternc                   @   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edd Zdd Zd)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:    rS   J/var/www/html/venv/lib/python3.10/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.)rH   rJ   rM   rQ   rS   rS   rT   rO   e      z	Node.copyNc                 C   s   | j ||S )zGet attribute.)rN   get)rQ   keydefaultrS   rS   rT   rX   i   rW   zNode.getc                 C   s   | j jddd S )zXML tag name with no namespace.}r   )rL   tagsplitrV   rS   rS   rT   r]   m      zNode.tagc                 C      | j jS )zXML node text.)rL   r#   rV   rS   rS   rT   r#   r      z	Node.textc                 C   r`   )zText after the XML node.)rL   tailrV   rS   rS   rT   rb   w   ra   z	Node.tailc                 C   s   |  ddkS )z!Whether node should be displayed.displaynone)rX   rV   rS   rS   rT   rc   |   s   zNode.displayc                 C   s   | j o	| ddkS )zWhether node is visible.
visibilityhidden)rc   rX   rV   rS   rS   rT   visible   r_   zNode.visiblec                 c   s   | j D ]}t|| j}| j D ]\}}|tvr#||jvr#||j|< q|d}|r2t|\}}ng g }}| j\}}	dd ||D }
dd |	|D }|
|g||gf}|D ]}|D ]}|D ]\}}|	 |j|< qbq^qZt
D ]}||dkr|dd|j|< qr|j  D ]\}}|dkr| |}|d	u r|j|= q||j|< q|jd
v r|j|ddd\}}dd |D |j _|V  qd	S )z&Yield node children, handling cascade.r:   c                 S      g | ]}|d  qS r\   rS   .0rulerS   rS   rT   
<listcomp>       z!Node.__iter__.<locals>.<listcomp>c                 S   rh   ri   rS   rj   rS   rS   rT   rm      rn   currentColorr&   blackinheritNr#   r.   r,   T)trailing_space	text_rootc                 S   s   g | ]}|j qS rS   )rL   )rk   childrS   rS   rT   rm      s    )rJ   rH   rM   rN   itemsNOT_INHERITED_ATTRIBUTESrX   r   matchstripCOLOR_ATTRIBUTESrO   r]   text_childrenetree_children)rQ   rR   ru   rY   value
style_attrnormal_attrimportant_attrnormal_matcherimportant_matchernormal	importantdeclarations_listsdeclarations_listdeclarationsnamechildren_rS   rS   rT   __iter__   sV   











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       | ]}t |V  qd S rI   float)rk   numberrS   rS   rT   	<genexpr>   s    
z#Node.get_viewbox.<locals>.<genexpr>N)rX   tupler'   r^   )rQ   viewboxrS   rS   rT   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   )rQ   base_url	attr_nameurlrS   rS   rT   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)rN   pop)rQ   r   rS   rS   rT   del_href   s   zNode.del_hrefc                 C   sD   | sdS |rt dd| S t dd| } t dd| } t dd| S )z>Replace newlines by spaces, and merge spaces if not preserved. z[
	] z[
]	z +)resub)stringpreserverS   rS   rT   process_whitespace   s   zNode.process_whitespacec                 C   s:   | D ]}| 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)rQ   id_ru   
grandchildrS   rS   rT   r      s   
zNode.get_childFc                 C   s  g }d}|  |dk}| |jj|| j_|r!|s!| jd| j_dd t|  d dD }|	 }|r>| 
|| | jrG| jd}t| }	|	D ]}
|
j}|jdv rrt|
| j}d|j_|j}| |j_t|}
nt|
| j}| |dk}| |j||j_||
|\|_}|jd}|rd|vr|
|| || | |j|}|r|
|	d	 u r|s|d}|rtd
}tt|| j}||j_|r|
|| |r|s|jd|j_|jr|jd}|| qO|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 rS   r   rk   irS   rS   rT   rm      s    z&Node.text_children.<locals>.<listcomp>r8   )z {http://www.w3.org/2000/svg}treftrefr/   r\   z!{http://www.w3.org/2000/svg}tspan)rX   r   rK   r#   rL   lstripr'   ry   r^   rO   pop_rotationendswithr   iter_childrenr]   rH   rM   flattenr
   from_xml_rootr{   r   appendrb   rstripr	   Element)rQ   elementrs   rt   r   spacer   original_rotater8   element_childrenchild_elementru   
child_nodechild_preserverb   anonymous_etree	anonymousrS   rS   rT   r{      sx   




zNode.text_childrenc                 C   sL   | j pdg}t| D ]}||  ||jpd | | q
d|S )z)Flatten text in node and in its children.r   )r#   listr   r   rb   removejoin)rQ   flattened_textru   rS   rS   rT   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   rS   rT   r   ,  s
    
z$Node.pop_rotation.<locals>.<genexpr>r8   N)r   rangelenr#   rN   )rQ   r   r8   rS   r   rT   r   *  s   zNode.pop_rotationc                    s    t dtfd fddi| _dS )u$   Override node’s children iterator.rH   r   c                    s    S rI   rS   )r   iteratorrS   rT   <lambda>5  s    z$Node.override_iter.<locals>.<lambda>N)typerH   	__class__)rQ   r   rS   r   rT   override_iter0  s   
zNode.override_iterrI   F)__name__
__module____qualname____doc__rU   rO   rX   propertyr]   r#   rb   rc   rg   r   r   r   r   staticmethodr   r   r{   r   r   r   rS   rS   rS   rT   rH   X   s4    






2

	?	rH   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||| _|| _tD ]}| j|dkr*| jdd| jj|< qi | _	i | _
i | _i | _i | _i | _i | _i | _ddg| _ddg| _d| _| | j |   d S )Nro   r&   rp   r   )r
   r   r   rH   treer   rz   rX   rN   filters	gradientsimagesmarkersmaskspatternspaths	use_cachecursor_positioncursor_d_positiontext_path_width
parse_defsinherit_defs)rQ   r   r   rR   r:   rY   rS   rS   rT   rU   ;  s*   



zSVG.__init__c                 C   sZ   | j dd}d|v rd}nt||}| j dd}d|v r$d}||fS t||}||fS )z Get intrinsic size of the image.r<   z100%%Nr3   )r   rX   r*   )rQ   	font_sizeintrinsic_widthintrinsic_heightrS   rS   rT   get_intrinsic_sizeW  s   

zSVG.get_intrinsic_sizec                 C   s
   | j  S )z*Get document viewBox as a tuple of floats.)r   r   rV   rS   rS   rT   r   g  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*   inner_widthinner_height)rQ   r=   r>   r   rS   rS   rT   pointk  s   z	SVG.pointc                 C   s   t ||| jS )z'Compute size of an arbirtary attribute.)r*   inner_diagonal)rQ   lengthr   rS   rS   rT   r   q  rW   z
SVG.lengthc                 C   s   || _ || _|| _t||td | _|  }|r%|d |d | _| _n| j| _| j| _t| j| jtd | _	|| _
|| _|| _| | jtd dS )zDraw image on a stream.r      12ptN)streamconcrete_widthconcrete_heightr   r   normalized_diagonalr   r   r   r   r   url_fetchercontext	draw_noder   r*   )rQ   r   r   r   r   r   r   r   rS   rS   rT   drawu  s    zSVG.drawTc                 C   s  |j dkrdS t|dd||}g }|r| j  | jt|dj}|r/t| ||| | 	|d| t
|dd}|rmd	|  krLdk rmn n|| j | ||}t|sfd	d	| j| jf}| jj| | _t|d
j}|r|| jv r| jj}	| j| }|ddkr| |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  |j dkr	|d}t|}|r	|js	|d	 d}|j dkr&|dv r&| jd	d	d	d	}|| j || _|jr6t|j tkr6t |_!|j"r^|j tv r^t#t$ t|j  | || W d   n	1 sYw   Y  |jr|j t%vr|D ]N}| ||| t|j tkot|j tko|j"}|rt|j!sqj|j!dd \}}||j!d  }||j!d  }t&|j!||f||ff|_!qj|j dkr|dv r| jj'}|( | _| j  t|j!r|j!\}
}}}|
||
| || f|j)d dd< |dkr|d n|}| jj	| d | j*| | j+  | j,t|dj}|r$t-| ||| |r-| .|| | /||| |r]d	|  krCdk r]n n| jj'}|( | _| jj0|ddd | j*| |j dkrpd	d	g| _1d	d	g| _2d	| _3|rz| j+  dS dS ) zDraw a node.defsNz	font-size1emr2   r+   r6   r   r   r1   clipPathUnitsobjectBoundingBoxr=   r>   r<   r3   )r,   defgFfill_stroker#   ztext-anchor)middleendr   r   BBoxr   )r   r5   T)rD   rC   )4r]   r*   rX   r   
push_stater   r(   fragmentr   r+   r%   r   calculate_bounding_boxr   r   r   	add_groupr   ctmr   rL   r   	rectangler0   r   determinantinvertvaluesr   r#   rc   TAGSr   text_bounding_boxrg   r   r$   	DEF_TYPESr   r4   r   extradraw_x_object	pop_stater   r   r   draw_markers	set_alphar   r   r   )rQ   noder   r   original_streamsfilter_r6   boxr   old_ctmr=   r>   r<   r3   original_tagnew_ctmtext_anchorr   groupru   visible_text_childx1y1x2y2group_idx_alignr5   rS   rS   rT   r     s   








"
"


zSVG.draw_nodec           #      C   s  |j sdS i }t|dj}dD ]}d| }||jv r(t|j| j||< q|||< qd\}}	d}|j r|j d}
|j rF|j dnd}|rd|dkrUt|d  }n
|	t |d  d }|\}}	n|	}d	}|| }|su|rrd
nd}q3| j|}| |d|d|\}}d|jv r| |dd|dd|\}}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d|\}}| ||}t|rPt||d  ||d   }}|| }|| }nd }}d}|ddkrp| |dd|}||9 }||9 }|dd} | dvrtt| }n| dkr|dkr|td 7 }|D ]Z}!| j  | jj|t| |t| | t| |t| g|
R   | jj| | d! |d"d#}"|r|"d$v r| jj|  | j  | j  | |!|| | j  q|rd
nd}|j s7dS dS )%zDraw markers defined in a node.NrF   )startmidr   zmarker-NNr"  r   r   r   r#  refXrefYr;   markerWidthr   markerHeightpreserveAspectRatioxMidYMidr   rd   minr         maxmarkerUnitsuserSpaceOnUsestroke-widthorient)autoauto-start-reverser4     )r   r   r7   rf   )rf   scroll)rP   r(   rX   r  rN   r   r   r   r   r)   r   r^   lowerr  r   r+  r   r   r   r   r  r+   r   r   r  r0   r   r   r  )#rQ   r  r   r   r   common_markerposition	attributeangle1angle2r   anglesanglerF   marker_nodetranslate_xtranslate_ymarker_widthmarker_heightscale_xscale_yr   clip_xclip_yviewbox_widthviewbox_heightalign
x_position
y_positionclip_boxr  scale
node_angleru   r7   rS   rS   rT   r    s   


















zSVG.draw_markersc                 C   sf   | r| dkrdS |   } td| }|r)t|dj}|dp$d}||fS d}| p.d}||fS )z9Get paint fill or stroke attribute with a color or a URL.rd   r$  z(url\(.+\)) *(.*)r   r   N)ry   r   compilesearchr(   r  r  )r}   rx   sourcer&   rS   rS   rT   	get_paint  s   zSVG.get_paintFc                    s  |j dv r	|s	dS |dd\}}t|dd}t|| |dd}|rB|sBt|\}}	}
}j||	|
 j||  |pE|}|d	\}}t|d
d}t|| |dd}|r|st|\}}	}
}jj||	|
dd jj|| dd |p|}	|dd }|rj
| nd}t fddt|d D }|otdd |D  ot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 r4d}j| |d d!k}|rc|rM|rMd}n|rSd}n|rYd}nd"}j| dS |rq|rqj| dS |r{j  dS |rj| dS j  dS )#z!Paint fill and stroke for a node.rr   NrC   rp   zfill-opacityr   F)rD   rD   zstroke-opacityTr1  1pxc                 3   s$    | ]}|d kr | V  qdS )rd   N)r   rk   r}   r   rQ   rS   rT   r     s    
z"SVG.fill_stroke.<locals>.<genexpr>zstroke-dasharrayc                 s   s    | ]}|d kV  qdS r   NrS   rU  rS   rS   rT   r         c                 s   s    | ]}|d k V  qdS rW  rS   rU  rS   rS   rT   r     rX  zstroke-dashoffsetr   c                 s   r   rI   r   rU  rS   rS   rT   r     rX  zstroke-linecapbuttroundsquarer   zstroke-linejoinmiterbevelzstroke-miterlimitr,  z	fill-ruleevenoddr   )r]   rS  rX   r%   r   r&   r   set_color_rgbr  r   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   )rQ   r  r   r#   fill_source
fill_colorfill_opacity
fill_drawnredgreenbluealpharC   stroke_sourcestroke_colorstroke_opacitystroke_drawnrD   stroke_width
dash_arraydash_conditionoffset
sum_dashesline_cap	line_joinmiter_limiteven_oddtext_renderingrS   rV  rT   r     s   


zSVG.fill_strokec                 C   s2   |sdS t ||| j}|jr| jj |j  dS dS )z*Apply a transformation string to the node.N)r+   r   r  r   r	  )rQ   transform_stringr   matrixrS   rS   rT   r+     s   zSVG.transformc                 C   sT   t D ]}||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]   r7  rN   getattrr   )rQ   r  def_typeru   rS   rS   rT   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)rQ   r   r   rS   rS   rT   r     s
   zSVG.inherit_defsc                 C   s   | | j}|s
dS |  |t|j}|sdS | || |j D ]\}}||jvr3||j|< q%t	t
|ddu rF||  dS dS )z2Recursively handle inheritance of defined element.N)r   r   r   rX   r(   r  r  rN   rv   nextiterr   r   )rQ   r   r   rB   parentrY   r}   rS   rS   rT   r    s   

zSVG.inherit_elementc                 C   sH   |s|j du r!t | |||}t|r!d|dd vr!|r|S ||_ |j S )z%Calculate the bounding box of a node.Nr   r   )r   r   )rQ   r  r   rD   r  rS   rS   rT   r  %  s   zSVG.calculate_bounding_boxNTr   )r   r   r   r   rU   r   r   r   r   r   r   r  r   rS  r   r+   r   r   r  r  rS   rS   rS   rT   r   8  s&    
 }

_	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 rI   )superrU   rL   r   r   r   )rQ   r   r   r   rS   rT   rU   2  s   
zPattern.__init__Tc                    s*   || j kr
| jj | _ t j||dd d S )NTr   )r   r   r  r   )rQ   r  r   r   r  rS   rT   r   7  s   

zPattern.draw_noder  )r   r   r   r   rU   r   __classcell__rS   rS   r  rT   r  0  s    r  );r   r   
contextlibr   mathr   r   r   r   r   r   	xml.etreer	   
cssselect2r
   urlsr   r   r   r   r   cssr   r   r   r   r   r   r   r   r   r   r   r   shapesr   r   r   r    r!   r"   r#   utilsr$   r%   r&   r'   r(   r)   r*   r+   r
  	frozensetrw   rz   r  rH   r   r  rS   rS   rS   rT   <module>   sR      ( a   {