U
    '1ew                    @   sp  d Z dZddlZddlmZmZ ddlmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ ddlmZmZmZmZ d ZG dd dZ G dd dZ!G dd de!Z"dd Z#dddZ$dZ%dd Z&dd Z'G dd de!Z(G d d! d!e!Z)G d"d# d#e!Z*G d$d% d%e*Z+G d&d' d'e*Z,G d(d) d)e,Z-G d*d+ d+e-Z.G d,d- d-e-Z/G d.d/ d/e+Z0dd1d2Z1d3d4 Z2G d5d6 d6Z3G d7d8 d8e3e!Z4G d9d: d:e4Z5G d;d< d<e!Z6d=d> Z7G d?d@ d@e!Z8G dAdB dBe!Z9G dCdD dDe*Z:G dEdF dFe!Z;G dGdH dHe!Z<G dIdJ dJZ=dKdL Z>G dMdN dNe3Z?G dOdP dPe?e!Z@dQdR ZAdSdT ZBG dUdV dVe?e!ZCG dWdX dXZDG dYdZ dZe?eDe!ZEG d[d\ d\e*ZFG d]d^ d^e*ZGG d_d` d`e*ZHG dadb dbeDe*ZIG dcdd dde+ZJG dedf dfeZKG dgdh dheJZLG didj dje*ZMddklNmOZO ePdldmdndodpdqdrdsdtdudv
ZQddxdyZRG dzd{ d{ZSd|d} ZTG d~d de!ZUG dd deUZVddlmWZW G dd dZXG dd dZYG dd de?e!ZZG dd de!Z[G dd de*Z\G dd de\Z]G dd de\Z^G dd de^Z_G dd de^Z`G dd de`ZaG dd de*ZbG dd de*ZcdS )z3.3.0a  
A flowable is a "floating element" in a document whose exact position is determined by the
other elements that precede it, such as a paragraph, a diagram interspersed between paragraphs,
a section header, etcetera.  Examples of non-flowables include page numbering annotations,
headers, footers, fixed diagrams or logos, among others.

Flowables are defined here as objects which know how to determine their size and which
can draw themselves onto a page with respect to a relative "origin" position determined
at a higher level. The object's draw() method should assume that (0,0) corresponds to the
bottom left corner of the enclosing rectangle that will contain the object. The attributes
vAlign and hAlign may be used by 'packers' as hints as to how the object should be placed.

Some Flowables also know how to "split themselves".  For example a
long paragraph might split itself between one page and the next.

Packers should set the canv attribute during wrap, split & draw operations to allow
the flowable to work out sizes etc in the proper context.

The "text" of a document usually consists mainly of a sequence of flowables which
flow into a document from top to bottom (with column and page breaks controlled by
higher level components).
    N)deepcopycopy)gray	lightgrey)fp_str)TA_LEFT	TA_CENTERTA_RIGHT)_baseFontName)strTypesrl_safe_exec)ABag)pdfutilsstringWidth)_FUZZoverlapAttachedSpaceignoreContainerActionslistWrapOnFakeWidtha  AnchorFlowable BalancedColumns BulletDrawer CallerMacro CondPageBreak DDIndenter DocAssert
        DocAssign DocExec DocIf DocPara DocWhile FailOnDraw FailOnWrap Flowable FrameBG FrameSplitter
        HRFlowable Image ImageAndFlowables KeepInFrame KeepTogether LIIndenter ListFlowable ListItem
        Macro NullDraw PTOContainer PageBreak PageBreakIfNotEmpty ParagraphAndImage Preformatted
        SetPageTopFlowables SetTopFlowables SlowPageBreak Spacer TopPadder TraceInfo UseUpSpace XBox
        splitLine splitLinesc                   @   s   e Zd ZdZdd ZdS )	TraceInfoz0Holder for info about where an object originatedc                 C   s"   d| _ d| _d| _d| _d| _d S )Nz	(unknown))ZsrcFileZstartLineNoZstartLinePosZ	endLineNoZ
endLinePosself r   @/tmp/pip-unpacked-wheel-109iniqw/reportlab/platypus/flowables.py__init__0   s
    zTraceInfo.__init__N__name__
__module____qualname____doc__r   r   r   r   r   r   .   s   r   c                   @   s   e Zd ZdZdZdZdd Zdd Zd&ddZ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dZed d! Zd"d# Zd$d% ZdS ))FlowablezAbstract base class for things to be drawn.  Key concepts:

    1. It knows its size
    2. It draws in its own coordinate system (this requires the
       base API to provide a translate() function.

    r   c                 C   s4   d| _ d| _d| _d| _d| _d | _d | _d | _d S )Nr   LEFTBOTTOM)widthheightwrappedhAlignvAlignZ
_traceInfo_showBoundaryencodingr   r   r   r   r   H   s    zFlowable.__init__c                 C   s   || _ |   | ` dS )z#ensure canv is set on and then drawN)canvdrawr   r+   r   r   r   _drawOnZ   s    zFlowable._drawOnc                 C   sf   |rbt | drb| j}|ddtfkr0|d| 7 }n2|dtfkrF||7 }n|dtfkrbtdt| |S )Nr'   CENTERZCENTRE      ?RIGHTr"   zBad hAlign value )hasattrr'   r   r	   r   
ValueErrorstr)r   xZsWar   r   r   _hAlignAdjust`   s    
zFlowable._hAlignAdjustc                 C   sd   |  ||}|  ||| | | t| drX| jrX|t |dd| j	| j
 |  dS )z6Tell it to draw itself on the canvas.  Do not overrider)   r   N)r7   	saveState	translater.   r2   r)   setStrokeColorr   rectr$   r%   restoreStater   canvasr5   y_sWr   r   r   drawOnk   s    

zFlowable.drawOnc                 C   s"   || _ | ||\}}| ` ||fS )zWintended for use by packers allows setting the canvas on
        during the actual wrap)r+   wrap)r   r+   aWaHwhr   r   r   wrapOnw   s    zFlowable.wrapOnc                 C   s   | j | jfS )zThis will be called by the enclosing frame before objects
        are asked their size, drawn or whatever.  It returns the
        size actually used.r$   r%   r   
availWidthavailHeightr   r   r   rB      s    zFlowable.wrapc                 C   s   t | d| jS )z-This should return the minimum required widthZ	_minWidth)getattrr$   r   r   r   r   minWidth   s    zFlowable.minWidthc                 C   s   || _ | ||}| ` |S )zXintended for use by packers allows setting the canvas on
        during the actual split)r+   split)r   r+   rC   rD   Sr   r   r   splitOn   s    zFlowable.splitOnc                 C   s   g S )ao  This will be called by more sophisticated frames when
        wrap fails. Stupid flowables should return []. Clever flowables
        should split themselves and return a list of flowables.
        If they decide that nothing useful can be fitted in the
        available space (e.g. if you have a table and not enough
        space for the first row), also return []r   )r   rJ   Zavailheightr   r   r   rN      s    zFlowable.splitc                 C   s6   t | dr| jS t | dr.t | jdr.| jjS dS dS )zOreturns boolean determining whether the next flowable should stay with this onekeepWithNextstyler   N)r2   rQ   rR   r   r   r   r   getKeepWithNext   s
    
  zFlowable.getKeepWithNextc                 C   s6   t | dr| jS t | dr.t | jdr.| jjS dS dS )zXreturns how much space should follow this item if another item follows on the same page.
spaceAfterrR   r   N)r2   rT   rR   r   r   r   r   getSpaceAfter   s
    
  zFlowable.getSpaceAfterc                 C   s6   t | dr| jS t | dr.t | jdr.| jjS dS dS )z[returns how much space should precede this item if another item precedess on the same page.spaceBeforerR   r   N)r2   rV   rR   r   r   r   r   getSpaceBefore   s
    
  zFlowable.getSpaceBeforec                 C   s   dS )z?Hook for IndexingFlowables - things which have cross referencesr   r   r   r   r   r   
isIndexing   s    zFlowable.isIndexingNc                 C   sf   t | dr| jdd}nt | dr.t| j}nd}|rF|rF|d| }d| jjtt| |  |f S )z
        This method should attempt to return a string that can be used to identify
        a particular flowable uniquely. The result can then be used for debugging
        and or error printouts
        getPlainText   )identifytextz...Nz<%s at %s%s>%s)	r2   rY   r4   r\   	__class__r   hexid
_frameNamer   maxLenrr   r   r   identity   s    

zFlowable.identityc                 C   s   t t | dd dd S )Nr+   _doctemplaterL   r   r   r   r   re      s    zFlowable._doctemplatec                 C   s   t | j|d S N)rL   re   r   r6   r   r   r   _doctemplateAttr   s    zFlowable._doctemplateAttrc                 C   s2   t | dd }|s| d}|r.|jr.d|j S dS )N_frameframez	 frame=%s )rL   ri   r_   r   fr   r   r   r`      s     

 
zFlowable._frameName)r   )r   )N)r   r   r   r    _fixedWidth_fixedHeightr   r.   r7   rA   rG   rB   rM   rP   rN   rS   rU   rW   rX   rd   propertyre   ri   r`   r   r   r   r   r!   =   s*   

	

r!   c                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )XBoxz~Example flowable - a box with an x through it and a caption.
    This has a known size, so does not need to respond to wrap().A Boxc                 C   s    t |  || _|| _|| _d S rg   )r!   r   r$   r%   r\   )r   r$   r%   r\   r   r   r   r      s    
zXBox.__init__c                 C   s   d| j | j| jf S )NzXBox(w=%s, h=%s, t=%s))r$   r%   r\   r   r   r   r   __repr__   s    zXBox.__repr__c                 C   sr   | j dd| j| j | j dd| j| j | j d| j| jd | j td | j d| j d| j | j d S )Nr      r0   )	r+   r;   r$   r%   linesetFontr
   drawCentredStringr\   r   r   r   r   r,      s
    z	XBox.drawN)rs   )r   r   r   r    r   rt   r,   r   r   r   r   rr      s   
rr   c                 C   sP   t | r&| d  dkr&| dd  } q t | rL| d  dkrL| d d } q&| S )Nr   rl   rZ   r   )lenstrip)linesr   r   r   _trimEmptyLines   s
    r|   c                 C   sP   |  d}|dkrDt|}g }|D ]}||d  }|| q"nt|}|S )z
    tidy up text - carefully, it is probably code.  If people want to
    indent code within a source script, you can supply an arg to dedent
    and it will chop off that many character, otherwise it leaves
    left edge intact.
    
r   N)rN   r|   rstripappend)r\   dedentr{   Z	templinesrv   r   r   r   	_dedenter   s    
r   z[{( ,.;:/\-c                 C   sR   |d krt }|d krd}g }| D ],}t||krBt||||| q || q |S )Nrl   )SPLIT_CHARSry   	splitLiner   )r{   maximum_lengthsplit_charactersnew_line_characterslines_splittedrv   r   r   r   
splitLines   s     r   c                 C   s   d}| rt | dkrd}t | |kr.t | }n"t|D ]}| | |kr6|d }q6|dkr`|d }|r|| d|  d}|t |8 }n||| d|   | |d  } qd S )NTr   rZ   F)ry   ranger   )Zline_to_splitr   r   r   r   
first_lineZsplit_indexZ
line_indexr   r   r   r     s$    


