o
    hv                     @   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+   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   s8   || _ |j| _|| _d | _|jj | _g | _d | _d S N)	_wrapperetree_element_etree_node_style	_childrenattribcopyverticesr!   )selfwrapperr:    rV   Y/var/www/html/optinet_system/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.)rJ   rL   rO   rT   rV   rV   rW   rR   f      z	Node.copyNc                 C   s   | j ||S )zGet attribute.)rQ   get)rT   keydefaultrV   rV   rW   r[   j   rZ   zNode.getc                 C   s   | j jddd S )zXML tag name with no namespace.}r   )rN   tagsplitrY   rV   rV   rW   r`   n      zNode.tagc                 C      | j jS )zXML node text.)rN   r   rY   rV   rV   rW   r   s      z	Node.textc                 C   rc   )zText after the XML node.)rN   tailrY   rV   rV   rW   re   x   rd   z	Node.tailc                 C   s   |  ddkS )z!Whether node should be displayed.displaynone)r[   rY   rV   rV   rW   rf   }   s   zNode.displayc                 C   s   | j o	| ddkS )zWhether node is visible.
visibilityhidden)rf   r[   rY   rV   rV   rW   visible   rb   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_   rV   .0rulerV   rV   rW   
<listcomp>       z Node.cascade.<locals>.<listcomp>c                 S   rk   rl   rV   rm   rV   rV   rW   rp      rq   currentColorr&   blackinheritNr   r.   r,   T)trailing_space	text_rootc                 S   s   g | ]}|j qS rV   )rN   )rn   childrV   rV   rW   rp      s    )rL   rQ   itemsNOT_INHERITED_ATTRIBUTESr[   r   rO   matchstripCOLOR_ATTRIBUTESrR   r`   text_childrenetree_children)rT   rx   rU   r\   value
style_attrnormal_attrimportant_attrnormal_matcherimportant_matchernormal	importantdeclarations_listdeclarationsnamechildren_rV   rV   rW   cascade   sJ   








zNode.cascadec                 C   sJ   | j du r g }| jD ]}t|| j}| | || q
|| _ t| j S )z&Yield node children, handling cascade.N)rP   rL   rJ   rO   r   appenditer)rT   r   rU   rx   rV   rV   rW   __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 rK   float)rn   numberrV   rV   rW   	<genexpr>       z#Node.get_viewbox.<locals>.<genexpr>N)r[   tupler'   ra   )rT   viewboxrV   rV   rW   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.rB   rC   T)allow_relativeNr   )rT   base_url	attr_nameurlrV   rV   rW   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)rQ   pop)rT   r   rV   rV   rW   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preserverV   rV   rW   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)r[   	get_child)rT   id_rx   
grandchildrV   rV   rW   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 rV   r   rn   irV   rV   rW   rp      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)r[   r   rM   r   rN   lstripr'   r|   ra   rR   pop_rotationendswithr   iter_childrenr`   rJ   rO   flattenr
   from_xml_rootr~   r   r   re   rstripr	   Element)rT   elementrv   rw   r   spacer   original_rotater8   element_childrenchild_elementrx   
child_nodechild_preservere   anonymous_etree	anonymousrV   rV   rW   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   re   removejoin)rT   flattened_textrx   rV   rV   rW   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   rV   rW   r   0  s
    
