
    ,g<u                        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Z3 e4d      Z5 e4d      Z6 e4d      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	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-colorr:   stroke)	r.   r3   gradientr   markerr6   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                  | _        || _        |j                  j                  j                         | _        g | _        d | _        y N)_wrapperetree_element_etree_node_styleattribcopyverticesr"   )selfwrapperr;   s      o/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/weasyprint/svg/__init__.py__init__zNode.__init__[   sI    "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   rU   s    rW   rS   z	Node.copye   s    DMM4;;//rY   Nc                 :    | j                   j                  ||      S )zGet attribute.)rR   get)rU   keydefaults      rW   r]   zNode.geti   s    {{sG,,rY   c                 T    | j                   j                  j                  dd      d   S )zXML tag name with no namespace.}r   )rP   tagsplitr[   s    rW   rc   zNode.tagm   s(     ##))#q1"55rY   c                 .    | j                   j                  S )zXML node text.)rP   r    r[   s    rW   r    z	Node.textr        $$$rY   c                 .    | j                   j                  S )zText after the XML node.)rP   tailr[   s    rW   rh   z	Node.tailw   rf   rY   c                 *    | j                  d      dk7  S )z!Whether node should be displayed.displaynone)r]   r[   s    rW   rj   zNode.display|   s     xx	"f,,rY   c                 F    | j                   xr | j                  d      dk7  S )zWhether node is visible.
visibilityhidden)rj   r]   r[   s    rW   visiblezNode.visible   s!     ||B 6( BBrY   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 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.r;   rb   currentColorr'   blackinheritNr    r/   r-   T)trailing_space	text_root)rN   rR   itemsNOT_INHERITED_ATTRIBUTESr]   r   rQ   matchstripCOLOR_ATTRIBUTESrS   rc   text_childrenrP   etree_children)rU   childrV   r^   value
style_attrnormal_attrimportant_attrnormal_matcherimportant_matcherrulenormal	importantdeclarations_listdeclarationsnamechildren_s                     rW   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 $ 	@Cyy~/$)IIgw$?S!	@
  ,,++-335 	.JC	!=S)(-ELL%	. 9911-- . >KHa 08-9&+!!-9ENN) 2- FK0-9s   G=?HHc              #      K   | j                   D ]-  }t        || j                        }| j                  |       | / yw)z&Yield node children, handling cascade.N)rN   rK   rQ   r   )rU   rV   r~   s      rW   __iter__zNode.__iter__   s:     }} 	G$++.ELLK	s   >A 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     rW   	<genexpr>z#Node.get_viewbox.<locals>.<genexpr>   s     P6vP   N)r]   tupler(   rd   )rU   viewboxs     rW   get_viewboxzNode.get_viewbox   s7    ((9%PYw5G5M5M5OPPP rY   c                 <    dD ]  }t        | ||d      x}s|c S  y)z4Get the href attribute, with or without a namespace.rB   rC   T)allow_relativeNr   )rU   base_url	attr_nameurls       rW   get_hrefzNode.get_href   s-    G 	I'iRVWWsW
	rY   c                 J    dD ]  }| j                   j                  |d         y)z8Remove the href attributes, with or without a namespace.r   N)rR   pop)rU   r   s     rW   del_hrefzNode.del_href   s#    G 	-IKKOOIt,	-rY   c                     | sy|rt        j                  dd|       S t        j                  dd|       } t        j                  dd|       } t        j                  dd|       S )z>Replace newlines by spaces, and merge spaces if not preserved. z[
	] z[
]	z +)resub)stringpreserves     rW   process_whitespacezNode.process_whitespace   sW     66*c622VVHb&1FVVD#v.F66$V,,rY   c                 p    | D ]1  }|j                  d      |k(  r|c S |j                  |      }|s/|c S  y)z2Get a child with given id in the whole child tree.r5   N)r]   	get_child)rU   id_r~   
grandchilds       rW   r   zNode.get_child   s=     	"Eyy#%-J!!	"rY   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   r9   )z {http://www.w3.org/2000/svg}treftrefr0   rb   z!{http://www.w3.org/2000/svg}tspan)r]   r   rO   r    rP   lstripr(   rz   rd   r   rS   pop_rotationendswithr   iter_childrenrc   rK   rQ   flattenr   from_xml_rootr|   r   appendrh   rstripr
   Element)rU   elementru   rv   r   spacer   ioriginal_rotater9   element_childrenchild_elementr~   