r   c                   @   sB   e Zd ZdZdddZdd Zd	d
 Zdd Zdd Zdd Z	dS )Preformatteda  This is like the HTML <PRE> tag.
    It attempts to display text exactly as you typed it in a fixed width "typewriter" font.
    By default the line breaks are exactly where you put them, and it will not be wrapped.
    You can optionally define a maximum line length and the code will be wrapped; and
    extra characters to be inserted at the beginning of each wrapped line (e.g. '> ').
    Nr   rl   c                 C   s6   || _ || _t||| _|r2|r2t| j|||| _dS )ztext is the text to display. If dedent is set then common leading space
        will be chopped off the front (for example if the entire text is indented
        6 spaces or more then each line will have 6 spaces removed from the front).
        N)rR   
bulletTextr   r{   r   )r   r\   rR   r   r   ZmaxLineLengthZ
splitCharsZnewLineCharsr   r   r   r   >  s    zPreformatted.__init__c                 C   s2   | j }d}|d k	rdt| }d|d| jf S )NzPreformatted(zPreformatted(bulletText=%s,z%s'''\ 
%s''')r}   )r   reprjoinr{   )r   ZbTHr   r   r   rt   N  s
    zPreformatted.__repr__c                 C   s&   || _ | jjt| j | _| j | jfS rg   )r$   rR   leadingry   r{   r%   rI   r   r   r   rB   U  s    zPreformatted.wrapc                    s,   | j }|j|j t fdd| jD S )Nc                    s   g | ]}t | qS r   r   ).0rv   fontNamefontSizer   r   
<listcomp>^  s     z)Preformatted.minWidth.<locals>.<listcomp>)rR   r   r   maxr{   )r   rR   r   r   r   rM   Z  s    zPreformatted.minWidthc                 C   s   || j jk rg S t|d | j j }d| jd| }d| j|d  }| j }|jdkrjt|}d|_t|| j t||gS )N      ?r}   r   )rR   r   intr   r{   firstLineIndentr   r   )r   rJ   rK   ZlinesThatFitZtext1Ztext2rR   r   r   r   rN   `  s    
zPreformatted.splitc                 C   s   | j j}| j| j j }| jd | j jr:| j| j j | j||}|	| j j
| j j| j j | jD ]}|| qh| j| d S )Nz%PreformattedPara)rR   
leftIndentr%   r   r+   Z
addLiteralZ	textColorsetFillColorZ	beginTextrw   r   r   r{   ZtextLineZdrawText)r   Zcur_xZcur_yZtxr\   r   r   r   r,   q  s    

zPreformatted.draw)Nr   NNrl   )
r   r   r   r    r   rt   rB   rM   rN   r,   r   r   r   r   r   7  s   
r   c                   @   sl   e Zd ZdZdZdZ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dZdS )Imagea  an image (digital picture).  Formats supported by PIL/Java 1.4 (the Python/Java Imaging Library
       are supported. Images as flowables may be aligned horizontally in the
       frame with the hAlign parameter - accepted values are 'CENTER',
       'LEFT' or 'RIGHT' with 'CENTER' being the default.
       We allow for two kinds of lazyness to allow for many images in a document
       which could lead to file handle starvation.
       lazy=1 don't open image until required.
       lazy=2 open image when required then shut it.
    rZ   Ndirectautor/   Fc	              	   C   sL  || _ || _t|d}	d| _|	r2|| _t|| _n8t|dr^|| _t|| _d| _d| _d}	n| | _| _|| _|	s t	j
|d dkr ddlm}
 |
|d	}z6zt|}W n"   | |||| Y W 
dS X W 5 |  X |d | _|d | _|r|d
 | _d| _| |||d n(|	r8| |||d n| |||| dS )z8If size to draw at not specified, get it from the image.readNZ	_renderPyTrZ   )z.jpgz.JPGz.jpegz.JPEGr   )open_for_readb   )r'   _maskr2   _drawing_filer   filename_img_dpiospathsplitextreportlab.lib.utilsr   closer   ZreadJPEGInfo_setup
imageWidthimageHeight)r   r   r$   r%   kindmasklazyr'   ZuseDPIfpr   rn   infor   r   r   r     sD    







zImage.__init__c                 C   sR   | j }|rN|d dkr,|  jd|d  9  _|d dkrN|  jd|d  9  _d S )Nr   H   g      R@rZ   )r   r   r   )r   dpir   r   r   
_dpiAdjust  s      zImage._dpiAdjustc                 C   s,   || _ || _|| _|| _|dkr(|   d S Nr   )_lazy_width_height_kind_setup_inner)r   r$   r%   r   r   r   r   r   r     s     zImage._setupc                 C   s  | j }| j}| j}| j}|rP| \| _| _| jrrt|drr|j	j
dd| _n"| jrr| jj| jj | _| _d| _|   | jdkr| `|dkr|p| j| _|p| j| _nj|dkr| j| d | _| j| d | _n@|d	krtt|| j t|| j }| j| | _| j| | _d S )
N_imager   )r   r   F   )r   absolute)
percentage%{Gz?)boundZproportional)r   r   r   r   ZgetSizer   r   r   r2   r   r   getr   r$   r%   r   r   	drawWidth
drawHeightminfloat)r   r$   r%   r   imgfactorr   r   r   r     s0    
 
zImage._setup_innerc                 C   sp   | j |t ks| j|t krd| j | jf| _tt|| j  t|| j }|  j |9  _ |  j|9  _| j | jfS rg   )r   r   r   _oldDrawSizer   r   )r   rC   rD   r   r   r   r   _restrictSize  s    zImage._restrictSizec                 C   s    t | dd }|r|\| _| _d S )Nr   )rL   r   r   )r   Zdwhr   r   r   _unRestrictSize  s    zImage._unRestrictSizec                 C   sz   |dkrHddl m} || j| _t| jtsBd | _| jdkrBd| _| jS |dkrb|   | j| S t	dt
| |f d S )Nr   r   )ImageReaderr   rZ   )r   r   r   r   z<Image @ 0x%x>.%s)r   r   r   r   
isinstancer   r   r   __dict__AttributeErrorr_   )r   r6   r   r   r   r   __getattr__  s    
 
zImage.__getattr__c                 C   s   | j | jfS rg   )r   r   rI   r   r   r   rB     s    z
Image.wrapc                 C   s   t | dd}t | dd}| j}|rt| jt| j }| jt| j }|j}z ||| |	| j
|| W 5 ||_X nT| j}|dkrd| _| j
j| jp| j||| j| j| jd |dkrd  | _| _|| _d S )NZ_offs_xr   Z_offs_yr   rZ   )r   )rL   r   r   r   r   r   r   Z	transformscalerA   r+   r   Z	drawImager   r   r   r   )r   dxZdydZsxZsyZotransr   r   r   r   r,     s0    
 z
Image.drawc                 C   sB   t | |}|dd  dkr>t| jtr>d|d d | jf }|S )Nz>...z%s filename=%s>)r!   rd   r   r   r4   ra   r   r   r   rd     s    zImage.identity)NNr   r   rZ   r/   F)N)r   r   r   r    ro   rp   r   r   r   r   r   r   r   rB   r,   rd   r   r   r   r   r     s$   	        
,r   c                   @   s   e Zd Zdd ZdS )NullDrawc                 C   s   d S rg   r   r   r   r   r   r,   #  s    zNullDraw.drawN)r   r   r   r,   r   r   r   r   r   "  s   r   c                   @   s*   e Zd ZdZdZdZd	ddZdd ZdS )
SpacerzdA spacer just takes up space and doesn't draw anything - it guarantees
       a gap between objects.rZ   Fc                 C   s    || _ |rd| _|| _|| _d S )Ng-C6?)r$   r%   Zspacebefore)r   r$   r%   ZisGluer   r   r   r   +  s
    zSpacer.__init__c                 C   s   d| j j| j| jf S )Nz
%s(%s, %s))r]   r   r$   r%   r   r   r   r   rt   2  s    zSpacer.__repr__N)F)r   r   r   r    ro   rp   r   rt   r   r   r   r   r   &  s
   
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )
UseUpSpacec                 C   s   d S rg   r   r   r   r   r   r   6  s    zUseUpSpace.__init__c                 C   s   d| j j S )Nz%s()r]   r   r   r   r   r   rt   9  s    zUseUpSpace.__repr__c                 C   s   || _ || _||d fS )N:0yE>rH   rI   r   r   r   rB   <  s    zUseUpSpace.wrapN)r   r   r   r   rt   rB   r   r   r   r   r   5  s   r   c                   @   s"   e Zd ZdZdddZdd ZdS )	PageBreakrZ   Nc                 C   s
   || _ d S rg   )nextTemplate)r   r   r   r   r   r   E  s    zPageBreak.__init__c                 C   s    d| j j| jrt| jndf S )N%s(%s)rl   )r]   r   r   r   r   r   r   r   rt   H  s    zPageBreak.__repr__)N)r   r   r   
