
    Owg                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZ ddl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mZmZmZm Z m!Z!m"Z"m#Z# ddl$m%Z% dd	l&m'Z'm(Z( dd
l)m*Z* 	 ddl+m,Z, ddl.m/Z/ ddl0Z0ddl1Z1ddl2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z; ddl6m<Z=m>Z? d9dZ<d:dZ>dZ@dZAdZBdZCdZD eE       ZF ej                  eH      ZI edg d      ZJ ej                  d      j                  ZM G d de      ZN G d de      ZO G d d e0j                        ZQ G d! d"      ZR G d# d$eR      ZS G d% d&e0j                        ZU G d' d(eV      ZW G d) d*      ZX G d+ d,      ZY G d- d.      ZZ G d/ d0eZ      Z[d;d1Z\d2 Z]d;d3Z^d4 Z_d<d5Z`d=d6Zad7 Zbd8 Zc ec        y# e-$ r
 ddlm,Z, Y ;w xY w)>a  A library for reading and converting SVG.

This is a converter from SVG to RLG (ReportLab Graphics) drawings.
It converts mainly basic shapes, paths and simple text. The intended
usage is either as module within other projects:

    from svglib.svglib import svg2rlg
    drawing = svg2rlg("foo.svg")

or from the command-line where it is usable as an SVG to PDF converting
tool named sv2pdf (which should also handle SVG files compressed with
gzip and extension .svgz).
    N)defaultdict
