U
    '1e6                     @   s  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mZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZmZmZ ddlmZmZmZ dd	lT dd
lmZ ddlmZmZmZ ddlmZmZ ddlm Z  ddl!m"Z" ej#Z#ej$Z$ej%Z%d& Z'd& Z(d& Z)d& Z*d& Z+ej,fddZ-ej,fddZ.ddej,fddZ/dd Z0d/ddZ1G dd  d e2Z3ed!d"d!d!d!ed#d$d#d#d#iZ4d%d& Z5G d'd( d(Z6G d)d* d*eZ7d0d,d-Z8e9d.kre8  dS )1a  An experimental SVG renderer for the ReportLab graphics framework.

This will create SVG code from the ReportLab Graphics API (RLG).
To read existing SVG code and convert it into ReportLab graphics
objects download the svglib module here:

  http://python.net/~gherman/#svglib
    N)BytesIOStringIO)stringWidthfp_str)asNative)getStateDeltaRendererrenderScaledDrawing)STATE_DEFAULTSPathUserNode)*)	rl_config)RLString	isUnicodeisBytes)FILL_EVEN_ODDFILL_NON_ZERO   )	_getImage)getDOMImplementationzsstroke-width stroke-linecap stroke stroke-opacity fill fill-opacity stroke-dasharray stroke-dashoffset fill-rule idzWstroke-width stroke-linecap stroke stroke-opacity stroke-dasharray stroke-dashoffset idz<font-family font-weight font-style font-variant font-size idzTstroke-width stroke-linecap stroke stroke-opacity stroke-dasharray stroke-dashoffsetzfill fill-opacityc                 K   s$   t  }t| |fd|i| | S )z>Returns a SVG as a string in memory, without touching the diskshowBoundary)r   
drawToFilegetvalue)dr   kwdss r   @/tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/renderSVG.pydrawToString'   s    r    c                 K   s<   t | } t| j| jff|}t| |dd|d || d S )Nr   r   )r
   	SVGCanvaswidthheightdrawsave)r   fnr   r   cr   r   r   r   -   s    r   c                 C   s"   t  }|jt| ||||d dS )zAs it says.r!   N)_SVGRendererr%   r
   )drawingZcanvasxyr   rr   r   r   r%   3   s    r%   c                 C   s8   g }t dt| dD ]}|| | | |d  f q|S )zo
    given a list of coordinates [x0, y0, x1, y1....]
    produce a list of points [(x0,y0), (y1,y0),....]
    r      r   )rangelenappend)LPir   r   r   _pointsFromList9   s    r5   c           	      K   sT   |  |}| D ]<\}}t|}|s4||| q||}|||pJ| q|S )a  Transform a DOM node into new node and copy selected attributes.

    Creates a new DOM node with tag name 'newTag' for document 'doc'
    and copies selected attributes from an existing 'node' as provided
    in 'attrDict'. The source 'node' can be None. Attribute values will
    be converted to strings.

    E.g.

        n = transformNode(doc, "node1", x="0", y="1")
        -> DOM node for <node1 x="0" y="1"/>

        n = transformNode(doc, "node1", x=0, y=1+1)
        -> DOM node for <node1 x="0" y="2"/>

        n = transformNode(doc, "node1", node0, x="x0", y="x0", zoo=bar())
        -> DOM node for <node1 x="[node0.x0]" y="[node0.y0]" zoo="[bar()]"/>
    )createElementitemsstrsetAttributegetAttribute)	docZnewTagnodeattrDictZnewNodeZnewAttrattrZsattrZattrValr   r   r   transformNodeE   s    

r?   c                   @   sH   e Zd ZdZejejejejej	ej
dZdddZdd Zdd	 Zd
S )EncodedWriterz
    EncodedWriter(encoding) assumes .write will be called with
    either unicode or utf8 encoded bytes. it will accumulate
    unicode
    )zutf-32z	utf-32-bez	utf-32-lezutf-16z	utf-16-bez	utf-16-leFc                 C   sD   t |  t|j | _}|r(d|ks0d|kr@| | j|  d S )NZ16Z32)list__init__codecslookupnameencodingwriteBOMS)selfrF   bomr   r   r   rB   r   s    
