
    3vj}                        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 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.m/Z/m0Z0m1Z1 e$eeee ee"e!e#ee$e$e$edZ2 e3d      Z4 e3d      Z5 e3d      Z6 G d d      Z7 G d d      Z8 G d d      Z9 G d de9      Z:y)zRender SVG images.    N)suppress)coshypotpiradianssinsqrt)ElementTree)ElementWrapper   get_url_attribute   )parse_declarationsparse_stylesheets)apply_filters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   r   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-colorr8   stroke)	clipPathr1   gradientr   markerr4   r   patternsymbolc                       e Zd ZdZd Zd ZddZed        Zed        Z	ed        Z
ed	        Zed
        Zd Zd Zd Zd Zd Zed        Zd ZddZd Zd Zd Zd Zy)NodezAn SVG document node.c                     || _         |j                  | _        || _        d | _        |j                  j
                  j                         | _        g | _        d | _        y N)	_wrapperetree_element_etree_node_style	_childrenattribcopyverticesr!   )selfwrapperr9   s      J/root/.hermes/venv/lib/python3.12/site-packages/weasyprint/svg/__init__.py__init__zNode.__init__Z   sP    "00++22779     c                 B    t        | j                  | j                        S )z<Create a deep copy of the node as it was when first created.)rK   rN   rQ   rV   s    rX   rT   z	Node.copye   s    DMM4;;//rZ   Nc                 :    | j                   j                  ||      S )zGet attribute.)rS   get)rV   keydefaults      rX   r^   zNode.geti   s    {{sG,,rZ   c                 T    | j                   j                  j                  dd      d   S )zXML tag name with no namespace.}r   )rP   tagsplitr\   s    rX   rd   zNode.tagm   s(     ##))#q1"55rZ   c                 .    | j                   j                  S )zXML node text.)rP   r   r\   s    rX   r   z	Node.textr        $$$rZ   c                 .    | j                   j                  S )zText after the XML node.)rP   tailr\   s    rX   ri   z	Node.tailw   rg   rZ   c                 *    | j                  d      dk7  S )z!Whether node should be displayed.displaynoner^   r\   s    rX   rk   zNode.display|   s     xx	"f,,rZ   c                 F    | j                   xr | j                  d      dk7  S )zWhether node is visible.