namedtuple)stringWidth)FILL_EVEN_ODDFILL_NON_ZERO)PDFImage)
_CLOSEPATHCircleDrawingEllipseGroupImageLinePathPolyLinePolygonRect
SolidShapeString)colors)picatoLength)
haveImages)mmult)etree   )bezier_arc_from_end_pointsconvert_quadratic_to_cubic_pathnormalise_svg_path)get_global_font_mapDEFAULT_FONT_NAMEDEFAULT_FONT_WEIGHTDEFAULT_FONT_STYLEDEFAULT_FONT_SIZE)register_font	find_fontc                      t        | ||||      S N)_fonts_register_font)	font_name	font_pathweightstylerlgFontNames        D/var/www/horilla/myenv/lib/python3.12/site-packages/svglib/svglib.pyr%   r%   B   s    	9fe[QQ    c                     t        | ||      S r(   )_fonts_find_font)r*   r,   r-   s      r/   r&   r&   F   s    Ivu55r0   z1.5.1zLGPL 3zDinu Ghermanz
2023-01-07z$http://www.w3.org/XML/1998/namespaceBox)xywidthheightz[^ \t\r\n\f]+c                   ,     e Zd ZdZ fdZ fdZ xZS )NoStrokePathzg
    This path object never gets a stroke width whatever the properties it's
    getting assigned.
    c                     |j                  dd       }t        |   |i | |r9| j                  j	                  t        j                  |j                               y y )N	copy_from)popsuper__init____dict__updatecopydeepcopy)selfargskwargsr;   	__class__s       r/   r>   zNoStrokePath.__init__`   sN    JJ{D1	$)&)MM  y/A/A!BC r0   c                 J    t        |   |i |}d|v rd|d<   d|v rd |d<   |S )NstrokeWidthr   strokeColor)r=   getProperties)rC   rD   rE   propsrF   s       r/   rJ   zNoStrokePath.getPropertiesf   s@    %t6v6E!#$E- E!#'E- r0   )__name__
__module____qualname____doc__r>   rJ   __classcell__rF   s   @r/   r9   r9   [   s    D r0   r9   c                       e Zd Zd Zd Zy)ClippingPathc                     |j                  dd       }t        j                  | g|i | |r8| j                  j	                  t        j                  |j                               d| _        y )Nr;   r   )r<   r   r>   r?   r@   rA   rB   
isClipPath)rC   rD   rE   r;   s       r/   r>   zClippingPath.__init__q   sS    JJ{D1	d,T,V,MM  y/A/A!BCr0   c                 \    t        j                  | g|i |}d|v rd |d<   d|v rd |d<   |S )N	fillColorrI   )r   rJ   )rC   rD   rE   rK   s       r/   rJ   zClippingPath.getPropertiesx   sE    ""49$9&9%!%E+E!#'E- r0   N)rL   rM   rN   r>   rJ    r0   r/   rS   rS   p   s    r0   rS   c                       e Zd Zd Zy)
CSSMatcherc                 :   t        j                  |dd      }|D ]  }|j                  r|j                  dk(  rt	        j
                  |j                        }t        j                  |j                        }t        j                  |j                        j                  d      D ci c]I  }d|v rC|j                  d      d   j                         |j                  d      d   j                         K }}||f}|D ]  }	| j                  |	|         y c c}w )NT)skip_commentsskip_whitespacezat-rule;:r   r   )tinycss2parse_stylesheetpreludetype
cssselect2compile_selector_list	serializecontentsplitstripadd_selector)
rC   style_contentrulesrule	selectorsselector_stringattrcontent_dictpayloadselectors
             r/   
add_styleszCSSMatcher.add_styles   s   ))t
  	5D<<499	#9"88FI&00>O %..t||<BB3G$; 

3"((*DJJsOA,>,D,D,FFL 
 '5G% 5!!(G45	5
s   (ADN)rL   rM   rN   rt   rX   r0   r/   rZ   rZ      s    5r0   rZ   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
AttributeConverterzEAn abstract class to locate and convert attributes in a DOM instance.c                      d | _         d | _        y r(   )	css_rulesmain_boxrC   s    r/   r>   zAttributeConverter.__init__   s    r0   c                     || _         y r(   )ry   )rC   ry   s     r/   set_boxzAttributeConverter.set_box   s	     r0   c                    |j                  d      }|D cg c]  }|j                          }}t        d |      }i }|D ]>  }|j                  d      \  }}||fD cg c]  }|j                          c}\  }}|||<   @ |S c c}w c c}w )znTry parsing compound attribute string.

        Return a dictionary with single attributes in 'line'.
        r^   c                     t        |       dkD  S Nr   )len)as    r/   <lambda>z9AttributeConverter.parseMultiAttributes.<locals>.<lambda>   s    Q! r0   r_   )rh   ri   filter)rC   lineattrsr   	new_attrskvss           r/   parseMultiAttributesz'AttributeConverter.parseMultiAttributes   s     

3$)*q**+U3	 	A773<DAq()1v.!AGGI.DAqIaL	
  + /s   BBc                 Z   |j                   j                  dd      s| j                  |j                  | j                         |j                   j                  d      rr| j	                  |j                   j                  d            }|j                         D ]&  \  }}|j                  d      r||j                   |<   ( d|j                   d<   |j                   j                  |d      j                         }|r|dk7  r|S |j                  | j                  |j                  |      S y)zSearch an attribute with some name in some node or above.

        First the node is searched, then its style attribute, then
        the search continues in the node's parent node. If no such
        attribute is found, '' is returned.
        __rules_appliedFr-   -1 inherit)
attribgetrx   apply_rulesr   items
startswithri   parentfindAttr)rC   svgNodenamer   keyval
attr_values          r/   r   zAttributeConverter.findAttr   s     ~~!!"3U;~~)##DNN3~~!!'*11'..2D2DW2MN % 2HC>>#..1s+2 5801^^''b1779
*	1>>%==66r0   c                 v   i }t        |j                               dk(  r.|j                  | j                  |j                                      |j                  j                  d      }|r"| j                  |      }|j                  |       |j                  j                         D ]  \  }}|dk7  s|||<    |S )zJReturn a dictionary of all attributes of svgNode or those inherited by it.gr-   )	node_name	getparentr@   getAllAttributesr   r   r   r   )rC   r   dictr-   dr   values          r/   r   z#AttributeConverter.getAllAttributes   s     W&&()S0KK--g.?.?.ABC""7+))%0AKKN!....0 	"JCg~!S		" r0   c                     |S )zReturn attribute as is.rX   rC   svgAttrs     r/   idzAttributeConverter.id   s    r0   c           	      D   |j                         }|dd }g }g }t        |      D ]  \  }}|dv s|j                  |        t        dt	        |      d      D ]  }||   ||dz      }	}||dz   |	 }
|
j                         }
|
j                  dd      }
t        j                  dd|
      }
	 d|
v r1|j                  t        d	 |
j                  d      D                     n|j                  t        |
             |d| d|	|z
  dz   z  z   ||	dz   d z   } |j                  dd      j                         }t	        |      t	        |      k7  rt        j                  d
|       g S g }t        |      D ]  \  }}|j                  |||   f        |S # t        $ r Y Ew xY w)zParse transform attribute string.

        E.g. "scale(2) translate(10,20)"
             -> [("scale", 2), ("translate", (10,20))]
        Nz()r      r   , z[ ]+c              3   2   K   | ]  }t        |        y wr(   float).0nums     r/   	<genexpr>z6AttributeConverter.convertTransform.<locals>.<genexpr>  s     (Rs(Rs   z'Unable to parse transform expression %r)ri   	enumerateappendranger   replaceresubtuplerh   r   
ValueErrorloggerwarning)rC   r   r   opsbracketsindicesilinbibjsublineresultops                r/   convertTransformz#AttributeConverter.convertTransform   s    }}1go 	#FAsd{"	# q#h-+ 	8Aa[(1Q3-B2a4mGmmoGooc3/GffVS'2G'>NN5(Rw}}S?Q(R#RSNN5>2 cr(S"R%']*SAZ7C	8 kk#s#))+s8s7|#NNDgNIs^ 	,EArMM2wqz*+	,   s   +AF	FFN)rL   rM   rN   rO   r>   r|   r   r   r   r   r   rX   r0   r/   rv   rv      s(    K!$>&'r0   rv   c                        e Zd ZdZd fd	Zed        Zed        ZeddfdZ	d Z
d	 Zd
 Zd Zd Zd Zd Zd ZddZ xZS )Svg2RlgAttributeConverterz*A concrete SVG to RLG attribute converter.Nc                 r    t         |           |xs | j                  | _        |xs
 t	               | _        y r(   )r=   r>   identity_color_convertercolor_converterr    	_font_map)rC   r   font_maprF   s      r/   r>   z"Svg2RlgAttributeConverter.__init__  s1    .O$2O2O!:%8%:r0   c                     | S r(   rX   )cs    r/   r   z2Svg2RlgAttributeConverter.identity_color_converter  s    r0   c                 h    t        j                  | j                         j                  dd            S )Nr   r   )shlexrh   ri   r   )rp   s    r/   split_attr_listz)Svg2RlgAttributeConverter.split_attr_list   s$    {{4::<//S9::r0           c           	      F   |j                  dd      j                         }|s|S d|v r2| j                  |      D cg c]  }| j                  ||||       c}S |j	                  d      r| j
                  #t        j                  d       t        |dd       S |#t        j                  d       t        |dd       S |d	v r| j
                  j                  }n?|d
v r| j
                  j                  }n$t        j                  d|       t        |dd       S t        |dd       dz  |z  S |j	                  d      rt        |dd       t        z  S |j	                  d      rt        |dd       dz  S |j	                  d      rt        |dd       |z  S |j	                  d      rt        |dd       S |j	                  d      rt        |dd       |z  dz  S |j	                  d      rt        |dd       |z  dz  S |j                         }t        |      }|S c c}w )zConvert length to points.r   r   )em_base	attr_namedefault%Nz4Unable to resolve percentage unit without a main boxz?Unable to resolve percentage unit without knowing the node name)r4   cxx1x2r6   )r5   cyy1y2r7   z.Unable to detect if node %r is width or heightd   pcptg      ?empxexr   ch)r   ri   r   convertLengthendswithry   r   errorr   r6   r7   r   r   )	rC   r   r   r   r   textr   fulllengths	            r/   r   z'Svg2RlgAttributeConverter.convertLength$  s"    sC(..0N$;  //5 ""39V]"^ 
 ==}}$STT#2Y'' ^_T#2Y''<<}}**??}}++MyYT#2Y''cr#c)D00]]4 cr#d**]]4 cr#d**]]4 cr#g--]]4 cr##]]4  cr#g-11]]4  cr#g-11zz|$Qs   Hc                 h    | j                  |      D cg c]  }| j                  |       c}S c c}w )zConvert a list of lengths.)r   r   )rC   r   r   s      r/   convertLengthListz+Svg2RlgAttributeConverter.convertLengthListV  s,    /3/C/CG/LM!""1%MMMs   /c                     t        |      S r(   r   r   s     r/   convertOpacityz(Svg2RlgAttributeConverter.convertOpacityZ  s    W~r0   c                 <    t         t        dj                  |d      S )N)nonzeroevenoddr   )r   r   r   r   s     r/   convertFillRulez)Svg2RlgAttributeConverter.convertFillRule]  s     $$
 #gr
	r0   c                    |}|r|dk(  ry|dk(  ryt        |      dv r,|d   dk(  r$t        j                  |t        |      dk(        }nt        |      d	k(  r9|d   dk(  r1t        j                  dd
|d   z  z   d
|d
   z  z   d
|d   z  z         }nt        |      dk(  rD|d   dk(  r<t        j                  dd
|d   z  z   d
|d
   z  z   d
|d   z  z   d
|d	   z  z   d      }n6t        j                  |      }|	 t	        t        |      j                         }|t        j                  d|       y| j                  |      S # t        $ r Y 5w xY w)z$Convert string to a RL color object.noneNcurrentColor)   	   r   #r   )hasAlpha   r   r         TzCan't handle color: %s)
r   r   HexColorcssParsegetattrcloneAttributeErrorr   r   r   )rC   r   r   colors       r/   convertColorz&Svg2RlgAttributeConverter.convertColorc  s\   
 tv~>!!t947c>OOD3t9>BEY!^Q3OOC!DG)OaQi$?!DG)$KLEY!^Q3OOaQi!DG)+aQi7!DG)CdE
 OOD)E}#FD1779E =NN3T:''.. & s   ;E 	EEc                     dddd|   S )Nr   r   r   )miterroundbevelrX   r   s     r/   convertLineJoinz)Svg2RlgAttributeConverter.convertLineJoin  s    Q3G<<r0   c                     dddd|   S )Nr   r   r   )buttr
  squarerX   r   s     r/   convertLineCapz(Svg2RlgAttributeConverter.convertLineCap  s    A3G<<r0   c                 (    | j                  |      }|S r(   )r   )rC   r   strokeDashArrays      r/   convertDashArrayz*Svg2RlgAttributeConverter.convertDashArray  s    009r0   c                 (    | j                  |      }|S r(   )r   )rC   r   strokeDashOffsets      r/   convertDashOffsetz+Svg2RlgAttributeConverter.convertDashOffset  s    --g6r0   c                    |sy| j                  |      }g }|D ]<  }| j                  j                  |||      \  }}|r|c S |s,|j                  |       > |r|d   S t        j                  d| d| d|        t        S )Nr   r   z0Unable to find a suitable font for 'font-family:z
', weight:z, style:)r   r   r&   r   r   r   r!   )rC   fontAttr
weightAttr	styleAttr
font_namesnon_exact_matchesr*   exacts           r/   convertFontFamilyz+Svg2RlgAttributeConverter.convertFontFamily  s    ))(3
# 	4I#~~77	:yYIu  !((3	4 $Q''NNB8* M$Xi[: %$r0   NNnormalr!  )rL   rM   rN   rO   r>   staticmethodr   r   r$   r   r   r   r   r  r  r  r  r  r  rP   rQ   s   @r/   r   r     sr    0;
   ; ; .?$X[ 0dN/B== %r0   r   c                   :     e Zd ZdZ fdZd Zd Zd Zd Z xZ	S )NodeTrackerzAn object wrapper keeping track of arguments to certain method calls.

    Instances wrap an object and store all arguments to one special
    method, getAttribute(name), in a list of unique elements, usedAttrs.
    c                 2    t        |   |i | g | _        y r(   )r=   r>   	usedAttrs)rC   rD   rE   rF   s      r/   r>   zNodeTracker.__init__  s    $)&)r0   c                 "    d| j                    dS )Nz<NodeTracker for node >)etree_elementrz   s    r/   __repr__zNodeTracker.__repr__  s    '(:(:';1==r0   c                     || j                   vr| j                   j                  |       | j                  j                  j	                  |d      S Nr   )r&  r   r)  r   r   rC   r   s     r/   getAttributezNodeTracker.getAttribute  s?    t~~%NN!!$'!!((,,T266r0   c                 .    t        | j                  |      S r(   )r  r)  r-  s     r/   __getattr__zNodeTracker.__getattr__  s    t))400r0   c                     |j                  |       }|D ]<  }|d   d   }|j                         D ]  \  }}	 || j                  j                  |<   ! > | j                  j                  dd       y # t        $ r Y Lw xY w)Nr   r   r   r   )matchr   r)  r   r   set)rC   rl   matchesr2  	attr_dictrp   r   s          r/   r   zNodeTracker.apply_rules  s    ++d# 	EaI&__. 	c69D&&--d3	 	0#6 " s   A00	A<;A<)
rL   rM   rN   rO   r>   r*  r.  r0  r   rP   rQ   s   @r/   r$  r$    s!    >71
7r0   r$  c                       e Zd Zy)CircularRefErrorN)rL   rM   rN   rX   r0   r/   r7  r7    s    r0   r7  c                       e Zd Zd Zd Zy)ExternalSVGc                     t        |      | _        t        ||j                  |j                  gz         | _        d| _        y )N)parent_svgsF)load_svg_file	root_nodeSvgRenderer_parent_chainsource_pathrendererrendered)rC   pathrA  s      r/   r>   zExternalSVG.__init__  s<    &t,#h448L8L7MM
 r0   c                     | j                   s,| j                  j                  | j                         d| _         | j                  j                  j                  |      S )NT)rB  rA  renderr=  definitionsr   )rC   fragments     r/   get_fragmentzExternalSVG.get_fragment  sA    }}MM  0 DM}}((,,X66r0   N)rL   rM   rN   r>   rH  rX   r0   r/   r9  r9    s    7r0   r9  c                   ~    e Zd ZdZddZd ZddZd Zd Zd Z	dd	Z
d
 Zd ZddZddZddZd Zd Zd ZddZy)r>  zRenderer that renders an SVG file on a ReportLab Drawing instance.

    This is the base class for walking over an SVG DOM document and
    transforming it into a ReportLab Drawing instance.
    Nc                 6   || _         |xs g | _        t        ||      | _        t	        || j                        | _        | j
                  j                         | _        i | _        t        t              | _        i | _        t               | j                  _        y )N)r   r   )r@  r?  r   attrConverterSvg2RlgShapeConvertershape_converterget_handled_shapeshandled_shapesrF  r   listwaiting_use_nodes_external_svgsrZ   rx   )rC   rC  r   r;  r   s        r/   r>   zSvgRenderer.__init__  s    (.B6+h
  5T4;M;MN"22EEG!,T!2 '1|$r0   c                 4   t         j                  |      }| j                  |d      }| j                  j	                  |       | j                  |d      }| j                  j                         D ]  }t        j                  d|        |j                  d|j                  z
  |j                   |j                  z
         | j                  j                  |dd|j                   |j                  f      \  }}t#        ||      }|j%                  |       |S )	NTdefault_box)	outermostz(Ignoring unavailable object width ID %r.r   r6   r7   defaults)r$  from_xml_rootget_boxrK  r|   	renderSvgrQ  keysr   debug	translater4   r7   r5   rM  convert_length_attrsr6   r   add)	rC   svg_nodenodeview_box
main_groupxlinkr6   r7   drawings	            r/   rE  zSvgRenderer.render  s    ((2<<$<7""8,^^DD^9
++002 	LELLCUK	L 	Q^hoo-=

-JK,,AAgx8>>8??2S B 
v %(Jr0   c                    |j                  d      }d}d }t        |      }| j                  |      }|dk(  r$| j                  |      }|j	                  |       n|dk(  rd}n|dk(  r$| j                  |      }|j	                  |       n|dk(  r=|j                  d      }| j                  ||	      }|d
k7  r|j	                  |       n|dk(  r| j                  |       n||dk(  rS| j                  |      }|j                  j                  d      r|j	                  |       n8|j                  dd       n$|dk(  r%| j                  ||	      }|j	                  |       n|dk(  r| j                  |      }n|| j                  v r|dk(  rq| j                  |      }	|	y t        |	t               rFt#               }
|	\  }}|j%                  ||
       | j'                  ||
       |j	                  |
       y |	|_        | j*                  j-                  |||      }|j                  d      }|r/|d
k7  r*|j	                  |       nd}t.        j1                  d|       |s|rz|rx|| j2                  |<   |j5                  d|i       |j                  j7                         D cg c]  \  }}d|v s| }}}t9        |      dk(  r|\  }|j5                  d|i       || j:                  j=                         v r8| j:                  j?                  |      }|D ]  \  }}| j                  ||        | jA                  |       y y c c}}w )Nr   FsvgdefsTr   r   display)clippingr   r-   symbol	_renderedr   useclipPathimager   zIgnoring node: %ssvgidlabelr   group)!r.  r   get_clippathr[  r`  renderArenderGrenderStylerenderSymbolr   r   r3  	renderUserO  xlink_href_target
isinstancer   r   
renderNodeapply_node_attr_to_group_resolved_targetrM  convertShaper   r]  rF  setPropertiesr   r   rQ  r\  r<   print_unused_attributes)rC   rb  r   nidignoreditemr   rk  rj  targetgrrA  img_noder   r   label_attrsrs  	to_renderuse_noderu  s                       r/   r~  zSvgRenderer.renderNode  s   %$$T*5=>>$'DJJtV^GS[<<%DJJtS[''	2G<<x<8D& 