zEncodedWriter.__init__c                 C   sv   t |rPz|d}W qh   t \}}}t|}~~td||f Y qhX nt|shtdt| | | d S )Nutf-8z)String %r not encoded as 'utf-8'
error=%sz?EncodedWriter.write(%s) argument should be 'utf-8' bytes or str)	r   decodesysexc_infor8   
ValueErrorr   asciir1   )rI   uetZevtbr   r   r   rG   x   s    zEncodedWriter.writec                 C   s   d | }| d d = |S )N join)rI   r-   r   r   r   r      s    

zEncodedWriter.getvalueN)F)__name__
__module____qualname____doc__rC   	BOM_UTF32BOM_UTF32_BEBOM_UTF32_LE	BOM_UTF16BOM_UTF16_BEBOM_UTF16_LErH   rB   rG   r   r   r   r   r   r@   d   s   
r@   Znonzeroznon-zeroZevenoddzeven-oddc                  G   s   d dd | D S )N c                 s   s"   | ]}d |  d dV  qdS )z%f0.N)rstrip).0ar   r   r   	<genexpr>   s     zpy_fp_str.<locals>.<genexpr>rU   argsr   r   r   	py_fp_str   s    rj   c                   @   s  e Zd ZdbddZdcdd	Zddd
dZg dfddZdd Zdd Zdde	dfddZ
dd Zdd Zg dfddZdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zded(d)Zdfd*d+Zdgd-d.Zdhd0d1Zdid3d4Zd5d6 Zdjd8d9Zd:d; Zdkd<d=Zdld>d?Zdmd@dAZdndCdDZdodEdFZ dpdGdHZ!dIdJ Z"e#ddKfdLdMZ$dNdO Z%dPdQ Z&dRdS Z'dTdU Z(dVdW Z)dXdY Z*dZd[ Z+d\d] Z,d^d_ Z-d`da Z.dS )qr"   ,  rl   rK   r   Fc                    s  | _ t|j _| _|dd}|di  _|dd _|dd}t	 _
| \ _ _ _g  _i  _d _d  _  _  _  _  _  _ _|ddrt _nt _ fd	d
 _td}|ddd}	|dd|	 _ jj _ t!t"|d t" jdd j jf ddd}
t# j
 |