visibilityhidden)rk   r^   r\   s    rX   visiblezNode.visible   s!     ||B 6( BBrZ   c                    |j                   }| j                  j                         D ],  \  }}|t        vs||j                  vs||j                  |<   . |j	                  d      x}rt        |      \  }}ng g }}| j                  \  }}	|j                  |      D 
cg c]  }
|
d   	 }}
|	j                  |      D 
cg c]  }
|
d   	 }}
||g||gfD ]0  }|D ])  }|D ]"  \  }}|j                         |j                  |<   $ + 2 |j                  j                  dd      x}rR|j                         j                  d      }t        |      dk(  r$|d   |j                  d	<   |d   |j                  d
<   t        D ]6  }|j	                  |      dk(  s|j	                  dd      |j                  |<   8 |j                  j                         j                         D ];  \  }}|dk(  s| j	                  |      }||j                  |= -||j                  |<   = |j                  dv rA|j                  |dd      \  }}|D cg c]  }|j                    c}j                   _        yyc c}
w c c}
w c c}w )z>Apply CSS cascade and other related operations to given child.r9   rc   fontNr   )maxsplitr   r   	font-sizezfont-familycurrentColorr&   blackinherit)r   r-   r,   T)trailing_space	text_root)rN   rS   itemsNOT_INHERITED_ATTRIBUTESr^   r   rQ   matchstrippopre   lenCOLOR_ATTRIBUTESrT   rd   text_childrenrP   etree_children)rV   childrW   r_   value
style_attrnormal_attrimportant_attrnormal_matcherimportant_matcherrulenormal	importantdeclarations_listdeclarationsnamers   partschildren_s                       rX   cascadezNode.cascade   s   .. ++++- 	.JC22ell*(-ELL%	. 7++:+*<Z*H'K*,bK,0KK))'5';';G'DEt$r(EE*;*A*A'*JK$T"XK	K"(;-^DT!U 	7 1 7#/ 7KD%).ELL&77	7 <<##FD1141JJL&&&2E5zQ,1!H[).3Ah]+ $ 	@Cyy~/$)IIgw$?S!	@
  ,,++-335 	.JC	!=S)(-ELL%	. 9911-- . >KHa 08-9&+!!-9ENN) 2= FK@-9s   I-?I2I7c                     | j                   Rg }| j                  D ]:  }t        || j                        }| j	                  |       |j                  |       < || _         t        | j                         S )z&Yield node children, handling cascade.)rR   rN   rK   rQ   r   appenditer)rV   r   rW   r   s       rX   __iter__zNode.__iter__   sd    >>!H== 'Wdkk2U#&' &DNDNN##rZ   c                 |    | j                  d      }|r)t        d t        |      j                         D              S y)z&Get node viewBox as a tuple of floats.r;   c              3   2   K   | ]  }t        |        y wrM   float).0numbers     rX   	<genexpr>z#Node.get_viewbox.<locals>.<genexpr>   s     P6vP   N)r^   tupler'   re   )rV   viewboxs     rX   get_viewboxzNode.get_viewbox   s7    ((9%PYw5G5M5M5OPPP rZ   c                 <    dD ]  }t        | ||d      x}s|c S  y)z4Get the href attribute, with or without a namespace.rA   rB   T)allow_relativeNr   )rV   base_url	attr_nameurls       rX   get_hrefzNode.get_href   s-    G 	I'iRVWWsW
	rZ   c                 J    dD ]  }| j                   j                  |d         y)z8Remove the href attributes, with or without a namespace.r   N)rS   r   )rV   r   s     rX   del_hrefzNode.del_href   s#    G 	-IKKOOIt,	-rZ   c                     | sy|rt        j                  dd|       S t        j                  dd|       } | j                  dd      } t        j                  dd|       S )z>Replace newlines by spaces, and merge spaces if not preserved. z[
	] z[
]	z +)resubreplace)stringpreserves     rX   process_whitespacezNode.process_whitespace   sU     66*c622VVHb&1F^^D#.F66$V,,rZ   c                     | j                   j                  d| d      y| D ]1  }|j                  d      |k(  r|c S |j                  |      }|s/|c S  y)z2Get a child with given id in the whole child tree.z
.//*[@id="z"]Nr3   )rP   findr^   	get_child)rV   id_r   
grandchilds       rX   r   zNode.get_child   s`      :cU"!56> 	"Eyy#%-J!!	"rZ   c                 V   g }d}| j                  |      dk(  }| j                  |j                  j                  |      | j                  _        |r,|s*| j                  j                  d      | j                  _        t        | j                  d            j                         j                  d      D cg c]  }|rt        |       }}|j                         }	|r| j                  ||	       | j                  r| j                  j                  d      }t        |j                               }
|
D ]=  }|j                  }|j                  dv rht!        || j"                        }d|j                  _        |j                  }|j%                         |j                  _        t'        j(                  |      }nt!        || j"                        }|j                  |      dk(  }| j                  |j                  |      |j                  _        |j+                  ||      \  |_        }|j                  j                  d      }|rd|vr|j                  ||	       |j/                  |       | j                  |j0                  |      }|r||
d   u r|s|j3                  d      }|sut5        j6                  d      }t!        t'        j(                  |      | j"                        }||j                  _        |r|j                  ||	       |r,|s*|j                  j                  d      |j                  _        |j                  r|j                  j                  d      }|j/                  |       @ |r.|s,|s*| j                  j3                  d      | j                  _        ||fS c c}w )	z<Handle text node by fixing whitespaces and flattening tails.z+{http://www.w3.org/XML/1998/namespace}spacer   r   r7   )z {http://www.w3.org/2000/svg}treftrefr.   rc   z!{http://www.w3.org/2000/svg}tspan)r^   r   rO   r   rP   lstripr'   r~   re   r   rT   pop_rotationendswithr   iter_childrenrd   rK   rQ   flattenr   from_xml_rootr   r   r   ri   rstripr
   Element)rV   elementry   rz   r   spacer   ioriginal_rotater7   element_childrenchild_elementr   
child_nodechild_preserveri   anonymous_etree	anonymouss                     rX   r   zNode.text_children   s)   =88E?j0 $ 7 7!!&&!2($(II$4$4S$9D! dhhx()//177<C@A !HC C !%%'ov699!YY//4N !6!6!89- %	+M!//EyyHH!-=
-4
&&* #..).!!& . < <U C!-=
'^^E2j@N*.*A*A

N+,J""'2<2J2J~3//J'__55c:N8:#=''@OOJ'**5::x@D].>r.BB;;s+D"-"5"57#9 "00A4;;P	-1	%%*"**?FC!(1:1F1Fs1KI)).>>%.^^%<%<S%AN	*K%	+N Xh$(II$4$4S$9D!''gCs   5N&c                    | j                   xs dg}t        |       D ]Q  }|j                  |j                                |j                  |j                  xs d       | j                  |       S dj                  |      S )z)Flatten text in node and in its children.r   )r   listr   r   ri   removejoin)rV   flattened_textr   s      rX   r   zNode.flatten-  sm    ))/r*$Z 	E!!%--/2!!%**"23KK	 ww~&&rZ   c                     dj                  fdt        t        | j                              D              | j                  d<   y)zMerge nested letter rotations.r   c              3   `   K   | ]%  }t        rj                  d       nd          ' yw)r   rc   N)strr   )r   r   r   r7   s     rX   r   z$Node.pop_rotation.<locals>.<genexpr>8  s/      ), 