4 W_T"X$$T*D {{{+

4 c*U]>>$>:DJJtZ<<%DT(((w //5>.B)/&Hh'''<11$;JJrN -3D)''44T4JD''	2G6)

4 GLL,d3t(,  % ""GS>2 .2[[->->-@QTQGqLqQQ{#q((FE&&'78d,,1133 2266s;	'0 :OHeNN85N9:((.!  Rs   (M5Mc                     fd fd|j                  d      }|syt        j                  d|      }|sy|j                         d   }| j                  vrt
        j                  d|       y  j                  |         }t        |t              r|j                         \  }}}}	t               }
|
j                  ||       |
j                  ||       |
j                  ||	       |
j                  ||	       |
j                          t        ||
       |
S t        |t              rt        |      S |r+t!        j"                  d	|j$                  j&                         yy)
zo
        Return the clipping Path object referenced by the node 'clip-path'
        attribute, if any.
        c                     | j                   D ]0  }t        |t              r
 |      c S t        |t              s.|c S  y r(   )contentsr}  r   r   )ru  elemget_shape_from_groups     r/   r  z6SvgRenderer.get_clippath.<locals>.get_shape_from_group`  s:      dE*/55j1K	 r0   c                 `   | j                         D ]  }t        |      dk(  r-j                  j                  d|      }|j                  d   c S t        |      dk(  rj                  |      } |      c S t        |      dk(  rj                  j                  |      c S  |      c S  y )NrC  r   rn  rect)iter_childrenr   rM  r  r  r{  convertRect)rb  childru  grpr  get_shape_from_noderC   s       r/   r  z5SvgRenderer.get_clippath.<locals>.get_shape_from_nodeg  s    ++- 