d< d|
d< |
$|di  |
% D ]\}} j &|| qX j'd} j(d}|)|  j )|  j'd} j(d}|)|  j )|  *t+d t+d   ,t+d   -d  .d  /d  |s`t0 jd!d"d#}t0 jd$dd j jd%}|)|  j )| t!d&d'}nt!d j jf d(}t0 jd)fd*d+ j d,| _1|rt0 jd)|d-d, _2 j2) j1  j ) j2 n j ) j1  j1 _3dS ).a  
        verbose = 0 >0 means do verbose stuff
        useClip = False True means don't use a clipPath definition put the global clip into the clip property
                        to get around an issue with safari
        extraXmlDecl = ''   use to add extra xml declarations
        scaleGroupId = ''   id of an extra group to add around the drawing to allow easy scaling
        svgAttrs = {}       dictionary of attributes to be applied to the svg tag itself
        useClipF	fontHacksextraXmlDeclrT   scaleGroupIdNZ
use_fp_strc                     s    j |  ddS )Nra   ,)r   replacerh   rI   r   r   <lambda>       z$SVGCanvas.__init__.<locals>.<lambda>minidomsvgz-//W3C//DTD SVG 1.0//ENz8http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtdr   zxMinYMin meetz	0 0 %d %dzhttp://www.w3.org/2000/svgz1.0)r#   r$   preserveAspectRatioviewBoxxmlnsversion	fill-rulezhttp://www.w3.org/1999/xlinkzxmlns:xlinksvgAttrstitlez...descfontNamefontSizestrokeColorr.   r   clipPathclip)idrect)r+   r,   r#   r$   zclip-path: url(#clip)style)r   ggroupzscale(1,-1) translate(0,-%d))r   	transformz
scale(1,1))4verboserC   rD   rE   rF   rJ   poprn   ro   r   	_fillModer#   r$   sizecoder   path_strokeColor
_fillColor
_lineWidth_font	_fontSize_lineCap	_lineJoinr   rj   cfp_strr   ZcreateDocumentTypeZcreateDocumentr;   ZdocumentElementrw   dictr8   _fillRuleMapupdater7   r9   r6   createTextNodeappendChildsetFontr   setStrokeColor
setLineCapsetLineJoinsetLineWidthr?   Z	groupTreeZ	scaleTree	currGroup)rI   r   rF   r   rJ   r   rm   rp   implementationdoctyper}   kvr~   textr   r   ZclipRectZgtkwr   rs   r   rB      s    	






 

zSVGCanvas.__init__Nc                 C   s   t | j| jd}| jj|dd| jd t|dr6|}nt|d| jd}| }| j}|rh|	dd| }|
| ||k	r|  d S )	N)rJ   	
)Z	addindentZnewlrF   rG   w)rF   z?>)r@   rF   rJ   r;   Zwritexmlhasattropenr   ro   rr   rG   close)rI   r'   writerfrw   Zexdr   r   r   r&     s    

zSVGCanvas.savec                 C   s    |p| j }|p| j}t|||S )zuReturn the logical width of the string if it were drawn
        in the current font (defaults to self.font).
        )r   r   r   )rI   r   fontr   r   r   r   NOTUSED_stringWidth  s    

zSVGCanvas.NOTUSED_stringWidthrT   c                    sx   | j  | t }r6fdd|D } rX    fdd|D }nfdd|D }d|d S )Nc                    s   g | ]}| kr|qS r   r   re   r   )includer   r   
<listcomp>%  s      z*SVGCanvas._formatStyle.<locals>.<listcomp>c                    s(   g | ] }| kr|d  t |  qS z: r8   r   )excluder   r   r   r   (  s      c                    s    g | ]}|d  t  |  qS r   r   r   r   r   r   r   *  s     z; ;)r   copyr   rA   keyssplitrV   )rI   r   r   r   r   r7   r   )r   r   r   r   _formatStyle   s    

zSVGCanvas._formatStylec                 C   s   |S )zKI don't think this was ever needed; seems to have been copied from renderPSr   )rI   r   r   r   r   _escape-  s    zSVGCanvas._escapec                 C   s&   dS d}|	|
||||| |f}|| S )zXCalculate the path for an arc inscribed in rectangle defined
        by (x1,y1),(x2,y2).N       @zImatrix currentmatrix %s %s translate %s %s scale 0 0 1 %s %s %s setmatrixr   arcZarcn)abs)rI   x1y1x2y2startAngextentZxScaleZyScaler+   r,   codeliner   datar   r   r   _genArcCode1  s          zSVGCanvas._genArcCodec                 C   sT   i }|rt | |d< t| jd| j| |d}|r>| ||}| j| d| _d S )Nr|   r   r   r   rT   )r   r?   r;   r   r   	_add_linkr   r   )rI   r   r   	link_infoZstylesfillModeZxtrar   r   r   r   _fillAndStrokeG  s     zSVGCanvas._fillAndStrokec                 C   s.   dddd}| j |kr*|| _ || | jd< d S )NZbuttroundZsquarer   r   r.   stroke-linecap)r   r   rI   r   valsr   r   r   r   U  s    
zSVGCanvas.setLineCapc                 C   s.   dddd}| j |kr*|| _ || | jd< d S )NZmiterr   Zbevelr   r   )r   r   r   r   r   r   r   [  s    
zSVGCanvas.setLineJoinc                 C   s   t |ttfr*dtt||g| jd< nVt |ttfrt	|dkr|dksTt
ddtt|| jd< |dkrt|| jd< dS )z7Two notations. Pass two numbers, or an array and phase., zstroke-dasharrayr   zphase is a length in user spacezstroke-dashoffsetN)
isinstancefloatintrV   mapr8   r   tuplerA   r0   AssertionError)rI   arrayphaser   r   r   setDasha  s    zSVGCanvas.setDashc                 C   s   || _ |d krd| jd< nf|j|j|j  }}}d|d |d |d f | jd< |j}|dkrnd| | jd< nd| jkr| jd= d S )NnoneZstrokergb(%d%%,%d%%,%d%%)d   r   %szstroke-opacity)r   r   redgreenbluenormalizedAlpharI   colorr-   r   balphar   r   r   r   l  s     
zSVGCanvas.setStrokeColorc                 C   s   || _ |d krd| jd< nf|j|j|j  }}}d|d |d |d f | jd< |j}|dkrnd| | jd< nd| jkr| jd= d S )Nr   fillr   r   r   r   zfill-opacity)r   r   r   r   r   r   r   r   r   r   setFillColory  s     
zSVGCanvas.setFillColorc                 C   s   || _ t| | jd< d S )Nr|   )r   r   r   )rI   r   r   r   r   setFillMode  s    zSVGCanvas.setFillModec                 C   s   || j kr|| _ || jd< d S )Nzstroke-width)r   r   )rI   r#   r   r   r   r     s    
zSVGCanvas.setLineWidthc                 C   s   | j |ks| j|kr|| _ || _| j}tD ]}||kr*||= q*|| jkrR| j| ni }t|trt|t|j	
  |r|
 D ] \}}d| }|tkr|||< qd|kr||d< d| |d< d S )Nzfont-zfont-familyz%spxz	font-size)r   r   r   TEXT_STYLESrn   r   r   r   iterr}   r7   )rI   r   r   r   r   r}   r   rf   r   r   r   r     s$    

zSVGCanvas.setFontc                 C   s,   t |tstt| jdf|}|| |S )Nrf   )r   r   r   r?   r;   r   )rI   Z
dom_objectr   linkr   r   r   r     s    
zSVGCanvas._add_link   c              	   K   s   | j rtd t||}	t||}
i }t| jdf|	|
t|||	 t|||
 | td|}|rp| ||}| j	
| dS )z)Draw a rectangle between x1,y1 and x2,y2.z+++ SVGCanvas.rectr   )r+   r,   r#   r$   r   N)r   printminr?   r;   maxr   AREA_STYLESr   r   r   )rI   r   r   r   r   rxryr   	_svgAttrsr+   r,   r   r   r   r   r   r     s"     


   zSVGCanvas.rectc           
      K   sR   t | jdf|||| || ||| td|}	|rB| |	|}	| j|	 dS )zDraw a rounded rectangle between x1,y1 and x2,y2.

        Corners inset as ellipses with x-radius rx and y-radius ry.
        These should have x1<x2, y1<y2, rx>0, and ry>0.
        r   )r+   r,   r#   r$   r   r   r   Nr?   r;   r   r   r   r   r   )
rI   r   r   r   r   r   r   r   r   r   r   r   r   	roundRect  s    
     zSVGCanvas.roundRectleftc                 K   s  |dkrd S t |}| jr"td |dkp@|dkp@|dkp@|dk}	|dkp`|dkp`|dkp`|dk}
