
     h                        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, n# e-$ r	 ddlm,Z, Y nw xY wddl.m/Z/ ddl0Z0ddl1Z1ddl2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z; ddl6m<Z=m>Z? d;dZ<d<dZ>dZ@dZAdZBdZCdZD eE            ZF ejG        eH          ZI edg d          ZJ ejK        d          jL        ZM G d de          ZN G d de          ZO G d  d!e0jP                  ZQ G d" d#          ZR G d$ d%eR          ZS G d& d'e0jT                  ZU G d( d)eV          ZW G d* d+          ZX G d, d-          ZY G d. d/          ZZ G d0 d1eZ          Z[d=d3Z\d4 Z]d=d5Z^d6 Z_d>d7Z`d?d8Zad9 Zbd: Zc ec             dS )@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_fontnormalc                 (    t          | ||||          S N)_fonts_register_font)	font_name	font_pathweightstylerlgFontNames        I/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/svglib/svglib.pyr%   r%   B   s    	9fe[QQQ    c                 $    t          | ||          S r)   )_fonts_find_font)r+   r-   r.   s      r0   r&   r&   F   s    Ivu555r1   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                     |                     dd           } t                      j        |i | |r3| j                            t          j        |j                             d S d S )N	copy_from)popsuper__init____dict__updatecopydeepcopy)selfargskwargsr<   	__class__s       r0   r?   zNoStrokePath.__init__`   sp    JJ{D11	$)&))) 	DM  y/A!B!BCCCCC	D 	Dr1   c                 ^     t                      j        |i |}d|v rd|d<   d|v rd |d<   |S )NstrokeWidthr   strokeColor)r>   getProperties)rD   rE   rF   propsrG   s       r0   rK   zNoStrokePath.getPropertiesf   sM    %%t6v66E!!#$E- E!!#'E- r1   )__name__
__module____qualname____doc__r?   rK   __classcell__rG   s   @r0   r:   r:   [   s`         D D D D D        r1   r:   c                       e Zd Zd Zd ZdS )ClippingPathc                     |                     dd           }t          j        | g|R i | |r1| j                            t          j        |j                             d| _        d S )Nr<   r   )r=   r   r?   r@   rA   rB   rC   
isClipPath)rD   rE   rF   r<   s       r0   r?   zClippingPath.__init__q   sl    JJ{D11	d,T,,,V,,, 	DM  y/A!B!BCCCr1   c                 T    t          j        | g|R i |}d|v rd |d<   d|v rd |d<   |S )N	fillColorrJ   )r   rK   )rD   rE   rF   rL   s       r0   rK   zClippingPath.getPropertiesx   sQ    "49$999&99%!%E+E!!#'E- r1   N)rM   rN   rO   r?   rK    r1   r0   rT   rT   p   s2              r1   rT   c                       e Zd Zd ZdS )
CSSMatcherc                 r   t          j        |dd          }|D ]}|j        r|j        dk    rt	          j        |j                  }t          j        |j                  }d t          j        |j                                      d          D             }||f}|D ]}| 	                    ||           d S )NT)skip_commentsskip_whitespacezat-rulec                     i | ]_}d |v |                     d           d                                         |                     d           d                                         `S ):r   r   )splitstrip).0attrs     r0   
<dictcomp>z)CSSMatcher.add_styles.<locals>.<dictcomp>   sa       $;; 

3"((**DJJsOOA,>,D,D,F,F;;r1   ;)
tinycss2parse_stylesheetpreludetype
cssselect2compile_selector_list	serializecontentra   add_selector)	rD   style_contentrulesrule	selectorsselector_stringcontent_dictpayloadselectors	            r0   
add_styleszCSSMatcher.add_styles   s    )t
 
 
  	5 	5D< 49	#9#9"8FFI&0>>O $.t|<<BB3GG  L
 '5G% 5 5!!(G44445	5 	5r1   N)rM   rN   rO   rx   rY   r1   r0   r[   r[      s#        5 5 5 5 5r1   r[   c                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	S )
AttributeConverterzEAn abstract class to locate and convert attributes in a DOM instance.c                 "    d | _         d | _        d S r)   )	css_rulesmain_boxrD   s    r0   r?   zAttributeConverter.__init__   s    r1   c                     || _         d S r)   )r}   )rD   r}   s     r0   set_boxzAttributeConverter.set_box   s     r1   c                     |                     d          }d |D             }t          d |          }i }|D ]0}|                     d          \  }}d ||fD             \  }}|||<   1|S )znTry parsing compound attribute string.

        Return a dictionary with single attributes in 'line'.
        rf   c                 6    g | ]}|                                 S rY   rb   )rc   as     r0   