6U#v- 00==feLE >>"--u%.../C/44u%///;;EBB.u55
6r0   z	clip-pathNzurl\(#([^\)]*)\)r   z)Unable to find a clipping path with id %sr;   z&Unsupported shape type %s for clipping)r.  r   r2  groupsrF  r   r   r}  r   	getBoundsrS   moveTolineTo	closePathcopy_shape_propertiesr   loggingr   rF   rL   )rC   rb  	clip_pathmrefshaper   r   r   r   cpr  r  s   `          @@r/   rv  zSvgRenderer.get_clippath[  s-   
	 	6 %%k2	HH()4hhjmd&&&NNFL#D$4$4S$9:eT" #__.NBBBIIb"IIb"IIb"IIb"LLN!%,It$%00MMBEOOD\D\] r0   c                 :   t         j                  t        j                  kD  ry | j                  j                  |j                        j                         }|D cg c]  }||j                  vs| }}|r!t         j                  dt        |      |       y y c c}w )NzUnused attrs: %s %s)r   levelr  DEBUGrK  r   r)  r\  r&  r]  r   )rC   rb  	all_attrsrp   unused_attrss        r/   r  z#SvgRenderer.print_unused_attributes  s{    <<'--'&&778J8JKPPR	)2Qd$..6PQQLL.	$N  Rs   B.Bc                     |j                   }t        |d      \  }}}|s|r|d|xs d d|xs d dz  }|r| j                  j                  ||       y y )N)	transformr4   r5   z translate(r   z, ))r.  maprM  applyTransformOnGroup)rC   rb  ru  getAttrr  r4   r5   s          r/   r  z$SvgRenderer.apply_node_attr_to_group  sd    ##g'>?	1a;qvAhba::I  66y%H r0   c                    |j                   j                  d      xs |j                   j                  d      }|syt        j                  d|      }|r|j	                         d   }t        j                  ||j                  d      d   dz   d j                  d            }t        j                  d| 	      \  }}t        |d
      5 }	|	j                  |       ddd       t        j                  |       |S d|v r|j                  dd      \  }
}n|d}}
|
rt!        | j"                  t$              st&        j)                  d|
       yt        j*                  j-                  t        j*                  j/                  t        j*                  j1                  | j"                        |
            }t        j2                  |t        j4                        sy|| j"                  k(  rd}
|
rj7                  d      r|| j8                  v rt&        j)                  d       t;               || j<                  vrt?        ||       | j<                  |<   | j<                  |   }|j@                  _|r!|jC                  |      }|I|jD                  |fS |jD                  tF        jI                  |j@                        fS 	 tK        |dd       |S yy|rE|| jN                  v r| | jN                  |   fS | jP                  |   jS                  ||f       tT        S y# 1 sw Y   6xY w# tL        $ r t&        j)                  d|       Y yw xY w)a  
        Return either:
            - a tuple (renderer, node) when the the xlink:href attribute targets
              a vector file or node
            - the path to an image file for any raster image targets
            - None if any problem occurs
        z"{http://www.w3.org/1999/xlink}hrefhrefNz^data:image/(jpe?g|png);base64r   r   ascii.)suffixwbr   zLUnable to resolve image path %r as the SVG source is not a file system path.z.svgz$Circular reference detected in file.z(Unable to read the image %s. Skipping...)+r   r   r   r2  r  base64decodebytesspanencodetempfilemkstempopenwriteoscloserh   r}  r@  strr   r   rC  normpathjoindirnameaccessR_OKr   r?  r7  rR  r9  r=  rH  rA  r$  rY  r   OSErrorrF  rQ  r   DELAYED)rC   rb  ru  