| jd krp|	s| jd kr|
r|d	krt|| j| j}|d
kr||8 }nH|dkr||d 8 }n2|dkr|t|||| j| j8 }nt	dt
| | |}| t}|dkr(|d| |||  }|	r>|| t7 }n|d7 }|
r\|| t7 }n|d7 }t| jdf|||dd|  d|}| j|}|| |r| ||}| j| d S )N   z+++ SVGCanvas.drawStringr   r.         r      )startZ	inheritedr   endmiddler   numericzbad value for text_anchor z rotate(%s);z fill:none;z stroke:none;r   ztranslate(0,%d) scale(1,-1))r+   r,   r   r   )r   r   r   r   r   r   r   r   ZnumericXShiftrO   r8   r   r   r   r   EXTRA_FILL_STYLESEXTRA_STROKE_STYLESr?   r;   r   r   r   r   )rI   r   r+   r,   angler   text_anchortextRenderModer   ZneedFillZ
needStrokeZtextLenstr   contentr   r   r   
drawString  sP         




  

zSVGCanvas.drawStringr  c           	      K   s2   | j rtd | j|||f||||d| d S )Nz+++ SVGCanvas.drawCentredStringr  r   r  r	  r   r   r  )	rI   r   r+   r,   r  r  r   r	  r   r   r   r   drawCentredString  s     zSVGCanvas.drawCentredStringr  c           	      K   s2   | j rtd | j|||f||||d| d S )Nz+++ SVGCanvas.drawRightStringr  r  )	rI   r   r+   r,   r  r  r   r	  r   r   r   r   drawRightString  s     zSVGCanvas.drawRightStringc                 C   s   | j |}dS )zAdd a comment.N)r;   ZcreateComment)rI   r   commentr   r   r   r    s    zSVGCanvas.commentTc                 C   sj   t  }||d tt| }| jt| j	d||||d| d| 
ddddd|d|   d	 d S )
NZpngimagezdata:image/png;base64,
matrix(%s)r   r   r.   )r+   r,   r#   r$   hrefr   )r   r&   r   base64	b64encoder   r   r   r?   r;   r   )rI   r  r+   r,   r#   r$   embedbufr   r   r   	drawImage
  s       zSVGCanvas.drawImagec              	   C   sJ   | j d krFt| jdd| ||| ||f | td}| j| d S )Nr   zM %s L %s Zr   )r   r?   LINE_STYLESr;   r   r   r   r   )rI   r   r   r   r   r   r   r   r   line  s    
