o
    ôSk[?  ã                   @   s.  d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZ ddlmZ ddlmZ e 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ƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS ) a  
A paragraph class to be used with ReportLab Platypus.

TODO
====

- Bullets
- Weblinks and internal links
- Borders and margins (Box)
- Underline, Background, Strike
- Images
- Hyphenation
+ Alignment
+ Breakline, empty lines
+ TextIndent
- Sub and super

é    N)ÚColor)Ú	TA_CENTERÚ
TA_JUSTIFYÚTA_LEFTÚTA_RIGHT©ÚstringWidth)ÚFlowableÚ	xhtml2pdfc                   @   s<   e Zd ZdZedddddedddƒdddddœZd	d
„ ZdS )ÚStylezž
    Style.

    Single place for style definitions: Paragraphs and Fragments. The
    naming follows the convention of CSS written in camelCase letters.
    g        NzTimes-Romang      $@r   g      ø?)Ú	textAlignÚ
textIndentÚwidthÚheightÚfontNameÚfontSizeÚcolorÚ
lineHeightÚlineHeightAbsoluteÚpdfLineSpacingÚlinkc                 K   s,   |   | j¡ |   |¡ d| _d| _d| _d S ©Nr   F)ÚupdateÚDEFAULTÚspaceBeforeÚ
spaceAfterÚkeepWithNext)ÚselfÚkw© r   úE/var/www/html/env/lib/python3.10/site-packages/xhtml2pdf/paragraph.pyÚ__init__G   s
   

zStyle.__init__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r!   r   r   r   r    r   1   s    
õr   c                   @   s   e Zd ZdZdZdd„ ZdS )ÚBoxa%  
    Box.

    Handles the following styles:

        backgroundColor, backgroundImage
        paddingLeft, paddingRight, paddingTop, paddingBottom
        marginLeft, marginRight, marginTop, marginBottom
        borderLeftColor, borderLeftWidth, borderLeftStyle
        borderRightColor, borderRightWidth, borderRightStyle
        borderTopColor, borderTopWidth, borderTopStyle
        borderBottomColor, borderBottomWidth, borderBottomStyle

    Not used in inline Elements:

        paddingTop, paddingBottom
        marginTop, marginBottom

    Úboxc              	      s&  ˆ   ¡  ˆ dd ¡}|d urˆ  |¡ ˆ j||||ddd� ‡ ‡fdd„}|ˆ dd ¡ˆ dd ¡ˆ d	d ¡||||| ƒ |ˆ d
