U
    '1et                     @   s  d Z dZddlT ddlmZmZ ddlmZmZ ddl	m
Z
 ddlmZ dd	lmZmZ dd
lZdd
lZddlmZmZ ddlmZmZmZmZ d7ddZzeejZW n ek
r   d
ZY nX dd Zdd Zej fddZ!ddlm"Z" G dd de"Z#dd Z$dd Z%dd Z&d8ddZ'd Z(G d!d" d"Z)d#d$d
ej ejfd%d&Z*d#d$d
ej ejfd'd(Z+d#d$d
ej ejfd)d*Z,d+d#d$d
ej ejfd,d-Z-d+d#d$d
ej ejfd.d/Z.e-Z/d9d2d3Z0e1d4kre0d5d6 d
S ):z3.3.0a$  Render drawing objects in common bitmap formats

Usage::

    from reportlab.graphics import renderPM
    renderPM.drawToFile(drawing,filename,fmt='GIF',configPIL={....})

Other functions let you create a PM drawing as string or into a PM buffer.
Execute the script to see some test drawings.    )*)getStateDeltarenderScaledDrawing)getFont
unicode2T1)	isUnicode)	rl_config   )setFontRenderPMErrorN)BytesIOStringIO)sincospiceilc                 C   s   | s
t j} | dkrnzdd l}W q tk
rj } z.zdd l}W n tk
rX   tdY nX W 5 d }~X Y qX n~d|  krzdd l}W q tk
r } z6zdd l}W n$ tk
r   td|  dY nX W 5 d }~X Y qX ntd|  |S )N	_renderPMr   zCannot import desired renderPM backend, {backend}.
No module named _rl_renderPM
it may be badly or not installed!
You may need to install development tools
or seek advice at the users list see
https://pairlist2.pair.net/mailman/listinfo/reportlab-userscairoz'cannot import desired renderPM backend z^
Seek advice at the users list see
https://pairlist2.pair.net/mailman/listinfo/reportlab-userszInvalid renderPM backend, )r   renderPMBackendZ_rl_renderPMImportError	rlPyCairor   lower)backendMZerrMsg r   ?/tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/renderPM.py_getPMBackend   s(     "*r   c                  C   s2   zddl m}  W n tk
r,   dd l} Y nX | S )Nr   Image)PILr   r   r   r   r   r   	_getImage<   s
    r    c                 C   sF   | rBdt d| j @ d> dt d| j @ d> B dt d| j @ B S | S )N         )intZredZgreenZblue)cr   r   r   	Color2HexC   s     >r&   c                 C   s"   t  }|jt| ||||d dS )z
As it saysshowBoundaryN)_PMRendererdrawr   )drawingZcanvasxyr(   Rr   r   r   r*   I   s    r*   )Rendererc                   @   s   e Zd Z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dZdd Zdd Zdd Zdd ZdS )!r)   zThis draws onto a pix map image. It needs to be a class
    rather than a function, as some image-specific state tracking is
    needed outside of the state info in the SVG model.c                 C   s   | j   |   d S N)_trackerpop
applyStateselfr   r   r   r2   T   s    
z_PMRenderer.popc                 C   s    t |}| j| |   d S r0   )r   r1   pushr3   )r5   nodedeltasr   r   r   r6   X   s    z_PMRenderer.pushc                 C   s  | j  }|d | j_|d | j_|d }|d k	r:|| j_| j|d  |d | j_|d | j_|d | j_	|d }|sd }n:t
|ttfs|f}t|d	kst
|d
 ttfsd|f}|| j_|d }|d k	r|| j_| j|d  | j|d |d  d S )NctmstrokeWidthstrokeOpacitystrokeColorZstrokeLineCapZstrokeLineJoinfillModeZstrokeDashArray   r	   r   fillOpacity	fillColorfontNamefontSize)r1   getState_canvasr9   r:   r;   setStrokeColorlineCaplineJoinr=   
isinstancelisttuplelen	dashArrayr?   setFillColorr
   )r5   salphadar   r   r   r3   ]   s.    
z_PMRenderer.applyStatec                 C   sH   | j jd }| jjdd ||f  |d< |d< | j | |   d S )Nr      Z	transformr9   )r1   Z	_combinedrD   _baseCTMr6   r3   )r5   r,   r-   r8   r   r   r   	initStatew   s    $z_PMRenderer.initStatec                 C   s    |  | | | |   dS )zEThis is the recursive method called for each node
        in the treeN)r6   ZdrawNodeDispatcherr2   )r5   r7   r   r   r   drawNode}   s    