locChangerr   rt   r   r   r   r   r   A  s   
r   c                   @   s   e Zd ZdS )SlowPageBreakNr   r   r   r   r   r   r   r   K  s   r   c                   @   s   e Zd ZdS )PageBreakIfNotEmptyNr   r   r   r   r   r   N  s   r   c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )CondPageBreakrZ   c                 C   s
   || _ d S rg   r%   )r   r%   r   r   r   r   T  s    zCondPageBreak.__init__c                 C   s   d| j f S )NzCondPageBreak(%s)r   r   r   r   r   rt   W  s    zCondPageBreak.__repr__c                 C   s:   || j k r6| d}|s ||fS ddlm} || dS )Nrk   r   
FrameBreakr   r   )r%   ri   reportlab.platypus.doctemplater   add_generated_content)r   rJ   rK   rn   r   r   r   r   rB   Z  s    

 
zCondPageBreak.wrapNc                 C   s   t | dd|   S )N)z
,frame=%s))r   replacer`   r   rb   r   r   r   rd   b  s    zCondPageBreak.identity)N)r   r   r   r   r   rt   rB   rd   r   r   r   r   r   Q  s
   r   rZ   c                 C   s  t |dd}t |dd}|dkr$t}|rTddlm}	m}
 |}t| }|_d|_|`zld}d}d}d}| dd } | r| d}t	|drddlm}
 t
||
rt||j|j 8 }qt|||d	\}}|dk	r|||f |r|	| | |tkrd
st|tkrqtt||rt||n|}||7 }|sd| }|rZt |dd
rL|}t|| d}||7 }n|dk	rx| |_d}| }t |dd
r|}|}||7 }qt|dk	r||_||| fW S |r||_X dS );return max width, required height for a list of flowables Fre   Nrk   r   )_addGeneratedContentIndenterrZ   frameActionr   F_SPACETRANSFER)rL   r   r   r   r   r   rk   _generated_contentpopr2   r   leftrightrG   r   r   r   r   rW   _spaceBeforerU   _spaceAfter)FrJ   r+   
mergeSpaceobjdims	fakeWidthZdoctZcframer   r   Z
doct_frameWr   pSatToprn   rE   rF   sr   r   r   _listWrapOne  sh    


 
 

 


 r  c                    sJ   t | ttfs | dk	r| gpg } ddlm   fdd| D rFtd| S )z.if it isn't a list or tuple, wrap it in a listNr   LCActionFlowablec                    s   g | ]}t | r|qS r   )r   r   r5   r  r   r   r     s     
 z$_flowableSublist.<locals>.<listcomp>z)LCActionFlowables not allowed in sublists)r   listtupler   r  AssertionError)Vr   r  r   _flowableSublist  s
     r  c                   @   s    e Zd ZdddZdddZdS )_ContainerSpaceNc                 C   s2   |d kr| j n|D ]}t|ds|   S qdS Nr   r   )_contentr2   rW   r   contentcr   r   r   rW     s    
z_ContainerSpace.getSpaceBeforec                 C   s6   t |d kr| jn|D ]}t|ds|   S qdS r  )reversedr  r2   rU   r  r   r   r   rU     s    
z_ContainerSpace.getSpaceAfter)N)N)r   r   r   rW   rU   r   r   r   r   r    s   
r  c                   @   s<   e Zd ZdZdddZdd Zdd Zd	d
 ZdddZdS )KeepTogetherFNc                 C   sb   t tds@ddlm} ddlm} ddlm} |t_|t_|| _|sN|  g}t|| _|| _	d S )NNullActionFlowabler   )r  r   )annotateException)
r2   r  r   r  r   r   r  r  r  
_maxHeight)r   	flowables	maxHeightr  r   r  r   r   r   r     s    


zKeepTogether.__init__c                 C   sB   | j }ttt|}dd| }|dd}d| jj|| jf S )Nr}   z
  z%s(%s,maxHeight=%s))	r  r	  mapr   r   r   r]   r   r  )r   rn   Lr   r   r   rt     s
    zKeepTogether.__repr__c              
   C   s|   g }zt | j|| j|d\}}W n,   | d| jj| jjt| f  Y nX || _|rd|d d pfd| _	||f| _
|dfS )N)r   z%
raised by class %s(%s)@0x%8.8x wrap
r   rZ   i )r  r  r+   r  r]   r   r   r_   _H_H0	_wrapInfo)r   rC   rD   r   r  r   r   r   r   rB     s    &
zKeepTogether.wrapc                 C   s*  t | dd ||fkr | || | jd d  }t | dd  }}|rZt |dd }|j}|j}| j|kot| j pt|| jk}| j|kp|o|}	|s|	r&d}
| d}|r|r| }|j}|j}|r| j	r|s|o|o|o||ko||k }
n"|r
||jkr
|| jkr
d}
|
d|
r| jn| j  |S )Nr  rj   Z_atTopFZ_peekNextFrameTr   )rL   rB   r  r   r   r  r  r  ri   
splitAtTopinsertr   r  )r   rC   rD   rO   cfr  ZcAWZcAHZC0C1ZfbZpanfnfZnAWZnAHr   r   r   rN     s.     

 zKeepTogether.splitc                 C   sJ   d| j jtt| |  ddd | jD f }|rB|d| S |S d S )Nz<%s at %s%s> containing :%sr}   c                 S   s   g | ]}|  qS r   )rd   r   rn   r   r   r   r     s     z)KeepTogether.identity.<locals>.<listcomp>r   )r]   r   r^   r_   r`   r   r  )r   rb   msgr   r   r   rd     s    2zKeepTogether.identity)N)N)	r   r   r   r   r   rt   rB   rN   rd   r   r   r   r   r    s   
r  c                   @   s   e Zd ZdZdZdS )KeepTogetherSplitAtTopzq
    Same as KeepTogether, but it will split content immediately if it cannot
    fit at the top of a frame.
    TN)r   r   r   r    r   r   r   r   r   r'    s   r'  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )MacrozThis is not actually drawn (i.e. it has zero height)
    but is executed when it would fit in the frame.  Allows direct
    access to the canvas through the object 'canvas'c                 C   s
   || _ d S rg   )command)r   r)  r   r   r   r     s    zMacro.__init__c                 C   s   dt | j S )Nz	Macro(%s))r   r)  r   r   r   r   rt     s    zMacro.__repr__c                 C   s   dS Nr   r   rI   r   r   r   rB     s    z
Macro.wrapc                 C   s   t | jd d| jid d S )Nr>   )gl)r   r)  r+   r   r   r   r   r,     s    z
Macro.drawNr   r   r   r    r   rt   rB   r,   r   r   r   r   r(    s
   r(  c                  O   s   d S rg   r   )argskwdsr   r   r   _nullCallable  s    r0  c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )CallerMacrozf
    like Macro, but with callable command(s)
    drawCallable(self)
    wrapCallable(self,aW,aH)
    Nc                 C   s   |pt | _|pt | _d S rg   )r0  _drawCallable_wrapCallable)r   ZdrawCallableZwrapCallabler   r   r   r     s    
zCallerMacro.__init__c                 C   s   d| j | jf S )NzCallerMacro(%r,%r))r2  r3  r   r   r   r   rt     s    zCallerMacro.__repr__c                 C   s   |  | || dS r*  )r3  r   rC   rD   r   r   r   rB     s    zCallerMacro.wrapc                 C   s   |  |  d S rg   )r2  r   r   r   r   r,     s    zCallerMacro.draw)NNr-  r   r   r   r   r1  	  s
   
r1  c                   @   sB   e Zd ZdZdddZdd Zdd	 Zd
d Zdd Zdd Z	dS )ParagraphAndImagez combine a Paragraph and an Imager   r   c                 C   s"   || _ || _|| _|| _|| _d S rg   )PIxpadypad_side)r   r6  r7  r8  r9  Zsider   r   r   r     s
    zParagraphAndImage.__init__c                 C   s   t | j | j S rg   )r   r6  rW   r7  r   r   r   r   rW   #  s    z ParagraphAndImage.getSpaceBeforec                 C   s   t | j | j S rg   )r   r6  rU   r7  r   r   r   r   rU   &  s    zParagraphAndImage.getSpaceAfterc                 C   s   | j ||\}}|| _|| _|| _| j}|j}| j}| j}|j	}	|j
}
||
 |j }|| | }||j }d|_t|| |	d  }||g||g  |g |_| jdkr|| gd|  dg | _t|jj|	 |_t||j| _| j| jfS )Nr   r   r   rZ   )r7  rB   wIhIr$   r6  rR   r8  r9  r   r   rightIndentr   r   Z
breakLinesblParar:  _offsetsry   r{   r%   r   )r   rJ   rK   r;  r<  r6  rR   r8  r9  r   r   Zlater_widthsZintermediate_widthsZfirst_line_widthZnIWr   r   r   rB   )  s*    

zParagraphAndImage.wrapc           	      C   s   | j | j| j| jf\}}}}|| |ks6t|jdkr:g S |||}|sN|S |d  }| _ |d= |j}t| j jj	|j
 |_t||j| _| g| S r   )r6  r;  r<  r9  ry   ZfragsrN   rR   r>  r{   r   r%   r   )	r   rJ   rK   r6  r;  r<  r9  rO   rR   r   r   r   rN   A  s      zParagraphAndImage.splitc                 C   s   | j }| jdkrX| j|d| j| j | j  | j| j_z| j|dd W 5 | j`X n<| j|| j	| j
 | j | j| j | j  | j|dd d S )Nr   r   )r+   r:  r7  rA   r%   r<  r9  r?  r6  r$   r;  r8  r-   r   r   r   r,   M  s    


,zParagraphAndImage.drawN)r   r   r   )
r   r   r   r    r   rW   rU   rB   rN   r,   r   r   r   r   r5    s   
r5  c                   @   s   e Zd Zdd ZdS )
FailOnWrapc                 C   s   t dd S )Nz3FailOnWrap flowable wrapped and failing as ordered!r3   rI   r   r   r   rB   [  s    zFailOnWrap.wrapN)r   r   r   rB   r   r   r   r   r@  Z  s   r@  c                   @   s   e Zd Zdd Zdd ZdS )
FailOnDrawc                 C   s   dS r*  r   rI   r   r   r   rB   _  s    zFailOnDraw.wrapc                 C   s   t dd S )Nz2FailOnDraw flowable drawn, and failing as ordered!rA  r   r   r   r   r,   b  s    zFailOnDraw.drawN)r   r   r   rB   r,   r   r   r   r   rB  ^  s   rB  c                	   @   sD   e Zd ZdZdddedddddf	dd	Zd
d Zdd Zdd ZdS )
HRFlowablezLike the hr tagz80%rZ   roundr/   r#   Nc
           
      C   sD   t |  || _|| _|| _|| _|| _|| _|| _|| _	|	| _