<listcomp>z;AttributeConverter.parseMultiAttributes.<locals>.<listcomp>   s     ***q***r1   c                 (    t          |           dk    S Nr   )len)r   s    r0   <lambda>z9AttributeConverter.parseMultiAttributes.<locals>.<lambda>   s    Q! r1   r`   c                 6    g | ]}|                                 S rY   r   )rc   ss     r0   r   z;AttributeConverter.parseMultiAttributes.<locals>.<listcomp>   s     ...!AGGII...r1   )ra   filter)rD   lineattrs	new_attrsr   kvs          r0   parseMultiAttributesz'AttributeConverter.parseMultiAttributes   s     

3**E***++U33	 	 	A773<<DAq..1v...DAqIaLLr1   c                 D   |j                             dd          s| j        |                    | j                   |j                             d          rp|                     |j                             d                    }|                                D ]$\  }}|                    d          s
||j         |<   %d|j         d<   |j                             |d                                          }|r|dk    r|S |j        | 	                    |j        |          S dS )	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_appliedFNr.   -1 inherit)
attribgetr|   apply_rulesr   items
startswithrb   parentfindAttr)rD   svgNodenamer   keyval
attr_values          r0   r   zAttributeConverter.findAttr   s    ~!!"3U;; 	8~)##DN333~!!'** 811'.2D2DW2M2MNN % 2 2HC>>#.. 2.1s+4701^''b117799
 	*	11>%==666rr1   c                    i }t          |                                          dk    r:|                    |                     |                                                     |j                            d          }|r*|                     |          }|                    |           |j                                        D ]\  }}|dk    r|||<   |S )zJReturn a dictionary of all attributes of svgNode or those inherited by it.gr.   )	node_name	getparentrA   getAllAttributesr   r   r   r   )rD   r   dictr.   dr   values          r0   r   z#AttributeConverter.getAllAttributes   s     W&&(())S00KK--g.?.?.A.ABBCCC""7++ 	))%00AKKNNN!...00 	" 	"JCg~~!S	r1   c                     |S )zReturn attribute as is.rY   rD   svgAttrs     r0   idzAttributeConverter.id   s    r1   c           	         |                                 }|dd         }g }g }t          |          D ]\  }}|dv r|                    |           t          dt	          |          d          D ]}||         ||dz            }	}||dz   |	         }
|
                                 }
|
                    dd          }
t          j        dd|
          }
	 d|
v r@|                    t          d	 |
	                    d          D                                  n"|                    t          |
                     n# t          $ r Y w xY w|d|         d|	|z
  dz   z  z   ||	dz   d         z   }|                    dd          	                                }t	          |          t	          |          k    rt                              d
|           g S g }t          |          D ]"\  }}|                    |||         f           #|S )zParse transform attribute string.

        E.g. "scale(2) translate(10,20)"
             -> [("scale", 2), ("translate", (10,20))]
        Nz()r      r   , z[ ]+c              3   4   K   | ]}t          |          V  d S r)   float)rc   nums     r0   	<genexpr>z6AttributeConverter.convertTransform.<locals>.<genexpr>  s(      (R(Rs(R(R(R(R(R(Rr1   z'Unable to parse transform expression %r)rb   	enumerateappendranger   replaceresubtuplera   r   
ValueErrorloggerwarning)rD   r   r   opsbracketsindicesilinbibjsublineresultops                r0   convertTransformz#AttributeConverter.convertTransform   s    }}111goo 	# 	#FAsd{{"""q#h--++ 	8 	8Aa[(1Q3-B2a47mGmmooGooc3//GfVS'22G'>>NN5(R(Rw}}S?Q?Q(R(R(R#R#RSSSSNN5>>222   crc(S"R%']*SAZ7CCkk#s##))++s88s7||##NNDgNNNIs^^ 	, 	,EArMM2wqz*++++s   A&D99
EEN)rM   rN   rO   rP   r?   r   r   r   r   r   r   rY   r1   r0   rz   rz      s        KK  ! ! !  $  >  &  ' ' ' ' 'r1   rz   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                     t                                                       |p| j        | _        |pt	                      | _        d S r)   )r>   r?   identity_color_convertercolor_converterr    	_font_map)rD   r   font_maprG   s      r0   r?   z"Svg2RlgAttributeConverter.__init__  s@    .O$2O!:%8%:%:r1   c                     | S r)   rY   )cs    r0   r   z2Svg2RlgAttributeConverter.identity_color_converter  s    r1   c                 v    t          j        |                                                     dd                    S )Nr   r   )shlexra   rb   r   )rd   s    r0   split_attr_listz)Svg2RlgAttributeConverter.split_attr_list   s*    {4::<<//S99:::r1           c                 "    |                     dd                                          }|sS d|v r$ fd                     |          D             S |                    d          r܉ j        1t
                              d           t          |dd                   S 1t
                              d           t          |dd                   S d	v r j        j        }nCd
v r j        j	        }n2t
                              d           t          |dd                   S t          |dd                   dz  |z  S |                    d          rt          |dd                   t          z  S |                    d          rt          |dd                   dz  S |                    d          rt          |dd                   z  S |                    d          rt          |dd                   S |                    d          rt          |dd                   z  dz  S |                    d          rt          |dd                   z  dz  S |                                }t          |          }|S )zConvert length to points.r   r   c                 B    g | ]}                     |           S ))em_base	attr_namedefaultconvertLength)rc   r   r   r   r   rD   s     r0   r   z;Svg2RlgAttributeConverter.convertLength.<locals>.<listcomp>,  sA        ""39V]"^^  r1   %Nz4Unable to resolve percentage unit without a main boxz?Unable to resolve percentage unit without knowing the node name)r5   cxx1x2r7   )r6   cyy1y2r8   z.Unable to detect if node %r is width or heightd   pcptg      ?empxexr   ch)r   rb   r   endswithr}   r   errorr   r7   r8   r   r   )rD   r   r   r   r   textfulllengths   ` ```   r0   r   z'Svg2RlgAttributeConverter.convertLength$  s    sC((..00 	N$;;      //55   
 == 	2}$STTTT#2#Y''' ^___T#2#Y'''<<<}*???}+MyYYYT#2#Y'''crc##c)D00]]4   	2crc##d**]]4   	2crc##d**]]4   	2crc##g--]]4   		2crc###]]4   	2 crc##g-11]]4   	2 crc##g-11zz||$r1   c                 F      fd                      |          D             S )zConvert a list of lengths.c                 :    g | ]}                     |          S rY   r   )rc   r   rD   s     r0   r   z?Svg2RlgAttributeConverter.convertLengthList.<locals>.<listcomp>X  s'    MMM!""1%%MMMr1   )r   r   s   ` r0   convertLengthListz+Svg2RlgAttributeConverter.convertLengthListV  s+    MMMMt/C/CG/L/LMMMMr1   c                      t          |          S r)   r   r   s     r0   convertOpacityz(Svg2RlgAttributeConverter.convertOpacityZ  s    W~~r1   c                 H    t           t          d                    |d          S )N)nonzeroevenoddr   )r   r   r   r   s     r0   convertFillRulez)Svg2RlgAttributeConverter.convertFillRule]  s(    $$
 
 #gr

	r1   c                 8   |}|r|dk    rdS |dk    rdS t          |          dv r5|d         dk    r)t          j        |t          |          dk              }nt          |          d	k    rE|d         dk    r9t          j        dd
|d         z  z   d
|d
         z  z   d
|d         z  z             }nt          |          dk    rS|d         dk    rGt          j        dd
|d         z  z   d
|d
         z  z   d
|d         z  z   d
|d	         z  z   d          }nOt          j        |          }|9	 t	          t          |                                          }n# t          $ r Y nw xY w|t                              d|           dS | 	                    |          S )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   )rD   r   r   colors       r0   convertColorz&Svg2RlgAttributeConverter.convertColorc  s   
  	tv~~4>!!!>t9947c>>OD3t99>BBBEEYY!^^Q3OC!DG)OaQi$?!DG)$KLLEEYY!^^Q3OaQi!DG)+aQi7!DG)Cd  EE
 OD))E}#FD117799EE%   D=NN3T:::::''...s   0'E 
