
    kf6                        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Z-ej,        fdZ.ddej,        fdZ/d Z0d(dZ1 G d de2          Z3edddddedddddiZ4d  Z5 G d! d"          Z6 G d# d$e          Z7d)d&Z8e9d'k    r e8             dS dS )*a  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                 f    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ss       \/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/reportlab/graphics/renderSVG.pydrawToStringr!   '   s6    

Aq!66,6666::<<    c                     t          |           } t          | j        | j        ffi |}t	          | |dd|           |                    |           d S )Nr   r   )r   	SVGCanvaswidthheightdrawsave)r   fnr   r   cs        r    r   r   -   sY    AA17AH%----AAq!,////FF2JJJJJr"   c                 p    t                      }|                    t          |           ||||           dS )zAs it says.r$   N)_SVGRendererr(   r   )drawingcanvasxyr   rs         r    r(   r(   3   s6    AFFw''ALFQQQQQr"   c                     g }t          dt          |           d          D ](}|                    | |         | |dz            f           )|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is      r    _pointsFromListr;   9   sT     	A1SVVQ ! !	!A$!A#    Hr"   c                    |                      |          }|                                D ]Z\  }}t          |          }|s|                    ||           -|                    |          }|                    ||p|           [|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)	docnewTagnodeattrDictnewNodenewAttrattrsattrattrVals	            r    transformNoderK   E   s    ( ''G!)) < <T 	<  %0000''..G  '*:U;;;;Nr"   c                   t    e Zd ZdZej        ej        ej        ej        ej	        ej
        dZddZd Z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                     t                               |            t          j        |          j        x| _        }|rd|v sd|v r"|                     | j        |                    d S d S )N1632)list__init__codecslookupnameencodingwriteBOMS)selfrV   boms      r    rR   zEncodedWriter.__init__r   sp    d#)=#:#:#?? 	,48##tx'7'7JJty*+++++ (8'7r"   c                 \   t          |          rY	 |                    d          }np#  t          j                    \  }}}t	          |          }~~t          d|d|          xY wt          |          st          dt          |          z            |                     |           d S )Nutf-8zString z not encoded as 'utf-8'
error=z?EncodedWriter.write(%s) argument should be 'utf-8' bytes or str)	r   decodesysexc_infor?   
ValueErrorr   asciir7   )rY   uetevtbs        r    rW   zEncodedWriter.writex   s    1:: 		kXXXg&&X \^^
BWW jQRQRQRSUSU!VWWW1 	k^afghaiaiijjjAs	   ' ?A&c                 :    d                     |           }| d d = |S )N join)rY   r2   s     r    r   zEncodedWriter.getvalue   s!    GGDMMGr"   N)F)__name__
__module____qualname____doc__rS   	BOM_UTF32BOM_UTF32_BEBOM_UTF32_LE	BOM_UTF16BOM_UTF16_BEBOM_UTF16_LErX   rR   rW   r    r"   r    rM   rM   d   s          !''!''
 
D, , , ,      r"   rM   nonzeroznon-zeroevenoddzeven-oddc                  @    d                     d | D                       S )N c              3   l   K   | ]/}d |z                       d                               d          V  0dS )z%f0.N)rstrip).0as     r    	<genexpr>zpy_fp_str.<locals>.<genexpr>   sB      FFAdQh&&s++22377FFFFFFr"   rh   )argss    r    	py_fp_strr      s#    88FFFFFGGGr"   c                   ^   e Zd Zd8dZd9dZd:dZg d	fd
Zd Zd Zdde	dfdZ
d Zd Zg dfdZd Zd Zd Zd Zd Zd Zd;dZd;dZd<dZ	 	 d=dZ	 	 d>dZd  Zd?d"Zd# Zd9d$Zd9d%Zd@d&ZdAd(ZdBd)Z d:d*Z!d+ Z" e#d	,          fd-Z$d. Z%d/ Z&d0 Z'd1 Z(d2 Z)d3 Z*d4 Z+d5 Z,d6 Z-d7 Z.dS )Cr%   ,  r   r\   r   Fc                 	    | _         t          j        |          j         _        | _        |                    dd          }|                    di            _        |                    dd           _        |                    dd          }t           _
        |x\   _         _         _        g  _        i  _        d _        dx _        x _        x _        x _        x _        x _         _        |                    dd          rt0           _        nt2           _         fd	 _        t7          d
          }|                    ddd          }	|                    dd|	           _         j        j         _         tC          tE          |d                   tE           j                  dd j         j        fz  dd          }
tF           j
                 |