d S rg   )r!   r   r$   	lineWidthlineCaprV   rT   colorr'   r(   dash)
r   r$   Z	thicknessrF  rG  rV   rT   r'   r(   rH  r   r   r   r   g  s    
zHRFlowable.__init__c                 C   s   d| j | jf S )NzHRFlowable(width=%s, height=%s)rH   r   r   r   r   rt   z  s    zHRFlowable.__repr__c                 C   s^   | j }t|trD| }|dr<|t|d d  d }nt|}t||}|| _|| jfS )Nr   r   r   )	r$   r   r   rz   endswithr   r   r   rE  )r   rJ   rK   rE   r   r   r   rB   }  s    

 
zHRFlowable.wrapc                 C   st   | j }|  || j |dddd| j   || j | j	rT|
| j	 |dd| j| j |  d S )Nr   rZ   r   )ZbuttrD  square)r+   r8   setLineWidthrE  Z
setLineCaprF  lowerr:   rG  rH  setDashrv   r   r%   r<   r-   r   r   r   r,     s     zHRFlowable.draw)	r   r   r   r    r   r   rt   rB   r,   r   r   r   r   rC  e  s     

rC  c                   @   s   e Zd Zdd ZdS )_PTOInfoc                 C   s   t || _t || _d S rg   )r  trailerheader)r   rO  rP  r   r   r   r     s    
z_PTOInfo.__init__Nr   r   r   r   r   r   r   r   rN    s   rN  c                 C   s   t | dr|  S t| S d S )Nr   )r2   r   )r   r   r   r   	cdeepcopy  s    
rR  c                   @   s    e Zd ZdddZd	ddZdS )

_Containerr   r   Nc              	   C   s$  ddl m}m}	 |}
|}d}|dkr*| j}||9 }|dkr@| j}| ||| }|| j| 7 }|}t| dd}|D ]}tst	||r|
|j qrt	||	r||j| 7 }||j|j | 8 }qr|||d\}}|tk rt|ddsqr||kr| }t|dds|t|| d7 }||8 }| }t|ddr>|}|}t|d	d}|r|d
 jr|d
 }|j}|j}|j}||j| |  }|
|||j   }|| | }t||| }td|| }||||||| ||_|j||||| d ||d
 k	rt|dds||8 }|`qrdS )z"we simulate being added to a framer   )ActionFlowabler   Nrj   r   	_ZEROSIZEr   F	_frameBGsr   )r@   )r   rT  r   r$   r  r7   r%   rL   r   r   applyre   r   r   rG   r   rW   r   rU   activestartr   _leftPaddingrenderrj   rA   )r   r+   r5   r?   r@   r   r  rC   rT  r   Zx0Zy0r  Zytrk   r  rE   rF   r  ZfbgbgfbglZfbgrZbgmfbwfbxfbhfbyr   r   r   rA     sd     

 
z_Container.drawOnc                 C   s.   g j }|p| jD ]}|t| q|j| _d S rg   )r   r  rR  __self__)r   r  Cr  r   r   r   copyContent  s    z_Container.copyContent)r   r   NN)N)r   r   r   rA   rd  r   r   r   r   rS    s   
3rS  c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
PTOContaineraM  PTOContainer(contentList,trailerList,headerList)

    A container for flowables decorated with trailer & header lists.
    If the split operation would be called then the trailer and header
    lists are injected before and after the split. This allows specialist
    "please turn over" and "continued from previous" like behaviours.Nc                 C   sX   t ||}g  | _}t|D ]6}t|tr8||j q|| t|ds||_qd S )N_ptoinfo)	rN  r  r  r   re  extendr   r2   rf  )r   r  rO  rP  r7  rc  _r   r   r   r     s    




 zPTOContainer.__init__c                 C   s$   t | j|| j\| _| _| j| jfS rg   )r  r  r+   r$   r%   rI   r   r   r   rB     s    zPTOContainer.wrapc           "      C   s&  ddl m} |dk rg S | j}| j}d } } } }	}
t|}i }d }}t|D ]*}|| }|j}|| kr|j}|j	}t
||| j\}}t|r|d  }nd}||||f||< n|| \}}}}|||d\}}t||r|j|j }||j7 }||j7 }||8 }d}	d}
n(|r>t| |	 d}
||
7 }| }	|||	 7 }|t||	 }|| |t krx q|d7 }qT|||	 8 }|| | |
 d }|d| kr||||}ng }t|t| dkr|| | g}|||g}ng  }}|sb|}|dkr<||d   r<|d8 }d|| _q
|dkrb|d  rb|}d|d _t g}t|dkr|d | |d d  | | | } || |dd   ||d d   }!n6|sg S |d | | | | } || ||d   }!| t|!dd	 |jD dd	 |j	D g }|S )
Nr   r   r   rZ   gwJ?皙?r   c                 S   s   g | ]}t |qS r   )r   r  r   r   r   r   9  s     z&PTOContainer.split.<locals>.<listcomp>)r   r   r+   r  ry   r   rf  keysrO  rP  r  rW   rG   r   r   r   r   rU   r   rP   absrS   rQ   r   re  )"r   rJ   rK   r   r+   rc  r5   ir   r  hxnZI2WZdLeftZdRightr  r7  TZHdrZtWZtHZtSBrh  rF   ZdwZtHSrD   ZSSZR1IZR2Ijr   ZR1ZR2r   r   r   rN     s     

 

$&*zPTOContainer.split)NN)r   r   r   r    r   rB   rN   r   r   r   r   re    s   

re  c                 C   s   d| d  }d|  }d|d  }d| }|| ||  }|| }	| | }
| | }|| }|	| |
|  }|| ||  }||fS )Nr   r   r   )s0s1Zh0h1Za11Za12Za21Za22ZdetZb11Zb12Zb21Zb22r6   r   r   r   r   _hmodel=  s    

rt  c           
      C   s   |\}}t |tkr||  S d| | }ddlm} |  | }|| | }|dk rVdS ||}|dkrr| | }n
| | }|| }	td| d|	 S )z=solve the model v = a/s**2 + b/s for an s which gives us v==hr0   r   )sqrtNr   )rk  r   mathru  r   )
rF   abr6   r   tru  rn   rc   rr  s2r   r   r   _qsolveM  s    
 
rz  c                   @   sH   e Zd Zg ddddddfddZd	d
 ZdddZdd ZdddZdS )KeepInFramerZ   shrinkrl   r"   r#   Nc
           
      C   s   || _ || _|| _|| _|dks4td|  |f |dksPtd|  |f |dkr\t}|| _|phg | _|| _	|| _
|	| _dS )ab  mode describes the action to take when overflowing
            error       raise an error in the normal way
            continue    ignore ie just draw it and report maxWidth, maxHeight
            shrink      shrinkToFit
            truncate    fit as much as possible
            set fakeWidth to False to make _listWrapOn do the 'right' thing
        )erroroverflowr|  truncatez%s invalid mode value %sr   z%s invalid maxHeight value %sN)namemaxWidthr  moder  rd   r   Z
mergespacer  r(   r'   r   )
r   r  r  r  r   r  r  r'   r(   r   r   r   r   r   `  s     
zKeepInFrame.__init__c                 C   s   | j | j | j S rg   )r  _leftExtraIndent_rightExtraIndentr   r   r   r   _getAvailableWidthu  s    zKeepInFrame._getAvailableWidthc                 C   s~   d| j jtt| |  t| ddr4dt| dd p6dt| ddrVdtt| dd pXdt| ddrvd	tt| d pxdf S )
Nz<%s at %s%s%s> size=%sx%sr  rl   
 name="%s"r  z maxWidth=%sr   r  z maxHeight=%s)r]   r   r^   r_   r`   rL   r   r   r   r   r   rd   x  s
    " zKeepInFrame.identityc                    sB  ddl m} j}ttjp||ttjp2||}j tj	j
 d\}}|dkr|t ksx||t krd||df }||n|t kr||t kr|t _|t _nn|dkrt|t _t||t _nB fdd	}	|}
|}d
}|t krn| }|	|\}}||t krb|t _|t _|_||fS |}|}|}
|| }|	|\}}|t _|t _|_|td| |d k s||t kr6|}dD ]j}t|d
|  t||||}|	|\}}||t kr|t kr|t _|t _|_ q6qʈjjfS )Nr   )LayoutErrorr   r}  zcontent %sx%s too large for %s   )r~  r  c                    s<   t | } tj|  j d\}}||  }||  }||fS )Nr  )r   r  r  r+   )r5   r  r   r   r  r   r   r   func  s
    zKeepInFrame.wrap.<locals>.funcrZ   gffffff?
   )r   r   ri  皙?g333333?)r   r  r  r   r   r  r  r   r  r  r+   r   rd   r$   r%   _scalerz  rt  )r   rJ   rK   r  r  r  r  r   identr  ZW0H0rq  rr  H1rn   r  r   r  r   rB   ~  s\     




&


zKeepInFrame.wrapr   c           	      C   s   t | dd}| jdk}|dkp |}|r|  |r^| }|||| j| j |j|dd n(||| d }}|	d| d|  t
j| |||||d |r|  d S )Nr  r   r  r   )stroke)r@   r   )rL   r  r8   Z	beginPathr;   r$   r%   clipPathr9   r   rS  rA   r<   )	r   r+   r5   r?   r@   r   r  sspr   r   r   rA     s    
 zKeepInFrame.drawOn)N)r   )r   r   r   r   r  rd   rB   rA   r   r   r   r   r{  _  s
   
<r{  c                   @   s    e Zd ZdddZd	ddZdS )
_FindSplitterMixinrZ   NTc                 C   s<  d}d}	d }
}d}|  |}t|D ]\}}t|drbddlm} t||r&||j|j 8 }q&|||d\}}|t	ks&|t	krq&t
||}|s| }|rt
||
 d}|	|7 }	n|dk	r| |_d}|	|ks||kr|||d| ||d f  S |	|7 }	|	|kr
||	|  }|rddlm} t||tfr|jj}|t|t|  t	 }||k rp||7 }||| 7 }|}zt||||}W n   d}Y nX |s|||d| ||d f  S |||d| |dd  |dd ||d d  f  S | }
|	|
7 }	q&|dk	r,|
|_||	|
 |g fS )r   r   rZ   r   r   r   N	Paragraph)_getContent	enumerater2   r   r   r   r   r   rG   r   r   rW   r   reportlab.platypus.paragraphr  r   rR   r   r   r   rR  rP   rU   r   )r   r+   rJ   rK   r   r   r  paraFixr  r   r  ZsBr  r   rl  rn   r   rE   rF   r  rD   r  r   ZnHrO   r   r   r   
_findSplit  sb    


 
 
 
 

 
 <

 z_FindSplitterMixin._findSplitc                 C   sH   g }|d k	r|n| j }|D ](}t|tr8||  q|| q|S rg   )r  r   ListFlowablerg  r  r   )r   r  r   rc  rn   r   r   r   r    s    
z_FindSplitterMixin._getContent)rZ   NNT)N)r   r   r   r  r  r   r   r   r   r    s   
2r  c                   @   sT   e Zd ZdZd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S )ImageAndFlowables(combine a list of flowables and an Imager   r   r   Nc	           	      C   s8   t || _|| _|| _|| _|| _|| _|| _|| _d S rg   )	r  r  _I_irpad_ilpad_ibpad_itpadr:  	imageHref)	r   r7  r   imageLeftPaddingimageRightPaddingimageTopPaddingimageBottomPadding	imageSider  r   r   r   r     s    
zImageAndFlowables.__init__c                 C   s   t | }|   |  |S rg   )r   _resetrd  )r   r  r   r   r   r     s    zImageAndFlowables.deepcopyc                 C   s6   t | dr| j}nt | dr$| j}n| j}t| |S )N_C1_C0)r2   r  r  r  rS  rU   )r   rc  r   r   r   rU     s    

zImageAndFlowables.getSpaceAfterc                 C   s   t | j t| S rg   )r   r  rW   rS  r   r   r   r   rW   %  s    z ImageAndFlowables.getSpaceBeforec                 C   s*   dD ] }zt | | W q   Y qX qd S )N)	_wrapArgsr  r  )delattrrh   r   r   r   r  (  s
    zImageAndFlowables._resetc                 C   sR  | j }| j}t| drP| j||fkr@t|dd d kr@| j| jfS |   |  ||f| _|	|| |
||\}}|| _|| _| j}| j}| j}	| j}
|| | |  | _}|
| |	 }|tkr| |||\}}| _| _n|}d}||t krg | _| j| _t|| }| _|| _| js*|| _nt| j||\}}|| | _| j| jfS )Nr  r   r   )r+   r  r2   r  rL   r$   r%   r  r   rB   r   _wI_hIr  r  r  r  _iWr   r  r  r  r  r   _aHr  )r   rJ   rK   r+   r7  r;  r<  ZilpadZirpadZibpadZitpadZiWrD   r  r  W1r  r   r   r   rB   /  s@    


zImageAndFlowables.wrapc           	   
   C   s   t | dr>| j}| j||fks.t|dd d k	r>|   |  | ||\}}| j|kr\g S | j}|r|d 	||| j }|sg }q|d g}|dd  |dd   }ng }t
| j| j| | j| j| j| j| j| jdg| S )Nr  r   r   rZ   )r  r  r  r  r  r  )r2   r  r  rL   r  r   rB   r  r  rN   r  r  r  r  r  r  r:  r  )	r   rJ   rK   r7  r  r   r#  rO   r  r   r   r   rN   S  s8    

 
 zImageAndFlowables.splitc           	      C   s   | j dkr&|| j }|| j | j }n|| j | j | j }|}| j|||| j | j | j	  | j
r|j| j
||| j | j | j	 || j || j fdd | jrtj| |||| j| jd | jr| j\}}tj| |||| j | j|d d S )Nr   rZ   )relative)r  rC   )r:  r  r  r  r$   r  rA   r%   r  r  r  ZlinkURLr  rS  r  r  r  r  )	r   r+   r5   r?   r@   ZIxZFxrC   rD   r   r   r   rA   o  s    

"8
zImageAndFlowables.drawOn)r   r   r   r   r   N)r   )r   r   r   r    r   r   rU   rW   r  rB   rN   rA   r   r   r   r   r  	  s       
	$r  c                   @   s0   e Zd ZdZdZdddZdd Zdd	d
ZdS )_AbsRectrZ   Tr   Nc	           	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S rg   )_x_yr   r   _strokeColor
_fillColor_strokeWidth_strokeDashArray)	r   r5   r?   r$   r%   strokeWidthstrokeColor	fillColorstrokeDashArrayr   r   r   r     s    z_AbsRect.__init__c                 C   s   dS r*  r   rI   r   r   r   rB     s    z_AbsRect.wrapc                 C   s   | j tkr| jtkr| jo,| jd k	o,| jdk}|s8| jr|  |r\|| j || j | jrn|	| j |j
| j| j| j | j|rdnd| jrdndd |  d S Nr   rZ   )r  fill)r   r   r   r  r  r  r8   r:   rK  r   r;   r  r  r<   )r   r+   r5   r?   r@   str   r   r   rA     s    
0z_AbsRect.drawOn)r   NNN)r   r   r   r   rU  r   r   rB   rA   r   r   r   r   r    s
   

r  c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
	_ExtendBGrZ   Tc                 C   s   || _ || _|| _d S rg   )r  r   _bg)r   r?   r%   r\  rk   r   r   r   r     s    z_ExtendBG.__init__c                 C   s   dS r*  r   rI   r   r   r   rB     s    z_ExtendBG.wrapc           
      C   sX   | j }| j}| j}|j}|j| |j }|j| }| j}| }	|	|||||| d S rg   )
r  r  r   r   r   r   _x1r+   getPageNumberr[  )
r   rk   r\  ra  r`  r]  r^  r_  r+   pnr   r   r   r     s    
z_ExtendBG.frameActionN)r   r   r   rU  r   r   rB   r   r   r   r   r   r    s
   r  c                   @   s0   e Zd ZdZdZdddZdd Zdd	d