E%$E%c                     dddd|         S )Nr   r   r   )miterroundbevelrY   r   s     r0   convertLineJoinz)Svg2RlgAttributeConverter.convertLineJoin  s    Q33G<<r1   c                     dddd|         S )Nr   r   r   )buttr  squarerY   r   s     r0   convertLineCapz(Svg2RlgAttributeConverter.convertLineCap  s    A33G<<r1   c                 0    |                      |          }|S r)   )r   )rD   r   strokeDashArrays      r0   convertDashArrayz*Svg2RlgAttributeConverter.convertDashArray  s    0099r1   c                 0    |                      |          }|S r)   r   )rD   r   strokeDashOffsets      r0   convertDashOffsetz+Svg2RlgAttributeConverter.convertDashOffset  s    --g66r1   r'   c                 "   |sdS |                      |          }g }|D ]>}| j                            |||          \  }}|r|c S |r|                    |           ?|r|d         S t                              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!   )rD   fontAttr
weightAttr	styleAttr
font_namesnon_exact_matchesr+   exacts           r0   convertFontFamilyz+Svg2RlgAttributeConverter.convertFontFamily  s     	2))(33
# 	4 	4I#~77	:yYYIu 4     4!((333 	%$Q''NN:8 : :$: :.7: :   %$r1   NNr'   r'   )rM   rN   rO   rP   r?   staticmethodr   r   r$   r   r   r   r   r  r  r  r  r   r(  rQ   rR   s   @r0   r   r     s(       00; ; ; ; ; ;
   \ ; ; \; .?$X[ 0 0 0 0dN N N    / / /B= = == = =       % % % % % % % %r1   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                 H     t                      j        |i | g | _        d S r)   )r>   r?   	usedAttrs)rD   rE   rF   rG   s      r0   r?   zNodeTracker.__init__  s*    $)&)))r1   c                     d| j          dS )Nz<NodeTracker for node >)etree_elementr~   s    r0   __repr__zNodeTracker.__repr__  s    =(:====r1   c                     || j         vr| j                             |           | j        j                            |d          S Nr   )r/  r   r2  r   r   rD   r   s     r0   getAttributezNodeTracker.getAttribute  sA    t~%%N!!$'''!(,,T2666r1   c                 ,    t          | j        |          S r)   )r  r2  r6  s     r0   __getattr__zNodeTracker.__getattr__  s    t)4000r1   c                     |                     |           }|D ]J}|d         d         }|                                D ]%\  }}	 || j        j        |<   # t          $ r Y "w xY wK| j                            dd           d S )Nr	  r   r   r   )matchr   r2  r   r   set)rD   rq   matchesr;  	attr_dictrd   r   s          r0   r   zNodeTracker.apply_rules  s    ++d## 	 	EaI&__..  	c69D&-d33!   D 	0#66666s   A
AA)
rM   rN   rO   rP   r?   r3  r7  r9  r   rQ   rR   s   @r0   r-  r-    s~             > > >7 7 71 1 1
7 
7 
7 
7 
7 
7 
7r1   r-  c                       e Zd ZdS )CircularRefErrorN)rM   rN   rO   rY   r1   r0   r@  r@    s        Dr1   r@  c                       e Zd Zd Zd ZdS )ExternalSVGc                     t          |          | _        t          ||j        |j        gz             | _        d| _        d S )N)parent_svgsF)load_svg_file	root_nodeSvgRenderer_parent_chainsource_pathrendererrendered)rD   pathrJ  s      r0   r?   zExternalSVG.__init__  sG    &t,,#h48L7MM
 
 
 r1   c                     | j         s&| j                            | j                   d| _         | j        j                            |          S )NT)rK  rJ  renderrF  definitionsr   )rD   fragments     r0   get_fragmentzExternalSVG.get_fragment  sD    } 	!M  000 DM}(,,X666r1   N)rM   rN   rO   r?   rQ  rY   r1   r0   rB  rB    s2          7 7 7 7 7r1   rB  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dS )rG  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                 @   || _         |pg | _        t          ||          | _        t	          || j                  | _        | j                                        | _        i | _        t          t                    | _        i | _        t                      | j        _        d S )N)r   r   )rI  rH  r   attrConverterSvg2RlgShapeConvertershape_converterget_handled_shapeshandled_shapesrO  r   listwaiting_use_nodes_external_svgsr[   r|   )rD   rL  r   rD  r   s        r0   r?   zSvgRenderer.__init__  s    (.B6+h
 
 
  5T4;MNN"2EEGG!,T!2!2 '1||$$$r1   c                 4   t                               |          }|                     |d          }| j                            |           |                     |d          }| j                                        D ]}t          	                    d|           |
                    d|j        z
  |j         |j        z
             | j                            |dd|j        |j        f          \  }}t#          ||          }|                    |           |S )	NTdefault_box)	outermostz(Ignoring unavailable object width ID %r.r   r7   r8   defaults)r-  from_xml_rootget_boxrT  r   	renderSvgrZ  keysr   debug	translater5   r8   r6   rV  convert_length_attrsr7   r   add)	rD   svg_nodenodeview_box
main_groupxlinkr7   r8   drawings	            r0   rN  zSvgRenderer.render  s   ((22<<$<77""8,,,^^DD^99
+0022 	L 	LELLCUKKKKQ^ho-=
-JKKK,AAgx8>8?2S B 
 
v %((Jr1   c                 r   |                     d          }d}d }t          |          }|                     |          }|dk    r,|                     |          }|                    |           nd|dk    rd}nZ|dk    r,|                     |          }|                    |           n(|dk    rI|                     d          }|                     ||	          }|d
k    r|                    |           n|dk    r|                     |           n|dk    r^|                     |          }|j	        
                    d          r|                    |           np|                    dd           nX|dk    r.|                     ||	          }|                    |           n$|dk    r|                     |          }n|| j        v r|dk    r|                     |          }	|	d S t          |	t                     rWt#                      }
|	\  }}|                    ||
           |                     ||
           |                    |
           d S |	|_        | j                            |||          }|                     d          }|r|d
k    r|                    |           nd}t.                              d|           |s|rt|rr|| j        |<   |                    d|i           d |j	                                        D             }t9          |          dk    r|\  }|                    d|i           || j                                        v r9| j                            |          }|D ]\  }}|                     ||           |                      |           d S d S )Nr   FsvgdefsTr   r   display)clippingr  r.   symbol	_renderedr   useclipPathimager   zIgnoring node: %ssvgidc                      g | ]\  }}d |v 	|S )labelrY   )rc   r   r   s      r0   r   z*SvgRenderer.renderNode.<locals>.<listcomp>Q  s!    QQQTQGqLLqLLLr1   r   r}  group)!r7  r   get_clippathrd  ri  renderArenderGrenderStylerenderSymbolr   r   r<  	renderUserX  xlink_href_target
isinstancer   r   
renderNodeapply_node_attr_to_group_resolved_targetrV  convertShaper   rf  rO  setPropertiesr   r   rZ  re  r=   print_unused_attributes)rD   rk  r   nidignoreditemr   rt  rs  targetgrrJ  img_nodelabel_attrsr}  	to_renderuse_noder  s                     r0   r  zSvgRenderer.renderNode  s   %%$$T**5==>>$''DJJtV^^GGS[[<<%%DJJtS[[''	22G<<x<88D&  

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

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

4   GLL,d333 	/ 
9t 
9(, % ""GS>222 RQT[->->-@-@QQQ{##q(((FE&&'7888d,113333 266s;;	'0 : :OHeNN85N9999((.....!	/ 	/r1   c                 8    fd fd|                     d          }|sdS t          j        d|          }|sdS |                                d         }| j        vrt
                              d|           dS   j        |                   }t          |t                    r|	                                \  }}}}	t                      }
|
                    ||           |
                    ||           |
                    ||	           |
                    ||	           |
                                 t          ||
           |
S t          |t                    rt          |          S |r!t!          j        d	|j        j                   dS dS )
zo
        Return the clipping Path object referenced by the node 'clip-path'
        attribute, if any.
        c                     | j         D ]=}t          |t                    r |          c S t          |t                    r|c S >d S r)   )contentsr  r   r   )r  elemget_shape_from_groups     r0   r  z6SvgRenderer.get_clippath.<locals>.get_shape_from_group`  sg        dE**  //55555j11  KKK    r1   c                    |                                  D ]}t          |          dk    r*j                            d|          }|j        d         c S t          |          dk    r"                    |          } |          c S t          |          dk    rj                            |          c S  |          c S d S )NrL  r   rw  rect)iter_childrenr   rV  r  r  r  convertRect)rk  childr  grpr  get_shape_from_noderD   s       r0   r  z5SvgRenderer.get_clippath.<locals>.get_shape_from_nodeg  s    ++-- 
6 
6U##v-- 0==feLLE >"----u%%....//C//44444u%%///;;EBBBBB..u55555
6 
6r1   z	clip-pathNzurl\(#([^\)]*)\)r   z)Unable to find a clipping path with id %sr<   z&Unsupported shape type %s for clipping)r7  r   r;  groupsrO  r   r   r  r   	getBoundsrT   moveTolineTo	closePathcopy_shape_propertiesr   loggingr   rG   rM   )rD   rk  	clip_pathmrefshaper   r   r   r   cpr  r  s   `          @@r0   r  zSvgRenderer.get_clippath[  s   
	  	  	  	  	 	6 	6 	6 	6 	6 	6 	6 %%k22	 	FH()44 	Fhhjjmd&&&NNFLLLF##D$4S$9::eT"" 	^ #__..NBBBIIb"IIb"IIb"IIb"LLNNN!%,,,It$$ 	^%0000 	^MBEOD\]]]]]	^ 	^r1   c                    t           j        t          j        k    rd S | j                            j                                                  }fd|D             }|r+t                               dt                    |           d S d S )Nc                 &    g | ]}|j         v|S rY   )r/  )rc   rd   rk  s     r0   r   z7SvgRenderer.print_unused_attributes.<locals>.<listcomp>  s%    QQQd$.6P6P6P6P6Pr1   zUnused attrs: %s %s)
r   levelr  DEBUGrT  r   r2  re  rf  r   )rD   rk  	all_attrsunused_attrss    `  r0   r  z#SvgRenderer.print_unused_attributes  s    <'-''F&778JKKPPRR	QQQQQQQ 	OLL.	$NNNNN	O 	Or1   c                     |j         }t          |d          \  }}}|s|r|d|pd d|pd dz  }|r| j                            ||           d S d S )N)	transformr5   r6   z translate(r   z, ))r7  maprV  applyTransformOnGroup)rD   rk  r  getAttrr  r5   r6   s          r0   r  z$SvgRenderer.apply_node_attr_to_group  s    #g'>??	1a 	; 	;:qvA::a::::I 	I 66y%HHHHH	I 	Ir1   c                    |j                             d          p|j                             d          }|sdS t          j        d|          }|r|                                d         }t          j        ||                    d          d         dz   d                             d                    }t          j
        d| 	          \  }}t          |d
          5 }	|	                    |           ddd           n# 1 swxY w Y   t          j        |           |S d|v r|                    dd          \  }
}n|d}}
|
rt!          | j        t$                    st&                              d|
           dS t          j                            t          j                            t          j                            | j                  |
                    }t          j        |t          j                  sdS || j        k    rd}
|
r|                    d          r|| j        v r(t&                              d           t;                      || j        vrt?          ||           | j        |<   | j        |         }|j         J|r"|!                    |          }|	|j"        |fS dS |j"        tF          $                    |j                   fS dS 	 tK          |dd           n,# tL          $ r t&                              d|           Y dS w xY w|S |rA|| j'        v r| | j'        |         fS | j(        |         )                    ||f           tT          S dS )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   r;  r  base64decodebytesspanencodetempfilemkstempopenwriteosclosera   r  rI  strr   r   rL  normpathjoindirnameaccessR_OKr   rH  r@  r[  rB  rF  rQ  rJ  r-  rb  r   OSErrorrO  rZ  r   DELAYED)rD   rk  r  
xlink_hrefr;  
img_format
image_datafile_indicatorrL  fhirirP  ext_svgext_frags                 r0   r  zSvgRenderer.xlink_href_target  s    [__%IJJedkoo^dNeNe
 	4 :JGG 
	*J+J

1a8H18L7N7N,O,V,VW^,_,_``J#+#3;Kz;K;K#L#L#L NDdD!! %R$$$% % % % % % % % % % % % % % % H^$$$ K *&,,S!44MC&C 	d.44 *  
 t7##BGLLAQ1R1RTW$X$XYYD9T27++ tt'''  	}}V$$ 4---LL!GHHH*,,,t2220;D$0G0GD'--d3$0 ^#*#7#7#A#A#/#*#3X#== 0/  '/1J1J7K\1]1]]] 10 T1a((((      LL!KTRRR44   	4+++T-h777 &x077uFFF	 	s$    DD	DK( (%LLc                     d S r)   rY   rD   rk  s     r0   renderTitle_zSvgRenderer.renderTitle_      r1   c                     d S r)   rY   r  s     r0   renderDesc_zSvgRenderer.renderDesc_  r  r1   Fc                    |                     d          }|r#| j                            |          }t          | S |rIt	          |j         d          \  }}t	          | j        j        ||f          \  }}t          dd||          S d S )NviewBox)r7   r8   r   )r7  rT  r   r4   r  r   )rD   rj  r^  rl  r7   r8   s         r0   rc  zSvgRenderer.get_box  s    ((33 	");;HEEH>! 	, 57JKKME6 2 @5&/RRME6q!UF+++	, 	,r1   c                    | j         j        }|                    dt           d          dk    | j         _        |                     |d          }| j        j        }|r| j                            |           |j        	                    d           }|
                                D ]*}|j        |rd| dndk    r|                     |           +t                      }|                                D ]}	|                     |	|           || j         _        | j                            |           |s=| j                             |dd	          \  }
}|
s|r|                    |
pd
|pd
           |s|r|                    dd           ns|rqd\  }}| j                             |ddd          \  }}||j        |k    r