z_PMRenderer.drawNodec                 C   s`   | j }|j|j  krdkr<n n||j|j|j|j n ||j|j|j|j|j|j d S )Nr   )	rD   rxryrectr,   r-   widthheight	roundRect)r5   rX   r%   r   r   r   drawRect   s    z_PMRenderer.drawRectc                 C   s   | j |j|j|j|j d S r0   )rD   linex1y1x2y2)r5   r]   r   r   r   drawLine   s    z_PMRenderer.drawLinec              
   C   s   |j }t|tr8|r tj |s$d S t |d}nt|drN|d}nd S |j	\}}|j
|j }}|d krv|}|d kr|}| j|j|j||| jjdkr|nt|dr|jn|j ||d d S )NRGBconvertr   tobytes   )pathrH   strosisfiler    openrd   hasattrsizerY   rZ   rD   	_aapixbufr,   r-   _backendre   tostring)r5   imagerg   imZsrcWZsrcHZdstWZdstHr   r   r   	drawImage   s2    
 

       z_PMRenderer.drawImagec                 C   s&   | j }||j|j|j |  d S r0   )rD   circlecxcyrfillstrokepath)r5   rt   r%   r   r   r   
drawCircle   s    z_PMRenderer.drawCircler   c                 C   s   |j }t|dkstd| j}|  ||d |d  tdt|dD ]}||| ||d   qL|r~|  |	  |
  d S )Nr>   z#Polyline must have 1 or more pointsr   r	   )ZpointsrK   AssertionErrorrD   	pathBeginmoveTorangelineTo	pathClosepathFill
pathStroke)r5   Zpolyline_doClosePr%   ir   r   r   drawPolyLine   s    z_PMRenderer.drawPolyLinec                 C   s*   | j }||j|j|j|j |  d S r0   )rD   ellipseru   rv   rV   rW   rx   )r5   r   r%   r   r   r   drawEllipse   s    z_PMRenderer.drawEllipsec                 C   s   | j |dd d S )Nr	   )r   )r   )r5   Zpolygonr   r   r   drawPolygon   s    z_PMRenderer.drawPolygonc                 C   s   | j }|j}t|dd}|d k	s$|r| j }|d }|d }|d }|j}	|j}
|j}|dkrt|	||}|dkr~|
|8 }
nH|dkr|
|d	 8 }
n2|d
kr|
t	||	||||j
8 }
ntdt| |j}||_z|j|
||	||fd W 5 ||_X d S )NtextRenderModer   Z
textAnchorrA   rB   )startZ	inheritedendmiddler>   numericzbad value for textAnchor )	_fontInfo)rD   r@   getattrr1   rC   textr,   r-   stringWidthnumericXShiftencoding
ValueErrorrh   r   
drawString)r5   Z	stringObjZcanvfillr   Stext_anchorrA   rB   r   r,   r-   textLenZoldTextRenderModer   r   r   r      s2    

z_PMRenderer.drawStringc           	         s  | j tkrPjd= jrDjd }|j}d|_| | ||_n  d S ddlm  jj	j
jftdd}d fdd		}jr|    j jd k	}jd k	}td
d}|dkr<|r
|r
|dd | |    n0|r&|dd | n|r|    nN|dkrp|dd |r`| |r  n| r|   d S )NrQ   r	   r   )_renderPath	autoclose Fc                    s       | dS )NZ
forceClose)r{   r   r   r%   Z	drawFuncsrg   r   r   rP   s    z _PMRenderer.drawPath.<locals>.rPr=   svgTr   pdf)F)rD   ZEmptyClipPath
_clipPathsZ
isClipPathdrawPathZclipPathClearreportlab.graphics.shapesr   r|   r~   curveTor   r   ZclipPathSetappendr@   r<   r   r   )	r5   rg   r   Zicpr   r   r   stroker=   r   r   r   r      sV    














z_PMRenderer.drawPathN)r   )__name__
__module____qualname____doc__r2   r6   r3   rT   rU   r\   rb   rs   ry   r   r   r   r   r   r   r   r   r   r)   O   s   
r)   c                 C   s   t  }| jd|j|jdS )Nr   ZditherZpalette)r    rd   NONEADAPTIVE)rr   r   r   r   r   _convert2pilp  s    r   c                 C   s
   |  dS )NLrd   rr   r   r   r   _convert2pilL  s    r   c                 C   s
   |  dS )N1r   r   r   r   r   _convert2pil1  s    r   c           	   	   C   s   t | } | j\}}t||t| dr*| jn| j | j }t|dst	t
