
    Xwg8E                       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rdd	lmZ  ej.                  e      Z G d
 de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z  G d de      Z! G d de      Z" G d de      Z# G d de$      Z% G d de$      Z& G d  d!e      Z' G d" d#e      Z(y)$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                  P    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Zy)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]]DEFAULTc                    | j                  | j                         | j                  |       d| _        d| _        d| _        d| _        y Nr   F)updater   spaceBefore
spaceAfter
leftIndentkeepWithNext)selfkwargss     J/var/www/horilla/myenv/lib/python3.12/site-packages/xhtml2pdf/paragraph.py__init__zStyle.__init__H   s<    DLL!F !  "'    returnNone)	__name__
__module____qualname____doc__r   r
   r   __annotations__r(    r)   r'   r   r   2   sF     q!Q!")G% (r)   r   c                  (    e Zd ZU dZdZded<   ddZy)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namec           
         j                           j                  dd       }|(j                  |       j                  ||||dd        fd} | j                  dd        j                  dd        j                  dd       |||||z           | j                  d	d        j                  d
d        j                  dd       ||z   |||z   ||z           | j                  dd        j                  dd        j                  dd       |||z   ||z   ||z           | j                  dd        j                  dd        j                  dd       ||||z   |       j	                          y )NbackgroundColor   r   fillstrokec                    |r\| rY|j                  dt        ddd            }|7j                  |       j                  |       j	                  ||||       y y y y )N	textColorr   )getr   setStrokeColorsetLineWidthline)	bstyler   r   x1y1x2y2canvasr%   s	          r'   _drawBorderLinez$Box.drawBox.<locals>._drawBorderLines   se    = HH[%1a.AE$))%0''.KKBB/ %	  ur)   borderLeftStyleborderLeftWidthborderLeftColorborderRightStyleborderRightWidthborderRightColorborderTopStyleborderTopWidthborderTopColorborderBottomStyleborderBottomWidthborderBottomColor)	saveStater@   setFillColorrectrestoreState)r%   rI   xywhbgrJ   s   ``      r'   drawBoxzBox.drawBoxh   s    XX'.>#KK1a1K5		0 	HH&-HH&-HH&-E	
 	HH'.HH'.HH'.EEE	
 	HH%t,HH%t,HH%t,EEE	
 	HH($/HH($/HH($/E	
 	r)   N)
rI   r   r[   intr\   ra   r]   ra   r^   ra   )r-   r.   r/   r0   r7   r1   r`   r2   r)   r'   r4   r4   Q   s    ( D#;r)   r4   c                  R    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
Z	y)Fragmentz
    Fragment.

    text:       String containing text
    fontName:
    fontSize:
    width:      Width of string
    height:     Height of string
    fragmentr6   r7   FboolisSoftisTextisLFc                    d| d<   y )Nr   r   r2   r%   s    r'   calczFragment.calc   s    Wr)   Nr*   )
r-   r.   r/   r0   r7   r1   rf   rg   rh   rk   r2   r)   r'   rc   rc      s6     D#FDFDD$r)   rc   c                  6    e Zd ZU dZdZded<   dZded<   d
dZy	)WordzA single word.wordr6   r7   Tre   rg   c                6    t        | d   | d   | d         | d<   y)z*XXX Cache stringWith if not accelerated?!.textr   r   r   Nr   rj   s    r'   rk   z	Word.calc   s"    #DL$z2BDDTUWr)   Nr*   )r-   r.   r/   r0   r7   r1   rg   rk   r2   r)   r'   rm   rm      s    D#FDVr)   rm   c                  6    e Zd ZU dZdZded<   dZded<   d
dZy	)SpacezDA space between fragments that is the usual place for line breaking.spacer6   r7   Tre   rf   c                0    t        d| d   | d         | d<   y )N r   r   r   r   rj   s    r'   rk   z
Space.calc   s    #Cj)94
;KLWr)   Nr*   )r-   r.   r/   r0   r7   r1   rf   rk   r2   r)   r'   rr   rr      s    ND#FDMr)   rr   c                  <    e Zd ZU dZdZded<   dZded<   dZded<   y	)
	LineBreakzLine break.brr6   r7   Tre   rf   rh   N)r-   r.   r/   r0   r7   r1   rf   rh   r2   r)   r'   rw   rw      s#    D#FDD$r)   rw   c                  *    e Zd ZU dZded<   ddZd Zy)BoxBeginbeginr6   r7   c                T    | j                  dd      | j                  dd      z   | d<   y )N
marginLeftr   paddingLeftr   r@   rj   s    r'   rk   zBoxBegin.calc   s+    q1DHH15
 
Wr)   c                    | j                  dd      | d   z   }| d   | j                  dd      z   }| d   }| j                  |||||       y )Nr}   r   r[   lengthpaddingRightr   )r@   r`   )r%   rI   r\   r[   r]   r^   s         r'   drawzBoxBegin.draw   sR    HH\1%S	1NTXXna88VQ1a(r)   Nr*   )r-   r.   r/   r7   r1   rk   r   r2   r)   r'   rz   rz      s    D#

)r)   rz   c                  $    e Zd ZU dZded<   ddZy)BoxEndendr6   r7   c                T    | j                  dd      | j                  dd      z   | d<   y )NmarginRightr   r   r   r   rj   s    r'   rk   zBoxEnd.calc   s+    2TXXA6
 