xlink_hrefr2  
img_format
image_datafile_indicatorrC  fhirirG  ext_svgext_frags                 r/   r|  zSvgRenderer.xlink_href_target  s    [[__%IJedkkoo^dNe
 :JG*J++J

1a8H18L7N,O,V,VW^,_`J#+#3#3Qzl;K#L NDdD! %R$% HH^$ K *&,,S!4MC&Cd..4*
 77##BGGLLAQAQ1RTW$XYD99T277+t'''}}V$4---LL!GH*,,t2220;D$0GD''---d3$$0#*#7#7#A#/#*#3#3X#==&//1J1J7K\K\1]]] T1a(  0 1" 4+++T--h777 &&x077uF o% %d   LL!KTR s   L8L LM ?M c                      y r(   rX   rC   rb  s     r/   renderTitle_zSvgRenderer.renderTitle_      r0   c                      y r(   rX   r  s     r/   renderDesc_zSvgRenderer.renderDesc_  r  r0   c                    |j                  d      }|r#| j                  j                  |      }t        | S |rLt	        |j                   d      \  }}t	        | j                  j
                  ||f      \  }}t        dd||      S y )NviewBox)r6   r7   r   )r.  rK  r   r3   r  r   )rC   ra  rU  rc  r6   r7   s         r/   rZ  zSvgRenderer.get_box  s    ((3));;HEH>! 5 57JKME6 2 2 @ @5&/RME6q!UF++ r0   c                 4   | j                   j                  }|j                  dt         d      dk(  | j                   _        | j	                  |d      }| j
                  j                  }|r| j
                  j                  |       |j                  j                  d       }|j                         D ]+  }|j                  |rd| dndk(  s| j                  |       - t               }|j                         D ]  }	| j                  |	|        || j                   _        | j
                  j                  |       |s>| j                   j!                  |dd	      \  }
}|
s|r|j#                  |
xs d
|xs d
       |s|r|j%                  dd       |S |rd\  }}| j                   j!                  |ddd      \  }}||j&                  |k7  r||j&                  z  }||j(                  |k7  r||j(                  z  }|j%                  |||rdndz         |S )N{}spacepreserveTrT  z}defsri  r4   r5   r   r   r   )r   r   r6   r7   r  rW  )rM  preserve_spacer.  XML_NSrZ  rK  ry   r|   nsmapr   iter_subtreetagrx  r   r  r~  r_  r^  scaler7   r6   )rC   rb  rV  _saved_preserve_spacerc  
_saved_boxsvg_nsdef_noderu  r  r4   r5   x_scaley_scaler6   r7   s                   r/   r[  zSvgRenderer.renderSvg  s    $ 4 4 C C.2.?.?"VHG@T.UYc.c+<<$<7''00
&&x0 %))+ 	'H||v"VHF 36JX&	' '') 	*EOOE5)	*.C+"":. ''<<T3LDAqAQQ/ IKK2  #GW 00EEgx+ F ME6 !hoo&? 8??2 X^^u%<(..0KK)B!CDr0   c                    |j                   }t        |d      \  }}t               }|r|j                  |       |j	                         D ]  }| j                  ||        |r| j                  j                  ||       |S )N)r   r  rq  )r.  r  r   r`  r  r~  rM  r  )rC   rb  rk  r  r   r  r  r  s           r/   rx  zSvgRenderer.renderG2  s|    ##G%89IWFF8'') 	.EOOE"O-	.   66y"E	r0   c                 j    | j                   j                  j                  |j                  xs d       y r,  )rK  rx   rt   r   r  s     r/   ry  zSvgRenderer.renderStyle@  s$    $$//		R@r0   c                 $    | j                  |      S r(   rx  r  s     r/   rz  zSvgRenderer.renderSymbolC  s    ||D!!r0   c                 $    | j                  |      S r(   r  r  s     r/   rw  zSvgRenderer.renderAF  s     ||D!!r0   c                 Z   |
t               }	 | j                  ||      }|y t        |t              rt        j                  d       y |t        u r|S |d   }|r|j                  |       t        |j                               dk(  r$|j                  t        j                   |             | j#                  t%        |j'                               d   |       | j)                  ||       |S # t        $ r4 |j                  j                  j                  |j                         |cY S w xY w)Nrt  z/<use> nodes cannot reference bitmap image filesr   r   r   rq  )r   r|  r7  r   r)  remover}  r  r   r   r  r`  r   getchildrenr   rA   rB   r~  rP  r  r  )rC   rb  ru  rk  r  s        r/   r{  zSvgRenderer.renderUseK  s   =GE	))$e)<D <c"LLJKW_L7DIIht!"a'KKd+,T//1226uE%%dE2)   	KK%%,,T-?-?@L	s   C- -:D*)D*)NNNr(   Fr  )rL   rM   rN   rO   r>   rE  r~  rv  r  r  r|  r  r  rZ  r[  rx  ry  rz  rw  r{  rX   r0   r/   r>  r>    sa    4&N/`5^nOIQf,)VA""
r0   r>  c                   (    e Zd ZdZddZed        Zy)SvgShapeConvertera;  An abstract SVG shape converter.

    Implement subclasses with methods named 'convertX(node)', where
    'X' should be the capitalised name of an SVG node element for
    shapes, like 'Rect', 'Circle', 'Line', etc.

    Each of these methods should return a shape object appropriate
    for the target format.
    Nc                 F    |xs
 t               | _        || _        d| _        y )NF)r   rK  svg_source_filer  )rC   rC  rK  s      r/   r>   zSvgShapeConverter.__init__r  s#    *I.G.I##r0   c                     t        |       D cg c]'  }|j                  d      s|dd j                         ) c}S c c}w )ztDynamically determine a list of handled shape elements based on
           convert<shape> method existence.
        convertr   N)dirr   lower)clsr   s     r/   rN  z$SvgShapeConverter.get_handled_shapesw  s3    
 ,/s8QCs~~i7PABQQQs   ==r(   )rL   rM   rN   rO   r>   classmethodrN  rX   r0   r/   r  r  h  s"    $
 R Rr0   r  c                   h    e Zd ZdZddZeddZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd ZddZy)rL  z=Converter from SVG shapes to RLG (ReportLab Graphics) shapes.Nc                 4   d|j                          } t        | |      |      }|sy |dvr| j                  ||       |j                  d      }|s|s|S t	               }|r| j                  ||       |r|j                  |       |j                  |       |S )Nr  )rC  polyliner   r  )
capitalizer  applyStyleOnShaper.  r   r  r`  )rC   r   rb  rk  method_namer  r  ru  s           r/   r  z"Svg2RlgShapeConverter.convertShape  s     123*k*4033""5$/%%k2	XLGE**9e<		(#IIeLr0   r   c          
         t        d      rj                  nfd}| j                  j                  }|j	                  ddt        |      z        }t        ||      D 	cg c]  \  }}	 | ||      |||	       c}	}S c c}	}w )Nr.  c                 <    j                   j                  | d      S r,  )r   r   )rp   rb  s    r/   r   z<Svg2RlgShapeConverter.convert_length_attrs.<locals>.<lambda>  s    dkkoodB7 r0   rX  )r   )r   r   r   )hasattrr.  rK  r   r   r   zip)
rC   rb  r   r   rE   r  
convLengthrX  rp   r   s
    `        r/   r_  z*Svg2RlgShapeConverter.convert_length_attrs  s     ")~!>D7 	 ''55