zSVGCanvas.linec              
   C   s^   t | jd|| d || d || d || d | td}|rN| ||}| j| dS )z{Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2.

        These should have x1<x2 and y1<y2.
        ellipser   )cxcyr   r   r   Nr   )rI   r   r   r   r   r   r  r   r   r   r  "  s    
 
 
 
zSVGCanvas.ellipsec              	   C   s<   t | jd|||| td}|r,| ||}| j| d S )Ncircle)r  r  r-   r   r   )rI   ZxcZycr-   r   r   r   r   r   r   0  s      zSVGCanvas.circlec
                 C   s2   d S | jd kr.| j|
| |	r"dp$d d  d S )Nz%s m %s curvetoz eofillz
 closepathrT   z stroke)r   r   r   r1   r   )rI   r   r   r   r   x3y3Zx4Zy4closedr   r   r   r   r   	drawCurve:  s        

zSVGCanvas.drawCurveh  c              
   C   sh  || d || d  }}	|| d || d  }
}|
t |t d  | }|t|t d  |	 }|
t || t d  | }|t|| t d  |	 }| j}g j}|r|d|||	|||f  |r|d||
|d|dkd|||f  n.|d|||||
|d|dkd|||f  |r:|d|||	  t| jdd	|j| 	 d
}| j
| dS )a  Draw a partial ellipse inscribed within the rectangle x1,y1,x2,y2.

        Starting at startAng degrees and covering extent degrees. Angles
        start with 0 to the right (+x) and increase counter-clockwise.
        These should have x1<x2 and y1<y2.
        r      z	M %s L %szA %s %d %d %d %sr   zM %s A %s %d %d %d %s ZzL %s Zr   ra   r   N)cospisinr   r1   r?   r;   rV   __self__r   r   r   )rI   r   r   r   r   r   r   
fromcenterr  r  r   r   ZmxZmyZaxZayr   r   r   r   r   r   drawArcG  s0    $
 zSVGCanvas.drawArcc                 C   st   t |dkstd| jd ks(| jd krpddd |D }t| jd|| td}|rd| 	||}| j