j|d d |  d}|| W 5 Q R X t
jdkrddlm} ||dd	 n
|| d S )
Nre   writer   .wbmacmarkfilenamePICText)r   rm   
_pmBackendZpil2pictrl   re   rp   rr   Z
getpaletterk   ri   rg   splitextr   r   namereportlab.lib.utilsr   )	rr   fnfmttransparentcolsZrowsrN   fr   r   r   r   _saveAsPICT  s    
*
$
r   gOQ?c                   @   s  e Zd ZdBddZedCdd	ZdDd
dZdd ZdEddZdFddZ	dd Z
dGddZdd Zdd ZdHddZdd Zd d! Zd"d# ZdId%d&Zd'd( ZdJd*d+Zd,d- ZdKd.d/Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; ZeZd<d= Zd>d? Zd@dA Z dS )LPMCanvasH    Nrc   c           	      C   s   |d }t || d }t || d }| ||||| jd< || jd< |dd|ddf| jd< g | jd< || jd< || jd	< t| jjttkrd
nd| jd< || jd< | j| _dS )z-configPIL dict is passed to image save methodg      R@g      ?_gs_bgr   rS   r   	configPIL_dpir   r   ro   Z_backendfmtN)	r$   
_getGState__dict__typer   rn   powrS   r9   )	r5   whdpibgr   r   Z
backendFmtZscaler   r   r   __init__*  s    



"
zPMCanvas.__init__RGB24c              	   C   s   t |}|d krtj}|dkrnz|j| ||dW S  tk
rj   z|j| |||dW  Y S    Y nX Y qX nFd| krz|j| |||dW S  tk
r   |j| ||d Y S X td|d S )Nr   r   r   r   z.Cannot obtain PM graphics state using backend )	r   r   r   gstate	TypeErrorZGStater   AttributeErrorRuntimeError)r   r   r   r   r   modr   r   r   r   ;  s"    zPMCanvas._getGStatec           	      C   s   |d kr| j }|| | j_| j_d d d d d d d d}| j}|j|j }}| D ]}t||||< qP~| `t	j
|||d }| jd< | D ]}t| |||  q||| d S )N)r9   r:   r<   rF   rG   rL   r@   r   r   )r   Z_drawingrY   rZ   r   rA   rB   keysr   r   r   r   setattrr
   )	r5   r   r   r   AgsZfNZfSkr   r   r   _drawTimeResizeO  s     zPMCanvas._drawTimeResizec                 C   s.   t  jd| jj| jjfd}|| jj |S )Nrc   )rm   )r    newr   rY   rZ   Z	frombytespixBuf)r5   rr   r   r   r   toPIL]  s    zPMCanvas.toPILc              
   C   s~  |   }|d krPt|ts*tdt| tj|d }|drP|dd  }| j	pXi }|
dd  |d}|r|||}| }|dkrt|}n|dkr|drt|}n&|drt|}n|d	rt|}d
}nJ|dkr t||||dd dS |dkrn|dkrd}ntd| |d
kr|dd }|rddlm}m} ddg }	td| D ]\}
}d|	|
| < ql|d| |||	dddg dg f }d| jfdfD ]\}}|||||< q|
dd |drddlm} ||}|
dd  |d}|r:||}|j||f| t |dsztj!dkrzddl"m#} |||d  d S )!Nz*Invalid value '%s' for fn when fmt is Noner	   r   preConvertCB)GIF)TIFFZTIFFPZTIFFLZTIFZTIFF1r   r   r   r   )ZPCTr   r   )r   )ZPNGZBMPZPPM)ZJPGJPEGr   zUnknown image kind %sr   )
ImageChopsr   i   )r      i   r!   ZRGBA
resolution)zresolution unitZinchZchops_invert)r   	preSaveCBr   r   r   r   )$r   rH   rh   r   asciiri   rg   r   
startswithr   
setdefaultr2   upperr   endswithr   r   r   getr   r   r   r   zipZ
bitmap_rgbmergesplitinvertZpointrd   r   saverl   r   r   r   )r5   r   r   rr   r   r   Ztcr   r   Tor%   adr   r   r   r   r   
saveToFileb  sh    

 












:

zPMCanvas.saveToFiler   c                 C   s   t  }| j||d | S )Nr   )r   r  getvalue)r5   r   rN   r   r   r   saveToString  s    zPMCanvas.saveToStringc           	      C   s   ddl }| j}|j|j|j  }}}||ddt|d ddd||dd
 |d	 }tt|d| D ]}|||| |  qh|d
 dS )z
        Niki Spahiev, <niki@vintech.bg>, asserts that this is a respectable way to get BMP without PIL
        f is a file like object to which the BMP is written
        r   Nz=2sLLLLLLhh24xZBM6   (   r	      rf   z              )	structr   r   rY   rZ   r   packrK   r}   )	r5   r   r  r   ZpixrY   rZ   Zrowbr   r   r   r   
_saveToBMP  s    *zPMCanvas._saveToBMPc                 C   s   t | j|| d S r0   )_setFontr   )r5   rA   rB   leadingr   r   r   r
     s    zPMCanvas.setFontc                 C   s   t | j|| d S r0   )r   r   )r5   r   valuer   r   r   __setattr__  s    zPMCanvas.__setattr__c                 C   s   t | j|S r0   )r   r   )r5   r   r   r   r   __getattr__  s    zPMCanvas.__getattr__r	   c                 C   s   |r|    |r|   d S r0   )r   r   )r5   r   r   r   r   r   rx     s      zPMCanvas.fillstrokepathc                 C   s"  t || dksttt| d }tt| d }|||  }	|||  }
tt| d }tt| d }|||  }|||  }| | }|| }t||  d }t ddt|  t| }|	||  }|
||  }| | }|| }|||  }|||  }|	|
f||f||f||fffS )a-  compute the control points for a bezier arc with theta1-theta0 <= 90.
        Points are computed for an arc with angle theta increasing in the
        counter-clockwise (CCW) direction.  returns a tuple with starting point
        and 3 control points of a cubic bezier curve for the curvto opertatorZ   g     f@g     v@gUUUUUU?g      ?)absrz   r   r   r   )r5   ru   rv   rV   rW   theta0theta1Zcos0Zsin0x0y0Zcos1Zsin1x3y3Zdx1Zdy1ZhalfAngr   r^   r_   Zdx2Zdy2r`   ra   r   r   r   _bezierArcSegmentCCW  s(    

zPMCanvas._bezierArcSegmentCCWc              	   C   s   || }t |dkr ||fg}nTttt |d }	t||	 }
g }t|	D ]&}|||
  }||
 }|||f qLg }|D ]Z\}}|s| ||||||\\}}}|| q|| ||||||\\}}}|| q|||f|fS )zreturn a set of control points for Bezier approximation to an arc
        with angle increasing counter clockwise. No requirement on (theta1-theta0) <= 90
        However, it must be true that theta1-theta0 > 0.g     V@)r  r$   r   floatr}   r   r  )r5   ru   rv   rV   rW   r  r  ZangularExtentZ	angleListZNfragZ	fragAngleiir   bctrlptsr  r  ZptsZtmpxZtmpyr   r   r   bezierArcCCW  s$    zPMCanvas.bezierArcCCWc              	   C   s\   |  ||||||\\}}}	| || |	D ]*\\}
}\}}\}}| |
||||| q,dS )zadds an ellisesoidal arc segment to a path, with an ellipse centered
        on cx,cy and with radii (major & minor axes) rx and ry.  The arc is
        drawn in the CCW direction.  Requires: (ang2-ang1) > 0N)r  r~   r   )r5   ru   rv   rV   rW   Zang1Zang2r  r  r  r^   r_   r`   ra   r  r  r   r   r   addEllipsoidalArc  s    zPMCanvas.addEllipsoidalArcr   c                 C   s   | j ||||d d S )Nr   r   )r5   r,   r-   r   r   r   r   r   drawCentredString  s    zPMCanvas.drawCentredStringc                 C   s   | j |||dd d S )Nr   r  r  )r5   r   r,   r-   r   r   r   drawRightString	  s    zPMCanvas.drawRightStringleftc                 C   s  | j }|j}|j}|r8|||fkr8|\}	}
t||	|
 n|}	|}