::j&3u:*=> "%UH!5
g wt}gwW
 	
 
s   "Bc                 R    | j                  |dddd      }t        |       t        | S )Nr   r   r   r   )r_  nudge_pointsr   )rC   rb  pointss      r/   convertLinez!Svg2RlgShapeConverter.convertLine  s,    **4tT4HVV}r0   c           	          | j                  |dddddd      \  }}}}}}||dz  kD  r|dz  }||dz  kD  r|dz  }|r|s|}n|r|s|}t        ||||||      S )	Nr4   r5   r6   r7   rxryr   )r  r  )r_  r   )rC   rb  r4   r5   r6   r7   r  r  s           r/   r  z!Svg2RlgShapeConverter.convertRect  s    &*&?&?#sGXtT'
#1eVR B!!BbBBAq%B266r0   c                 L    | j                  |ddd      \  }}}t        |||      S )Nr   r   r)r_  r
   )rC   rb  r   r   r  s        r/   convertCirclez#Svg2RlgShapeConverter.convertCircle  s-    --dD$D	Bb"a  r0   c                 Z    | j                  |dddd      \  }}}}||}}t        ||||      S )Nr   r   r  r  )r_  r   )rC   rb  r   r   r  r  r6   r7   s           r/   convertEllipsez$Svg2RlgShapeConverter.convertEllipse  s<    224tT4PBBBvr2uf--r0   c                 2   |j                  d      }|j                  dd      }|j                         }t        t	        | j
                  j                  |            }t        |      dz  dk7  st        |      dk(  ry t        |       t        |      }| j                  ||       | j
                  j                  |d      dv}|rRt               }t        |      }| j                  ||       d |_        |j                  |       |j                  |       |S |S )Nr
  r   r   r   r   fill)r   r   )r.  r   rh   rP  r  rK  r   r   r	  r   r   r   r   r   rI   r`  )rC   rb  r
  r  has_fillru  polygons          r/   convertPolylinez%Svg2RlgShapeConverter.convertPolyline  s    ""8,S)c$,,::FCDv;?a3v;!#3VF#x.%%..tV<LP GEfoG""7D1"&GIIgIIhLr0   c                 *   |j                  d      }|j                  dd      }|j                         }t        t	        | j
                  j                  |            }t        |      dz  dk7  st        |      dk(  ry t        |       t        |      }|S )Nr
  r   r   r   r   )
r.  r   rh   rP  r  rK  r   r   r	  r   )rC   rb  r
  r  s       r/   convertPolygonz$Svg2RlgShapeConverter.convertPolygon  s~    ""8,S)c$,,::FCDv;?a3v;!#3Vr0   c           	         | j                   }|j                  dt         d      }|r|dk(  }n| j                  }t	               }g }d\  }}d\  }	}
|j                  |d      xs t        }|j                  |d      xs t        }|j                  |d      xs t        }|j                  |||      }|j                  |d      xs t        t              }|j                  |      }| j                  |d	d
|      \  }}t        ||      D ]  \  }}}|sd\  }}d\  }}d}|s| j                  |d	d
dd|      \  }	}
}}|j                  j!                  d	d      dk7  |j                  j!                  d
d      dk7  }}|t#        |t$              r|d   n|z   }|t#        |t$              r|d   n|z   }|j                  j!                  dd      }|dv r| dz  |dz  dd|   }n|j                  ||      }|j'                  t)        |||             t+        d |	|
||fD              r.|rt#        |	t$              r|	n|	g}n||z   t-        |d d       z   g}|rt#        |
t$              r|
n|
g}n||z   g}t#        |t$              r|n|g}t#        |t$              r|n|g}|d   |d   d}}}t/        j0                  |||||      D ]  \  } }!}"}#}$|$ |"d}"|#d}#|"| |t)        |||      z   n| z   }%|#|!|n|!z   }&t3        |%|&|z
   |$      }'| j5                  |'|       t7        |      dk(  r| j5                  |'|       |j9                  |'       |%}|&}|$} L|r|	|z   n||z   t-        |d d       z   }%|r|
|z   n||z   }&t3        |%|&|z
   |      }'| j5                  |'|       t7        |      dk(  r| j5                  |'|       |j9                  |'        |j;                  dd       |S )Nr  r  r  )r   r   font-familyfont-weight
font-style	font-sizer4   r5   r  FFr   dxdyr   zbaseline-shift0)r   r=   baseliner   c              3   <   K   | ]  }t        |t                y wr(   )r}  rP  )r   r   s     r/   r   z4Svg2RlgShapeConverter.convertText.<locals>.<genexpr>  s     ES:c4(Es   r   tspanr   )rK  r.  r  r  r   r   r!   r"   r#   r  r  r$   r   r_  iter_text_noder   r   r}  rP  r   r   anysum	itertoolszip_longestr   r   r   r`  r  )(rC   rb  attrConv	xml_spacer  r  frag_lengthsdx0dy0r   r   fffwfstylefsr4   r5   subnoder   is_tailhas_xhas_yr!  r"  baseLineShiftxlistylistdxlistdylistlast_xlast_y	last_charchar_xchar_ychar_dxchar_dycharnew_xnew_yr  s(                                           r/   convertTextz!Svg2RlgShapeConverter.convertText  sQ   %%%%6('&:;	&*4N!00NWSBt]3H7Ht]3J7J""46L:L''B7t[1KS9J5K##B'((sC(D1&4T>&J ;	"GT7'LE5FBM!%!:!:7CdTXbd!:!eBB ' 2 23 ;r A7>>CUCUVY[]C^bdCdujT&:RUCjT&:RUC#NN../?EM <<)+A1! L] [ ( 6 6}b 6 QD"b 9: ERR4DEE",R"6BRDEWs<+<'==>E",R"6BRDEWIE)"d3")"d3",1!HeAh	>G>S>Suffd?< %:FFGWd|"#"##CI>YB!??W]E $vVLE"5EM,A*BDIE**5$7 )W4..ug>FF5M"F"F $I'%* &+bS3|CR?P;Q1Q%*bSu(=&>E&&ud3W%0**5':uw;	z 	B	r0   c                    |j                  d      }|sy t        |      }t               }|j                  }g }g }d}d }	t	        dt        |      d      D ]"  }
||
|
dz    \  }}|dv r?|
dkD  r:|j                  d   t        k7  r$|j                  t        |j                               |dk(  r |j                  |  |dd  }n|d	k(  r |j                  |  n|d
k(  rYt        |      dk\  r5|dv r|}n|dd  }|d   |d   z   |d   |d   z   }}|j                  ||       n |j                  |  |dd  }n:|dk(  r*|d   |d   z   |d   |d   z   }}|j                  ||       n|dk(  r|j                  |d   |d          n|dk(  r|j                  |d   |d          n|dk(  r |j                  |d   |d   z   |d          n|dk(  r |j                  |d   |d   |d   z          n|dk(  r |j                  |  nm|dk(  rY|\  }}}}t        |      dk  s|dvr|dd  dz  \  }}}}n
|dd  \  }}}}|||z
  z   |||z
  z   }}|j                  ||||||       n|dk(  r;|dd  \  }}|\  }}}}}}|j                  ||z   ||z   ||z   ||z   ||z   ||z          n|dk(  re|\  }}}}t        |      dk  s|dvr|dd  dz  \  }}}}n