| d S )Nr.   z"Polygon must have 2 or more pointsr   c                 S   s   g | ]}t | qS r   r   re   pr   r   r   r   m  s     z%SVGCanvas.polygon.<locals>.<listcomp>polygonpointsr   )r0   r   r   r   rV   r?   r;   r   r   r   r   r   )rI   r1  r#  r   ptspolyliner   r   r   r/  i  s     zSVGCanvas.polygonc                 C   s2   d S ](}| j|t|d t|d f  qd S )Nz%s m %s l stroker   r   )r   r   r1   r   )rI   ZlineListr   r#   r   r  r   r   r   linesx  s
      zSVGCanvas.linesc                 C   s^   t |dkstd| jd krZddd |D }t| jd|| jtd dd}| j	| d S )	Nr   z#Polyline must have 1 or more pointsr   c                 S   s   g | ]}t | qS r   r   r-  r   r   r   r     s     z&SVGCanvas.polyLine.<locals>.<listcomp>r3  )r   r0  )
r0   r   r   rV   r?   r;   r   r   r   r   )rI   r1  r2  r3  r   r   r   polyLine  s    
 zSVGCanvas.polyLine)r   c                 C   sF   | j rtd | j}t| jdf|}|| || _| j rBtd |S )Nz+++ begin SVGCanvas.startGroupr   z+++ end SVGCanvas.startGroup)r   r   r   r?   r;   r   )rI   r=   r   r   r   r   r   
startGroup  s     
 zSVGCanvas.startGroupc                 C   s&   | j rtd || _| j r"td d S )Nz+++ begin SVGCanvas.endGroupz+++ end SVGCanvas.endGroup)r   r   r   )rI   r   r   r   r   endGroup  s
      zSVGCanvas.endGroupc           	   	   C   sl   | j rtd|||||| | jd}||||||fdkrhd| |||||| }| jdd||f  d S )Nz!!! begin SVGCanvas.transformr   )r   r   r   r   r   r   r  %s %s)r   r   r   r:   r   r9   )	rI   rf   r   r(   r   er   trtr   r   r   r     s     zSVGCanvas.transformc              
   C   s:   ||fdkr6| j dd| j dd| || f  d S )N)r   r   r   r8  ztranslate(%s))r   r9   r:   r   rI   r+   r,   r   r   r   	translate  s    

zSVGCanvas.translatec              
   C   s>   ||fdkr:| j dd| jd dd| || f  d S )N)r   r   r   r8  r  z	scale(%s))r   r9   groupsr:   r   )rI   ZsxZsyr   r   r   scale  s    