d<   d|
d<   |
$                    |                    di                      |
%                                D ] \  }} j         &                    ||           ! j        '                    d          } j        (                    d          }|)                    |            j         )                    |            j        '                    d          } j        (                    d          }|)                    |            j         )                    |            *                    tV          d         tV          d                     ,                    tV          d                     -                    d            .                    d            /                    d           |s{ta           j        d d!"          }ta           j        d#dd j         j        $          }|)                    |            j         )                    |           tC          d%&          }ntC          d j         j        fz  '          }ta           j        d(fd)d* j        z  d+| _1        |r\ta           j        d(|d,+           _2         j2        )                     j1                    j         )                     j2                   n j         )                     j1                    j1         _3        d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extraXmlDeclrg   scaleGroupIdN
use_fp_strc                  @     j         |                      dd          S )Nrx   ,)r   replace)r   rY   s    r    <lambda>z$SVGCanvas.__init__.<locals>.<lambda>   s     [T[$%7%?%?C%H%H r"   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strokeColorr4   r   clipPathclip)idrect)r0   r1   r&   r'   zclip-path: url(#clip))style)r   ggroupzscale(1,-1) translate(0,-%d))r   	transformz
scale(1,1))4verboserS   rT   rU   rV   rZ   popr   r   r   	_fillModer&   r'   sizecoder   path_strokeColor
_fillColor
_lineWidth_font	_fontSize_lineCap	_lineJoinr   r   cfp_strr   createDocumentTypecreateDocumentrB   documentElementr   dictr?   _fillRuleMapupdater>   r@   r=   createTextNodeappendChildsetFontr   setStrokeColor
setLineCapsetLineJoinsetLineWidthrK   	groupTree	scaleTree	currGroup)rY   r   rV   r   rZ   r   r   r   implementationdoctyper   kvr   textr   r   clipRectgtkws   `                  r    rR   zSVGCanvas.__init__   s    h//4((9U+++b11 HH^B77xxr22&.22
DK$)	
	 "	" 	"DO 	"do 	"J	"	"*.-N88L'' 	$ DKK#DKHHHH-i88 !33E+LN N "00eGDD8+QLLt{++(7'4:t{*CC 7!
 
 
 !-T^ <"@B//000>>## 	' 	'CAaH!!!A&&&&&&w//x&&u--$U###x%%f--x&&u--T"""^J/
1KLLLN=9:::! 		E$TXzfEEEH$TXvaj6 6 6H  ***H  ***5666DD[DJt{+CCDDDD&tx 4t{B     	1*48S\UabbbDNN&&t~666H  0000H  000r"   Nc                    t          | j        | j                  }| j                            |dd| j                   t          |d          r|}nt          |d| j                  }|                                }| j        }|r|	                    dd|z             }|
                    |           ||ur|                                 d S d S )	N)rZ   	
)	addindentnewlrV   rW   w)rV   z?>)rM   rV   rZ   rB   writexmlhasattropenr   r   r   rW   close)rY   r*   writerfr   exds         r    r)   zSVGCanvas.save  s    t}:::&4T4=QQQ2g 	5AARdm444Aoo 	-++d48,,C	B;;GGIIIII ;r"   c                 H    |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   )rY   r   fontr   s       r    NOTUSED_stringWidthzSVGCanvas.NOTUSED_stringWidth  s.    
 !tz-t~1dH---r"   rg   c                 ^   | j                                                             |           t                                                    }rfd|D             }r$                                fd|D             }nfd|D             }d                    |          dz   S )Nc                     g | ]}|v |	S rt   rt   )r}   r   includes     r    
<listcomp>z*SVGCanvas._formatStyle.<locals>.<listcomp>%  s    444!qG||A|||r"   c                 N    g | ]!}|v|d z   t          |                   z   "S z: r?   )r}   r   excluder   s     r    r   z*SVGCanvas._formatStyle.<locals>.<listcomp>(  s6    LLLa1G;K;KQtVCaMM);K;K;Kr"   c                 F    g | ]}|d z   t          |                   z   S r   r   )r}   r   r   s     r    r   z*SVGCanvas._formatStyle.<locals>.<listcomp>*  s,    888aQtVCaMM)888r"   z; ;)r   copyr   rQ   keyssplitri   )rY   r   r   r   r   r>   r   s    ``   @r    _formatStylezSVGCanvas._formatStyle   s    
!!TEJJLL!! 	54444t444D 	9mmooGLLLLL4LLLEE88884888Eyy#%%r"   c                     |S )zKI don't think this was ever needed; seems to have been copied from renderPSrt   )rY   r   s     r    _escapezSVGCanvas._escape-  s    r"   c                     dS )zXCalculate the path for an arc inscribed in rectangle defined
        by (x1,y1),(x2,y2).N)abs)rY   x1y1x2y2startAngextentxScaleyScaler0   r1   codelinearcdatas                 r    _genArcCodezSVGCanvas._genArcCode1  s	     	r"   c                     i }|rt           |         |d<   t          | j        d| j        |                     |                    }|r|                     ||          }| j                            |           d| _        d S )Nr   r   r   r   rg   )r   rK   rB   r   r   	_add_linkr   r   )rY   r   r   	link_infostylesfillModextrar   s           r    _fillAndStrokezSVGCanvas._fillAndStrokeG  s     	7 ,X 6DTXvit0088    	3>>$	22D""4(((			r"   c                 Z    dddd}| j         |k    r|| _         ||         | j        d<   d S d S )Nbuttroundsquarer   r   r4   stroke-linecap)r   r   rY   r   valss      r    r   zSVGCanvas.setLineCapU  sD    Gx00=ADM+/7DJ'((( r"   c                 Z    dddd}| j         |k    r|| _         ||         | j        d<   d S d S )Nmiterr  bevelr  r  )r   r   r  s      r    r   zSVGCanvas.setLineJoin[  sD    W00>QDN+/7DJ'((( r"   c                    t          |t          t          f          r4d                    t	          t
          ||g                    | j        d<   dS t          |t          t          f          rrt          |          dk    ra|dk    s
J d            d                    t	          t
          |                    | j        d<   |dk    rt          |          | j        d<   dS dS dS 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intri   mapr?   r   tuplerQ   r6   )rY   arrayphases      r    setDashzSVGCanvas.setDasha  s     eU3K(( 	=-1YYs3%7Q7Q-R-RDJ)***uTl++ 	=E

QA:::@:::-1YYs3-G-GDJ)*Qww25e**
.///		= 	= wr"   c                     || _         |d k    rd| j        d<   d S |j        |j        |j        }}}d|dz  |dz  |dz  fz  | j        d<   |j        }|dk    rd|z  | j        d<   d S d| j        v r
| j        d= d S d S )Nnonestrokergb(%d%%,%d%%,%d%%)d   r   %szstroke-opacity)r   r   redgreenbluenormalizedAlpharY   colorr2   r   balphas         r    r   zSVGCanvas.setStrokeColorl  s    !D==#)DJx   iej!qA#8AcE1S5!C%;P#PDJx )Eaxx/3e|
+,,,!TZ//J/000 0/r"   c                     || _         |d k    rd| j        d<   d S |j        |j        |j        }}}d|dz  |dz  |dz  fz  | j        d<   |j        }|dk    rd|z  | j        d<   d S d| j        v r
| j        d= d S d S )Nr  fillr  r  r   r  zfill-opacity)r   r   r  r  r  r  r  s         r    setFillColorzSVGCanvas.setFillColory  s    D==!'DJviej!qA!6!C%3#9N!NDJv)Eaxx-1E\
>***4:--J~... .-r"   c                 >    || _         t          |         | j        d<   d S )Nr   )r   r   r   )rY   r   s     r    setFillModezSVGCanvas.setFillMode  s    ".q/
;r"   c                 B    || j         k    r|| _         || j        d<   d S d S )Nzstroke-width)r   r   )rY   r&   s     r    r   zSVGCanvas.setLineWidth  s0    DO###DO).DJ~&&& $#r"   c                    | j         |k    s| j        |k    r|| _         || _        | j        }t          D ]	}||v r||= 
|| j        v r| j        |         ni }t          |t                    r9|                    t          |j	        
                                                     |r-|
                                D ]\  }}d|z   }|t          v r|||<   d|vr||d<   d|z  |d<   d S d S )Nzfont-zfont-familyz%spxz	font-size)r   r   r   TEXT_STYLESr   r  r   r   iterr   r>   )rY   r   r   r   r   r   r   r~   s           r    r   zSVGCanvas.setFont  s   :8!;!;DJ%DNJE  ! !::a/3t~/E/Et~d++2H$x(( =T]%8%8%:%: ; ;<<< %#>>++ % %CAa	AK''#$aE))'+m$!'(!2E+# "<!;r"   c                     t          |t                    sJ t          | j        dfi |}|                    |           |S )Nr~   )r  r   rK   rB   r   )rY   
dom_objectr   links       r    r   zSVGCanvas._add_link  sJ    )T*****TXs88i88$$$r"      c           
         | j         rt          d           t          ||          }	t          ||          }
i }t          | j        df|	|
t          ||          |	z
  t          ||          |
z
  |                     t                    d|}|r|                     ||          }| j	        
                    |           dS )z)Draw a rectangle between x1,y1 and x2,y2.z+++ SVGCanvas.rectr   )r0   r1   r&   r'   r   N)r   printminrK   rB   maxr   AREA_STYLESr   r   r   )rY   r   r   r   r   rxryr   	_svgAttrsr0   r1   r   r   s                r    r   zSVGCanvas.rect  s     <434442JJ2JJTXv >1C2JJqLRA##K00> >3<> >  	3>>$	22D""4(((((r"   c                     t          | j        df||||z
  ||z
  |||                     t                    d|}	|r|                     |	|          }	| 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   )r0   r1   r&   r'   r4  r5  r   NrK   rB   r   r3  r   r   r   )
rY   r   r   r   r   r4  r5  r   r6  r   s
             r    	roundRectzSVGCanvas.roundRect  s     TXv ?BbeBrEbR##K00? ?4=? ?  	3>>$	22D""4(((((r"   leftc           	      6   |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    r|	s| j        d k    r|
r|d	vr|t          || j        | j                  }|d
k    r||z  }nU|dk    r	||dz  z  }nF|dk    r!|t          |||| j        | j                  z  }nt          dt          |          z             |                     |          }|                     t                    }|dk    r|d|                     |||          z  z   }|	r||                     t                    z  }n|dz  }|
r||                     t                     z  }n|dz  }t#          | j        df|||dd|z  z  d|}| j                            |          }|                    |           |r|                     ||          }| j                            |           d S d S d S )N   z+++ SVGCanvas.drawStringr   r4         r      )start	inheritedr:  endmiddle       @numericzbad value for text_anchor z rotate(%s);z fill:none;z stroke:none;r   ztranslate(0,%d) scale(1,-1))r0   r1   r   r   )r   r   r0  r   r   r   r   r   numericXShiftr`   r?   r   r   r)  r   EXTRA_FILL_STYLESEXTRA_STROKE_STYLESrK   rB   r   r   r   r   )rY   r   r0   r1   angler   text_anchortextRenderModer6  needFill
needStroketextLenstr   contents                  r    
drawStringzSVGCanvas.drawString  s   1ffQKK<:9:::!1$c(9c^Q=NcR`bcRc#Q&e.!*;e~q?PeTbdeTe
OT!!h!D4Et4K4KPZ4K"@@@%a
4>BB%%LAA (**OAA )++{1WTZWWWAA$%ACDTDT%TUUUQA"";//Bzz$++eQ*B*BBBr $d''(9:::m# &d''(;<<<o% !6 q71Q3?   D
 h--a00GW%%% 7~~dI66N&&t,,,,,I 5L4K4K4Kr"   rC  c                 \    | j         rt          d            | j        |||f||||d| d S )Nz+++ SVGCanvas.drawCentredStringrI  r   rJ  rK  r   r0  rQ  )	rY   r   r0   r1   rI  rJ  r   rK  r6  s	            r    drawCentredStringzSVGCanvas.drawCentredString  sY    <A@AAA!A 	<EYK-	< 	<1:	< 	< 	< 	< 	<r"   rB  c                 \    | j         rt          d            | j        |||f||||d| d S )Nz+++ SVGCanvas.drawRightStringrS  rT  )	rY   r   r0   r1   rI  rJ  r   rK  r6  s	            r    drawRightStringzSVGCanvas.drawRightString  sY    <?>???Qq 	<u	{-	< 	<1:	< 	< 	< 	< 	<r"   c                 :    | j                             |          }dS )zAdd a comment.N)rB   createComment)rY   r   comments      r    rZ  zSVGCanvas.comment  s     (((..r"   Tc                 d   t                      }|                    |d           t          t          j        |                                                    }| j                            t          | j	        d||||d|z   d| 
                    ddddd|d|z  z             z  	                     d S )
Npngimagezdata:image/png;base64,
matrix(%s)r   r   r4   )r0   r1   r&   r'   hrefr   )r   r)   r   base64	b64encoder   r   r   rK   rB   r   )rY   r]  r0   r1   r&   r'   embedbufs           r    	drawImagezSVGCanvas.drawImage
  s    ii

3uv'7788""dhw!%v1#5*T\\!Aa1VAaCZ-P-PP  	 	 	 	 	r"   c                    | j         d k    r|	 t          | j        dd|                     ||          d|                     ||          d|                     t                              }| j                            |           d S d S )	Nr   line)r0   r1   r   r   r   r   M  L z Zr   )r   rK   rB   r   LINE_STYLESr   r   r   )rY   r   r   r   r   rg  r   s          r    rg  zSVGCanvas.line  s    $$1
 !66#'<<2#6#6#6#6t||Br7J7J7J7JK''446 6 6D N&&t,,,,, %$r"   c                     t          | j        d||z   dz  ||z   dz  ||z
  dz  ||z
  dz  |                     t                              }|r|                     ||          }| j                            |           dS )z{Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2.

        These should have x1<x2 and y1<y2.
        ellipserD  )cxcyr4  r5  r   Nr8  )rY   r   r   r   r   r   rl  s          r    rl  zSVGCanvas.ellipse"  s    
  )2s{2s{2s{2s{##K002 2 2  	9nnWi88G""7+++++r"   c           
          t          | j        d||||                     t                              }|r|                     ||          }| j                            |           d S )Ncircle)rm  rn  r2   r   r8  )rY   xcycr2   r   rp  s         r    rp  zSVGCanvas.circle0  sm    txbA##K002 2 2  	7^^FI66F""6*****r"   c
                     	 d S N)r   r   r   r7   r   )rY   r   r   r   r   x3y3x4y4closedr   r   s               r    	drawCurvezSVGCanvas.drawCurve:  s
    r"   h  c                 p   ||z   dz  ||z   dz  }	}||z
  dz  ||z
  dz  }}
|
t          |t          z  dz            z  |z   }|t          |t          z  dz            z  |	z   }|
t          ||z   t          z  dz            z  |z   }|t          ||z   t          z  dz            z  |	z   }| j        }g j        }|r% |d |||	          d |||                     |r, |d ||
|          d|dk    d |||          fz             n6 |d |||           ||
|          d|dk    d |||          fz             |r |d |||	          z             t          | j        d	d
                    |j                  | 	                                          }| 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.
        rD     rh  ri  zA %s %d %d %d %sr   zM %s A %s %d %d %d %s ZzL %s Zr   rx   r   N)cospisinr   r7   rK   rB   ri   __self__r   r   r   )rY   r   r   r   r   r   r   
fromcenterrm  rn  r4  r5  mxmyaxayr   r   r   s                      r    drawArczSVGCanvas.drawArcG  s.    R%r"uckBR%r"uckB#hrk#o&&&+#hrk#o&&&+#x*3.///"4#x*3.///"4,I 	@AAWWR____ggb"ooo>??? 	VA wr263;772r??CD E E E E A'wr2BFCKGGBPROOTU V V V  	*AhR()))TXvhhqz""$*;*;*=*=? ? ?""4(((((r"   c                 r   t          |          dk    s
J d            | j        d k    s| j        d k    rd                    d |D                       }t	          | j        d||                     t                              }|r|                     ||          }| j	        
                    |           d S d S )Nr4   z"Polygon must have 2 or more pointsr  c                      g | ]}t          | S rt   r   r}   ps     r    r   z%SVGCanvas.polygon.<locals>.<listcomp>m      888AVQZ888r"   polygonpointsr   )r6   r   r   ri   rK   rB   r   r3  r   r   r   )rY   r  ry  r   ptspolylines         r    r  zSVGCanvas.polygoni  s    6{{a!Ed""dot&;&;))8888899C$TXy$"3"3K"@"@B B BH  ?>>(I>>N&&x00000 '<&;r"   c                     d S rt  )r   r   r7   r   )rY   lineListr  r&   r   rg  s         r    lineszSVGCanvas.linesx  s    r"   c           	      0   t          |          dk    s
J d            | j        d k    rmd                    d |D                       }t          | j        d||                     t          d                     }| j                            |           d S d S )Nr   z#Polyline must have 1 or more pointsr  c                      g | ]}t          | S rt   r   r  s     r    r   z&SVGCanvas.polyLine.<locals>.<listcomp>  r  r"   r  )r#  r  )	r6   r   ri   rK   rB   r   r3  r   r   )rY   r  r  r  s       r    polyLinezSVGCanvas.polyLine  s    6{{a!F$$))8888899C$TXz$"3"3KT"3"J"JL L LHN&&x00000	 %$r"   )r   c                     | j         rt          d           | j        }t          | j        dfi |}|                    |           || _        | j         rt          d           |S )Nz+++ begin SVGCanvas.startGroupr   z+++ end SVGCanvas.startGroup)r   r0  r   rK   rB   r   )rY   rE   r   r   s       r    
startGroupzSVGCanvas.startGroup  so    <@?@@@N	dh88x88e$$$<>=>>>r"   c                 p    | j         rt          d           || _        | j         rt          d           d S d S )Nz+++ begin SVGCanvas.endGroupz+++ end SVGCanvas.endGroup)r   r0  r   )rY   r   s     r    endGroupzSVGCanvas.endGroup  sA    <>=>>>"<<;<<<<<<<r"   c           	         | j         rt          d||||||           | j                            d          }||||||fdk    r?d|                     ||||||          z  }| j                            d|d|           d S d S )Nz!!! begin SVGCanvas.transformr   )r   r   r   r   r   r   r^  rx   )r   r0  r   rA   r   r@   )	rY   r~   r   r+   r   er   trts	            r    r   zSVGCanvas.transform  s    <Q>1aAqQQQ^((55q!Q1!333t||Aa!Aa888AN''AA5FGGGGG 43r"   c           
          ||fdk    rQ| j                             d| j                             d          dd|                     ||          z             d S d S )N)r   r   r   rx   ztranslate(%s))r   r@   rA   r   rY   r0   r1   s      r    	translatezSVGCanvas.translate  ss    a5E>>N''>..{;;;;#dll1Q&7&77769 : : : : : >r"   c           
          ||fdk    rW| j                             d| j        d                             d          dd|                     ||          z             d S d S )N)r   r   r   r_  rx   z	scale(%s))r   r@   groupsrA   r   )rY   sxsys      r    scalezSVGCanvas.scale  sz    r7eN''{233K@@@@#dll2r&:&:::6< = = = = = r"   c                 R    | j         d|                     ||          z  z   | _         d S )NzM %s r   r   r  s      r    moveTozSVGCanvas.moveTo  '    I$++a*;*; ;;			r"   c                 R    | j         d|                     ||          z  z   | _         d S )NzL %s r  r  s      r    lineTozSVGCanvas.lineTo  r  r"   c           
      Z    | j         d|                     ||||||          z  z   | _         d S )NzC %s r  )rY   r   r   r   r   ru  rv  s          r    curveTozSVGCanvas.curveTo  s/    I$++b"b"b"*M*M MM			r"   c                 $    | j         dz   | _         d S )NzZ )r   rY   s    r    	closePathzSVGCanvas.closePath  s    I$			r"   c                     d S rt  rt   r  s    r    	saveStatezSVGCanvas.saveState      r"   c                     d S rt  rt   r  s    r    restoreStatezSVGCanvas.restoreState  r  r"   )r   r\   r   Frt  )NN)r.  r.  N)r   Nr:  r   )r   rC  Nr   )r   rB  Nr   )T)r   )r   r{  r   )r   N)/rj   rk   rl   rR   r)   r   r   r   r   r3  r   r   r   r  r   r$  r&  r   r   r   r   r9  rQ  rU  rW  rZ  re  rg  rl  rp  rz  r  r  r  r  r   r  r  r   r  r  r  r  r  r  r  r  rt   r"   r    r%   r%      s8       j( j( j( j(X   $. . . . $&r & & & &    , )*TVZ 
 
 
 
3 3 33 3 3 a 	= 	= 	= 	=1 1 1/ / /2 2 2/ / /
3 3 3(  ) ) ) )") ) ) ) +- +- +- +-Z ?G+,< < < < ?D+,< < < </ / /
 
 
 

- 
- 
-, , , ,+ + + +) ) ) ) )  )  )  )D1 1 1 1P P P P1 1 1 "&!3!3!3    = = =
H H H: : := = =< < << < <N N N% % %      r"   r%   c                       e Zd ZdZd Zd Zdddddd	d
dZd Zd Zd Z	d Z
d Zd Zd Zd Zd Zd ZefdZd Zd ZdS )r-   z%This draws onto an SVG document.
    c                     d| _         d S )Nr   )r   r  s    r    rR   z_SVGRenderer.__init__  s    r"   c                    | j         rt          d|z             | j                            d|z             | j        j                                        }t          |t                    r|j        s	 t          |          }| j
                            |           |                     |i            |                     |           | j
                                        }t          |t                    r|j        s	 | j                            d|z             |                                D ]/\  }}|| j        v r!t#          | j        | j        |         |           0|| j        _        | j         rt          d|z             dS 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   r0  _canvasrZ  r   r   r  r   
isClipPathr	   _trackerpushapplyStateChangesdrawNodeDispatcherr   r>   	_restoressetattr)rY   rD   r   deltasrDeltasr   r   s          r    drawNodez_SVGRenderer.drawNode  s    <LDtKLLL_T1222"''))4&& 	4? 	 t$$6"""vr*** 	%%%-##%%4&& 	4? 	]4/000 MMOO 	: 	:DAqDN""T^A%6q999"<JBTIJJJJJJJr"   r   r   r   r   r   r   r   )r   strokeWidthstrokeLineCapstrokeLineJoin	fillColorr   r   c                 b    t          |dd          pd}t          |dd          pd}|r||ddS d S )NhrefURLrg   	hrefTitle_top)z
xlink:hrefzxlink:titletarget)getattr)rY   objurlr   s       r    _get_link_info_dictz _SVGRenderer._get_link_info_dict  sQ     c9b))/R["--3 	 "%EFKKK$ 4r"   c                    | j         rt          d           | j                                        }| j                                        d         \  }}}}}}|                                D ]C}	t          |	t                    r|		                                }
n|	}
| 
                    |
           D| j                            ||||||           | j                            |           | j         rt          d           d S d S )Nz ### begin _SVGRenderer.drawGroupr   z### end _SVGRenderer.drawGroup)r   r0  r  r  r  getStategetContentsr  r   provideNoder  r   r  )rY   r   r   r~   r   r+   r   r  r   	childNodenode2s              r    	drawGroupz_SVGRenderer.drawGroup	  s   <BABBBL++--	=1133K@1aAq**,, 	! 	!I)X.. "!--//!MM%    q!Q1a000i(((<@?@@@@@@@r"   c                    |                      |          }t          |di           }|j        |j        cxk    rdk    rAn n> | j        j        |j        |j        |j        |j        z   |j        |j	        z   fd|i| d S  | j        j
        |j        |j        |j        |j        z   |j        |j	        z   |j        |j        fd|i| d S )Nr6  r   r   )r  r  r4  r5  r  r   r0   r1   r&   r'   r9  )rY   r   r   r   s       r    drawRectz_SVGRenderer.drawRect  s   ,,T22	4B//7dg"""""""""DLFDFF4:%tvdk'9\ \EN\RZ\ \ \ \ \ #DL"FDFF4:%tvdk'9GTW5 5 (	5 ,4	5 5 5 5 5r"   c           
         | j                                         }|d         |j        |j        |j        f\  }}}} | j        j        |||f|                     |          |t          |dd          dt          |di            d S )N
textAnchorrK  r   )r   rJ  rK  r6  )	r  r  r0   r1   r   r  rQ  r  r  )rY   	stringObjSrJ  r0   r1   r   s          r    rQ  z_SVGRenderer.drawString*  s    M""$$"#L/9;	Y^"[Q4Qq 	943K3KI3V3V'	JZ[\8]8]	9 	9iB77	9 	9 	9 	9 	9r"   c                     | j         j        r3| j                             |j        |j        |j        |j                   d S d S rt  )r  r   rg  r   r   r   r   )rY   rg  s     r    drawLinez_SVGRenderer.drawLine1  sF    <$ 	BLdgtwAAAAA	B 	Br"   c                     | j                             |j        |j        |j        |                     |                     d S N)r   )r  rp  rm  rn  r2   r  )rY   rp  s     r    
drawCirclez_SVGRenderer.drawCircle5  s<    VY	68tG_G_`fGgGghhhhhr"   c           	         |                                 \  }}}|dk    s||dk    s|w|j        sp|j        |j        |j        |j        |j        f\  }}}}}	|j        p|j        }||z
  ||z
  }}