|dd  \  }}}}|||z
  z   |||z
  z   }}|j                  ||||z   ||z   ||z   ||z          ne|dk(  rO|dd  \  }}|\  }}}}||f}	t        ||f||f||f      \  \  }}\  }}\  }}\  }}|j                  ||||||       n|dk(  rm|	|	\  }}n|dd  \  }}|dd  \  }}|||z
  z   |||z
  z   }}||f}	|\  }}t        ||f||f||f      \  \  }}\  }}\  }}\  }}|j                  ||||||       n|dk(  rf|dd  \  }}|\  }}}}||z   ||z   ||z   ||z   f\  }}}}||f}	t        ||f||f||f      \  \  }}\  }}\  }}\  }}|j                  ||||||       n4|dk(  rv|	|	\  }}n|dd  \  }}|dd  \  }}|\  }}||z   ||z   }}|||z
  z   |||z
  z   }}||f}	t        ||f||f||f      \  \  }}\  }}\  }}\  }}|j                  ||||||       n|dv r|\  }}}}}}}|dd  \  }}|dk(  r
||z  }||z  }t        |      dk  st        |      dk  r|j                  ||       net        |||||||||	      }|D ]!  \  } } }}}}}}|j                  ||||||       # n+|dv r|j                          nt         j#                  d |       |d!vrd }	|}% t%               }!| j'                  ||       |j                  d   t        k7  r$|j                  t        |j                               |r`|j(                  Tt+        |"      }"t-        |      D ]"  }#|"j                  j/                  |#t               $ |!j1                  |"       d |_        |!j1                  |       |!S )#Nr   r   r   r   )r  Mr   rJ  r   Lr  )Zzr   lHVhr   CSr   >   rR  rS  r   r   r   r   QTqt)Ar   r   g|=zSuspicious path operator: %s)rU  rW  rV  rX  r  )r   r   r   r
  r   r   	operatorsr	   r   r  r  curveTor   absr   r  r   r]  r   r   rW   r9   reversedinsertr`  )$rC   rb  r   normPathrC  r
  unclosed_subpath_pointerssubpath_startlastoplast_quadratic_cpr   r   numsstarting_pointxnynr   r   xpypx0y0xiyir   r   r  r  phifAfSbp_r  closed_pathpointers$                                       r/   convertPathz!Svg2RlgShapeConverter.convertPath>  s   HHSM%a(v$&! q#h-+ H	A!A#HBZAEdnnR.@J.N)00T^^1DE SyT" &rssT" sv;!#+)6)/+A.a8.:KdSTg:UBKKB'DKK& &rssd1g-vbzDG/CBB# sDGVBZ0sF2JQ0 sF2Ja0&*=sF2Jr
T!W(<= sd#s!%BBv;?f4H&H%+BC[1_NBB%+BC[NBBrBwrBwBRRR4 sB)-&BBBR"Wb2grBwRb"r'Rs!%BBv;?f4H&H%+BC[1_NBB%+BC[NBBrBwrBwBRR"Wb2grBwRH sB!%BB%'H!3RHr2hRQ 7R(2rHRhr2RRR4s$0.FB#BC[FBBrBwrBwB%'H!B3RHr2hRQ 7R(2rHRhr2RRR4 sB!%BB!#b"r'27BG!CBB%'H!3RHr2hRQ 7R(2rHRhr2RRR4s$0.FB#BC[FBBBb"r'BrBwrBwB%'H!3RHr2hRQ 7R(2rHRhr2RRR4 z!.2+BRRB9"HB"HBr7e#s2w%'7KKB'3BBCRQSUWXB8: =41b"b"b"RRR<= z!  ;R@--$(!FQH	T WtT*>>"+%,,S-@A$)C '6K#$=> B%%,,WjABFF;!DN
t	r0   c                 `   t         st        j                  d       y | j                  |dddd      \  }}}}|j                  }t        t        |      t        ||z         t        |      t        |      |      }t        |      }|j                  d||z   dz         |j                  dd	       |S )
NzFUnable to handle embedded images. Maybe the pillow library is missing?r4   r5   r6   r7   r   r   r   r   )
r   r   r   r_  r  r   intr   r^  r  )rC   rb  r4   r5   r6   r7   rp  ru  s           r/   convertImagez"Svg2RlgShapeConverter.convertImage  s    NNX "77c3QYZ1eV%%c!fc!f*os5z3v;NeAJ!+,Arr0   c                    | j                   j                  |      }|D ]X  \  }}|dk(  r$t        |t              s||f} |j                  |  0|dk(  r*t        |t
        t        f      r|df} |j                  |  _|dk(  r}t        |t              rt        |      dk(  r|j                  |       t        |      dk(  s|\  }}}|j                  ||       |j                  |       |j                  | |        |dk(  r|j                  |d       |dk(  r|j                  d|       |d	k(  r+t        |      d
k(  rt        |j                  |      |_        Bt        j                  d||       [ y)a6  Apply an SVG transformation to a RL Group shape.

        The transformation is the value of an SVG transform attribute
        like transform="scale(1, -1) translate(10, 30)".

        rotate(<angle> [<cx> <cy>]) is equivalent to:
          translate(<cx> <cy>) rotate(<angle>) translate(-<cx> -<cy>)
        r  r^  r   rotater   r   skewXskewYmatrix   zIgnoring transform: %s %sN)rK  r   r}  r   r  rw  r   r^  r   rz  skewr   r  r   r]  )	rC   r  ru  trr   valuesangler   r   s	            r/   r  z+Svg2RlgShapeConverter.applyTransformOnGroup  sO    00; 	FJBW}!&%0$f-FV${"fsEl3#QYF(x!&%0CK14DLL([A%$*ME2rOOB+LL'OORC"-w

61%w

1f%xCK1$4"'"@8"fE3	Fr0   c                 X   	 dgdddgfdgdddgfd	gd
ddgfdgdddgfdgdddgfdgdddgfdgdddgfdgdddgfdgdddgff	}g d d!d"t         t        t        gfd#gd$dt        t              gfd%gd&d'd(gff}|j
                  t        k(  r&|j                  D ]  }| j                  |||)        y*| j                  }||fD ]l  }|j
                  t        k7  r||k(  r|D ]J  \  }	}
}}g }t        |	      D ]  \  }}|j                  ||      }|d+k(  r|r!|dk(  r>t        |dd*      1t        |j                  d,d      dk7  r|j                  j                  }nH|dk(  r>t        |dd*      1t        |j                   d,d      dk7  r|j                   j                  }n||   }|d-k(  r#|j                  |j"                  d.      xs ||   }t%        |t              r |j'                  d/d+      j)                         }|j+                  |        	 t        ||      }t-        ||
 ||        M o t        |dd*      '|j                  r|j8                  |j                  _        t        |dd*      d1k(  rd*|_        y*y*# t.        t0        t2        f$ r t4        j7                  d0       Y w xY w)2z
        Apply styles from an SVG element to an RLG shape.
        If only_explicit is True, only attributes really present are applied.
        r  rW   r  blackzfill-opacityfillOpacityr   r   z	fill-rule	_fillRuler   r   strokerI   r   zstroke-widthrH   r   r   zstroke-opacitystrokeOpacityzstroke-linejoinstrokeLineJoinr  r#  zstroke-linecapstrokeLineCapr  zstroke-dasharrayr  r  )r  r  r  fontNamer  r  fontSizeztext-anchor
textAnchorr   start)only_explicitNr   alphar   r  z
!importantz"Exception during applyStyleOnShaper   )r!   r"   r#   r  r$   rF   r   r  r   rK  r   r   r   r  rW   r  rI   r   r}  r   ri   r   setattrr  KeyErrorr   r   r]  r  )rC   r  rb  r  mappingNmappingFsubshapeacmappingsvgAttrNamesrlgAttrfuncrX  svgAttrValuesindexsvgAttrNamesvgAttrValuemeths                     r/   r   z'Svg2RlgShapeConverter.applyStyleOnShape  s4    	H X{NWI>}.>D]K):YKHZA}ouE2BQCH "24EuM2BSEJ !#46H6(S

 =/"$79KL
 ]J#>O:P9QR_lD7)<
 ??e#!NN T&&x]&ST (+ !	GG&(W-@;B G7wh "*3L*A 7&E;#%;;t[#AL#r)($'>9 '{D A M '! D I+0??+@+@L'+;; '}d C O '(9(97A F! K+0+<+<+B+BL+3E?L#~5'){{4;;'H'[HUZO!,4'3';';L"'M'S'S'U!((6/70G"2t,DE7D-,@A9G!	GD 5-.:u$)$5$5EOO!5-.!3 !%E 4	 '*= GLL!EFGs   I<<)J)(J)r(   r  )rL   rM   rN   rO   r  r$   r_  r  r  r  r  r  r  rH  ru  rx  r  r   rX   r0   r/   rL  rL    sS    G( :K 