||j        z  }||j        |k    r
||j        z  }|                    |||rdndz             |S )N{}spacepreserveTr]  z}defsrr  r5   r6   r   r   r   )r   r   r7   r8   r)  r`  )rV  preserve_spacer7  XML_NSrc  rT  r}   r   nsmapr   iter_subtreetagr  r   r  r  rh  rg  scaler8   r7   )rD   rk  r_  _saved_preserve_spacerl  
_saved_boxsvg_nsdef_noder  r  r5   r6   x_scaley_scaler7   r8   s                   r0   rd  zSvgRenderer.renderSvg  s[    $ 4 C.2.?.?@TV@T@T@T.U.UYc.c+<<$<77'0
 	1&&x000 %%))++ 	' 	'H|v I 3V 3 3 3 36JJX&&&'')) 	* 	*EOOE5)))).C+"":...  	0'<<T3LLDAq 0A 0QQ///  	EI 	EKK2 		E#GW 0EEgx+ F  ME6 !ho&?&? 8?2 X^u%<%<(.0KK),BBB!CDDDr1   c                    |j         }t          |d          \  }}t                      }|r|                    |           |                                D ]}|                     ||           |r| j                            ||           |S )N)r   r  rz  )r7  r  r   ri  r  r  rV  r  )rD   rk  rt  r  r   r  r  r  s           r0   r  zSvgRenderer.renderG2  s    #G%899IWW 	FF8'')) 	. 	.EOOE"O---- 	F 66y"EEE	r1   c                 R    | j         j                            |j        pd           d S r5  )rT  r|   rx   r   r  s     r0   r  zSvgRenderer.renderStyle@  s(    $//	R@@@@@r1   c                 ,    |                      |          S r)   r  r  s     r0   r  zSvgRenderer.renderSymbolC  s    ||D!!!r1   c                 ,    |                      |          S r)   r  r  s     r0   r  zSvgRenderer.renderAF  s     ||D!!!r1   c                    |t                      }	 |                     ||          }n6# t          $ r) |j        j                            |j                   |cY S w xY w|d S t          |t                    rt          	                    d           d S |t          u r|S |d         }|r|                    |           t          |                                          dk    r'|                    t          j        |                     |                     t%          |                                          d         |           |                     ||           |S )Nr~  z/<use> nodes cannot reference bitmap image filesr   r   r   rz  )r   r  r@  r   r2  remover  r  r   r   r  ri  r   getchildrenr   rB   rC   r  rY  r  r  )rD   rk  r  rt  r  s        r0   r  zSvgRenderer.renderUseK  s[   =GGE	))$e)<<DD 	 	 	K%,,T-?@@@LLL	 <Fc"" 	LLJKKKFW__L7D 	 IIht!!""a''KKd++,,,T//112226uEEE%%dE222s   * 0AA)NNNr)   Fr)  )rM   rN   rO   rP   r?   rN  r  r  r  r  r  r  r  rc  rd  r  r  r  r  r  rY   r1   r0   rG  rG    sI        4 4 4 4  &N/ N/ N/ N/`5^ 5^ 5^nO O OI I IQ Q Q Qf    , , , ,) ) ) )V   A A A" " "" " "
     r1   rG  c                   0    e Zd ZdZddZed             ZdS )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                 L    |pt                      | _        || _        d| _        d S )NF)r   rT  svg_source_filer  )rD   rL  rT  s      r0   r?   zSvgShapeConverter.__init__r  s,    *I.G.I.I##r1   c                 4    d t          |           D             S )ztDynamically determine a list of handled shape elements based on
           convert<shape> method existence.
        c                 p    g | ]3}|                     d           |dd                                         4S )convertr  N)r   lower)rc   r   s     r0   r   z8SvgShapeConverter.get_handled_shapes.<locals>.<listcomp>|  s9    QQQCs~~i7P7PQABBQQQr1   )dir)clss    r0   rW  z$SvgShapeConverter.get_handled_shapesw  s    
 RQ3s88QQQQr1   r)   )rM   rN   rO   rP   r?   classmethodrW  rY   r1   r0   r  r  h  sR         $ $ $ $
 R R [R R Rr1   r  c                   j    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dS )rU  z=Converter from SVG shapes to RLG (ReportLab Graphics) shapes.Nc                 |   d|                                  } t          | |          |          }|sd S |dvr|                     ||           |                    d          }|s|s|S t	                      }|r|                     ||           |r|                    |           |                    |           |S )Nr  )rL  polyliner   r  )