||z   ||z   }}|	|z
  }| j        	                    |
|||||d           d S |
                                }t          |t                    r|                     |           d S |                     |           d S )Nr   r   )r  )
_xtraRadiiannularcenterxcenteryradiusstartangledegreesendangledegreesyradiusr  r  	asPolygonr  r   drawPathdrawPolygon)rY   wedger  radius1yradius1r  r  r  r  r  r   r   r   r   r   r9   s                   r    	drawWedgez_SVGRenderer.drawWedge8  s$   %*%5%5%7%7"(QJJ'/!x?OY^Yf?O]EM5<9PRWRgg IGWf&7m3u|GRR$'88FL  RR1BFWX YYYYY!!A!D!! $a       #####r"   c                 z    | j         j        r.| j                             t          |j                             d S d S rt  )r  r   r  r;   r  rY   r  s     r    drawPolyLinez_SVGRenderer.drawPolyLineI  s?    <$ 	=L!!/!(";";<<<<<	= 	=r"   c           	          |j         |j        z
  }|j         |j        z   }|j        |j        z
  }|j        |j        z   }| j                            |||||                     |                     d S r  )rm  r4  rn  r5  r  rl  r  )rY   rl  r   r   r   r   s         r    drawEllipsez_SVGRenderer.drawEllipseM  so    Z'*$Z'*$Z'*$Z'*$R2bD4L4LW4U4UVVVVVr"   c                     | j                             t          |j                  d|                     |                     d S )Nr   )ry  r   )r  r  r;   r  r  r  s     r    r  z_SVGRenderer.drawPolygonU  s>    _QX66qDLdLdefLgLghhhhhr"   c                   	
 ddl m	 | j        }|j        |j        |j        |j        f