Wr)   Nr*   )r-   r.   r/   r7   r1   rk   r2   r)   r'   r   r      s    D#
r)   r   c                      e Zd ZU dZded<   y)Imageimager6   r7   N)r-   r.   r/   r7   r1   r2   r)   r'   r   r      s    D#r)   r   c                  F     e Zd ZU dZdZded<   d	 fdZd Zd Zd Z	 xZ
S )
LinezContainer for line fragments.g      ?float
LINEHEIGHTc                h    d| _         d| _        d| _        || _        g | _        t
        |           y r   )r   r   isLaststyleboxStacksuperr(   )r%   r   	__class__s     r'   r(   zLine.__init__   s1    
!
 r)   c                   |t         k7  r| d   d   | d   d   z   }||z
  }|t        k(  r| D ]  }|dxx   |z  cc<    nj|t        k(  r| D ]  }|dxx   |dz  z  cc<    nI|t        k(  r@| j                  s4|t        |       dz
  z  }t        |       D ]  \  }}|dxx   ||z  z  cc<    | D ]|  }|d   |d   z   }t        |t              r| j                  j                  |       :t        |t              sK| j                  sX| j                  j                         }||d   z
  |d<   ~ | j                  D ]  }|d   z
  |d<    y )Nr[   r   g       @r:   r   )r
   r   r   r	   r   len	enumerate
isinstancerz   r   appendr   pop)	r%   r   	alignment	lineWidth
emptySpacefragdeltair[   s	            r'   doAlignmentzLine.doAlignment  sa   RR(99I*JH$  ,DI+I,i'  2DIc!11I2 Z'"c$i!m4( +GAtIU*I+  	/DS	DM)A$)$$T*D&)dmm}}((*!"T#YX	/ MM 	+Dc]DN	+r)   c                &    | _         dg D cg c]  }|j                  dd       c}z   }t        |       _        t         fd|D              x _         _         j
                   j                  z
  } D ]  }||d<   	  j                  S c c}w )zAlign words in previous line.r   r   c              3  <   K   | ]  }|j                   z    y wN)r   ).0r   r%   s     r'   	<genexpr>z Line.doLayout.<locals>.<genexpr>'  s      ,