z|dkrt||	|
}|dkrj||8 }n2|dkr||d 8 }n|dkr|t||||	|
8 }| jdkr|||| nHt	|	}|j
r|||| n(|}t|svz|d}W n tk
rt } z`|jdd	 \}}t|jd d	 d
|jd	 ||d | ||| |||d  f f  W 5 d }~X Y nX t||g|j }t|}|d }t|D ]^}|| \}}||krt||j|
 |}|||| ||kr||||j|
7 }qW 5 ||| X d S )N)r   r   r   r   r   g       @r   r   utf8r>   rR   z%s
%s-->%s<--%s
   r	   )r   rB   rA   r
  r
   r   r   ro   r   r   Z_dynamicFontr   decodeUnicodeDecodeErrorargsr   ZsubstitutionFontsrK   r}   ZencName)r5   r,   r-   r   r   r   r   Zgs_fontSizeZgs_fontNamerA   rB   r   fontZfcer   jZFTnZnm1r   tr   r   r   r     sR    


\

 zPMCanvas.drawStringc                 C   s6   | j d k	r2|   | || | || |   d S r0   )r<   r{   r|   r~   r   )r5   r^   r_   r`   ra   r   r   r   r]   >  s
    
zPMCanvas.linec                 C   sb   |    | || | || | | || ||  | |||  |   | j||d d S )N)r   r   )r{   r|   r~   r   rx   )r5   r,   r-   rY   rZ   r   r   r   r   r   rX   E  s    zPMCanvas.rectc           	      C   s   |dkr|}|dkr|}|| }|| }|    | || | | || || ||dd | || || ||dd | || || ||dd | || || ||dd |   |   dS )zrect(self, x, y, width, height, rx,ry):
        Draw a rectangle if rx or rx and ry are specified the corners are
        rounded with ellipsoidal arcs determined by rx and ry
        (drawn in the counter-clockwise direction)r   i  ih  r     N)r{   r|   r  r   rx   )	r5   r,   r-   rY   rZ   rV   rW   r`   ra   r   r   r   r[   N  s      zPMCanvas.roundRectc                 C   s   |  |||| dS )zRadd closed path circle with center cx,cy and axes r: counter-clockwise orientationN)r   )r5   ru   rv   rw   r   r   r   rt   `  s    zPMCanvas.circlec                 C   s\  |    || }|}|}|| }|| }	||t  }
||t  }|}| || | |	|
|||| |}|}|| }|}||t  }	|| }
|}||t  }| |	|
|||| |}|}|}|| }|| }	||t  }
||t  }|| }| |	|
|||| |}|}|| }|}||t  }	|| }
|| }||t  }| |	|
|||| |   dS )zadd closed path ellipse with center cx,cy and axes rx,ry: counter-clockwise orientation
        (remember y-axis increases downward) N)r{   BEZIER_ARC_MAGICr|   r   r   )r5   ru   rv   rV   rW   r  r  r  r  r^   r_   r`   ra   r   r   r   r   d  sN    zPMCanvas.ellipsec                 C   s   dS )zdo nothing for compatibilityNr   r4   r   r   r   	saveState  s    zPMCanvas.saveStatec                 C   s(   t || _t|dd }|d k	r$|| _d S NrO   )r&   r@   r   r?   r5   ZaColorrO   r   r   r   rM     s    
zPMCanvas.setFillColorc                 C   s(   t || _t|dd }|d k	r$|| _d S r0  )r&   r<   r   r;   r1  r   r   r   rE     s    
zPMCanvas.setStrokeColorc                 C   s
   || _ d S r0   )rF   )r5   capr   r   r   
setLineCap  s    zPMCanvas.setLineCapc                 C   s
   || _ d S r0   )rG   )r5   joinr   r   r   setLineJoin  s    zPMCanvas.setLineJoinc                 C   s
   || _ d S r0   )r:   )r5   rY   r   r   r   setLineWidth  s    zPMCanvas.setLineWidth)r   r   NNrc   )Nr   )N)N)r   )N)r	   r	   )r   )Nr"  )r	   r	   )!r   r   r   r   staticmethodr   r   r   r  r  r	  r
   r  r  rx   r  r  r  r   r!  r   r]   rX   r[   rt   r   r/  rM   rE   ZrestoreStater3  r5  r6  r   r   r   r   r   )  s@     


8


#

2
	;r   r   r   c                 C   s6   t | } t| j| j||||d}t| |dd|d |S )N)r   r   r   r   r   r'   )r   r   rY   rZ   r*   )r   r   r   r   r(   r   r%   r   r   r   drawToPMCanvas  s    r8  c                 C   s   t | |||||d S )Nr   r   r   r(   r   )r8  r   )r   r   r   r   r(   r   r   r   r   	drawToPIL  s    r:  c                 C   s.   t  }t| |||||d}|jd|j|jdS )Nr9  r   r   )r    r:  rd   r   r   )r   r   r   r   r(   r   r   rr   r   r   r   
drawToPILP  s    r;  r   c           	      C   s$   t | |||||d}||| dS )zocreate a pixmap and draw drawing, d to it then save as a file
    configPIL dict is passed to image save methodr9  N)r8  r  )	r   r   r   r   r   r   r(   r   r%   r   r   r   
drawToFile  s    r<  c              	   C   s$   t  }t| ||||||d | S )N)r   r   r   r   r   )r   r<  r  )r   r   r   r   r   r(   r   rN   r   r   r   drawToString  s    r=  pmoutFc              
      s  dd }dd l }ddlm} ddlm |j}g }|j| sH||  d}d}|g}	i }
t	j
dd  }d	d
 |D }|sdddddddg}n.|D ]}|| qddd
 |D d}g  dd lddlm  fdd}|ttddD ]\}}}|
|dd  }|
|< |dkr6|d|d  7 }|rH||krHq|}t|j}t|j}|	d||f  |D ]F}|dkr|	d|   z d|||f }|j| |}|j|r|| |dkrddlm} t|||d|id  n.|d!kr|jddg| |d" nt|||d# |d$krF|	d%|  n2|dkr`|	d&|  n|dkrx|	d'|  sd(krtd)t|  W n  t k
r   ||| Y nX qv|j!"d*d+d,krd|j#d-< d.D ]4}z|j|g| |d" W n   ||| Y nX qq rH|	d $d/d0|	d< |	d1 |	%  |	| |j| d2}t&|d3}|'|	 W 5 Q R X t	j(d4krdd5l)m*} ||d6d7 sd(krtd)|  d S )8Nc                 S   s   | dkrd} | S )NtiffZtifr   )r,   r   r   r   r     s     ztest.<locals>.extr   )
testshapes)verbosezq<html><head><title>renderPM output results</title></head>
    <body>
    <h1>renderPM results of output</h1>
    z</body>
    </html>
    r	   c                 S   s   g | ]}| d r|qS )z--ext=)r   .0r   r   r   r   