|t          dt                    }| 	                              }t          dd          }	
fd}|dk    r* |             |
                    g j        ||           d S |d	k    r, |d
           |
                    g j        ||           d S  |            }|sn|j        }|                    d            	 d }|
                    g j        ||           |                    |           d S # |                    |           w xY w|
                    g j        ||           d S )Nr   )_renderPathr   	autocloserg   c                       fi | S rt  rt   )r   r  	drawFuncsr   s    r    rPz!_SVGRenderer.drawPath.<locals>.rPa  s    ;tY77$777r"   r   )r   r   r   pdfT)
forceClose)reportlab.graphics.shapesr  r  r  r  r  r  r  r   r  r   r  r   r$  )rY   r   r   r+   r   r  r   isClosedofcr  r  s    `       @@r    r  z_SVGRenderer.drawPathX  s   999999LXqxAK@	tJ}==H,,T22	DR00		8 	8 	8 	8 	8 	8 	8eBDDDRdoU]^^^^^B$RdoU]^^^^^rttH 	clt$$$( $I$$Rdo]e$fffNN3'''''ANN3''''  $/YYa bbbbbs   ; D2 2E	c                    |j         }t          |t                    rE|rt          j                             |          sd S t                                          |          }nt          |d          r|}nd S |j        \  }}|j	        |j
        }}||}||}| j                            ||j        |j        ||d           d S )NconvertT)rc  )r   r  r?   osisfiler   r   r   r   r&   r'   r  re  r0   r1   )rY   r]  r   imsrcWsrcHdstWdstHs           r    re  z_SVGRenderer.drawImagev  s    zd3 	:RW^^D11:FF!!$''BBT)$$ 	BBFW
d[%,d<<r57EGT4tLLLLLr"   c                    |                                 D ]\  }}|dk    r|dk    r| j                            |           .|dk    r| j                            |           O|dk    r| j                            |           p|dk    r| j                            |           |dk    r|rt          |t          t          f          rFt          |          dk    r3t          |d         t          t          f          r|d	         }|d         }nd	}| j        
                    ||           | j        
                                 5|d
k    r| j                            |           W|dv r]|                    d| j        j                  }|                    d| j        j                  }| j                            ||           |dk    r| j                            |           dS )z\This takes a set of states, and outputs the operators
        needed to set those propertiesr   r   r  r  r  strokeDashArrayr4   r   r   r  )r   r   r   r   r   N)r>   r  r   r   r   r   r  rQ   r  r6   r  r$  getr   r   r   r&  )rY   deltanewStatekeyvaluer  fontnamefontsizes           r    r  z_SVGRenderer.applyStateChanges  s     ++-- 	0 	0JCk!!%%++E2222%%))%0000''''....(((((////))) +!%e55 "#e**a--JW\]^W_afgk`lLmLm- %a %a !L((u5555L((****##))%0000000 99Z1CDD 99Z1GHH$$Xx8888
""((///;	0 	0r"   N)rj   rk   rl   rm   rR   r  r  r  r  r  rQ  r  r  r  r  r  r  r   r  re  r  rt   r"   r    r-   r-     sD          K K K@  .\Zd!,QX&( (I  >A A A 5 5 5"9 9 9B B Bi i i$ $ $"= = =W W Wi i i '4 c c c c<M M M!0 !0 !0 !0 !0r"   r-   out-svgc                    t           j                            |           st          j        |            ddlm} g }t          |          D ]R}|dd         dk    rBt          ||          } |            }t          |dd          }|                    ||f           Sd}|D ]=\  }}t           j        	                    | d|z            }	t          ||	           |dz  }>d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
   
getDrawingrm   rg   zrenderSVG_%d.svgr   )getDrawing01ztest.svg)RL_CorpLogo)Drawingzcorplogo.svg)r  r   isdirmkdirreportlab.graphicsr  dirr  r7   ri   r   reportlab.graphics.testshapesr  reportlab.lib.corpr  r  r  r&   r'   add)outDirr  drawingsfuncnamefuncr.   	docstringr:   r   filenamer  r  r  rls                 r    testr.    s    7==   
------H
OO 2 2AbD>\)):h//DdffGYr22IOOWi0111	A"  I7<<'9A'=>>1h	Q::::::Aq"',,vj11222......111111	B##AEE"IIIq"',,vn5566666r"   __main__rt  )r  ):rm   mathr^   r  rS   ra  ior   r   reportlab.pdfbase.pdfmetricsr   reportlab.lib.rl_accelr   reportlab.lib.utilsr   reportlab.graphics.renderbaser	   r
   r   r  r   r   r   	reportlabr   r   r   r   reportlab.pdfgen.canvasr   r   renderPMr   xml.domr   r  r~  r  r   r3  rj  r)  rH  rG  r   r!   r   r(   r;   rK   rQ   rM   r   r   r%   r-   r.  rj   rt   r"   r    <module>r:     sI  	 % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $                 4 4 4 4 4 4 ) ) ) ) ) ) ( ( ( ( ( ( V V V V V V V V V V D D D D D D D D D D ' ' ' '       < < < < < < < < < < @ @ @ @ @ @ @ @       ( ( ( ( ( ( h
h	W D  J  J  L  LgmmooLRRTTlrrtt '--//  "+!7     $-#9     1G R R R R
 
 
   >$ $ $ $ $D $ $ $N 	yI9yI9
H H Hf f f f f f f fPg0 g0 g0 g0 g08 g0 g0 g0R 7  7  7  7D ZDFFFFF r"   