z$Node.pop_rotation.<locals>.<genexpr>r8   N)r   rangelenr   rQ   )rT   r   r8   rV   r   rW   r   .  s   zNode.pop_rotationc                    s    t dtfd fddi| _dS )u$   Override node’s children iterator.rJ   r   c                    s    S rK   rV   )r   iteratorrV   rW   <lambda>9  s    z$Node.override_iter.<locals>.<lambda>N)typerJ   	__class__)rT   r   rV   r   rW   override_iter4  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)rT   r   r   r   r   rV   rV   rW   set_svg_size;  s   zNode.set_svg_sizerK   F)__name__
__module____qualname____doc__rX   rR   r[   propertyr`   r   re   rf   rj   r   r   r   r   r   staticmethodr   r   r~   r   r   r   r   rV   rV   rV   rW   rJ   X   s8    





-

	?	rJ   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   rJ   treer   filters	gradientsimagesmarkersmaskspatternspathssymbols	use_cachecursor_positioncursor_d_positiontext_path_widthr   
parse_defsinherit_defs)rT   r   r   rU   r:   rV   rV   rW   rX   L  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   r[   r*   )rT   	font_sizeintrinsic_widthintrinsic_heightrV   rV   rW   get_intrinsic_sized  s   

zSVG.get_intrinsic_sizec                 C   s
   | j  S )z*Get document viewBox as a tuple of floats.)r   r   rY   rV   rV   rW   r   t  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   )rT   r>   r?   r   rV   rV   rW   pointx  s   z	SVG.pointc                 C   s   t ||| jS )z'Compute size of an arbirtary attribute.)r*   r   )rT   lengthr   rV   rV   rW   r   ~  rZ   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*   )rT   r   r   r   r   r   r   rV   rV   rW   draw  s   zSVG.drawTc                  C   s  |j dkrdS t|dd||}g }|r| j  | jt|dj}|r/t| ||| | 	|| t
|dd}|r[d|  krIdk r[n n|| j | jdddd| _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r>|j tv r>t t! t|j  | || W d   n	1 s9w   Y  |jr|j t"vr|D ]s}|o_|j dkp_d|j#v p_d|j#v }|rk| j}|d | _| ||| |rx|| _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| j&'t(|| |r3| jj)}|* | _| j  t$|jr(|j\}	}
}}|	| |
| |	| | |
| | f|j+d dd< |dkr|d n|}|j dks d|j#v s d|j#v r(| jj	| d | j,| | j-  | j.t|dj}|rIt/| ||| |rR| 0|| | 1||| |rd|  krhdk rn nC| 2||}t$|s}dd| j3| j4f}|\}	}
}}|	|
|	| |
| f| jj+d dd< | jj)}|* | _| jj5|ddd  | j,| |j dkrddg| _6ddg| _7d| _8|r| j-  dS dS )!zDraw a node.defsNz	font-size1emr2   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   )rE   rD   )9r`   r*   r[   r   
push_stater   r(   fragmentr   r+   r%   r   	add_groupr   ctmr   rN   r   	rectangler0   r  determinantinvertvaluesrf   TAGSr   r    text_bounding_boxr   r   rj   r   r$   	DEF_TYPESrQ   r#   r"   r   r   r   r4   r   extradraw_x_object	pop_stater   r   r  draw_markerscalculate_bounding_boxr   r   	set_alphar   r   r   ) rT   noder   r  original_streamsfilter_r6   r   old_ctmr>   r?   r=   r3   original_tagnew_ctmtext_anchor_shifttext_anchorgroupr   r   rx   	new_chunk
new_streamvisible_text_childx1y1x2y2group_idx_alignr5   boxrV   rV   rW   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.NrG   )startmidr  zmarker-NNr,  r   r   r  r-  refXrefYmarkerWidthr   markerHeightr<   preserveAspectRatioxMidYMidr   rg   minr         maxmarkerUnitsuserSpaceOnUsestroke-widthorient)autoauto-start-reverser>     )r   r  r7   ri   )ri   scroll)rS   r(   r[   r	  rQ   r   r   r   r   r)   r   ra   lowerr   r   r   r   r  r+   r   r   r  r0   r  r   r  )!rT   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_anglerx   r7   rV   rV   rW   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.rg   r.  z(url\(.+\)) *(.*)r   r   N)r|   r   compilesearchr(   r!  r	  )r   r{   sourcer&   rV   rV   rW   	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.ru   NrD   rs   zfill-opacityr   F)rE   rE   zstroke-opacityTr;  1pxc                 3   s$    | ]}|d kr | V  qdS )rg   N)r   rn   r   r   rT   rV   rW   r     s    
z"SVG.fill_stroke.<locals>.<genexpr>zstroke-dasharrayc                 s   s    | ]}|d kV  qdS r   NrV   r_  rV   rV   rW   r     r   c                 s   s    | ]}|d k V  qdS ra  rV   r_  rV   rV   rW   r     r   zstroke-dashoffsetr   c                 s   r   rK   r   r_  rV   rV   rW   r     r   zstroke-linecapbuttroundsquarer   zstroke-linejoinmiterbevelzstroke-miterlimitr6  z	fill-ruleevenoddr   )r`   r]  r[   r%   r   r&   alphar   	set_colorr   set_line_widthr   r'   ra   allanysumabsset_dashset_line_capset_line_joinr   set_miter_limitset_text_renderingfill_and_strokerE   rD   r  )rT   r  r   r   fill_source
fill_colorfill_opacity
fill_drawnstream_colorrD   stroke_sourcestroke_colorstroke_opacitystroke_drawnrE   stroke_width
dash_arraydash_conditionoffset
sum_dashesline_cap	line_joinmiter_limiteven_oddtext_renderingrV   r`  rW   r    s   


zSVG.fill_strokec                 C   sH   | d}| d}|sdS t|||| j}|jr"| jj|j  dS dS )z*Apply a transformation string to the node.r;   r+   N)r[   r+   r   r  r   r  )rT   r  r   transform_origintransform_stringmatrixrV   rV   rW   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`   rA  rQ   getattrr   )rT   r  def_typerx   rV   rV   rW   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)rT   r   r   rV   rV   rW   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   r[   r(   r	  r  rQ   ry   nextr   r   r   )rT   r   r   rC   parentr\   r   rV   rV   rW   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#   )rT   r  r   rE   r+  rV   rV   rW   r  -  s   zSVG.calculate_bounding_boxNTr   )r   r   r   r   rX   r   r   r   r   r   r   r  r   r]  r  r+   r   r   r  r  rV   rV   rV   rW   r   I  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 rK   )superrX   rN   r   r   r   )rT   r   r   r   rV   rW   rX   :  s   
zPattern.__init__Tc                    s*   || j kr
| jj | _ t j||dd d S )NTr  )r   r   r  r   )rT   r  r   r  r  rV   rW   r   ?  s   

zPattern.draw_noder  )r   r   r   r   rX   r   __classcell__rV   rV   r  rW   r  8  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  	frozensetrz   r}   r  rJ   r   r  rV   rV   rV   rW   <module>   sR      ( r   r