o
    Zh0h<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   M/var/www/html/rh/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.)rI   rK   rN   rR   rT   rT   rU   rP   e      z	Node.copyNc                 C   s   | j ||S )zGet attribute.)rO   get)rR   keydefaultrT   rT   rU   rY   i   rX   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      zNode.tagc                 C      | j jS )zXML node text.)rM   r   rW   rT   rT   rU   r   r      z	Node.textc                 C   ra   )zText after the XML node.)rM   tailrW   rT   rT   rU   rc   w   rb   z	Node.tailc                 C   s   |  ddkS )z!Whether node should be displayed.displaynone)rY   rW   rT   rT   rU   rd   |   s   zNode.displayc                 C   s   | j o	| ddkS )zWhether node is visible.
visibilityhidden)rd   rY   rW   rT   rT   rU   visible   r`   zNode.visiblec                 C   sr  |j }| j D ]\}}|tvr||jvr||j|< q|d }r)t|\}}ng g }}| j\}}	dd ||D }
dd |	|D }|
|g||gfD ]}|D ]}|D ]\}}| |j|< qWqSqOt	D ]}||dkry|dd|j|< qg|j
  D ]\}}|dkr| |}|d	u r|j|= q||j|< q|jd
v r|j|ddd\}}dd |D |j _d	S d	S )z>Apply CSS cascade and other related operations to given child.r:   c                 S      g | ]}|d  qS r]   rT   .0rulerT   rT   rU   
<listcomp>       z Node.cascade.<locals>.<listcomp>c                 S   ri   rj   rT   rk   rT   rT   rU   rn      ro   currentColorr&   blackinheritNr   r.   r,   T)trailing_space	text_rootc                 S   s   g | ]}|j qS rT   )rM   )rl   childrT   rT   rU   rn      s    )rK   rO   itemsNOT_INHERITED_ATTRIBUTESrY   r   rN   matchstripCOLOR_ATTRIBUTESrP   r^   text_childrenetree_children)rR   rv   rS   rZ   value
style_attrnormal_attrimportant_attrnormal_matcherimportant_matchernormal	importantdeclarations_listdeclarationsnamechildren_rT   rT   rU   cascade   sJ   








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   rv   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       | ]}t |V  qd S rJ   float)rl   numberrT   rT   rU   	<genexpr>       z#Node.get_viewbox.<locals>.<genexpr>N)rY   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   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preserverT   rT   rU   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)rY   	get_child)rR   id_rv   
grandchildrT   rT   rU   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 rT   r   rl   irT   rT   rU   rn      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)rY   r   rL   r   rM   lstripr'   rz   r_   rP   pop_rotationendswithr   iter_childrenr^   rI   rN   flattenr
   from_xml_rootr|   r   appendrc   rstripr	   Element)rR   elementrt   ru   r   spacer   original_rotater8   element_childrenchild_elementrv   
child_nodechild_preserverc   anonymous_etree	anonymousrT   rT   rU   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   rc   removejoin)rR   flattened_textrv   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  s    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 |_|   }r"|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   normalized_diagonalr   inner_widthinner_heightinner_diagonal)rR   r   r   r   r   rT   rT   rU   set_svg_size6  s   zNode.set_svg_sizerJ   F)__name__
__module____qualname____doc__rV   rP   rY   propertyr^   r   rc   rd   rh   r   r   r   r   r   staticmethodr   r   r|   r   r   r   r   rT   rT   rT   rU   rI   X   s8    






-

	?	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symbols	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   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   rY   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  rX   z
SVG.lengthc                 C   s>   || _ | j| || || _|| _|| _| | jtd dS )zDraw image on a stream.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   sf  |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  d}|jrt|j tkr|d }dv rd}| jd	d	d	d	}|| j || _t|_ |j dkr(| j!}| j"}|j#rP|j tv rPt$t% t|j  | || W d   n	1 sKw   Y  |jr|j t&vr|D ]s}|oq|j dkpqd|j'v pqd|j'v }|r}| j}|d | _| ||| |r|| _t|j tkot|j tko|j#}|rt|j sq\|j dd \}}||j d  }||j d  }t(|j ||f||ff|_ q\|j dkr| j)*t+|| |rE| jj,}|- | _| j  t|j r:|j \}
}}}|
| || |
| | || | f|j.d dd< |dkr|d n|}|j dks2d|j'v s2d|j'v r:| jj	| d | j/| | j0  | j1t|d j}|r[t2| ||| |rd| 3|| | 4||| |rd	|  krzdk rn n| jj,}|- | _| jj5|ddd! | j/| |j dkrd	d	g| _6d	d	g| _7d	| _8|r| j0  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_strokeztext-anchor)middleendTr   r   r]   r   r   BBoxr  )r   r5   )rD   rC   )9r^   r*   rY   r   
push_stater   r(   fragmentr   r+   r%   r   calculate_bounding_boxr#   r   r   	add_groupr   ctmr   rM   r   	rectangler0   r  determinantinvertvaluesrd   TAGSr   r    text_bounding_boxr   r   rh   r   r$   	DEF_TYPESrO   r"   r   r   r   r4   r   extradraw_x_object	pop_stater   r   r  draw_markers	set_alphar   r   r   ) rR   noder   r  original_streamsfilter_r6   boxr   old_ctmr=   r>   r<   r3   original_tagnew_ctmtext_anchor_shifttext_anchorgroupr   r   rv   	new_chunk
new_streamvisible_text_childx1y1x2y2group_idx_alignr5   rT   rT   rU   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	}| j||  }sy|rvd
nd}q3| |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rPtt|}n|dkr`|dkr`|td 7 }|D ]W}| j  | jj|t| |t| | t| |t| g|
R   | jj| | d! |d"d#} | d$v r| jj|  | j  | j  | ||| | j  qb|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refYmarkerWidthr   markerHeightr;   preserveAspectRatioxMidYMidr   re   minr         maxmarkerUnitsuserSpaceOnUsestroke-widthorient)autoauto-start-reverser;     )r   r   r7   rg   )rg   scroll)rQ   r(   rY   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   common_markerposition	attributeangle1angle2r   anglesangle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_boxscale
node_anglerv   r7   rT   rT   rU   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.re   r+  z(url\(.+\)) *(.*)r   r   N)rz   r   compilesearchr(   r  r  )r~   ry   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}|r;|s;t|}| j|9  _j| |p>|}	|d	\}
}t|d
d}t||
 |dd}|rr|srt|}| j|9  _jj|dd |pu|}	|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 r$d}j| |d d!k}|rS|r=|	r=d}n|rCd}n|	rId}nd"}j| dS |	ra|raj| dS |rkj  dS |	rvj| dS j  dS )#z!Paint fill and stroke for a node.rs   NrC   rq   zfill-opacityr   F)rD   rD   zstroke-opacityTr8  1pxc                 3   s$    | ]}|d kr | V  qdS )re   N)r   rl   r~   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     r   c                 s   s    | ]}|d k V  qdS r^  rT   r\  rT   rT   rU   r     r   zstroke-dashoffsetr   c                 s   r   rJ   r   r\  rT   rT   rU   r     r   zstroke-linecapbuttroundsquarer   zstroke-linejoinmiterbevelzstroke-miterlimitr3  z	fill-ruleevenoddr   )r^   rZ  rY   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   fill_source
fill_colorfill_opacity
fill_drawnstream_colorrC   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_renderingrT   r]  rU   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  )rR   transform_stringr   matrixrT   rT   rU   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^   r>  rO   getattrr   )rR   r  def_typerv   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}|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   rY   r(   r  r  rO   rw   nextiterr   r   )rR   r   r   rB   parentrZ   r~   rT   rT   rU   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#   )rR   r  r   rD   r  rT   rT   rU   r  "  s   zSVG.calculate_bounding_boxNTr   )r   r   r   r   rV   r   r   r   r   r   r   r  r   rZ  r  r+   r   r   r  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   r  r   )rR   r  r   r  r  rT   rU   r   4  s   

zPattern.draw_noder  )r   r   r   r   rV   r   __classcell__rT   rT   r  rU   r  -  s    r  );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   shapesr   r   r   r   r   r   r   r!   r    r"   r#   utilsr$   r%   r&   r'   r(   r)   r*   r+   r  	frozensetrx   r{   r  rI   r   r  rT   rT   rT   rU   <module>   sR      ( m   l