'+D4??",
s   r\   )r   r@   maxr   r   r   )r%   r   r   
font_sizesr\   s   `    r'   doLayoutzLine.doLayout   s     
SEDHHZ3EE
J(+ ,
/9,
 )
 	
do
 OOdmm+ 	DDI	 {{ Fs   Bc           	         t         j                  d       t         j                  d       | D ]@  }t         j                  d|j                  d|j                  j	                                      B y )Nr   z(----------------------------------------z%srp   )loggerdebugr@   r7   upper)r%   r   s     r'   dumpFragmentszLine.dumpFragments2  sO    VX 	DDLLtxx		0ABC	Dr)   r*   )r-   r.   r/   r0   r   r1   r(   r   r   r   __classcell__r   s   @r'   r   r      s%    'J+>$Dr)   r   c                  Z     e Zd ZdZd	d
 fdZddZdd	 	 	 	 	 	 	 ddZd Z fdZ xZ	S )Textz
    Container for text fragments.

    Helper functions for splitting text into lines and calculating sizes
    and positions.
    c                    |g }g | _         d| _        d| _        d| _        d| _        || _        t        |   |       y )Nr   )linesr   r   maxWidth	maxHeightr   r   r(   )r%   datar   r   s      r'   r(   zText.__init__A  sD    <D

#(
r)   c                2    | D ]  }|j                           y)zCalculate sizes of fragments.N)rk   )r%   rn   s     r'   rk   z	Text.calcN  s     	DIIK	r)   F)splittedc               Z   g | _         d| _        || _        || _        || _        g }| j
                  }d}|s|r|d   }t        |       }d}||k  r|}	t        |      }
t        j                  |      D ]!  }d|d<   |
j                  t        |             # ||k  r| |   }|d   }||d<   |dz  }t        |t              r|j                  |       n t        |t              r|j                          |j                  r$|j                  r|
j                  |       n+|dk(  r
||z   |kD  rn||z  }|
j                  |       ||k  r|
r5|
d   j                   dv r$|
j                          |
r|
d   j                   dv r$|
j#                          | xj                  |
j%                  | j                        z  c_        | j                   j                  |
       | j                  |kD  r|	S d}||k  rd| j                   d   _        |r&| j                   D ]  }
|
j)                  ||d	           y
)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   r[   r   r:   r   )rs   rx   Tr   N)r   r   r   r   r   r   r   r   copyr   rz   r   r   r   rf   rh   r7   r   r   r   r   )r%   r   r   r   r   r   r[   lenTextposposBeginrC   r5   r   	fragWidths                 r'   splitIntoLineszText.splitIntoLinesS  s'    

" 

 El#A4yGmH;D yy* +CHSM*+ -Cy M	S	q dH-OOD)f-LLN ;;yyD)Av  ]X- YD!; -@ 48==O;
 48==O;  KK4==44KJJd# {{Y& Aq Gmv !%

2

 ?  5+=>? r)   c                    t        | j                        D ]>  \  }}t        j                  d|       t        j                  |j	                                @ y)z.For debugging dump all line and their content.zLine %d:N)r   r   r   r   r   )r%   r   rC   s      r'   	dumpLineszText.dumpLines  sA     , 	/GAtLLQ'LL++-.	/r)   c                ~    t        |t              r t        |       t        |   |            S t        |   |      S )z6Make sure slices return also Text object and not lists)r   slicetyper   __getitem__)r%   keyr   s     r'   r   zText.__getitem__  s8    c5!4:eg1#677w"3''r)   )NN)r   zlist | Noner   zStyle | Noner+   r,   r*   )r   ra   r   ra   r   re   r+   z
int | None)
r-   r.   r/   r0   r(   rk   r   r   r   r   r   s   @r'   r   r   9  sS     BGWW(+W:>W	Wr/( (r)   r   c                  V     e Zd ZdZddd	 	 	 	 	 	 	 	 	 d fdZd	dZd
dZddZ x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   c                  t         |           || _        | j                  j                          || _        || j                  _        || _        || _        |j                         D ]  \  }}t        | ||        d | _	        y r   )
r   r(   rp   rk   r   r   r   itemssetattr
splitIndex)	r%   rp   r   r   r   kwDictkvr   s	           r'   r(   zParagraph.__init__  su     				!
		 
& LLN 	 DAqD!Q	  '+r)   c                   || _         || _        t        j                  d||       | j                  st        j                  ddd       y|}| j                  j                  ||      | _        || _        | j                  j                  | _        t        j                  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   rp   r   r   r   r   )r%   
availWidthavailHeightr   s       r'   wrapzParagraph.wrap  s     '((*kByyLL3Q:  ))225+F$
99++5JJKKOO		
 zz4;;&&r)   c                   t         j                  d||       g }| j                  r| j                  d| j                   }| j                  | j                  d }t	        t        |      | j                  | j                        }t	        t        |      | j                  | j                  d      }||g}t         j                  dt        |      t        |             t         j                  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   rp   r   r   r   r   r   )r%   r   r   r   text1text2p1p2s           r'   splitzParagraph.split  s    ):{C$&??))$5doo6E))DOO$56E%d5k4::TZZPB%UTZZtzzDB BxHLL13u:s5zJ_dmm4r)   c           	        t         j                  d       | j                  sy| j                  }| j                  }|j                          | j                  rd}t        ddd      }t        ddd      }|j                  |       |j                  |       |j                  |       |j                  |j                  d| j                  | j                  dd       d}| j                  }| j                  j                  D ]  }||j                  z  }|D ]  }	t        |	d      r|	j!                  |||z
         |	j#                  d	d
      r^|j%                  |	d   |	d          |j                  |	j#                  d|d                |j'                  |	d   ||z
  |	d   z   |	d	          |	j#                  dd      }
|
st)        j*                  d      }|	d   ||z
  |	d   |	d   f\  }}}}||||f}t-        |
t.              r|
j1                  d      }
|
j3                  dd      }t5        |      dk(  xr |d   j7                         xs d
}|j9                  |      rA|dk7  r<|j7                         dk(  xr dxs d}|dk(  r|d   }
|j;                  |
|d|       |
d   dk(  r|
dd }
d
}|j=                  d
|dk7  xr |
xs |d   |d         |j?                          y)z$Render the content of the paragraph.z*** drawNg      ?r:   r   g?r;   r   rp    r   r   r   r[   r\   r   z^[a-zA-Z][-+a-zA-Z0-9]+$r   utf8:)maxsplit   documentpdfGoToRURI)relativekind#)r   ) r   r   rp   canvr   rW   r   rA   rB   rX   rY   r#   r   r   r   hasattrr   r@   setFont
drawStringrecompiler   bytesdecoder   r   lowermatchlinkURLlinkRectrZ   )r%   rI   r   bwbcr_   r\   dyrC   r   r   
_scheme_rer[   r]   r^   rY   partsschemer   s                      r'   r   zParagraph.draw  s   Z yyzz ::BaABc3,B!!"%##KK((!TZZ1UVKW++IIOO &	DA $4(IIfb1f- 88FB'NN4
#3T*5EF''%.(IJ%%d3ia$s)1CT&\R %)HHVT$:!#,F!GJ!%cBFDM4
CS!SJAq!Qq!Q<D!$.#{{62 JJsQJ7E Z1_Aq1AGRF!''/Fj4H%||~6B7Ke7?#(8DtTADI7c>#'8D%'F"j09TEU1X %&	 ( ?$&	P 	r)   )
rp   r   r   r   r   re   r   re   r+   r,   )r   ra   r   ra   r+   ztuple[int, int])r   ra   r   ra   r+   zlist[Paragraph]r*   )	r-   r.   r/   r0   r(   r   r   r   r   r   s   @r'   r   r     sU    
" ++ +
 + + 
+6'8(@r)   r   c                  (     e Zd Zd fdZddZ xZS )PageNumberFlowablec                >    t         |           d | _        d | _        y r   )r   r(   page	pagecount)r%   r   s    r'   r(   zPageNumberFlowable.__init__U  s     $	%)r)   c                    t        | j                  j                  j                        | _        t        | j                  j                  j                        | _        y r   )r6   r   _doctemplater  _page_countr  rj   s    r'   r   zPageNumberFlowable.drawZ  s:    		..334	TYY33??@r)   r*   )r-   r.   r/   r(   r   r   r   s   @r'   r   r   T  s    *
Ar)   r   ))r0   
__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   r4   rc   rm   rr   rw   rz   r   r   listr   r   r   r   r2   r)   r'   <module>r     s   " #   	 / / & H H 4 1.			8	$(D (>R$ Rjs (V8 VMH M )x ) 
X 
H BD4 BDJ}(4 }(@X XvA Ar)   