<listcomp>  s     
 ztest.<locals>.<listcomp>gifr?  pngjpgpctpyr   ,c                 S   s   g | ]}|d d qS )   Nr   rB  r   r   r   rD    s     )escapec                    sZ   d| |f }sdkr t |  d|  t }j|d  d|   d S )NzProblem drawing %s fmt=%s filer>   z"<br/><h2 style="color:red">%s</h2>)filez<pre>%s</pre>)printr   r   	print_excr  )r   r   msgbufZerrsrL  shout	tracebackrA  r   r   handleError  s     ztest.<locals>.handleErrorZft_get_face)ZdoTTFz.%02dz%<hr><h2>Drawing %s</h2>
<pre>%s</pre>)rE  rF  rG  rH  z<p>%s format</p>
z%s.%s)whiter   )r   r   )rI  r   )formatsoutDirfnRootr   )rE  rF  rG  z<img src="%s" border="1"><br>
z#<a href="%s">python source</a><br>
z<a href="%s">SVG</a><br>
r>   zwrote %sZRL_NOEPSPREVIEW0r   preview)Zepsr   z</h1>z7 <a href="#errors" style="color: red">(errors)</a></h1>z<a name="errors"/>zpm-index.htmlr   r   r   ZHTMLr   )+ri   Zreportlab.graphicsr@  Zreportlab.rl_configrA  getAllTestDrawingsrg   isdirmkdirsysargvremover4  r   rT  xml.sax.saxutilsrL  rl   r   r   r$   rY   rZ   r   r   rj   Zreportlab.lib.colorsrV  r<  r   rN  r   r   environr   r   replaceextendrk   
writelinesplatformr   r   )rX  rS  r   ri   r@  r\  ZdrawingsZhtmlTopZ
htmlBottomhtmlnamesr`  Er   rU  r+   Z	docstringr   r   rY  r   r   r   filenamefullpathrV  ZhtmlFileNamer   r   r   rR  r   test  s    
	
  









  



 rm  __main__T)rS  )N)N)r>  F)2__version__r   r   Zreportlab.graphics.renderbaser   r   Zreportlab.pdfbase.pdfmetricsr   r   r   r   Z	reportlabr   utilsr
   r
  r   ri   r_  ior   r   mathr   r   r   r   r   r   r   r    r&   Z_unset_r*   r/   r)   r   r   r   r   r.  r   r8  r:  r;  r<  r=  r   rm  r   r   r   r   r   <module>   sN   


 C
   
`