capitalizer  applyStyleOnShaper7  r   r  ri  )rD   r   rk  rt  method_namer  r  r  s           r0   r  z"Svg2RlgShapeConverter.convertShape  s    3 1 133*k**400 	F333""5$///%%k22	 		X 		LGGE =**9e<<< $		(###IIeLr1   r   c                    t          d          rj        nfd| j        j        |                    ddt          |          z            }fdt          ||          D             S )Nr7  c                 :    j                             | d          S r5  )r   r   )rd   rk  s    r0   r   z<Svg2RlgShapeConverter.convert_length_attrs.<locals>.<lambda>  s    dkoodB77 r1   ra  )r   c                 F    g | ]\  }}  |          ||           S ))r   r   r   rY   )rc   rd   r   
convLengthr   r  s      r0   r   z>Svg2RlgShapeConverter.convert_length_attrs.<locals>.<listcomp>  sH     
 
 
g Jwwt}}gwWWW
 
 
r1   )hasattrr7  rT  r   r   r   zip)rD   rk  r   r   rF   ra  r  r  s    ``   @@r0   rh  z*Svg2RlgShapeConverter.convert_length_attrs  s     ")~!>!> 8D7777 	 '5
::j&3u::*=>>
 
 
 
 
 
!$UH!5!5
 
 
 	
r1   c                 d    |                      |dddd          }t          |           t          | S )Nr   r   r   r   )rh  nudge_pointsr   )rD   rk  pointss      r0   convertLinez!Svg2RlgShapeConverter.convertLine  s5    **4tT4HHVV}r1   c           	          |                      |dddddd          \  }}}}}}||dz  k    r|dz  }||dz  k    r|dz  }|r|s|}n|r|s|}t          ||||||          S )	Nr5   r6   r7   r8   rxryr   )r  r  )rh  r   )rD   rk  r5   r6   r7   r8   r  r  s           r0   r  z!Svg2RlgShapeConverter.convertRect  s    &*&?&?#sGXtT'
 '