7!
.
6TlhT $FLQ%r0   rL  c                 :   t        | t        j                        rt        |       } d}t        | t              rt        j
                  j                  |       d   j                         dk(  rTt        j                  | d      5 }t        | dd d      5 }t        j                  ||       ddd       ddd       | dd } d}t        | |	      }|yt        | fi |}|j                  |      }|rt	        j                  |        |S # 1 sw Y   ^xY w# 1 sw Y   bxY w)
z
    Convert an SVG file to an RLG Drawing object.
    `path` can be a file, a file-like, or a file path as str or pathlib.Path.
    Fr   z.svgzrbNr   r  T)resolve_entities)r}  pathlibr   r  r  rC  splitextr  gzipr  shutilcopyfileobjr<  r>  rE  r  )	rC  r  rE   unzippedf_inf_outsvg_rootsvgRendererrf  s	            r/   svg2rlgr  r  s    $%4y H$!1!1$!7!:!@!@!Bg!MYYtT" 	,dDcrD,A 	,UtU+	, 	,CRyT4DEH d-f-K  *G 
		$N#	, 	, 	, 	,s$   DD(DD	
DDc                     | syt        |       dk  ry| d   }| d   }t        dt        |       dz
  d      D ]  }|| |   k7  s|| |dz      k7  s y | dxx   dz  cc<   y)z Nudge first coordinate if all coordinate pairs are identical.

    This works around reportlab's decision to hide shapes of size zero, even
    when the stroke should be visible.
    Nr   r   r   r   g  ?)r   r   )r
  r4   r5   r   s       r/   r	  r	    sw     
6{Qq	Aq	A1c&k!mQ' q	>Q&1+-
 	q	Y	r0   c                     t        j                  dd|      }	 t        j                  | |      }|j                         }|S # t        $ r }t
        j                  d|       Y d }~y d }~ww xY w)NT)remove_commentsrecoverr  )parserzFailed to load input file! (%s))r   	XMLParserparsegetroot	Exceptionr   r   )rC  r  r  docr  excs         r/   r<  r<    sc    __d=MFkk$v.;;=   =6<<=s   'A 	A,A''A,c                 ^    	 | j                   j                  d      d   S # t        $ r Y yw xY w)z3Return lxml node name without the namespace prefix.}r   N)r  rh   r  )rb  s    r/   r   r     s1    xx~~c"2&& s     	,,c           	   #     K   |dk(  }| j                   r7t        | j                   |||xr t        | j                               dk(        nd}| |df | j	                         D ]  }t        |||dz         E d{     |dkD  rV|dk  xr | j                         du }| j                  rt        | j                  ||      nd}|dvr| j                  |d	f yyy7 bw)
zW
    Recursively iterate through text node and its children, including node tails.
    r   )strip_start	strip_endNFr   )r  )r  r,  T)	r   
clean_textr   r  r  r'  getnexttailr   )rb  r  r  level0r   r  r  r  s           r/   r'  r'    s      aZF 
 		>v&BiSQUQaQaQcMdhiMi 	 e
##% J!%uqyIIIJ qyQJ94<<>T#9	MQYYz$))^yI\`z!++tT)) "  	Js   A9C ;C<A#C c                     | y| j                  dd      j                  dd      j                  dd      } |s?|r| j                         } |r| j                         } d| v r| j                  dd      } d| v r| S )zCText cleaning as per https://www.w3.org/TR/SVG/text.html#WhiteSpaceNz
r   
	z  )r   lstriprstrip)r   r  r  r  s       r/   r  r    sx    |<<$,,T37??cJD;;=D;;=Ddl<<c*D dlKr0   c                     | j                         j                         D ]  \  }}	 t        |||        y # t        $ r Y "w xY wr(   )rJ   r   r  r  )source_shape
dest_shapepropr   s       r/   r  r    sL    !//1779 	c	Jc*  		s   6	AAc                      ddl m}  ddlm} |j                  fd}||_        | j
                  fd}|| _        y)z
    https://bitbucket.org/rptlab/reportlab/issues/95/
    ReportLab always use 'Even-Odd' filling mode for paths, this patch forces
    RL to honor the path fill rule mode (possibly 'Non-Zero Winding') instead.
    r   )Canvas)shapesc                 t    	 | j                   |d   j                  _         | |fi |S # t        $ r Y w xY wr   )r  __self__fillModer  )rC  	drawFuncsrE   original_renderPaths      r/   patchedRenderPathz0monkeypatch_reportlab.<locals>.patchedRenderPath  sF    	-1^^IaL!!* #4=f==  		s   + 	77c                     | j                   }t        |d      r|j                  | _         nt        | _          | |fi | || _         y )Nr  )	_fillModer  r  r   )rC   rC  rE   currentoriginal_drawPaths       r/   patchedDrawPathz.monkeypatch_reportlab.<locals>.patchedDrawPath  s>    ..4$!]]DN*DN$// r0   N)reportlab.pdfgen.canvasr  reportlab.graphicsr  _renderPathdrawPath)r  r  r  r  r  r  s       @@r/   monkeypatch_reportlabr    s>     /) ,,> +F! &FOr0   )Nr!  r!  Nr   r  )r   r   )drO   r  rA   r  r*  r  r  r  r   r  r   r  collectionsr   r   reportlab.pdfbase.pdfmetricsr   r  r   r   reportlab.pdfgen.pdfimagesr   reportlab.graphics.shapesr	   r
   r   r   r   r   r   r   r   r   r   r   r   reportlab.libr   reportlab.lib.unitsr   r   reportlab.lib.utilsr   reportlab.graphics.transformr   ImportErrorlxmlr   rd   r`   utilsr   r   r   fontsr    r!   r"   r#   r$   r%   r)   r&   r2   __version____license__
__author____date__r  objectr  	getLoggerrL   r   r3   compilefindallsplit_whitespacer9   rS   MatcherrZ   rv   r   ElementWrapperr$  r  r7  r9  r>  r  rL  r  r	  r<  r   r'  r  r  r  rX   r0   r/   <module>r     s        	  	    / 4 @ /    ! . *02
    
 
R6 
	/ (			8	$562::./77 4 *4 "5## 5.y yxR% 2 R%j#7*++ #7L	y 	7 7"A AHR R.p%- p%f@(
**&D  A/  0//0s   >F1 1G ?G 