ZdS )_AbsLinerZ   Tr   Nc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S rg   )r  r  r  _y1r  r  r  )r   r5   r?   x1y1r  r  r  r   r   r   r     s    z_AbsLine.__init__c                 C   s   dS r*  r   rI   r   r   r   rB     s    z_AbsLine.wrapc                 C   s^   | j rZ| jd k	rZ| jdkrZ|  || j  || j || j| j| j| j	 |
  d S r   )r  r  r8   r:   rK  rv   r  r  r  r  r<   r   r+   r5   r?   r@   r   r   r   rA     s    z_AbsLine.drawOn)r   NN)r   r  r   r   r   r   r    s
   
	r  c                   @   sD   e Zd ZdZddd	Zdd
dZdd Zdd Zdd Zdd Z	dS )BalancedColumnsr  r   r   r   Nrl   r  c                 C   s   |pdt |  | _|dk r.td||  f t|| _|| _|| _|| _|| _	|	| _
|
| _|| _|| _|t | _|| _|| _|| _|| _|| _|| _|| _|| _d S )NzBalancedColumns-%dr   z'nCols should be at least 2 not %r in %s)r_   r  r3   Z
identitityr  r  _nColsrT   rZ  _innerPadding_rightPadding_topPadding_bottomPaddingrV   r   _neededshowBoundaryendSlack_boxStrokeColor_boxStrokeWidth_boxFillColor
_boxMargin_vLinesStrokeColor_vLinesStrokeWidth)r   r   nColsneededrV   rT   r  leftPaddinginnerPaddingrightPadding
topPaddingbottomPaddingr  r  boxStrokeColorboxStrokeWidthboxFillColor	boxMarginvLinesStrokeColorvLinesStrokeWidthr   r   r   r     s*    