zSVGCanvas.scalec                 C   s   | j d| ||  | _ d S )NzM %s r   r   r<  r   r   r   moveTo  s    zSVGCanvas.moveToc                 C   s   | j d| ||  | _ d S )NzL %s r@  r<  r   r   r   lineTo  s    zSVGCanvas.lineToc              
   C   s$   | j d| ||||||  | _ d S )NzC %s r@  )rI   r   r   r   r   r!  r"  r   r   r   curveTo  s    zSVGCanvas.curveToc                 C   s   | j d | _ d S )NzZ )r   rs   r   r   r   	closePath  s    zSVGCanvas.closePathc                 C   s   d S Nr   rs   r   r   r   	saveState  s    zSVGCanvas.saveStatec                 C   s   d S rE  r   rs   r   r   r   restoreState  s    zSVGCanvas.restoreState)rk   rK   r   F)N)NN)r   r   N)r   r   N)r   Nr   r   )r   r  Nr   )r   r  Nr   )T)N)N)r   )r   r%  r   )r   N)NN)/rW   rX   rY   rB   r&   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r   r$  r,  r/  r4  r5  r   r6  r7  r   r=  r?  rA  rB  rC  rD  rF  rG  r   r   r   r   r"      s`   
l





-    
    






"

	
	r"   c                   @   s   e Zd ZdZdd Zdd Zdddd	d
dddZdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zd d! Zefd"d#Zd$d% Zd&d' Zd(S ))r)   z%This draws onto an SVG document.
    c                 C   s
   d| _ d S )Nr   )r   rs   r   r   r   rB     s    z_SVGRenderer.__init__c                 C   s   | j rtd|  | jd|  | jj }t|tr>|js>t	|}| j
| | |i  | | | j
 }t|tr|js| jd|  | D ]&\}}|| jkrt| j| j| | q|| j_| j rtd|  dS )zGThis is the recursive method called for each node in the tree.
        z#### begin _SVGRenderer.drawNode(%r)zbegin node %rzend node %rz!### end _SVGRenderer.drawNode(%r)N)r   r   _canvasr  r   r   r   r   
isClipPathr   _trackerpushapplyStateChangesZdrawNodeDispatcherr   r7   	_restoressetattr)rI   r<   r   ZdeltasZrDeltasr   r   r   r   r   drawNode  s$     


 z_SVGRenderer.drawNoder   r   r   r   r   r   r   )r   strokeWidthstrokeLineCapstrokeLineJoin	fillColorr   r   c                 C   s8   t |ddpd}t |ddpd}|r0||ddS d S d S )NZhrefURLrT   Z	hrefTitleZ_top)z
xlink:hrefzxlink:titletarget)getattr)rI   objurlr~   r   r   r   _get_link_info_dict  s
    z _SVGRenderer._get_link_info_dictc                 C   s   | j rtd | j }| j d \}}}}}}| D ]&}	t|	trR|		 }
n|	}
| 
|
 q:| j|||||| | j| | j rtd d S )Nz ### begin _SVGRenderer.drawGroupr   z### end _SVGRenderer.drawGroup)r   r   rH  r6  rJ  getStateZgetContentsr   r   ZprovideNoderO  r   r7  )rI   r   r   rf   r   r(   r   r9  r   Z	childNodenode2r   r   r   	drawGroup	  s     


 z_SVGRenderer.drawGroupc                 C   s   |  |}t|di }|j|j  kr.dkrfn n4| jj|j|j|j|j |j|j	 fd|i| n:| jj
|j|j|j|j |j|j	 |j|jfd|i| d S )Nr   r   r   )rX  rU  r   r   rH  r   r+   r,   r#   r$   r   )rI   r   r   r}   r   r   r   drawRect  s2    
 
 
 
 
 z_SVGRenderer.drawRectc                 C   sb   | j  }|d |j|j|jf\}}}}| jj|||f| ||t|dddt|di  d S )NZ
textAnchorr	  r   )r   r  r	  r   )	rJ  rY  r+   r,   r   rH  r  rX  rU  )rI   Z	stringObjSr  r+   r,   r   r   r   r   r  *  s    
 

z_SVGRenderer.drawStringc                 C   s&   | j jr"| j |j|j|j|j d S rE  )rH  r   r  r   r   r   r   )rI   r  r   r   r   drawLine1  s    z_SVGRenderer.drawLinec                 C   s$   | j j|j|j|j| |d d S N)r   )rH  r   r  r  r-   rX  )rI   r   r   r   r   
drawCircle5  s    z_SVGRenderer.drawCirclec              	   C   s   |  \}}}|dks|d kr|dks.|d kr|js|j|j|j|j|jf\}}}}}	|jp`|j}|| ||  }
}|| ||  }}|	| }| jj	|
|||||dd n(|
 }t|tr| | n
| | d S )Nr   r   )r+  )Z
_xtraRadiiZannularcenterxcenteryradiusstartangledegreesendangledegreesyradiusrH  r,  Z	asPolygonr   r   drawPathdrawPolygon)rI   Zwedgerf  Zradius1Zyradius1ra  rb  rc  rd  re  r   r   r   r   r   r3   r   r   r   	drawWedge8  s    &
z_SVGRenderer.drawWedgec                 C   s   | j jr| j t|j d S rE  )rH  r   r5  r5   r1  rI   r.  r   r   r   drawPolyLineI  s    z_SVGRenderer.drawPolyLinec                 C   sP   |j |j }|j |j }|j|j }|j|j }| jj||||| |d d S r_  )r  r   r  r   rH  r  rX  )rI   r  r   r   r   r   r   r   r   drawEllipseM  s
    z_SVGRenderer.drawEllipsec                 C   s"   | j jt|jd| |d d S )Nr   )r#  r   )rH  r/  r5   r1  rX  rj  r   r   r   rh  U  s    z_SVGRenderer.drawPolygonc           	   	      s
  ddl m  | j}|j|j|j|jf|d kr:tdt}| 	}tdd} fdd}|dkr|  |j