1_R-@A),s   +.r7   N)r   ranger   r   rS   )rV   r   r7   s    ``rX   r   zNode.pop_rotation6  s4     # ),3tyy>*), !,HrZ   c                 >    t        dt        fdfdi      | _        y)u$   Override node’s children iterator.rK   r   c                     S rM    )r   iterators    rX   <lambda>z$Node.override_iter.<locals>.<lambda>A  s    H rZ   N)typerK   	__class__)rV   r   s    `rX   override_iterzNode.override_iter<  s      TGj*<=?rZ   c                 R   ||_         ||_        t        ||      t        d      z  |_        | j                         x}r|d   |d   c|_        |_        n#|j                   |j                  c|_        |_        t        |j                  |j                        t        d      z  |_        y)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)rV   r   r   r   r   s        rX   set_svg_sizezNode.set_svg_sizeC  s    +-"'"H4PQ7"R&&((7(07
GAJ-COS-030B0BCDWDW-COS-"3??C4D4DEQOrZ   rM   F)__name__
__module____qualname____doc__rY   rT   r^   propertyrd   r   ri   rk   rq   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   rZ   rX   rK   rK   W   s    	!0- 6 6 % % % % - - C C29h	$Q-
 
- 
-	"=(~',?
PrZ   rK   c                   $    e Zd Zd Zd Zd Zd Zy)LazyDefsc                 .    || _         || _        i | _        y rM   )_name_svg_data)rV   r   r   s      rX   rY   zLazyDefs.__init__Q  s    
	