zBalancedColumns.__init__c              
   C   s@   d| j j| jtt| |  t| ddr8dt| dd p:df S )Nz<%s nCols=%r at %s%s%s>r  rl   r  )r]   r   r  r^   r_   r`   rL   r   r   r   r   rd     s    zBalancedColumns.identityc                 C   s   | j S rg   )rT   r   r   r   r   rU     s    zBalancedColumns.getSpaceAfterc                 C   s   | j S rg   )rV   r   r   r   r   rW     s    zBalancedColumns.getSpaceBeforec           7         sV  g }j ddlm}m}m} ddlm  ddlm} jd krFjnj
j	d kr\j	nj	j
d krrj
nj
jd krjnjj}j}	jd krt
nj}
|
d 	jj||
d   
  t |}| 8 }j| dd\}}}}|sHtd	 ||| d
d jD f i d'fdd	d}|rt|}ndd l}fdd}d|dd d ffdd	}tt|t jd  |}| | d s||||}|r|\}}}}|}d}n
|}j}nT|t }| | d sh||||}|r^|\}}}}|}d}n
|}j}|rvtd||\}}}}  |d g kr|d g kr|r||d g|d  }}j}j }j!}|  | }|  | |t |s|	r0|| |	 }|||	}nd  }}j"d k	rJj"nj"|| j  	
fddt#D }$dd kr|d  t%dd } | r| d nd  }!}"G fddd|}#|"rt&|"}!|'|! j(}$|'|#g ||d  |r4|'| j)rPj*rPj*dkpTj+}%j,onj-onj-dk}&|%s||&rj.}'|'sd}'t/|'dkr|'d  }( }) }*}+nt/|'dkr|'d  }(}+|'d  })}*nlt/|'dkr|'d }(|'d  })}*|'d }+n@t/|'dkr4|'d }(|'d }*|'d }+|'d })ntd t0|' |) },|d j|d j! |* }-|+ }.|( |+ }/|.|/ }0|%rt1|,|.|-|, |/j+j)j*d!}1|&rg }2t#dD ]N}3d||3 j||3d  j ||3d  j!  }4|2't2|4|.|4|0j-j,d" qn|}0}.|%r$|'|1 |&r4|3|2 4 }5t#D ]T}3||3 }6|6r~t5|||6d#d$}6t|5|64 }5|'|6 |3d krD|'| qD|'|#| |$ |!r|rd}5t|.|5 |!_6t||0|!j6 |!_7|r|'| |rN|'t8|j9j:jj"jjj	j
jj;d% jj)j*j+j.j,j-d& |fS )(Nr   )r  rT  r   Framer   r0   rZ   F)r  zB%s cannot make initial split aW=%r aH=%r ie cw=%r ah=%r
content=%sc                 S   s   g | ]}|j jqS r   r   r%  r   r   r   r     s     z6BalancedColumns._generated_content.<locals>.<listcomp>c                    s   |  krg }d}d}d }|r$d nd}t D ]}j| |dd\}}	}
}t||}t||	}||
 ||krjd|  |dd\}}}}|d| |  kr|| | d }g } q|}q0| dt|g k  |g k||||ff | <  |  d S )	Nr   r   r   F)r  r  rZ   gư>i )r   r  r   r   r   )ahr  r  rE   rF   ZcnZicheckrl  ZwihiZc0Zc1ZwcZhcZcc0Zcc1)_fresr+   cwr  r   r   r   	splitFunc  s*    


 
*z5BalancedColumns._generated_content.<locals>.splitFuncc                    s   |   |  d S r   r   )r  )r  r  r   r   r  1  s    z0BalancedColumns._generated_content.<locals>.func   r   c                    s   ||| |  }||| |  }t || |krl| || |k rF|}n|}||| |  }||| |  }q dd   D }|r|  |d d S d S )Nc                 S   s    g | ]\}}}|r|||fqS r   r   )r   r5   tfvr   r   r   r   B  s      zCBalancedColumns._generated_content.<locals>.gss.<locals>.<listcomp>r   r   )rk  valuessort)rn   r6   r   ZtolZgrr  r   r   )r  r   r   gss5  s    z/BalancedColumns._generated_content.<locals>.gssg?zunexpected non-empty C2c                    sZ   g | ]R} |  |s"n|d  kr6	nd
j |f jjdqS )rZ   z%s-%d)r  r  r  r  r_   r  r   _debug)r  Z_oASpacer  r   rl  )r  bpadr   fhrk   hgaplpadr  obxrpadr   r  tpady2r   r   r   u  s   
  pageTemplatez&%s used in non-doctemplate environmentrV  r   c                       s0   e Zd ZdZg g dfddZ ffdd	ZdS )z3BalancedColumns._generated_content.<locals>.TActionz?a special Action flowable that sets stuff on the doc template TNc                 S   s    t |  || _|| _|| _d S rg   )r!   r   bgsr   rn   )r   r  r   rn   r   r   r   r     s    
z<BalancedColumns._generated_content.<locals>.TAction.__init__c                    s*   | j |_| j _|| jj | j _d S rg   )r   framesr  rV  Zhandle_currentFramern   r_   )r   docro  )rk   r   r   rW    s    z9BalancedColumns._generated_content.<locals>.TAction.apply)r   r   r   r    r   rW  r   )ro  rk   r   r   TAction  s   r  )r   r   r   r   r      zInvalid value %s for boxMargin)r  r  r  )r  r  r|  )r  z-1)r  r  rV   rT   r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r   )<rj   r   r  rT  r   reportlab.platypus.framesr  r   rZ  r  r  r  r  r  r  r   r+   r  r   r  r3   rd   r  rv  ru  r   r   rT   r  r  clearr  r  r   r  r   ri   rL   r  r   r  r  r  r  r  r  r  ry   r   r  r  rg  rU   r{  r  r   r  r  rV   r  )7r   rC   rD   Gr  rT  r   r   ZleftExtraIndentZrightExtraIndentgapZaH0r  r  r  ZC2r  r   rv  r  r  r  r  rc  r#  r  r  fwZftopZ	indenter0Z	indenter1r   ZBGsZxbgr\  r  	oldFramesZdoBoxZdoVLinesZobmZobmtZobmlZobmrZobmbZobx1Zobx2Zoby2ZobhZoby1ZboxZvLinesrl  ZvlxsaZCir   )r  ro  r  r  r+   r  r   r  rk   r  r  r  r  r   r   r  r  r  r  r   r     s^          "$



 
" 

*$ 
 

  
   z"BalancedColumns._generated_contentc              
   C   s   t | dd }|| j| j t k r0t | g}d}nB|sZddlm} |dd|dddddd| _| ||\}}|sr| `|r|j	|  dt
||fS )Nrj   r   r  i)r  r  r  r  )rL   rV   r  r   r   r	  r  rj   r   r   r   )r   rC   rD   Z
self_framer  r  r  r   r   r   rB     s     
  
zBalancedColumns.wrap)r   r   r   r   NNNNNNrl   r  Nr   NNNN)N)
r   r   r   r    r   rd   rU   rW   r   rB   r   r   r   r   r    s,                      
 
 ur  c                   @   s8   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dS )AnchorFlowablezcreate a bookmark in the pdfrZ   Tc                 C   s   t | dd || _d S r   )r   r   _name)r   r  r   r   r   r     s    zAnchorFlowable.__init__c                 C   s   d| j j| jf S )Nr   )r]   r   r  r   r   r   r   rt     s    zAnchorFlowable.__repr__c                 C   s   dS r*  r   r4  r   r   r   rB     s    zAnchorFlowable.wrapc                 C   s   | j | jdd d S r   )r+   ZbookmarkHorizontalr  r   r   r   r   r,     s    zAnchorFlowable.drawN)
r   r   r   r    rU  r   r   rt   rB   r,   r   r   r   r   r     s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_FBGBagc                 C   sD   t |}t| jtr|| jks(|| jkoBt || jkoB| j| kS rg   )r_   r   fidr	  cidr  r  )r   rk   r+   r  r   r   r   matches  s     z_FBGBag.matchesc                 C   s&   |j | j  | _tt| jdd S )NrZ   r  )_codecodePosrN   _instr  r   r-   r   r   r   getDims  s    z_FBGBag.getDimsc                 C   s2   t ||||g| jdd< d| j|j| j< d S )NrZ   r   )r   r  r   r  r  )r   r+   r5   r?   rE   rF   r   r   r   setDims  s    z_FBGBag.setDimsc                 C   s<  t |tkr8t |tkr8| }| jt|krx| jt|krx| j|krx| |\}}	}
}| ||||
||	 |  n|	  | j
}|r|| | j}|d ks|dk rd n| j}|r|| || | j}|r|| t|| _t|| _|| _t|j| _|j|||||rdnd|r(dndd |  d S r  )rk  r   r  r  r_   r  r  r  r  r8   r  r   r  r  r:   rK  r  rM  ry   r  r  r;   r<   )r   r+   rk   r_  ra  r^  r`  r  ZoxZoyZowZohZfbgcswscdar   r   r   r[    s.    &





*z_FBGBag.renderN)r   r   r   r  r  r  r[  r   r   r   r   r    s   r  c                   @   s.   e Zd ZdZdZdddZdd	 Zd
d ZdS )FrameBGa$  Start or stop coloring the frame background
    left & right are distances from the edge of the frame to start stop colouring.
    if start in ('frame','frame-permanent') then the background is filled from here to the bottom of the frame and immediately discarded
    for the frame case.
    rZ   Nr   Tc           	      C   sT   t | dd || _|rPddlm} ||| _||| _|| _|| _|| _	|| _
d S )Nr   )_evalMeasurement)r   r   rY  r   r   r   r   rG  r  r  r  )	r   rG  r   r   rY  r  r  r  r   r   r   r   r   @  s    

zFrameBG.__init__c                    s(   d j jd fddd D f S )Nr   z, c                    s    g | ]}d |t  |df qS )z%s=%rNrf   r  r   r   r   r   M  s     z$FrameBG.__repr__.<locals>.<listcomp>zstart color left right)r]   r   r   rN   r   r   r   r   rt   L  s    zFrameBG.__repr__c                 C   s   t | dd }|d krd S | jr| j}| j}|d kr6dn|}|jt| j| j| j	| jdkr^| jnd | j| j| j
dddd dd n|jr|j  d S )Nrj   r   )rk   zframe-permanentr   T)r   r   r  rY  r  r  r  r  r  r  r  rX  )rL   rY  r  r  rV  r   r  r   r   rG  r  r   )r   rk   r  r  r   r   r   r,   O  s0     zFrameBG.draw)Nr   r   TNNN)r   r   r   r    rU  r   rt   r,   r   r   r   r   r  9  s
   
r  c                   @   s.   e Zd ZdZdZg dddfddZdd	 Zd
S )FrameSplittera@  When encountered this flowable should either switch directly to nextTemplate
    if remaining space in the current frame is less than gap+required or it should
    temporarily modify the current template to have the frames from nextTemplate
    that are listed in nextFrames and switch to the first of those frames.
    rZ   r  r   Tc                 C   s&   || _ |pg | _|| _|| _|| _d S rg   )r   
nextFramesr  requiredadjustHeight)r   r   r"  r  r#  r$  r   r   r   r   n  s
    
zFrameSplitter.__init__c                    s  j }ddlm}m}m} |jg}|jj t k rJ|	t
  n<d}|d krl|d  fdd|D }	|	s|d jf |	d }	fdd|	jD }
d	d |
D   fd
djD   r|d  |	j|	dd |	jD f d}	|	|	j|	jfdd}||	_|j }t|
D ]0\}}t|}jrX||_|  ||
|< q:|
|	_|	||
d j |j|  dS )Nr   )NextPageTemplateCurrentFrameFlowabler  ZpageTemplatesz(%s called in non-doctemplate environmentc                    s   g | ]}|j  jkr|qS r   )r_   r   )r   rx  r   r   r   r     s      z&FrameSplitter.wrap.<locals>.<listcomp>z%s.nextTemplate=%s not foundc                    s   g | ]}|j  jkr|qS r   )r_   r"  r%  r   r   r   r     s      c                 S   s   g | ]
}|j qS r   r_   r%  r   r   r   r     s     c                    s   g | ]}| kr|qS r   r   r%  )Nr   r   r     s      z;%s frames=%r not found in pageTemplate(%s)
%r has frames %rc                 S   s   g | ]
}|j qS r   r'  r%  r   r   r   r     s     r  c                 S   s   ||_ ||_|| | d S rg   )r  onPage)r+   r  ro  r)  r  r   r   r   unwrap  s    z"FrameSplitter.wrap.<locals>.unwrapr   )rj   r   r%  r&  r  r   r  r#  r   r   r   ri   rd   r  r"  r_   r)  r  r   r$  r%   r  r   )r   rC   rD   rk   r%  r&  r  r  Z	templatesro  r   r*  rF   rl  rn   r   )r(  r   r   rB   u  s>    
(

 
zFrameSplitter.wrapN)r   r   r   r    rU  r   rB   r   r   r   r   r!  g  s   r!  )_type2formatteru   •u   ●u   ■u   ○u   ◆u   ❖u   ➤u   ❇u   ❏u   ★)

bulletcharZcirclerJ  ZdiscZdiamondZ	diamondwxZ
rarrowheadZsparkleZ	squarelrsZ	blackstar1c                 C   s`   |dkrt | | }nt| t| }|r\t|tr>|| }nt|rP||}ntd| |S )Nbulletz!unexpected BulletDrawer format %r)_bulletNamesr   r+  r   r   r   callabler3   )valuetypeformatr  r   r   r   _bulletFormat  s    