#1eVR B!!B 	b 	BB 	 	BAq%B26666r1   c                 \    |                      |ddd          \  }}}t          |||          S )Nr   r   r)rh  r
   )rD   rk  r   r   r  s        r0   convertCirclez#Svg2RlgShapeConverter.convertCircle  s3    --dD$DD	Bb"a   r1   c                 j    |                      |dddd          \  }}}}||}}t          ||||          S )Nr   r   r  r  )rh  r   )rD   rk  r   r   r  r  r7   r8   s           r0   convertEllipsez$Svg2RlgShapeConverter.convertEllipse  sB    224tT4PPBBBvr2uf---r1   c                    |                     d          }|                    dd          }|                                }t          t	          | j        j        |                    }t          |          dz  dk    st          |          dk    rd S t          |           t          |          }| 
                    ||           | j                            |d          dv}|rft                      }t          |          }| 
                    ||           d |_        |                    |           |                    |           |S |S )Nr  r   r   r   r   fill)r   r  )r7  r   ra   rY  r  rT  r   r   r  r   r  r   r   r   rJ   ri  )rD   rk  r  r
  has_fillr  polygons          r0   convertPolylinez%Svg2RlgShapeConverter.convertPolyline  s4   ""8,,S))c$,:FCCDDv;;?a3v;;!#3#34VF##x...%..tV<<LP 		 GGEfooG""7D111"&GIIgIIhLr1   c                 d   |                     d          }|                    dd          }|                                }t          t	          | j        j        |                    }t          |          dz  dk    st          |          dk    rd S t          |           t          |          }|S )Nr  r   r   r   r   )
r7  r   ra   rY  r  rT  r   r   r  r   )rD   rk  r  r  s       r0   convertPolygonz$Svg2RlgShapeConverter.convertPolygon  s    ""8,,S))c$,:FCCDDv;;?a3v;;!#3#34Vr1   c           	      	   | j         }|                    dt           d          }|r|dk    }n| j        }t	                      }g }d\  }}d\  }	}
|                    |d          pt          }|                    |d          pt          }|                    |d          pt          }|	                    |||          }|                    |d          pt          t                    }|                    |          }|                     |d	d
|          \  }}t          ||          D ]E\  }}}|s
d\  }}d\  }}d}|s|                     |d	d
dd|          \  }	}
}}|j                            d	d          dk    |j                            d
d          dk    }}|t#          |t$                    r|d         n|z   }|t#          |t$                    r|d         n|z   }|j                            dd          }|dv r| dz  |dz  dd|         }n|                    ||          }|                    t)          |||                     t+          d |	|
||fD                       rf|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/          j        |||||          D ]\  } }!}"}#}$|$ n|"d}"|#d}#|"| |t)          |||          z   n| z   }%|#|!|n|!z   }&t3          |%|&|z
   |$          }'|                     |'|           t7          |          dk    r|                     |'|           |                    |'           |%}|&}|$}|r|	|z   n||z   t-          |d d                   z   }%|r|
|z   n||z   }&t3          |%|&|z
   |          }'|                     |'|           t7          |          dk    r|                     |'|           |                    |'           G|                    dd           |S )Nr  r  r  )r   r   font-familyfont-weight
font-style	font-sizer5   r6   r  FFr   dxdyr   zbaseline-shift0)r   r>   baseliner   c              3   @   K   | ]}t          |t                    V  d S r)   )r  rY  )rc   r   s     r0   r   z4Svg2RlgShapeConverter.convertText.<locals>.<genexpr>  s,      EES:c4((EEEEEEr1   r   tspanr   )rT  r7  r  r  r   r   r!   r"   r#   r(  r  r$   r   rh  iter_text_noder   r   r  rY  r   r   anysum	itertoolszip_longestr   r  r   ri  r  )(rD   rk  attrConv	xml_spacer  r  frag_lengthsdx0dy0r   r   fffwfstylefsr5   r6   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(                                           r0   convertTextz!Svg2RlgShapeConverter.convertText  s>   %%%&:6&:&:&:;;	 	1&*4NN!0NWWSBt]33H7Ht]33J7J""466L:L''B77t[11KS9J5K5K##B''((sC(DD1&4T>&J&J ;	 ;	"GT7 'LE5FBM D!%!:!:7CdTXbd!:!e!eBB ' 2 23 ; ;r A7>CUCUVY[]C^C^bdCdujT&:&:BRUUCjT&:&:BRUUC#N../?EEM <<<)+A1! L L] [ ( 6 6}b 6 Q QD"b 9 9::: EERR4DEEEEE ' ?",R"6"6@BBRDEEWs<+<'='==>E &",R"6"6@BBRDEEWIE)"d33=")"d33=",1!HeAh	>G>Suffd?< ?< % %:FFGWd|"#"##CI>YB!?!???W]E $vvVLE"5EM,A*BDIIE**5$777 ))W44..ug>>>FF5MMM"F"F $II%*RbS3|CRC?P;Q;Q1Q%*9bSu(=&>EE&&ud333W%%00**5':::u
B	r1   c                    |                     d          }|sd S t          |          }t                      }|j        }g }g }d}d }	t	          dt          |          d          D ]}
||
|
dz            \  }}|dv rC|
dk    r=|j        d         t          k    r'|                    t          |j                             |dk    r |j	        |  |dd          }n|d	k    r |j
        |  n|d
k    rst          |          dk    rJ|dv r|}n
|dd          }|d         |d         z   |d         |d         z   }}|	                    ||           n
 |j	        |  |dd          }n|dk    r:|d         |d         z   |d         |d         z   }}|
                    ||           n|dk    r$|
                    |d         |d                    n|dk    r$|
                    |d         |d                    n||dk    r-|
                    |d         |d         z   |d                    nI|dk    r-|
                    |d         |d         |d         z              n|dk    r |j        |  n|dk    rl|\  }}}}t          |          dk     s|dvr|dd          dz  \  }}}}n|dd          \  }}}}|||z
  z   |||z
  z   }}|                    ||||||           n|dk    rD|dd          \  }}|\  }}}}}}|                    ||z   ||z   ||z   ||z   ||z   ||z              nH|dk    rx|\  }}}}t          |          dk     s|dvr|dd          dz  \  }}}}n|dd          \  }}}}|||z
  z   |||z
  z   }}|                    ||||z   ||z   ||z   ||z              n|dk    r\|dd          \  }}|\  }}}}||f}	t          ||f||f||f          \  \  }}\  }}\  }}\  }}|                    ||||||           nh|dk    r|	|	\  }}n|dd          \  }}|dd          \  }}|||z
  z   |||z
  z   }}||f}	|\  }}t          ||f||f||f          \  \  }}\  }}\  }}\  }}|                    ||||||           n|dk    rs|dd          \  }}|\  }}}}||z   ||z   ||z   ||z   f\  }}}}||f}	t          ||f||f||f          \  \  }}\  }}\  }}\  }}|                    ||||||           nj|dk    r|	|	\  }}n|dd          \  }}|dd          \  }}|\  }}||z   ||z   }}|||z
  z   |||z
  z   }}||f}	t          ||f||f||f          \  \  }}\  }}\  }}\  }}|                    ||||||           n|dv r|\  }}}}}}}|dd          \  }}|dk    r