rZ   c                 $    | j                  |      S rM   rm   rV   r   s     rX   __getitem__zLazyDefs.__getitem__V      xx~rZ   c                    |sy || j                   v r| j                   |   S | j                  j                  j                  |      }|`| j                  |j
                  j                         v r:|| j                   |<   | j                  dv r,| j                  j                  ||        nd | j                   |<   | j                   |   S )N)rF   rH   )r   r   treer   r   rd   lowerinherit_element)rV   r   nodes      rX   r^   zLazyDefs.getY  s    4::::d##yy~~''-

dhhnn.> >#DJJtzz44		))$5#DJJtzz$rZ   c                 $    | j                  |      S rM   rm   r   s     rX   __contains__zLazyDefs.__contains__g  r   rZ   N)r   r   r   rY   r   r^   r  r   rZ   rX   r   r   P  s    
 rZ   r   c                   x    e Zd ZdZddZd Zd Zd Zd Zd Z	dd	Z
d
 Zed        ZddZddZd Zd ZddZy)SVGzAn SVG document.Nc                 0   t        j                  |      }t        ||||      }t        ||      | _        || _        || _        || _        t        d|       | _	        t        d|       | _
        t        d|       | _        t        d|       | _        t        d|       | _        t        d|       | _        t        d|       | _        t        d|       | _        i | _        d	d	g| _        d	d	g| _        d	| _        | j                  j+                  | j                         y )
Nr1   rF   r   rG   r4   rH   r   rI   r   )r   r   r   rK   r   font_configurl_fetcherr   r   filters	gradientsimagesmarkersmaskspatternspathssymbols	use_cachecursor_positioncursor_d_positiontext_path_widthr   )rV   r   r   r  r  rW   r9   s          rX   rY   zSVG.__init__n  s     ..t4!'3[I%(	&&$/!*d3w-$/fd+
 D1fd+
$/ !1v"#Q 		$))$rZ   c                     | j                   j                  dd      }d|v rd}nt        ||      }| j                   j                  dd      }d|v rd}||fS t        ||      }||fS )z Get intrinsic size of the image.r<   z100%%Nr2   )r   r^   r*   )rV   	font_sizeintrinsic_widthintrinsic_heights       rX   get_intrinsic_sizezSVG.get_intrinsic_size  s}    ))--8/!"O"?I>O99==6:""#  000  $$4i@ 000rZ   c                 6    | j                   j                         S )z*Get document viewBox as a tuple of floats.)r   r   r\   s    rX   r   zSVG.get_viewbox  s    yy$$&&rZ   c                 ^    t        ||| j                        t        ||| j                        fS )z.Compute size of an x/y or width/height couple.)r*   r   r   )rV   r=   r>   r  s       rX   pointz	SVG.point  s2     It//0It0013 	3rZ   c                 0    t        ||| j                        S )z'Compute size of an arbirtary attribute.)r*   r   )rV   lengthr  s      rX   r  z
SVG.length  s    FIt':':;;rZ   c                     || _         | j                  j                  | ||       || _        || _        | j                  | j                  t        d             y)zDraw image on a stream.12ptN)streamr   r   r   context	draw_noder*   )rV   r   r   r   r   r!  s         rX   drawzSVG.draw  sC    		t^_E tyy$v,/rZ   c                    |j                   dk(  ryt        |j                  dd      ||      }g }|xr |j                   dv }|r| j                  j	                          | j
                  j                  t        |j                  d            j                        }|rt        | |||       | j                  ||       t        |j                  dd            }|rLd	|cxk  rdk  rAn n>|j                  | j                         | j                  j                  d	d	d	d	      | _        |r| j                  ||       t        |j                  d
            j                  }|r|| j                  v r| j                  j                  }	| j                  |   }|j                  d      dk(  r| j!                  |j                  d      |j                  d      |      \  }
}| j!                  |j                  d      |j                  d      |      \  }}| j                  j                  |||
|       |j"                  j                   }d|j"                  _         | j%                  ||d       ||j"                  _         | j                  j'                  d	d	d	d	       | j                  j)                          | j                  j+                          | j                  j                  }|j,                  r0 | j                  j                  |	|j.                  z  j0                    d}|j2                  rt4        j                  |j                         t6        k(  rb|j                  d      x}dv rBd}| j                  j                  d	d	d	d	      }|j                  | j                         || _        t8        |_        |j                   dk(  r| j<                  }| j>                  }|j@                  rD|j                   t4        v r2tC        tD              5  t5        |j                      | ||       ddd       |j2                  rO|j                   tF        vr<|D ]6  }|xr/ |j                   dk(  xs d|jH                  v xs d|jH                  v }|r| j                  }|d   | _        | j%                  |||       |r| _        t4        j                  |j                         t6        k(  xr4 t4        j                  |j                         t6        k(  xr |j@                  }|stK        |j:                        s|j:                  dd \  }}||j:                  d   z   }||j:                  d   z   }tM        |j:                  ||f||ff      |_        9 |j                   dk(  r!| jN                  jQ                  tR               |r| j                  jT                  }|jW                         | _        | j                  j	                          tK        |j:                        r|j:                  \  }
}}}|
|z
  ||z
  |
|z   |z   ||z   |z   fjX                  d   dd dk(  r|dz  n|}|j                   dk(  sd|jH                  v sd|jH                  v r| j                  j                  |        | j                  j[                  |       | j                  j]                          | j^                  j                  t        |j                  d             j                        }|rta        | |||       |r| jc                  ||       | je                  |||       |rd	|cxk  rdk  rn n| jg                  ||      } tK        |       sd	d	| jh                  | jj                  f} | \  }
}}}|
||
|z   ||z   f| j                  jX                  d   dd | j                  jT                  }|jW                         | _        | j                  jm                  |dd!       | j                  j[                  |       |j                   dk(  rd	d	g| _7        d	d	g| _8        d	| _9        |r| j                  j]                          yy# 1 sw Y   GxY w)"zDraw a node.defsNru   1em)r   r   r   r   r   r   r   r1   r5   r   r   r0   clipPathUnitsobjectBoundingBoxr=   r>   r<   r2   )r,   defgFfill_strokeztext-anchor)middleendTr   r   rc   r   r   BBoxr/  )r*  r4   )rD   rC   ):rd   r*   r^   r   
push_stater  r(   fragmentr   r+   r%   r   	add_groupset_graphical_stater  ctmr  rP   r"  	rectangler/   r0  determinantinvertvaluesrk   TAGSr   r    text_bounding_boxr   r   rq   r   r$   	DEF_TYPESrS   r#   r"   r   r   r   r3   r   extradraw_x_object	pop_stater  r   r.  draw_markerscalculate_bounding_boxr   r   	set_alphar  r  r  )!rV   r   r  r.  original_streamscall_fill_strokefilter_r5   	clip_pathold_ctmr=   r>   r<   r2   original_tagnew_ctmtext_anchor_shifttext_anchorgroupr   r   r   	new_chunk
new_streamvisible_text_childx1y1x2y2group_idx_alignr4   boxs!                                    rX   r"  zSVG.draw_node  sJ   88v +u5y)L	& P488 8P ,P KK""$ ,,""9TXXh-?#@#I#IJ$gy9 	tY' dhhy!451+!+##DKK0++//1a;DK $$T95 dhh{34==	djj0kkooG

9-I}}_-1DDzz$((3-#	J1 $

HHW%txx'99!Fv%%1%B$0044L(+I!!%NN9iUNC(4I!!% KK!!!Q1-KKKKOOkkooG""%%%'..(@'H'HI "<<DHHTXX.$6#xx66;LL$(!--aAq9 ''4#%7D" 88u!00N"22O <<DHH,*% 6TXXtT956 <<DHHI5 F- WII'U3%,,+>U#BU !%J"22"6DKui=",DKHHTXX&$. "HHUYY'4/"MM # &01H1HI "44Ra8FBe55a88Be55a88B-@.."bB80D.FD*'F. 88uII""3H {{~~H*..0DKKK""$$T%;%;<&*&<&<#1eV 	M1y=I	)1v:	+A*CF#A& (3h'>%!)E88v%);sdkk?QKK))WH)5KK%%h/KK!!# zz~~i(89BBCtT41 T9- 	$	;7 1+!+--dI>C(-!T--t/@/@A"%Aq%+,aUAJ+FDKKf%a({{~~H*..0DKKK!!'$T!BKK%%h/ 88v$%q6D &'VD"#$D KK!!# _6 6s   
a**a4c           
      p   |j                   syi }t        |j                  d            j                  }dD ]@  }d| }||j                  v r&t        |j                  |         j                  ||<   <|||<   B d\  }}	d}|j                   r|j                   j                  d      }
|j                   r|j                   j                  d      nd}|r*|dk(  rt        |d   z
  }n|	t        z   |d   z
  dz  }|\  }}	n|	}d	}| j                  j                  ||         x}s|rd
nd}| j                  |j                  d      |j                  d      |      \  }}| j                  |j                  dd      |j                  dd      |      \  }}d|j                  v rt        | ||||      \  }}}}|j                         \  }}}}|j                  dd      j                  d      d   }|dk(  rdx}}n&|dd j                         }|dd j                         }|d
k(  r||||z  z
  dz  z  }n|dk(  r||||z  z
  z  }|d
k(  r||||z  z
  dz  z  }n|dk(  r||||z  z
  z  }||||z  ||z  f}n
dx}}dd||f}|j                  d      dk7  r,| j                  |j                  dd      |      }||z  }||z  }|j                  dd      }|dvrt        t        |            }n|dk(  r|dk(  r|t        d       z  }|D ]  }| j                   j#                           | j                   j$                  |t'        |      z  |t)        |      z  | t)        |      z  |t'        |      z  g|
  | j                   j%                  | | !       |j                  d"d#      } | d$v rM | j                   j*                  |  | j                   j-                          | j                   j/                          | j1                  |||       | j                   j3                            |rd
nd}|j                   ryy)%zDraw markers defined in a node.NrG   )startmidr0  zmarker-NNrY  r   r   r0  rZ  refXrefYmarkerWidthr   markerHeightr;   preserveAspectRatioxMidYMidr   rl   minr         maxmarkerUnitsuserSpaceOnUsestroke-widthorient)autoauto-start-reverserk     )r*  r+  r6   rp   )rp   scroll)rU   r(   r^   r3  rS   r   r   r
  r  r)   r   re   r   r  r   r   r   r2  r+   r   r   r7  r/   r0  r"  r@  )!rV   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_angler   r6   s!                                    rX   rA  zSVG.draw_markersL  s   }}!$((8"45>>/ 	2H!(,IDKK'$-dkk).D$E$N$N!$1!	2 $mmMM%%a(E-1]]T]]&&q)Fw&NE#b[6!949E!'  $(<<#3#3GH4E#FFKF$*5 (,zz')@($K +/**q12+'L- K...)7+y,*O&!Q  ++- >~ $):77<uSz!EF?.33J!&q!1!1!3J!&qr!2J&}|g/EEJJF5(mlW.DDDF&&)@@AF FF5(n}w/FFFF F 7*MG,CE %&%'q,> }-1AADHH^Q$?K5 5  %15J!??j 1233G8K% % (&&(%%%c%j('CJ*>Hs5z)7SZ+?  %%%E&??:x@33)DKK))84KK$$&KKOO%ui=%%'!($ !'uGHy mmrZ   c                    | r| dk(  ry| j                         } t        j                  d      j                  |       }|r=t	        |j                  d            j                  }|j                  d      xs d}||fS d}| xs d}||fS )z9Get paint fill or stroke attribute with a color or a URL.rl   r[  z(url\(.+\)) *(.*)r   r   N)r~   r   compilesearchr(   rM  r3  )r   r}   sourcer&   s       rX   	get_paintzSVG.get_paint  s     

/077>u{{1~.77FKKN*dE
 u} FMTEu}rZ   c                 
     j                  |j                  dd            \  }}t        |j                  dd            }| j                  v }| j                  v }|r?|s=|s;t        |      }	|	xj                  |z  c_         j                  j                  |	        j                  |j                  d            \  }
}t        |j                  dd            }|
 j                  v }|
 j                  v }|rA|s?|s=t        |      }	|	xj                  |z  c_         j                  j                  |	d        j                  |j                  d	d
            }|r j                  j                  |       t         fdt        |j                  d            j                         D              }|xr( t        d |D               xr t        d |D               }|re j                  |j                  d            }|dk  r#t!        d |D              }|t#        |      |z  z
  } j                  j%                  ||       |j                  dd      }|dk(  rd}n
|dk(  rd}nd} j                  j'                  |       |j                  dd      }|dk(  rd}n
|dk(  rd}nd} j                  j)                  |       t+        |j                  dd            }|dk  rd} j                  j-                  |       y)z-Set stroke and fill colors, and line options.rC   rw   fill-opacityr   rD   stroke-opacityTrD   rh  1pxc              3   L   K   | ]  }|d k7  rj                  |        yw)rl   N)r  )r   r   r  rV   s     rX   r   z*SVG.set_graphical_state.<locals>.<genexpr>  s-      P.3?D KKy)Ps   !$zstroke-dasharrayc              3   &   K   | ]	  }|d k(    ywr   Nr   r   r   s     rX   r   z*SVG.set_graphical_state.<locals>.<genexpr>  s     75EQJ7   c              3   &   K   | ]	  }|d k    ywr  r   r  s     rX   r   z*SVG.set_graphical_state.<locals>.<genexpr>  s     6%EAI6r  zstroke-dashoffsetr   c              3   2   K   | ]  }t        |        y wrM   r   r  s     rX   r   z*SVG.set_graphical_state.<locals>.<genexpr>  s      F%u Fr   zstroke-linecapbuttroundsquarer   zstroke-linejoinmiterbevelzstroke-miterlimitrc  N)r  r^   r%   r  r  r&   alphar   	set_colorr  set_line_widthr   r'   re   allanysumabsset_dashset_line_capset_line_joinr   set_miter_limit)rV   r   r  r   fill_source
fill_colorfill_opacityfill_in_gradientfill_in_patternstream_colorstroke_sourcestroke_colorstroke_opacitystroke_in_gradientstroke_in_patternstroke_width
dash_arraydash_conditionoffset
sum_dashesline_cap	line_joinmiter_limits   ` `                    rX   r5  zSVG.set_graphical_state  s    #'..&'1J"KZ"488NA#>?&$..8%6/? ,L,.KK!!,/ '+nnTXXh5G&H#|$TXX.>%BC*dnn<)T]]:!37H .L.0KK!!,t!<{{488NE#BINKK&&|4  Pdhh12399;P P
  77J77776:666 	 [[*=!>	JFz  F: FF
#c&kJ&>>KK  V4 88,f5wH!HH  * HH.8	I'!II!!), DHH%8!<=?K##K0rZ   c                    | j                  |j                  dd            \  }}t        |j                  dd            }t        | ||||d      }|xs |}| j                  |j                  d            \  }	}
t        |j                  dd            }t        | ||	||d	      }| j	                  |j                  d
d      |      }|
xs |xr |}|j                  d      dk(  }|r/|r|rd}n|rd}n|rd}nd}| j
                  j                  |       y|r|r| j
                  j                  |       y|r| j
                  j                          y|r| j
                  j                  |       y| j
                  j                          y)z!Paint fill and stroke for a node.rC   rw   r  r   Fr  rD   r  Trh  r  z	fill-ruleevenoddr   r   r   N)r  r^   r%   r   r  r   set_text_renderingfill_and_strokerD   rC   r0  )rV   r   r  r   r  r  r  
fill_drawnrC   r  r  r  stroke_drawnr  rD   even_oddtext_renderings                    rX   r.  zSVG.fill_stroke  se    #'..&'1J"KZ"488NA#>?-$YUL
'Z '+nnTXXh5G&H#|$TXX.>%BC/$y.O{{488NE#BIN.,@L 88K(I5$!"!"!"!"KK**>:++H5""$  *!rZ   c                     |j                  d      }|j                  d      }|syt        |||| j                        }|j                  r$ | j                  j                  |j
                    yy)z*Apply a transformation string to the node.r:   r+   N)r^   r+   r   r8  r   r:  )rV   r   r  transform_origintransform_stringmatrixs         rX   r+   zSVG.transform5  sh    88$6788K0.	4;N;NP!DKK!!6==1 rZ   c                    |j                  | j                        }|sy|j                          |j                  t	        |      j
                        }|sy| j                  ||       |j                  j                         D ]#  \  }}||j                  vs||j                  |<   % t        t        |      d       |j                  |j                                yy)z2Recursively handle inheritance of defined element.N)r   r   r   r^   r(   r3  r   rS   r{   nextr   r   r   )rV   r   r%  rB   parentr_   r   s          rX   r   zSVG.inherit_elementA  s    ))D/223VT* ----/ 	,JC'..(&+s#	, Wt$,!!&//"34 -rZ   c                     |s|j                   +t        | |||      }t        |      rd|dd vr|r|S ||_         |j                   S )z%Calculate the bounding box of a node.Nr   r   )r!   r#   )rV   r   r  rD   rW  s        rX   rB  zSVG.calculate_bounding_boxQ  sQ    T&&.tT9f=C$S)as12w.>J$'!   rZ   rM   Tr   )r   r   r   r   rY   r  r   r  r  r#  r"  rA  r   r  r5  r.  r+   r   rB  r   rZ   rX   r  r  k  sa    %21 '3<	0Z$xm4^   @1D%"N
25 !rZ   r  c                   .     e Zd ZdZ fdZd fd	Z xZS )PatternzSVG node applied as a pattern.c                     t         |   |j                  |j                  |j                  |j
                         || _        || _        y rM   )superrY   rP   r   r  r  r   r   )rV   r   r   r   s      rX   rY   zPattern.__init__^  s6    ))377COOS__U	rZ   c                 ~    || j                   k(  r| j                  j                   | _         t        |   ||d       y )NTr-  )r   r   r  r"  )rV   r   r  r.  r   s       rX   r"  zPattern.draw_nodec  s4     499DI$	t<rZ   r  )r   r   r   r   rY   r"  __classcell__)r   s   @rX   r  r  \  s    (
= =rZ   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   shapesr   r   r   r   r   r   r   r!   r    r"   r#   utilsr$   r%   r&   r'   r(   r)   r*   r+   r;  	frozensetr|   r   r=  rK   r   r  r  r   rZ   rX   <module>r     s     	  3 3 ! % $ 6 J J   B B R R  
 
" % &  2      
 
	vP vPr 6n! n!b=c =rZ   