child_nodechild_preserverh   anonymous_etree	anonymouss                     rW   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   rh   removejoin)rU   flattened_textr~   s      rW   r   zNode.flatten   sm    ))/r*$Z 	E!!%--/2!!%**"23KK	 ww~&&rY   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   rb   N)strr   )r   r   r   r9   s     rW   r   z$Node.pop_rotation.<locals>.<genexpr>+  s/      ), 

1_R-@A),s   +.r9   N)r   rangelenr    rR   )rU   r   r9   s    ``rW   r   zNode.pop_rotation)  s4     # ),3tyy>*), !,HrY   c                 >    t        dt        fdfdi      | _        y)u$   Override node’s children iterator.rK   r   c                     S rM    )r   iterators    rW   <lambda>z$Node.override_iter.<locals>.<lambda>4  s    H rY   N)typerK   	__class__)rU   r   s    `rW   override_iterzNode.override_iter/  s      TGj*<=?rY   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)rU   r   r   r   r   s        rW   set_svg_sizezNode.set_svg_size6  s    +-"'"H4PQ7"R&&((7(07
GAJ-COS-030B0BCDWDW-COS-"3??C4D4DEQOrY   rM   F)__name__
__module____qualname____doc__rX   rS   r]   propertyrc   r    rh   rj   ro   r   r   r   r   r   staticmethodr   r   r|   r   r   r   r   r   rY   rW   rK   rK   X   s    !0- 6 6 % % % % - - C C*9ZQ-
 
- 
-"=(~',?
PrY   rK   c                   z    e Zd ZdZd Zd Zd Zd Zd Zd Z	ddZ
d	 Zed
        ZddZd Zd Zd Zd ZddZy)SVGzAn SVG document.c                    t        j                  |      }t        ||      }t        ||      | _        || _        i | _        i | _        i | _        i | _	        i | _
        i | _        i | _        i | _        i | _        ddg| _        ddg| _        d| _        | j                  j%                  | j                         | j'                  | j                         | j)                          y )Nr   )r   r   r   rK   treer   filters	gradientsimagesmarkersmaskspatternspathssymbols	use_cachecursor_positioncursor_d_positiontext_path_widthr   
parse_defsinherit_defs)rU   r   r   rV   r;   s        rW   rX   zSVG.__init__G  s     ..t4!'3/%(	

 !1v"#Q 		$))$		"rY   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%%Nr4   )r   r]   r+   )rU   	font_sizeintrinsic_widthintrinsic_heights       rW   get_intrinsic_sizezSVG.get_intrinsic_size_  s}    ))--8/!"O"?I>O99==6:""#  000  $$4i@ 000rY   c                 6    | j                   j                         S )z*Get document viewBox as a tuple of floats.)r   r   r[   s    rW   r   zSVG.get_viewboxo  s    yy$$&&rY   c                 ^    t        ||| j                        t        ||| j                        fS )z.Compute size of an x/y or width/height couple.)r+   r   r   )rU   r>   r?   r   s       rW   pointz	SVG.points  s2     It//0It0013 	3rY   c                 0    t        ||| j                        S )z'Compute size of an arbirtary attribute.)r+   r   )rU   lengthr   s      rW   r  z
SVG.lengthy  s    FIt':':;;rY   c                     || _         | j                  j                  | ||       || _        || _        || _        | j                  | j                  t        d             y)zDraw image on a stream.12ptN)streamr   r   r   url_fetchercontext	draw_noder+   )rU   r  r   r   r   r	  r
  s          rW   drawzSVG.draw}  sM     		t^_E &tyy$v,/rY   c                 ^   |j                   dk(  ryt        |j                  dd      ||      }g }|r| j                  j	                          | j
                  j                  t        |j                  d            j                        }|rt        | |||       | j                  |j                  d      |       t        |j                  dd            }|r~d	|cxk  rdk  rsn np|j                  | j                         | j                  ||      }t        |      sd	d	| j                  | j                  f} | j                  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                  j1                          | j                  j$                  }|j2                  r0 | j                  j                  |	|j4                  z  j6                    d}|j8                  rt:        j                  |j                         t<        k(  rb|j                  d      x}dv rBd}| j                  j!                  d	d	d	d	      }|j                  | j                         || _        t>        |_         |j                   dk(  r| jB                  }| jD                  }|jF                  rD|j                   t:        v r2tI        tJ              5  t;        |j                      | ||       ddd       |j8                  rO|j                   tL        vr<|D ]6  }|xr/ |j                   dk(  xs d|jN                  v xs d|jN                  v }|r| j                  }|d   | _        | j+                  |||       |r| _        t:        j                  |j                         t<        k(  xr4 t:        j                  |j                         t<        k(  xr |jF                  }|st        |j@                        s|j@                  dd \  }}||j@                  d   z   }||j@                  d   z   }tQ        |j@                  ||f||ff      |_         9 |j                   dk(  r!| jR                  jU                  tV               |r| j                  jX                  }|j[                         | _        | j                  j	                          t        |j@                        r|j@                  \  }
}}}|
|z
  ||z
  |