g j||d	 n|d
kr|dd |j
g j||d	 nZ| }|s|j}|d  zd }|j
g j||d	 W 5 || X n|j
g j||d	 d S )Nr   )_renderPathr   	autocloserT   c                     s    f| S rE  r   )r   rm  Z	drawFuncsr   r   r   rPa  s    z!_SVGRenderer.drawPath.<locals>.rPrw   )r   r   r   ZpdfT)Z
forceClose)reportlab.graphics.shapesrm  rH  rA  rB  rC  rD  rU  r   rX  r   rI  r   r   )	rI   r   r   r(   r   rn  rp  ZisClosedZofcr   ro  r   rg  X  s.    


z_SVGRenderer.drawPathc                 C   s   |j }t|tr2|r tj |s$d S t |}nt|drB|}nd S |j\}}|j	|j
 }}|d krj|}|d krv|}| jj||j|j||dd d S )NconvertT)r  )r   r   r8   osisfiler   r   r   r   r#   r$   rH  r  r+   r,   )rI   r  r   ZimZsrcWZsrcHZdstWZdstHr   r   r   r  v  s    
 

  z_SVGRenderer.drawImagec                 C   sH  |  D ]8\}}|dkrq|dkr2| j| q|dkrH| j| q|dkr^| j| q|dkrt| j| q|dkr|rt|ttfrt	|dkrt|d ttfr|d	 }|d }nd	}| j
|| n
| j
  q|d
kr| j| q|dkr.|d| jj}|d| jj}| j|| q|dkr| j| qdS )z\This takes a set of states, and outputs the operators
        needed to set those propertiesr   r   rP  rQ  rR  ZstrokeDashArrayr.   r   r   rS  )r   r   r   r   r   N)r7   rH  r   r   r   r   r   rA   r   r0   r   r   getr   r   r   r   )rI   deltaZnewStatekeyvaluer   ZfontnameZfontsizer   r   r   rL    s6    ,

z_SVGRenderer.applyStateChangesN)rW   rX   rY   rZ   rB   rO  rM  rX  r[  r\  r  r^  r`  ri  rk  rl  rh  r   rg  r  rL  r   r   r   r   r)     s,      r)   out-svgc                 C   s  t j| st |  ddlm} g }t|D ]>}|dd dkr.t||}| }t|dd}|||f q.d}|D ],\}}t j	| d| }	t
||	 |d7 }qvdd	lm}
 |
 }t
|t j	| d
 ddlm} ddlm} | }||j|j}|| t
|t j	| d d S )Nr   )
testshapes
   Z
getDrawingrZ   rT   zrenderSVG_%d.svgr   )getDrawing01ztest.svg)RL_CorpLogo)Drawingzcorplogo.svg)rs  r   isdirmkdirZreportlab.graphicsrz  dirrU  r1   rV   r   Zreportlab.graphics.testshapesr|  Zreportlab.lib.corpr}  rq  r~  r#   r$   add)ZoutDirrz  Zdrawingsfuncnamefuncr*   Z	docstringr4   r   filenamer|  r}  r~  Zrlr   r   r   test  s0    




r  __main__)N)ry  ):rZ   mathrM   rs  rC   r  ior   r   Zreportlab.pdfbase.pdfmetricsr   Zreportlab.lib.rl_accelr   Zreportlab.lib.utilsr   Zreportlab.graphics.renderbaser   r	   r
   rq  r   r   r   Z	reportlabr   r   r   r   Zreportlab.pdfgen.canvasr   r   ZrenderPMr   xml.domr   r)  r'  r(  r   r   r  r   r  r  r   r    r   r%   r5   r?   rA   r@   r   rj   r"   r)   r  rW   r   r   r   r   <module>   sf   	(
'      	    , j
"
