o
    vh7E                     @  sf  d Z ddlmZ ddlZddlZddlZddlmZmZm	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rDdd	lmZ e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&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

    )annotationsN)TYPE_CHECKINGAnyClassVar)Color)	TA_CENTER
TA_JUSTIFYTA_LEFTTA_RIGHTstringWidth)Flowable)Canvasc                   @  sH   e Zd ZU dZeddddddddddedddZd	ed
< d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.
    r   zTimes-Romang      $@Ng      ?g        )colorfontNamefontSizeheight
lineHeightlineHeightAbsolutelinkpdfLineSpacing	textAlign
textIndentwidthzClassVar[dict[str, Any]]DEFAULTreturnNonec                 K  s2   |  | j |  | d| _d| _d| _d| _d S Nr   F)updater   spaceBefore
spaceAfter
leftIndentkeepWithNext)selfkwargs r&   Q/var/www/html/hyperkenya/venv/lib/python3.10/site-packages/xhtml2pdf/paragraph.py__init__H   s   

zStyle.__init__r   r   )	__name__
__module____qualname____doc__r   r	   r   __annotations__r(   r&   r&   r&   r'   r   2   s   
 
r   c                   @  s(   e Zd ZU dZdZded< d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

    boxstrnamecanvasr   xintywhc              	     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r3   r$   r&   r'   _drawBorderLines   s   

z$Box.drawBox.<locals>._drawBorderLineborderLeftStyleborderLeftWidthborderLeftColorborderRightStyleborderRightWidthborderRightColorborderTopStyleborderTopWidthborderTopColorborderBottomStyleborderBottomWidthborderBottomColor)	saveStater?   setFillColorrectrestoreState)r$   r3   r4   r6   r7   r8   bgrI   r&   rH   r'   drawBoxh   sV   



	


	


	



zBox.drawBoxN)
r3   r   r4   r5   r6   r5   r7   r5   r8   r5   )r*   r+   r,   r-   r2   r.   r[   r&   r&   r&   r'   r/   Q   s   
 r/   c                   @  sL   e Zd ZU dZdZded< dZded< dZded< dZded	< dddZ	dS )Fragmentz
    Fragment.

    text:       String containing text
    fontName:
    fontSize:
    width:      Width of string
    height:     Height of string
    fragmentr1   r2   FboolisSoftisTextisLFr   r   c                 C  s   d| d< d S )Nr   r   r&   r$   r&   r&   r'   calc   s   zFragment.calcNr)   )
r*   r+   r,   r-   r2   r.   r_   r`   ra   rc   r&   r&   r&   r'   r\      s   
 
r\   c                   @  4   e Zd ZU dZdZded< dZded< dd
dZdS )WordzA single word.wordr1   r2   Tr^   r`   r   r   c                 C  s    t | d | d | d | d< dS )z*XXX Cache stringWith if not accelerated?!.textr   r   r   Nr   rb   r&   r&   r'   rc      s    z	Word.calcNr)   )r*   r+   r,   r-   r2   r.   r`   rc   r&   r&   r&   r'   re      
   
 re   c                   @  rd   )SpacezDA space between fragments that is the usual place for line breaking.spacer1   r2   Tr^   r_   r   r   c                 C  s   t d| d | d | d< d S )N r   r   r   r   rb   r&   r&   r'   rc      s   z
Space.calcNr)   )r*   r+   r,   r-   r2   r.   r_   rc   r&   r&   r&   r'   ri      rh   ri   c                   @  s6   e Zd ZU dZdZded< dZded< dZded< d	S )
	LineBreakzLine break.brr1   r2   Tr^   r_   ra   N)r*   r+   r,   r-   r2   r.   r_   ra   r&   r&   r&   r'   rl      s
   
 rl   c                   @  s,   e Zd ZU dZded< dddZdd	 Zd
S )BoxBeginbeginr1   r2   r   r   c                 C      |  dd|  dd | d< d S )N
marginLeftr   paddingLeftr   r?   rb   r&   r&   r'   rc         zBoxBegin.calcc                 C  sF   |  dd| d  }| d |  dd }| d }| ||||| d S )Nrq   r   r4   lengthpaddingRightr   )r?   r[   )r$   r3   r6   r4   r7   r8   r&   r&   r'   draw   s   zBoxBegin.drawNr)   )r*   r+   r,   r2   r.   rc   rw   r&   r&   r&   r'   rn      s   
 
rn   c                   @  s$   e Zd ZU dZded< d	ddZdS )
BoxEndendr1   r2   r   r   c                 C  rp   )NmarginRightr   rv   r   rs   rb   r&   r&   r'   rc      rt   zBoxEnd.calcNr)   )r*   r+   r,   r2   r.   rc   r&   r&   r&   r'   rx      s   
 rx   c                   @  s   e Zd ZU dZded< dS )Imageimager1   r2   N)r*   r+   r,   r2   r.   r&   r&   r&   r'   r{      s   
 r{   c                      sH   e Zd ZU dZdZded< d fddZd	d
 Zdd Zdd Z	  Z
S )LinezContainer for line fragments.g      ?float
LINEHEIGHTr   r   c                   s,   d| _ d| _d| _|| _g | _t   d S r   )r   r   isLaststyleboxStacksuperr(   )r$   r   	__class__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< qd S )Nr4   r   g       @r:   ru   )r	   r
   r   r   r   len	enumerate
isinstancern   r   appendrx   pop)	r$   r   	alignment	lineWidth
emptySpacefragdeltair4   r&   r&   r'   doAlignment  s4   


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   rs   .0r   r&   r&   r'   
<listcomp>%  s    z!Line.doLayout.<locals>.<listcomp>c                 3  s    | ]}| j  V  qd S N)r   r   rb   r&   r'   	<genexpr>'  s    