||z  }||z  }t          |          dk    st          |          dk    r|
                    ||           ntt          |||||||||	  	        }|D ]%\  } } }}}}}}|                    ||||||           &n4|dv r|                                 nt                               d |           |d!vrd }	|}t%                      }!|                     ||           |j        d         t          k    r'|                    t          |j                             |re|j        ^t+          |"          }"t-          |          D ]"}#|"j                            |#t                     #|!                    |"           d |_        |!                    |           |!S )#Nr   r   r   r   )r  Mr   rW  r   Lr  )Zzr   lHVhr   CSr  >   r_  r`  r   r   r   r   QTqt)Ar   r   g|=zSuspicious path operator: %s)rb  rd  rc  re  r  )r   r   r   r  r   r   	operatorsr	   r   r  r  curveTor   absr   r  r   rf  r   r  rX   r:   reversedinsertri  )$rD   rk  r   normPathrL  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$                                       r0   convertPathz!Svg2RlgShapeConverter.convertPath>  s4	   HHSMM 	4%a((vv$&! q#h--++ H	 H	A!A#HBZAEEdnR.@J.N.N)00T^1D1DEEE SyyT"" &rsssT""" sv;;!##++)6)/+A.a8.:KdSTg:UBKKB''''DK&& &rsssd1g-vbzDG/CBB#### sDGVBZ0000sF2JQ0000 sF2Ja0&*====sF2Jr
T!W(<==== sd###s!%BBv;;??f4H&H&H%+BCC[1_NBB%+BCC[NBBrBwrBwBRRR4444 sB)-&BBBR"Wb2grBwRb"r'RRRRs!%BBv;;??f4H&H&H%+BCC[1_NBB%+BCC[NBBrBwrBwBRR"Wb2grBwRHHHH sB!%BB%'H!3RHr2hRQQ 7R(2rHRhr2RRR4444s$0.FB#BCC[FBBrBwrBwB%'H!B3RHr2hRQQ 7R(2rHRhr2RRR4444 sB!%BB!#b"r'27BG!CBB%'H!3RHr2hRQQ 7R(2rHRhr2RRR4444s$0.FB#BCC[FBBBb"r'BrBwrBwB%'H!3RHr2hRQQ 7R(2rHRhr2RRR4444 z!!.2+BRRB99"HB"HBr77e##s2ww%'7'7KKB''''3BBCRQSUWXXB8: = =41b"b"b"RRR<<<<= z!!     ;R@@@---$(!FFWWtT***>"++%,,S-@-@AAA$ 	")C '666K#$=>> B B%,,WjAAAAFF;!DN
t	r1   c                    t           st                              d           d S |                     |dddd          \  }}}}|j        }t          t          |          t          ||z             t          |          t          |          |          }t          |          }|                    d||z   dz             |	                    dd	           |S )
NzFUnable to handle embedded images. Maybe the pillow library is missing?r5   r6   r7   r8   r   r   r   r   )
r   r   r   rh  r  r   intr   rg  r  )rD   rk  r5   r6   r7   r8   ry  r  s           r0   convertImagez"Svg2RlgShapeConverter.convertImage  s     	NNX   4"77c3QYZZ1eV%c!ffc!f*oos5zz3v;;NNeAJ!+,,,Arr1   c                 b   | j                             |          }|D ]\  }}|dk    r$t          |t                    s||f} |j        |  0|dk    r+t          |t
          t          f          r|df} |j        |  a|dk    rt          |t                    rt          |          dk    r|	                    |           t          |          dk    rI|\  }}}|                    ||           |	                    |           |                    | |            |dk    r|
                    |d           !|dk    r|
                    d|           ?|d	k    r/t          |          d
k    rt          |j        |          |_        tt                              d||           dS )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  rg  r   rotater   r	  skewXskewYmatrix   zIgnoring transform: %s %sN)rT  r   r  r   r  r  r   rg  r   r  skewr   r  r   rf  )	rD   r  r  trr   valuesangler   r   s	            r0   r  z+Svg2RlgShapeConverter.applyTransformOnGroup  s    00;; 	F 	FJBW}}!&%00 .$f-FV$$${""fsEl33 '#QYF(((x!&%00 .CKK14D4DLL(((([[A%%$*ME2rOOB+++LL'''OORC"---w

61%%%%w

1f%%%%xCKK1$4$4"'"@"@8"fEEEE3	F 	Fr1   Fc                    	 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 ]}|                     |||)           d*S | j	        }||fD ]}|j        t          k    r||k    r|D ]\  }	}
}}g }t          |	          D ]$\  }}|                    ||          }|d+k    r|r%|dk    r8t          |dd*          't          |j        d,d          dk    r|j        j        }nF|dk    r8t          |dd*          't          |j        d,d          dk    r|j        j        }n||         }|d-k    r#|                    |j        d.          p||         }t%          |t                    r(|                    d/d+                                          }|                    |           &	 t          ||          }t-          ||
 ||            f# t.          t0          t2          f$ r t4                              d0           Y w xY wt          |dd*          |j        r|j        |j        _        t          |dd*          d1k    r	d*|_        d*S d*S )2z
        Apply styles from an SVG element to an RLG shape.
        If only_explicit is True, only attributes really present are applied.
        r"  rX   r  blackzfill-opacityfillOpacityr   r   z	fill-rule	_fillRuler   r   strokerJ   r  zstroke-widthrI   r   r   zstroke-opacitystrokeOpacityzstroke-linejoinstrokeLineJoinr  r0  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$   rG   r   r  r  rT  r   r   r   r  rX   r  rJ   r   r  r   rb   r   setattrr  KeyErrorr   r   rf  r  )rD   r  rk  r  mappingNmappingFsubshapeacmappingsvgAttrNamesrlgAttrfuncra  svgAttrValuesindexsvgAttrNamesvgAttrValuemeths                     r0   r  z'Svg2RlgShapeConverter.applyStyleOnShape  s    	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:P:P9QR_lD7)<
 ?e##!N T T&&x]&SSSSF (+ !	G !	GG&((W-@-@;B G G7wh "*3L*A*A 7 7&E;#%;;t[#A#AL#r))( %$'>99 '{D A A M '! D D I I+0?+@LL'+;;; '}d C C O '(97A F F! K K+0+<+BLL+3E?L#~55'){{4;'H'H'[HUZO!,44 V'3';';L"'M'M'S'S'U'U!((6666G"2t,,DE7DD-,@AAAA&*= G G GLL!EFFFFFG;G> 5-..:u:$)$5EO!5-..!33 !%E 43s   $H??1I43I4r)   r  )rM   rN   rO   rP   r  r$   rh  r  r  r  r   r%  r'  rU  r  r  r  r  rY   r1   r0   rU  rU    s	       GG   ( :K 
 
 
 
 
  