d ¡ˆ dd ¡ˆ dd ¡|| ||| || ƒ |ˆ dd ¡ˆ dd ¡ˆ dd ¡||| || || ƒ |ˆ dd ¡ˆ dd ¡ˆ dd ¡|||| |ƒ ˆ  ¡  d S )NÚbackgroundColoré   r   ©ÚfillÚstrokec                    s`   |r*| r,|d u rˆ  dtdddƒ¡}|d ur.ˆ  |¡ ˆ  |¡ ˆ  ||||¡ d S d S d S d S )NÚ	textColorr   )Úgetr   ÚsetStrokeColorÚsetLineWidthÚline)Úbstyler   r   Úx1Úy1Úx2Úy2©Úcanvasr   r   r    Ú_drawBorderLineq   s   

ùz$Box.drawBox.<locals>._drawBorderLineÚborderLeftStyleÚborderLeftWidthÚborderLeftColorÚborderRightStyleÚborderRightWidthÚborderRightColorÚborderTopStyleÚborderTopWidthÚborderTopColorÚborderBottomStyleÚborderBottomWidthÚborderBottomColor)Ú	saveStater.   ÚsetFillColorÚrectÚrestoreState)r   r8   ÚxÚyÚwÚhÚbgr9   r   r7   r    ÚdrawBoxf   s6   


ý

ý

ý

ýzBox.drawBoxN)r"   r#   r$   r%   ÚnamerO   r   r   r   r    r&   O   s    r&   c                   @   s(   e Zd ZdZdZdZdZdZdd„ ZdS )ÚFragmentz˜
    Fragment.

    text:       String containing text
    fontName:
    fontSize:
    width:      Width of string
    height:     Height of string
    ÚfragmentFc                 C   s   d| d< d S )Nr   r   r   ©r   r   r   r    Úcalc¡   s   zFragment.calcN)	r"   r#   r$   r%   rP   ÚisSoftÚisTextÚisLFrT   r   r   r   r    rQ   �   s    
rQ   c                   @   ó    e Zd ZdZdZdZdd„ ZdS )ÚWordz
    A single word.
    ÚwordTc                 C   s    t | d | d | d ƒ| d< dS )z;
        XXX Cache stringWith if not accelerated?!
        Útextr   r   r   Nr   rS   r   r   r    rT   ­   s    z	Word.calcN)r"   r#   r$   r%   rP   rV   rT   r   r   r   r    rY   ¥   ó
    rY   c                   @   rX   )ÚSpacezN
    A space between fragments that is the usual place for line breaking.
    ÚspaceTc                 C   s   t d| d | d ƒ| d< d S )Nú r   r   r   r   rS   r   r   r    rT   ¼   s   z
Space.calcN)r"   r#   r$   r%   rP   rU   rT   r   r   r   r    r]   ´   r\   r]   c                   @   s   e Zd ZdZdZdZdZdS )Ú	LineBreakz
    Line break.
    ÚbrTN)r"   r#   r$   r%   rP   rU   rW   r   r   r   r    r`   À   s    r`   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚBoxBeginÚbeginc                 C   ó    |   dd¡|   dd¡ | d< d S )NÚ
marginLeftr   ÚpaddingLeftr   ©r.   rS   r   r   r    rT   Ï   ó    zBoxBegin.calcc                 C   sF   |   dd¡| d  }| d |   dd¡ }| d }|  |||||¡ d S )Nre   r   rJ   ÚlengthÚpaddingRightr   )r.   rO   )r   r8   rK   rJ   rL   rM   r   r   r    ÚdrawÒ   s   zBoxBegin.drawN)r"   r#   r$   rP   rT   rk   r   r   r   r    rb   Ì   s    rb   c                   @   s   e Zd ZdZdd„ ZdS )ÚBoxEndÚendc                 C   rd   )NÚmarginRightr   rj   r   rg   rS   r   r   r    rT   Ý   rh   zBoxEnd.calcN)r"   r#   r$   rP   rT   r   r   r   r    rl   Ú   s    rl   c                   @   s   e Zd ZdZdS )ÚImageÚimageN)r"   r#   r$   rP   r   r   r   r    ro   á   s    ro   c                   @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚLinez'
    Container for line fragments.
    g      ð?c                 C   s,   d| _ d| _d| _|| _g | _t | ¡ d S r   )r   r   ÚisLastÚstyleÚboxStackÚlistr!   )r   rs   r   r   r    r!   î   s   zLine.__init__c           	      C   s4  |t kr\| d d | d d  }|| }|tkr&| D ]
}|d  |7  < qn6|tkr:| D ]}|d  |d 7  < q,n"|tkr\| js\|t| ƒd  }t| ƒD ]\}}|d  || 7  < qM| D ]+}|d |d  }t|tƒrt| j	 
|¡ q^t|tƒr‰| j	r‰| j	 ¡ }||d  |d< q^| j	D ]
}||d  |d< q�d S )NéÿÿÿÿrJ   r   g       @r)   ri   )r   r   r   r   rr   ÚlenÚ	enumerateÚ
isinstancerb   rt   Úappendrl   Úpop)	r   r   Ú	alignmentÚ	lineWidthÚ
emptySpaceÚfragÚdeltaÚirJ   r   r   r    ÚdoAlignmentö   s6   ÿÿ


€
ÿzLine.doAlignmentc                    sf   |ˆ _ dgdd„ ˆ D ƒ }t|ƒˆ _t‡ fdd„|D ƒƒ ˆ _ˆ _ˆ jˆ j }ˆ D ]}||d< q)ˆ jS )z/
        Align words in previous line.
        r   c                 S   s   g | ]}|  d d¡‘qS )r   r   rg   ©Ú.0r   r   r   r    Ú
<listcomp>  s    z!Line.doLayout.<locals>.<listcomp>c                 3   s   � | ]}|ˆ j  V  qd S ©N)Ú
LINEHEIGHTrƒ   rS   r   r    Ú	<genexpr>  s   € z Line.doLayout.<locals>.<genexpr>rK   )r   Úmaxr   r   r   )r   r   Ú
font_sizesrK   r   r   rS   r    ÚdoLayout  s   

zLine.doLayoutc              	   C   s<   t  d¡ t  d¡ | D ]}t  d| d|j ¡ ¡¡ qd S )Nrq   z(----------------------------------------z%sr[   )ÚloggerÚdebugr.   rP   Úupper)r   r   r   r   r    ÚdumpFragments'  s
   

ÿzLine.dumpFragmentsN)	r"   r#   r$   r%   r‡   r!   r‚   r‹   r�   r   r   r   r    rq   ç   s    rq   c                   @   s4   e Zd ZdZddd„Zdd„ Zddd	„Zd
d„ ZdS )ÚTextz„
    Container for text fragments.

    Helper functions for splitting text into lines and calculating sizes
    and positions.
    Nc                 C   s@   |d u rg }g | _ d| _d| _d| _d| _|| _t | |¡ d S )Nr   )Úlinesr   r   ÚmaxWidthÚ	maxHeightrs   ru   r!   )r   Údatars   r   r   r    r!   6  s   zText.__init__c                 C   s   | D ]}|  ¡  qdS )z/
        Calculate sizes of fragments.
        N)rT   )r   rZ   r   r   r    rT   C  s   
ÿz	Text.calcFc                 C   s¶  g | _ d| _| | _| _|| _g }| j}d}|s|d }t| ƒ}d}||k rÅ|}	t|ƒ}
t |¡D ]}d|d< |
 	t
|ƒ¡ q1||k r�| | }|d }||d< |d7 }t|t
ƒr^| 	|¡ n	t|tƒrg| ¡  |jry|jrs|
 	|¡ n|dkrxq?n|| |kr€n||7 }|
 	|¡ ||k sC|
r£|
d jdv r£|
 ¡  |
r£|
d jdv s–|
 ¡  |  j|
 | j¡7  _| j  	|
¡ | j|kr¿|	S d}||k s&d| j d _| j D ]
}
|
 ||d	 ¡ qÎd
S )z˜
        Split text into lines and calculate X positions. If we need more
        space in height than available we return the rest of the text
        r   r   rJ   r   r)   rv   )r^   ra   Tr   N)r‘   r   r’   r   r“   rs   rw   rq   Úcopyrz   rb   ry   rl   r{   rU   rW   rP   r�   r‹   rr   r‚   )r   r’   r“   Úsplittedrt   rs   rJ   ÚlenTextÚposÚposBeginr1   r'   r   Ú	fragWidthr   r   r    ÚsplitIntoLinesJ  sh   


ÿ
â!ÿ
Æ=
zText.splitIntoLinesc                 C   s2   t | jƒD ]\}}t d|¡ t | ¡ ¡ qdS )z?
        For debugging dump all line and their content
        zLine %d:N)rx   r‘   rŒ   r�   r�   )r   r�   r1   r   r   r    Ú	dumpLines¡  s   þzText.dumpLines)NN)F)r"   r#   r$   r%   r!   rT   r›   rœ   r   r   r   r    r�   .  s    

Wr�   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )Ú	Paragrapha:  
    A simple Paragraph class respecting alignment.

    Does text without tags.

    Respects only the following global style attributes:
    fontName, fontSize, leading, firstLineIndent, leftIndent,
    rightIndent, textColor, alignment.
    (spaceBefore, spaceAfter are handled by the Platypus framework.)

    Fc                 K   s^   t  | ¡ || _| j ¡  || _|| j_|| _|| _t |¡D ]
\}}t	| ||ƒ qd | _
d S r†   )r	   r!   r[   rT   rs   r�   r–   ÚsixÚ	iteritemsÚsetattrÚ
splitIndex)r   r[   rs   r�   r–   ÚkwDictÚkÚvr   r   r    r!   ¶  s   


zParagraph.__init__c                 C   sz   || _ || _t d||¡ | jst ddd¡ dS |}| j ||¡| _|| jj| _| _t d| j| j| j¡ | j| jfS )zF
        Determine the rectangle this paragraph really needs.
        z*** wrap (%f, %f)z*** wrap (%f, %f) neededr   )r   r   z'*** wrap (%f, %f) needed, splitIndex %r)	ÚavWidthÚavHeightrŒ   r�   r[   r›   r¡   r   r   )r   Ú
availWidthÚavailHeightr   r   r   r    ÚwrapÊ  s   zParagraph.wrapc                 C   s–   t  d||¡ g }| jrB| jd| j… }| j| jd… }tt|ƒ| j| jd�}tt|ƒ| j| jdd�}||g}t  dt|ƒt|ƒ¡ t  d| j¡ |S )z4
        Split ourselves in two paragraphs.
        z*** split (%f, %f)N)r�   T)r�   r–   z*** text1 %s / text %sz*** return %s)	rŒ   r�   r¡   r[   r�   r�   rs   rw   r–   )r   r§   r¨   r–   Útext1Útext2Úp1Úp2r   r   r    Úsplitã  s   zParagraph.splitc              	   C   sF  t  d¡ | js
dS | j}| j}| ¡  | jrBd}tdddƒ}tdddƒ}| |¡ | |¡ | 	|¡ |j
|jd| j| jddd� d}| j}| jjD ]Ñ}||j7 }|D ]Ç}	t|	dƒrc|	 ||| ¡ |	 d	d
¡r�| |	d |	d ¡ | 	|	 d|d ¡¡ | |	d || |	d  |	d	 ¡ |	 dd¡}
|
�rt d¡}|	d || |	d |	d f\}}}}||||f}t|
tjƒrÀ|
 d¡}
|
 dd¡}t|ƒdkrÒ|d  ¡ pÓd
}| |¡rù|dkrù| ¡ dkrådpæd}|dkrï|d }
|j|
|d|d� qT|
d dk�r|
dd… }
d
}|jd
|dk�r|
�p|d |dd� qTqK|  ¡  dS )z6
        Render the content of the paragraph.
        z*** drawNg      à?r)   r   gÍÌÌÌÌÌì?r*   rk   r[   Ú r   r   r   rJ   rK   r   z^[a-zA-Z][-+a-zA-Z0-9]+$r   Úutf8ú:é   ÚdocumentÚpdfÚGoToRÚURI)ÚrelativeÚkindú#)r·   )!rŒ   r�   r[   Úcanvrs   rF   r   r/   r0   rG   rH   Ú
leftIndentr   r   r‘   Úhasattrrk   r.   ÚsetFontÚ
drawStringÚreÚcompilery   rž   Ú	text_typeÚencoder®   rw   ÚlowerÚmatchÚlinkURLÚlinkRectrI   )r   r8   rs   ÚbwÚbcrN   rK   Údyr1   r   r   Ú
_scheme_rerJ   rL   rM   rH   ÚpartsÚschemer¸   r   r   r    rk   ø  sj   



ú

"
$
&€à"zParagraph.drawN)FF)r"   r#   r$   r%   r!   r©   r®   rk   r   r   r   r    r�   ª  s    
r�   ) r%   r•   Úloggingr¿   rž   Úreportlab.lib.colorsr   Úreportlab.lib.enumsr   r   r   r   Úreportlab.pdfbase.pdfmetricsr   Úreportlab.platypus.flowablesr	   Ú	getLoggerrŒ   Údictr   r&   rQ   rY   r]   r`   rb   rl   ro   ru   rq   r�   r�   r   r   r   r    Ú<module>   s,   
AG|