z Line.doLayout.<locals>.<genexpr>r6   )r   maxr   r   r   )r$   r   
font_sizesr6   r   r&   rb   r'   doLayout   s   

zLine.doLayoutc              	   C  s<   t d t d | D ]}t d|d|j  qd S )Nr}   z(----------------------------------------z%srg   )loggerdebugr?   r2   upper)r$   r   r&   r&   r'   dumpFragments2  s
   

zLine.dumpFragmentsr)   )r*   r+   r,   r-   r   r.   r(   r   r   r   __classcell__r&   r&   r   r'   r}      s   
 r}   c                      sR   e Zd ZdZdd fd	d
ZdddZdddddZdd Z fddZ  Z	S )Textz
    Container for text fragments.

    Helper functions for splitting text into lines and calculating sizes
    and positions.
    Ndatalist | Noner   Style | Noner   r   c                   s@   |d u rg }g | _ d| _d| _d| _d| _|| _t | d S )Nr   )linesr   r   maxWidth	maxHeightr   r   r(   )r$   r   r   r   r&   r'   r(   A  s   zText.__init__c                 C  s   | D ]}|   qdS )zCalculate sizes of fragments.N)rc   )r$   rf   r&   r&   r'   rc   N  s   
z	Text.calcF)splittedr   r5   r   r   r^   
int | Nonec                C  s  g | _ d| _|| _|| _|| _g }| j}d}|s|r|d }t| }d}||k r|}	t|}
t|D ]}d|d< |
	t
| q3||k r| | }|d }||d< |d7 }t|t
r`|	| n	t|tri|  |jr{|jru|
	| n|dkrzqAn|| |krn||7 }|
	| ||k sE|
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 _|r| j D ]
}
|
||d	  qd
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   r4   r   r:   r   >   rm   rj   Tr   N)r   r   r   r   r   r   r   r}   copyr   rn   r   rx   r   r_   ra   r2   r   r   r   r   )r$   r   r   r   r   r   r4   lenTextposposBeginrB   r0   r   	fragWidthr&   r&   r'   splitIntoLinesS  sl   



 
;
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)r   r   r   r   r   )r$   r   rB   r&   r&   r'   	dumpLines  s   zText.dumpLinesc                   s*   t |trt| t |S t |S )z6Make sure slices return also Text object and not lists)r   slicetyper   __getitem__)r$   keyr   r&   r'   r     s   
zText.__getitem__)NN)r   r   r   r   r   r   r)   )r   r5   r   r5   r   r^   r   r   )
r*   r+   r,   r-   r(   rc   r   r   r   r   r&   r&   r   r'   r   9  s    
Yr   c                      sH   e Zd ZdZdddd fddZdddZdddZdddZ  Z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.)

    Fr   r   rg   r   r   r   r   r^   r   r   r   c                  s\   t    || _| j  || _|| j_|| _|| _| D ]
\}}t| || qd | _	d S r   )
r   r(   rg   rc   r   r   r   itemssetattr
splitIndex)r$   rg   r   r   r   kwDictkvr   r&   r'   r(     s   
	

zParagraph.__init__
availWidthr5   availHeighttuple[int, int]c                 C  sx   || _ || _td|| | jstddd dS |}| j||| _|| _| jj| _td| j| j| j | j| jfS )z4Determine 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   rg   r   r   r   r   )r$   r   r   r   r&   r&   r'   wrap  s"   
zParagraph.wraplist[Paragraph]c                 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 )z"Split ourselves in two paragraphs.z*** split (%f, %f)N)r   Tr   z*** text1 %s / text %sz*** return %s)	r   r   r   rg   r   r   r   r   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r|
d}
|
jddd}t|dkr|d  pd
}||r|dkr| dkrdpd}|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 )z$Render the content of the paragraph.z*** drawNg      ?r:   r   g?r;   rw   rg    r   r   r   r4   r6   r   z^[a-zA-Z][-+a-zA-Z0-9]+$r   utf8:)maxsplit   documentpdfGoToRURI)relativekind#)r   ) r   r   rg   canvr   rV   r   r@   rA   rW   rX   r"   r   r   r   hasattrrw   r?   setFont
drawStringrecompiler   bytesdecoder   r   lowermatchlinkURLlinkRectrY   )r$   r3   r   bwbcrZ   r6   dyrB   r   r   
_scheme_rer4   r7   r8   rX   partsschemer   r&   r&   r'   rw     sf   





"
$

&zParagraph.draw)
rg   r   r   r   r   r^   r   r^   r   r   )r   r5   r   r5   r   r   )r   r5   r   r5   r   r   r)   )	r*   r+   r,   r-   r(   r   r   rw   r   r&   r&   r   r'   r     s    

r   c                      s(   e Zd Zd fddZdddZ  ZS )PageNumberFlowabler   r   c                   s   t    d | _d | _d S r   )r   r(   page	pagecountrb   r   r&   r'   r(   U  s   

zPageNumberFlowable.__init__c                 C  s$   t | jjj| _t | jjj| _d S r   )r1   r   _doctemplater   _page_countr   rb   r&   r&   r'   rw   Z  s   zPageNumberFlowable.drawr)   )r*   r+   r,   r(   rw   r   r&   r&   r   r'   r   T  s    r   ))r-   
__future__r   r   loggingr   typingr   r   r   reportlab.lib.colorsr   reportlab.lib.enumsr   r   r	   r
   reportlab.pdfbase.pdfmetricsr   reportlab.platypus.flowablesr   reportlab.pdfgen.canvasr   	getLoggerr*   r   dictr   r/   r\   re   ri   rl   rn   rx   r{   listr}   r   r   r   r&   r&   r&   r'   <module>   s8   
U
	E  