r4  c                
   @   s    e Zd Zdd
dZdddZd	S )BulletDrawer0r   r-  black	Helveticaru   r   ltrNc                 C   s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S rg   )
r1  _bulletAlign_bulletType_bulletColor_bulletFontName_bulletFontSize_bulletOffsetY_bulletDedent
_bulletDirr4  )r   r1  bulletAlign
bulletTypebulletColorbulletFontNamebulletFontSizebulletOffsetYbulletDedent	bulletDirbulletFormatr   r   r   r     s    zBulletDrawer.__init__c           	      C   s.  | j }|sd S |  ||| |j| j | j }| jdkrR|j|j | j	 }n|j
| j	 }|| j| j || j | j}t|| j| j}|dkr|||| nz|dkr|||| nb|dkr|||| nJ|ds|dr|dd   pd}||||| ntd	| |  d S )
Nrtlr   r   )centerZcentrenumericdecimal   .zInvalid bulletAlign: %r)r1  r8   r9   r%   r>  r?  rA  r$   _rightIndentr@  _leftIndentrw   r=  r   r<  r:  r4  r;  Z
drawStringZdrawRightStringrx   
startswithrz   ZdrawAlignedStringr3   r<   )	r   Zindenterr+   r5   r?   r@   r1  rB  Zpcr   r   r   rA     s0     
zBulletDrawer.drawOn)
r6  r   r-  r7  r8  ru   r   r   r9  N)r   )r   r   r   r   rA   r   r   r   r   r5    s             
r5  c                 C   s    t || j| j }t|| j| jS rg   )r4  r;  r   r=  r>  )r   r1  r   r   r   _computeBulletWidth  s    rT  c                   @   sZ   e Zd Zd ZdddZdd ZdddZd	d
 Zdd Zdd Z	dd Z
dddZdS )
DDIndenterz/_flowable _leftIndent _rightIndent width heightr   c                 C   s"   || _ || _|| _d | _d | _d S rg   )	_flowablerR  rQ  r$   r%   )r   flowabler   r=  r   r   r   r     s
    zDDIndenter.__init__c                    s,    j | j  j |} fdd|D S )Nc                    s   g | ]}t | j jd qS ))r   r=  )rU  rR  rQ  r   r  r   r   r   r     s
   z$DDIndenter.split.<locals>.<listcomp>rV  rN   rR  rQ  r   rC   rD   rO   r   r   r   rN     s    
zDDIndenter.splitc              	   C   s.   | j ||| j |td|| j | j  d S r   )rV  rA   rR  r   rQ  r  r   r   r   rA     s    zDDIndenter.drawOnc                 C   s@   | j || j | j |\}}|| j | j | _|| _| j|fS rg   )rV  rB   rR  rQ  r$   r%   r   rC   rD   rE   rF   r   r   r   rB     s    zDDIndenter.wrapc              	   C   sZ   || j krNz| j| W S  tk
rL   |dkrHt| d| d| j Y nX t| j|S )NrV   rT   z has no attribute z dict=)_IndenterAttrsr   KeyErrorr   rL   rV  rh   r   r   r   r     s    
 zDDIndenter.__getattr__c                 C   s(   || j kr|| j|< nt| j|| d S rg   )r]  r   setattrrV  r   r6   r  r   r   r   __setattr__  s    
zDDIndenter.__setattr__c                 C   s$   || j kr| j|= nt| j| d S rg   )r]  r   r  rV  rh   r   r   r   __delattr__  s    

zDDIndenter.__delattr__Nc                 C   s   d| j j| j|f S )Nz%s containing %s)r]   r   rV  rd   r   r   r   r   rd   "  s    zDDIndenter.identity)r   r   )r   )N)r   r   r   rN   r]  r   rA   rB   r   ra  rb  rd   r   r   r   r   rU    s   
	
	rU  c                   @   s0   e Zd Zd Zd
ddZdd Zddd	ZdS )
LIIndenterzN_flowable _bullet _leftIndent _rightIndent width height spaceBefore spaceAfterr   Nc                 C   sD   || _ || _|| _|| _d | _d | _|d k	r2|| _|d k	r@|| _d S rg   )rV  _bulletrR  rQ  r$   r%   rV   rT   )r   rW  r   r=  r.  rV   rT   r   r   r   r   '  s    zLIIndenter.__init__c                    s.   j |j j |  fdd D S )Nc              	      s2   g | ]*}t |jj| d  kr&jp(ddqS )r   N)r   r=  r.  )rc  rR  rQ  rd  rX  rO   r   r   r   r   5  s   z$LIIndenter.split.<locals>.<listcomp>rY  r4  r   re  r   rN   3  s    zLIIndenter.splitc              	   C   sH   | j r| j | |||d | j||| j |td|| j | j  d S r   )rd  rA   rV  rR  r   rQ  r  r   r   r   rA   =  s    zLIIndenter.drawOn)r   r   NNN)r   )r   r   r   rN   r]  r   rA   r   r   r   r   rc  %  s   

rc  )	ListStylec                   @   s   e Zd ZdddZdS )ListItemNc                 K   s   t |ttfs|f}|| _i  }| _|rLt |tsFtd| jj|f || _	tj
D ]2}||krj||}n|rRt||}nqR|||< qRdD ](}||t||d }|d k	r|||< qd S )Nz&%s style argument (%r) not a ListStyle)r1  rV   rT   )r   r	  r
  
_flowables_paramsrf  r3   r]   r   _styledefaultsr   rL   )r   r  rR   r/  paramskr  r   r   r   r   E  s&    



zListItem.__init__)NrQ  r   r   r   r   rg  D  s    rg  c                   @   s   e Zd Zdd ZdS )	_LIParamsc                 C   s   || _ || _|| _|| _d S rg   )rW  rl  r1  first)r   rW  rl  r1  ro  r   r   r   r   o  s    z_LIParams.__init__NrQ  r   r   r   r   rn  n  s   rn  c                   @   sZ   e Zd ZdZdddZedd Zdd Zd	d
 Zdd Z	dddZ
dddZdd ZdS )r  1aAiINc                 K   sj  || _ |r*t|ts$td| jj || _tj D ](\}}t	| d| |
|t||| q4dD ],}|
|t||d }|d k	rbt	| || qbd}|d krt| dd }|d kr| jdkrd}d}n
| j}d}| jdkr0|r|D ] }|| jkrtd	|| jf qn(| jD ] }|| jkrtd
| j q|| _|pHt|ttf| _d | _d | _|dd | _d S )Nz!%s style argument not a ListStylerh  r\  F_startr.  r,  Tz!invalid start=%r or bullettype=%rzinvalid bullettype=%rcaption)rh  r   rf  r3   r]   r   rR   rk  itemsr_  r   rL   r;  _numberStylesrq  r	  r
  _auto_list_content_dimsr   _caption)r   r  rY  rR   r/  rm  r  r   r   r   r   r   w  sB    
"