7 7 7! ! !
. . .
  6  T T Tlh h hT   $F $F $FLQ% Q% Q% Q% Q% Q%r1   rU  Fc                    t          | t          j                  rt          |           } d}t          | t                    rt          j                            |           d                                         dk    r~t          j	        | d          5 }t          | dd         d          5 }t          j        ||           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   | dd         } d}t          | |	          }|dS t          | fi |}|                    |          }|rt	          j        |            |S )
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  rL  splitextr  gzipr  shutilcopyfileobjrE  rG  rN  r  )	rL  r  rF   unzippedf_inf_outsvg_rootsvgRendererro  s	            r0   svg2rlgr  r  s    $%% 4yy H$ !1!1$!7!7!:!@!@!B!Bg!M!MYtT"" 	,dDcrcD,A,A 	,UtU+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,CRCyT4DEEEH d--f--K  **G  
	$Ns6   C#*C C#C	C#C	C##C'*C'c                     | sdS t          |           dk     rdS | d         }| d         }t          dt          |           dz
  d          D ] }|| |         k    s|| |dz            k    r dS !| dxx         dz  cc<   dS )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  r5   r6   r   s       r0   r  r    s      
6{{Qq	Aq	A1c&kk!mQ''  q	>>Q&1+--EE . 	q			Y					r1   c                     t          j        dd|          }	 t          j        | |          }|                                }|S # t          $ r&}t
                              d|           Y d }~d S d }~ww xY w)NT)remove_commentsrecoverr  )parserzFailed to load input file! (%s))r   	XMLParserparsegetroot	Exceptionr   r   )rL  r  r  docr  excs         r0   rE  rE    s    _d=M  Fk$v...;;==   = = =6<<<<<<<<<=s   *A 
A5A00A5c                 f    	 | j                             d          d         S # t          $ r Y dS w xY w)z3Return lxml node name without the namespace prefix.}r   N)r  ra   r  )rk  s    r0   r   r     sB    x~~c""2&&   s   " 
00c           	   #     K   |dk    }| j         r=t          | j         |||o$t          |                                           dk              nd}| |dfV  |                                 D ]}t          |||dz             E d{V  |dk    rN|dk    o|                                 du }| j        rt          | j        ||          nd}|dvr| j        |d	fV  dS dS dS )
zW
    Recursively iterate through text node and its children, including node tails.
    r   )strip_start	strip_endNFr   )r  )r  r5  T)	r   
clean_textr   r  r  r4  getnexttailr   )rk  r  r  level0r   r  r  r  s           r0   r4  r4    sB      aZF 
:	>v&BiSQUQaQaQcQcMdMdhiMi    	 e
##%% J J!%uqyIIIIIIIIIIIqyyQJ94<<>>T#9	MQY`z$)^yIIII\`z!!+tT))))))	 y "!r1   c                 "   | dS |                      dd                               dd                               dd          } |sJ|r|                                 } |r|                                 } d| v r|                      dd          } d| v | S )zCText cleaning as per https://www.w3.org/TR/SVG/text.html#WhiteSpaceNz
r   
	z  )r   lstriprstrip)r   r  r  r  s       r0   r  r    s    |t<<$$,,T377??cJJD + 	!;;==D 	!;;==Ddll<<c**D dllKr1   c                     |                                                                  D ]'\  }}	 t          |||           # t          $ r Y $w xY wd S r)   )rK   r   r  r  )source_shape
dest_shapepropr   s       r0   r  r    sq    !//117799  	c	Jc**** 	 	 	D	 s   ?
AAc                  n    ddl m}  ddlm} |j        fd}||_        | j        fd}|| _        dS )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                 j    	 | j         |d         j        _        n# t          $ r Y nw xY w | |fi |S r   )r  __self__fillModer  )rL  	drawFuncsrF   original_renderPaths      r0   patchedRenderPathz0monkeypatch_reportlab.<locals>.patchedRenderPath  sW    	-1^IaL!** 	 	 	D	""4==f===s    
((c                     | j         }t          |d          r|j        | _         nt          | _          | |fi | || _         d S )Nr  )	_fillModer  r  r   )rD   rL  rF   currentoriginal_drawPaths       r0   patchedDrawPathz.monkeypatch_reportlab.<locals>.patchedDrawPath  sT    .4$$ 	+!]DNN*DN$///// r1   N)reportlab.pdfgen.canvasr  reportlab.graphicsr  _renderPathdrawPath)r  r  r  r  r  r  s       @@r0   monkeypatch_reportlabr    s     /.....)))))) ,> > > > > +F! ! ! ! ! &FOOOr1   )Nr'   r'   Nr*  r  )r   r-  )drP   r  rB   r  r7  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   rk   rg   utilsr   r   r   fontsr    r!   r"   r#   r$   r%   r*   r&   r3   __version____license__
__author____date__r  objectr  	getLoggerrM   r   r4   compilefindallsplit_whitespacer:   rT   Matcherr[   rz   r   ElementWrapperr-  r  r@  rB  rG  r  rU  r  r  rE  r   r4  r  r  r  rY   r1   r0   <module>r     s            				  				    / / / / / / / / 4 4 4 4 4 4 @ @ @ @ @ @ @ @ / / / / / /                              !           . . . . . . . . * * * * * *02222222 0 0 0////////0                    
                    
R R R R6 6 6 6 
	/ &((		8	$	$j555662:.//7     4   *    4   "5 5 5 5 5# 5 5 5.y y y y y y y yxR% R% R% R% R% 2 R% R% R%j#7 #7 #7 #7 #7*+ #7 #7 #7L	 	 	 	 	y 	 	 	7 7 7 7 7 7 7 7"A A A A A A A AHR R R R R R R R.p% p% p% p% p%- p% p% p%f   @  (
 
 
 
  * * * **     & & &D       s   >B BB