|z   |z   ||z   |z   fj\                  d   dd dk(  r|dz  n|}|j                   dk(  sd|jN                  v sd|jN                  v r| j                  j                  |        | j                  j_                  |       | j                  ja                          | jb                  j                  t        |j                  d             j                        }|rte        | |||       |r| jg                  ||       | ji                  |||       |rrd	|cxk  rdk  rgn nd| j                  jX                  }|j[                         | _        | j                  jk                  |dd!       | j                  j_                  |       |j                   dk(  rd	d	g| _6        d	d	g| _7        d	| _8        |r| j                  ja                          yy# 1 sw Y   xY w)"zDraw a node.defsNz	font-size1emr3   r,   r7   r   r   r2   clipPathUnitsobjectBoundingBoxr>   r?   r=   r4   )r-   defgFfill_strokeztext-anchor)middleendTr   r    rb   r   r   BBoxr  )r  r6   )rE   rD   )9rc   r+   r]   r  
push_stater   r)   fragmentr   r,   r&   r   calculate_bounding_boxr$   r   r   	add_groupr   ctmr  rP   r  	rectangler1   r  determinantinvertvaluesrj   TAGSr    r!   text_bounding_boxr   r   ro   r   r%   	DEF_TYPESrR   r#   r   r   r   r5   r   extradraw_x_object	pop_stater   r   r  draw_markers	set_alphar   r   r   ) rU   noder   r  original_streamsfilter_r7   boxr   old_ctmr>   r?   r=   r4   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_alignr6   s                                    rW   r  zSVG.draw_node  s   88v +u5y)L	KK""$ ,,""9TXXh-?#@#I#IJ$gy9 	txx,i8 dhhy!451+!+##DKK0--dI>C(-!T--t/@/@A/$++//5DK dhh{34==	djj0kkooG

9-Iy}}_-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+!+{{~~H*..0DKKK!!'$T!BKK%%h/ 88v$%q6D &'VD"#$D KK!!# S6 6s   &`""`,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midr  zmarker-NNr@  r   r   r  rA  refXrefYmarkerWidthr   markerHeightr<   preserveAspectRatioxMidYMidr   rk   minr         maxmarkerUnitsuserSpaceOnUsestroke-widthorient)autoauto-start-reverserR     )r  r  r8   rn   )rn   scroll)rT   r)   r]   r  rR   r   r   r   r  r*   r   rd   lowerr  r   r   r  r  r,   r   r   r   r1   r  r  r)  )!rU   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~   r8   s!                                    rW   r*  zSVG.draw_markers  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 mmrY   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.rk   rB  z(url\(.+\)) *(.*)r   r   N)rz   r   compilesearchr)   r5  r  )r   ry   sourcer'   s       rW   	get_paintzSVG.get_paint  s     

/077>u{{1~.77FKKN*dE
 u} FMTEu}rY   c                     |j                   dv r|sy j                  |j                  dd            \  }}t        |j                  dd            }t	         |||d      }|r=|s;t        |      }|xj                  |z  c_         j                  j                  |       |xs |}	 j                  |j                  d	            \  }
}t        |j                  d
d            }t	         ||
|d      }|r?|s=t        |      }|xj                  |z  c_         j                  j                  |d       |xs |} j                  |j                  dd            }|r j                  j                  |       nd}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-                  |       |j                  d      d k(  }|r/|r|	rd}n|rd}n|	rd}nd!} j                  j/                  |       y|	r|r j                  j1                  |       y|r j                  j3                          y|	r j                  j5                  |       y j                  j7                          y)"z!Paint fill and stroke for a node.rt   NrD   rr   zfill-opacityr   F)rE   rE   zstroke-opacityTrO  1pxc              3   L   K   | ]  }|d k7  rj                  |        yw)rk   N)r  )r   r   r   rU   s     rW   r   z"SVG.fill_stroke.<locals>.<genexpr>  s-      P.3?D KKy)Ps   !$zstroke-dasharrayc              3   &   K   | ]	  }|d k(    ywr   Nr   r   r   s     rW   r   z"SVG.fill_stroke.<locals>.<genexpr>  s     75EQJ7   c              3   &   K   | ]	  }|d k    ywrw  r   rx  s     rW   r   z"SVG.fill_stroke.<locals>.<genexpr>  s     6%EAI6ry  zstroke-dashoffsetr   c              3   2   K   | ]  }t        |        y wrM   r   rx  s     rW   r   z"SVG.fill_stroke.<locals>.<genexpr>  s      F%u Fr   zstroke-linecapbuttroundsquarer   zstroke-linejoinmiterbevelzstroke-miterlimitrJ  z	fill-ruleevenoddr   )rc   rr  r]   r&   r   r'   alphar  	set_colorr  set_line_widthr   r(   rd   allanysumabsset_dashset_line_capset_line_joinr   set_miter_limitset_text_renderingfill_and_strokerE   rD   r  )rU   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_renderings   ` `                      rW   r  zSVG.fill_stroke  s{   8800 #'..&'1J"KZ"488NA#>?-$YUL
j ,L,.KK!!,/'Z '+nnTXXh5G&H#|$TXX.>%BC/$y.O .L.0KK!!,t!<-{{488NE#BINKK&&|4F  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0 88K(I5$!"!"!"!"KK**>:++H5""$  *!rY   c                     |syt        ||| j                        }|j                  r$ | j                  j                   |j                    yy)z*Apply a transformation string to the node.N)r,   r   r!  r  r#  )rU   transform_stringr   matrixs       rW   r,   zSVG.transform  sC    +Y8K8KL!DKK!!6==1 rY   c                     t         D ]M  }||j                  j                         v s d|j                  v s/|t	        | | d      |j                  d   <   O |D ]  }| j                  |        y)zParse defs included in a tree.r5   sN)r&  rc   rU  rR   getattrr   )rU   r,  def_typer~   s       rW   r   zSVG.parse_defs  sn    ! 	HH488>>++0CCG
!n-dkk$.?@	H  	#EOOE"	#rY   c                     | j                   | j                  fD ])  }|j                         D ]  }| j                  ||        + y)z7Handle inheritance of different defined elements lists.N)r   r   r#  inherit_element)rU   r  r   s      rW   r   zSVG.inherit_defs  sC    ^^T]]3 	4D;;= 4$$Wd34	4rY   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)   r  r  rR   rw   nextiterr   r   )rU   r   r  rC   parentr^   r   s          rW   r  zSVG.inherit_element  s    ))D/223VT* ----/ 	,JC'..(&+s#	, Wt$,!!&//"34 -rY   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$   )rU   r,  r   rE   r/  s        rW   r  zSVG.calculate_bounding_box"  sQ    T&&.tT9f=C$S)as12w.>J$'!   rY   NTr   )r   r   r   r   rX   r   r   r  r  r  r  r*  r   rr  r  r,   r   r   r  r  r   rY   rW   r   r   D  se    01 '3<0P$dm4^   ]"~2#45 !rY   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                 j    t         |   |j                  |j                         || _        || _        y rM   )superrX   rP   r   r   r   )rU   r   r   r   s      rW   rX   zPattern.__init__/  s*    ))3773	rY   c                 ~    || j                   k(  r| j                  j                   | _         t        |   ||d       y )NTr  )r   r   r  r  )rU   r,  r   r  r   s       rW   r  zPattern.draw_node4  s4     499DI$	t<rY   r  )r   r   r   r   rX   r  __classcell__)r   s   @rW   r  r  -  s    (
= =rY   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&  rK   r   r  r   rY   rW   <module>r     s     	  3 3 ! % $ 6 U U   B B R R  
 
$ % &  2      
 
	hP hPXf! f!R=c =rY   