zListFlowable.__init__c                 C   s   | j d kr|  | _ | `| j S rg   )rv  r  rh  r   r   r   r   r    s    

zListFlowable._contentc                 C   s4   | j |kr(t| j|| j\| _| _|| _ | j| jfS rg   )rw  r  r  r+   r$   r%   r4  r   r   r   rB     s    
zListFlowable.wrapc                 C   s   | j S rg   )r  r4  r   r   r   rN     s    zListFlowable.splitc           
   	   c   s^  | j D ]P}t|ttfrL|rJt|D ]"\}}|dko@t|t |fV  q&qt|trF|j}|st|j D ](\}}t|trtd|dk|fV  qln|	 }|
dd }|
dd }|
dd }t|j d }t|j D ]f\}}|	 }	|s|d k	r||	d< ||kr |d k	r ||	d< |r*d }dt||	||dkfV  qqt|t |fV  qd S )Nr   z"LIIndenter not allowed in ListItemr1  rV   rT   rZ   )rh  r   r	  r
  r  rc  rg  ri  r3   r   r   ry   rn  )
r   rn   rl  zrl  r1  rV   rT   rn  r6  r   r   r   _flowablesIter  s6    
 zListFlowable._flowablesIterc                 C   sb   |rL| d| j}| d| j}| dd }| dd }t||||||dS t|| j| j|S d S )Nr   r=  rV   rT   r\  )r   rR  rQ  rc  )r   rW  r.  rl  r   r=  rV   rT   r   r   r   _makeLIIndenter  s    zListFlowable._makeLIIndenterc                    sr    d krfdd}nt  dd  fdd}t||d|d|d|d|d	|d
|d|d|dd
S )Nc                    s   t  d|  S Nrh  rf   r6   r   r   r   getp  s    z&ListFlowable._makeBullet.<locals>.getprR   c                    s6   |  kr |  S r(| j kr(t| S td|  S r|  )r   rL   r}  rl  r   rR   r   r   r~    s
      
rB  rC  rD  rE  rF  rG  ZcalcBulletDedentrI  rJ  )
r1  rB  rC  rD  rE  rF  rG  rH  rI  rJ  )rL   r5  )r   r1  rl  r~  r   r  r   _makeBullet  s     zListFlowable._makeBulletc                 C   s  | j }| j}t|ttfr(|}|d }n|g}|d }t|dk}|rdzt|}W n   d}Y nX | j}|dkr| j}| j}|dkr|dkr| j	} n|dkr| j
}n|}	d}
|  D ]\}}|rt|
t| |	}
|r|	|7 }	qt|tr|j}|r$|j|kr4t|
t||j}
t|j}	nt|
t| |	}
|r|	|7 }	q|dkrr|dkrb| j	|
 }n| j	|
d  }n$|dkr| j
|
 }n| j
|
d  }|| _g }|j}d}|  D ]\}}t|tr<|j}t|ttfr|d }||kr<|jr8||d }||d  |d |  |_|jd }|r<||_ n|}i }|sl|d7 }t| d	d }|d k	rl||d	< |r|| j|| ||d
 |r||7 }qt|tr0|j}|r|j|krtd|j|f t|j}n| j|t|dd d|_|rt|jd	d||jd	< || |r||7 }nt|tr||j | j|j d |d
}|j!r|jd k	r|j}|rt|}| ||j|_|r||7 }|| n|| j|d |d
 qt| dd }|d k	r|d }t|jdd||jd< | j"r|#d| j" |S )Nr   rp  rZ   r   r9  r   r   r0   rV   )r.  rl  z>Included LIIndenter bulletType=%s != OrderedList bulletType=%srl  )rl  rT   r   )$r;  rq  r   r	  r
  r   r@  r:  rA  rR  rQ  rz  r   rT  rc  rd  rC  r1  Z_calcBulletDedentr   r  ru  indexrL   r{  r  r3   r   r   rn  updaterl  rW  ro  rx  r!  )r   Zbtr1  r  ZautovincZbdZaligndirZtvalueZmaxWr   rn   r   rO   ZaSrl  ZfstartZfparamsrV   ry  rT   r   r   r   r  	  s    



 

 





 
  
  

 zListFlowable._getContent)NN)N)N)r   r   r   rt  r   rq   r  rB   rN   rz  r{  r  r  r   r   r   r   r  u  s     
;



r  c                   @   sJ   e Zd Z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S )	TopPadderzwrap a single flowable so that its first bit will be
    padded to fill out the space so that it appears at the
    bottom of its framec                 C   s   || j d< d S )N_TopPadder__f)r   rm   r   r   r   r   x	  s    zTopPadder.__init__c                 C   s(   | j ||\}}|| | jd< ||fS )N_TopPadder__dh)r  rB   r   r[  r   r   r   rB   {	  s    zTopPadder.wrapc                 C   s.   | j ||}t|dkr*t|d |d< |S )NrZ   r   )r  rN   ry   r  rZ  r   r   r   rN   	  s    zTopPadder.splitr   c              	   C   s&   | j |||td| jd  | d S )Nr   r   )r  rA   r   r  r=   r   r   r   rA   	  s    zTopPadder.drawOnc                 C   s   t | j|| d S rg   )r_  r  r`  r   r   r   ra  	  s    zTopPadder.__setattr__c                 C   s   t | j|S rg   )rL   r  rh   r   r   r   r   	  s    zTopPadder.__getattr__c                 C   s   t | j| d S rg   )r  r  rh   r   r   r   rb  	  s    zTopPadder.__delattr__N)r   )r   r   r   r    r   rB   rN   rA   ra  r   rb  r   r   r   r   r  t	  s   
r  c                   @   s6   e Zd ZdZdZdddZdd Zdd	 Zd
d ZdS )	DocAssignzJAt wrap time this flowable evaluates var=expr in the doctemplate namespacerZ   foreverc                 C   s   t |  |||f| _d S rg   r!   r   r.  )r   varexprZlifer   r   r   r   	  s    
zDocAssign.__init__c                 C   sR   |  d}|t||d z|  W S dD ]}z
||= W q.   Y q.X q.X d S )N
_nameSpaceZavailableWidthZavailableHeight)ri   r  dictr  )r   rC   rD   NSrm  r   r   r   funcWrap	  s    

zDocAssign.funcWrapc                 C   s    |  d| jjdd   | j S )Nr   rZ   )ri   r]   r   r.  r   r   r   r   r  	  s    zDocAssign.funcc                 C   s   |  || dS r*  )r  r4  r   r   r   rB   	  s    zDocAssign.wrapN)r  )	r   r   r   r    rU  r   r  r  rB   r   r   r   r   r  	  s   
r  c                   @   s   e Zd ZdZdddZdS )DocExecz(at wrap time exec stmt in doc._nameSpacer  c                 C   s   t |  ||f| _d S rg   r  )r   ZstmtZlifetimer   r   r   r   	  s    
zDocExec.__init__N)r  r   r   r   r   r   r  	  s   r  c                   @   s:   e Zd ZdZdddZdd Zdd	 Zd
d Zdd ZdS )DocParaaH  at wrap time create a paragraph with the value of expr as text
    if format is specified it should use %(__expr__)s for string interpolation
    of the expression expr (if any). It may also use %(name)s interpolations
    for other variables in the namespace.
    suitable defaults will be used if style and klass are None
    NTc                 C   s,   t |  || _|| _|| _|| _|| _d S rg   )r!   r   r  r3  rR   klassescape)r   r  r3  rR   r  r  r   r   r   r   	  s    
zDocPara.__init__c                 C   s.   | j }|r*t|tst|}| d|S d S )NZdocEval)r  r   r4   ri   )r   r  r   r   r   r  	  s
    
 zDocPara.funcc                 G   s   |  dj|  d S )Nrk   )ri   r   )r   r.  r   r   r   add_content	  s    zDocPara.add_contentc                 C   sR   |  ||}| jrF| d }|t||d ||d< | j| }nt|}|S )Nr  r  Z__expr__)r  r3  ri   r   r  r  r4   )r   rC   rD   r1  r  r   r   r   	get_value	  s    zDocPara.get_valuec                 C   sr   |  ||}| j}|s"ddlm} | j}|sBddlm} | d }| jr\ddlm} ||}| 	|||d dS )Nr   r  )getSampleStyleSheetZCode)r  )rR   r   )
r  r  r  r  rR   reportlab.lib.stylesr  r  xml.sax.saxutilsr  )r   rC   rD   r1  r6  rR   r  r  r   r   r   rB   	  s    
zDocPara.wrap)NNNT)	r   r   r   r    r   r  r  r  rB   r   r   r   r   r  	  s   
r  c                   @   s&   e Zd ZdddZdd Zdd ZdS )		DocAssertNc                 C   s   t |  || _|| _d S rg   )r!   r   r  r3  )r   condr3  r   r   r   r   	  s    
zDocAssert.__init__c                 C   s   t | ||| _| jS rg   )r  r  _condr4  r   r   r   r  	  s    zDocAssert.funcWrapc                 C   s"   |  ||}t| jst|dS r*  )r  boolr  r  )r   rC   rD   r1  r   r   r   rB   	  s    
zDocAssert.wrap)N)r   r   r   r   r  rB   r   r   r   r   r  	  s   
r  c                   @   s(   e Zd Zg fddZdd Zdd ZdS )DocIfc                 C   s"   t |  || _|pg |f| _d S rg   )r!   r   r  blocks)r   r  Z	thenBlockZ	elseBlockr   r   r   r   	  s    
zDocIf.__init__c                 C   s   t |ttfs|f}|S rg   )r   r	  r
  )r   blockr   r   r   
checkBlock	  s    zDocIf.checkBlockc              
   C   s*   | j | | jtt| ||   dS r*  )r  r  r  r   r  r  r4  r   r   r   rB   	  s    &z
DocIf.wrapN)r   r   r   r   r  rB   r   r   r   r   r  	  s   r  c                   @   s   e Zd Zdd Zdd ZdS )DocWhilec                 C   s    t |  || _| || _d S rg   )r!   r   r  r  r  )r   r  Z
whileBlockr   r   r   r   
  s    
zDocWhile.__init__c                 C   s*   t | ||r&| jt| j| g   dS r*  )r  r  r  r	  r  r4  r   r   r   rB   	
  s    zDocWhile.wrapN)r   r   r   r   rB   r   r   r   r   r  
  s   r  c                   @   s"   e Zd ZdZdddZdd ZdS )	SetTopFlowablesrZ   Fc                 C   s   || _ || _d S rg   _F_showr   r   showr   r   r   r   
  s    zSetTopFlowables.__init__c                 C   s:   t t | dd dd }|r6| j|_| jr6| jr6| j|j_dS Nr+   re   r   )rL   r  Z_topFlowablesr  rk   r   r   rC   rD   r  r   r   r   rB   
  s    
zSetTopFlowables.wrapN)Fr   r   r   Z
_ZEROZSIZEr   rB   r   r   r   r   r  
  s   
r  c                   @   s"   e Zd ZdZdddZdd ZdS )	SetPageTopFlowablesrZ   Fc                 C   s   || _ || _d S rg   r  r  r   r   r   r   
  s    zSetPageTopFlowables.__init__c                 C   s:   t t | dd dd }|r6| j|_| jr6| jr6| j|j_dS r  )rL   r  Z_pageTopFlowablesr  rk   r   r  r   r   r   rB   "
  s    
zSetPageTopFlowables.wrapN)Fr  r   r   r   r   r  
  s   
r  )r   )rZ   NNN)r-  N)d__version__r    r   r   r   Zreportlab.lib.colorsr   r   Zreportlab.lib.rl_accelr   Zreportlab.lib.enumsr   r   r	   r  r
   r   r   r   Zreportlab.lib.abagr   Zreportlab.pdfbaser   Zreportlab.pdfbase.pdfmetricsr   Zreportlab.rl_configr   r   r   r   rN   __all__r   r!   rr   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r'  r(  r0  r1  r5  r@  rB  rC  rN  rR  rS  re  rt  rz  r{  r  r  r  r  r  r  r  r  r  r!  Zreportlab.lib.sequencerr+  r  r/  r4  r5  rT  rU  rc  rf  rg  rn  r  r  r  r  r  r  r  r  r  r  r   r   r   r   <module>   s    
(N 

5D@,:gm=x  7(.5
53*  2