
    Rj~                        d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZ ddlmZ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mZ ddlm Z  erddl!m"Z" ddlm#Z#m$Z$ ddl%m&Z& ddlm'Z'  G d de
          Z( G d de          Z) G d de
          Z* G d d          Z+ G d d          Z, G d d          Z- G d de          Z. G d d e.          Z/ G d! d"e          Z0 G d# d$e/e0          Z1dS )%zJ
Usage documentation at: <https://py-pdf.github.io/fpdf2/TextRegion.html>
    N)ABCabstractmethod)TracebackType)TYPE_CHECKINGAny
NamedTupleOptionalSequenceTypeUnioncast   )AlignWrapModeXPosYPos)FPDFException)RasterImageInfoVectorImageInfo)preload_image)	FORM_FEEDMultiLineBreak)get_scale_factor)FPDF)FragmentTextLine)	SVGObject)	ImageDatac                   $    e Zd ZU eed<   eed<   dS )ExtentsleftrightN)__name__
__module____qualname__float__annotations__     Q/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/fpdf/text_region.pyr    r    $   s"         
KKKLLLLLr)   r    c                   p     e Zd ZdZdededdf fdZded         ddfd	Zded         defd
Z	ddZ
 xZS )TextRegionMixinz>Mix-in to be added to FPDF() in order to support text regions.argskwargsreturnNc                 p    d | _         |                                   t                      j        |i | d S N)%_TextRegionMixin__current_text_regionclear_text_regionsuper__init__)selfr-   r.   	__class__s      r*   r5   zTextRegionMixin.__init__,   s?    =A"   $)&)))))r)   region
TextRegionParagraphCollectorMixinc                 0    t          d|          | _        d S )Nr:   )r   r2   r6   r8   s     r*   register_text_regionz$TextRegionMixin.register_text_region1   s     &*,%?%?"""r)   c                     | j         |k    S r1   r2   r=   s     r*   is_current_text_regionz&TextRegionMixin.is_current_text_region6   s     )V33r)   c                     d | _         d S r1   r@   r6   s    r*   r3   z!TextRegionMixin.clear_text_region;   s    %)"""r)   r/   N)r#   r$   r%   __doc__r   r5   r   r>   boolrA   r3   __classcell__r7   s   @r*   r,   r,   )   s        HH*c *S *T * * * * * *
@CD@	@ @ @ @
4CD4	4 4 4 4
* * * * * * * *r)   r,   c                   D    e Zd ZU dZded<   ded<   dZeed<   dZeed<   d	S )
LineWrapperzConnects each TextLine with the Paragraph it was written to.
    This allows to access paragraph specific attributes like
    top/bottom margins when rendering the line.
    r   line	Paragraph	paragraphF
first_line	last_lineN)r#   r$   r%   rE   r'   rN   rF   rO   r(   r)   r*   rJ   rJ   ?   sV          
 JItr)   rJ   c                   J    e Zd Zded         ded         deddfdZdefd	ZdS )
Bulletbullet_fragmentsr   	text_liner   bullet_r_marginr/   Nc                 >    || _         || _        || _        d| _        d S )NF)	fragmentsrS   r_marginrendered_flag)r6   rR   rS   rT   s       r*   r5   zBullet.__init__L   s(     0@"'#(r)   c                 L    d}| j         D ]}||                                z  }|S Nr   )rV   	get_width)r6   fragments_widthfrags      r*   get_fragments_widthzBullet.get_fragments_widthW   s4    !"N 	0 	0Dt~~///OOr)   )r#   r$   r%   r
   r	   r&   r5   r^   r(   r)   r*   rQ   rQ   K   ss        	)":.	) J'	) 		)
 
	) 	) 	) 	)U      r)   rQ   c                      e Zd Z	 	 	 	 	 	 	 	 	 	 d#ded         deeez           dee         d	ed
ededee         dededee	         defdZ
defdZd$dZdeee                  dee         dee         ddfdZd%dedeeez           ddfdZdededeeed         ed         f                  fdZd%dee         ddfd Zd!edee         fd"ZdS )&rL   Nr    Fr8   r9   
text_alignline_height
top_marginbottom_marginindentrT   bullet_stringskip_leading_spaceswrapmodefirst_line_indentc                    || _         |j        | _        d | _        |rct          j        |          }|t          j        t          j        t          j        t          j        fvrt          d|j
         d          || _        ||j        | _        n|| _        || _        || _        || _        |	| _        |
| j         j        | _        nt#          j        |
          | _        g | _        |dt'          d          z  | j        j        z  }|rP|                     ||          }t-          |t.                    sJ t1          |d         |d         |          | _        nd | _        || _        d S )NAText_align must be 'LEFT', 'CENTER', 'RIGHT', or 'JUSTIFY', not ''.   mmr   r   )_regionpdfra   r   coerceLCRJ
ValueErrorvaluerb   rc   rd   re   rg   rh   r   _text_fragmentsr   kgenerate_bullet_frags_and_tl
isinstancetuplerQ   bulletri   )r6   r8   ra   rb   rc   rd   re   rT   rf   rg   rh   ri   text_align_convbullet_frags_and_tls                 r*   r5   zParagraph.__init___   s~    !:+/ 	.%*\*%=%=Ouw%'&JJJ qXgXmqqq   .DO%1D*D$*#6  L1DMM$OH55DM13"  "24"8"8848:EO 		"&"C"C# # 1599999,2#A&(;A(>- -DKK DK!2r)   r/   c                     d| j          d| j         d| j         d| j         d| j         d| j         dt          | j                   dS )	NzParagraph(text_align=z, line_height=z, top_margin=z, bottom_margin=z, skip_leading_spaces=z, wrapmode=z, #text_fragments=))ra   rb   rc   rd   rg   rh   lenrx   rC   s    r*   __str__zParagraph.__str__   s    =DO = =4CS = =bfbq = ="0= =HLH`= =mqmz= = #D$8 9 9= = =	
r)   c                     | S r1   r(   rC   s    r*   	__enter__zParagraph.__enter__   s    r)   exc_type	exc_value	tracebackc                 8    | j                                          d S r1   )ro   end_paragraphr6   r   r   r   s       r*   __exit__zParagraph.__exit__   s     	""$$$$$r)   textlinkc                     | j         j        st          d          | j                             |                              dd          }| j                             |d          }|r|D ]	}||_        
| j                            |           d S )N3No font set, you need to call set_font() beforehandr`   Fmarkdown)	rp   font_familyr   normalize_textreplace_preload_font_stylesr   rx   extend)r6   r   r   normalized_stringrV   r]   s         r*   writezParagraph.write   s    x# 	W UVVV H33D99AA$KK H))!E *   	
  	!! ! ! 		##I.....r)   r   r   c           	         |sd S | j                             |          }| j         j        st          d          | j                             |d          }d}|D ]}||                                z  }t          || j        j        | j         j        | j	        |z
  |z
  z   | j         j        f| j
        p| j        j
        pt          j        | j        | j        | j        p| j        j                  }|                                }||fS )Nr   Fr   r   )	max_widthmarginsalignrh   rb   rg   )rp   r   r   r   r   r[   r   ro   c_marginre   ra   r   rr   rh   rb   rg   get_line)r6   rf   rT   rR   r\   r]   bullet_line_breakbullet_text_lines           r*   rz   z&Paragraph.generate_bullet_frags_and_tl   s/     	4//>>x# 	W UVVVH)) *   	
 "#$ 	0 	0Dt~~///OO*l,!T[?%B_%TU! /GT\%<G]( $ 8 !0|/
 
 
 -5577!111r)   hc                    | j         j        st          d          || j         j        | j        z  }| j                             dd          d         }||j        z  |j        _        | j	        
                    |           d S )Nr   
Fr   r   )rp   r   r   	font_sizerb   r   ry   graphics_statefont_size_ptrx   append)r6   r   fragments      r*   lnzParagraph.ln   s    x# 	W UVVV9"T%55A8005 1 
 
 

 018:~,##H-----r)   print_shc                    g }t          | j        | j        j        | j        j        | j        z   | j        j        f| j        | j        p| j        j        pt          j
        || j        | j        | j        p| j        j        	  	        }g | _        |                                }d}|=|                    t!          || |                     d}|                                }|=|r*|d         }t!          |j        | |j        d          }||d<   |S )N)r   r   ri   r   r   rh   rb   rg   T)rN   F)rN   rO   )r   rx   ro   r[   rp   r   re   ri   ra   r   rr   rh   rb   rg   r   r   rJ   rK   rN   )r6   r   
text_linesmulti_line_breakrS   rN   lasts          r*   build_lineszParagraph.build_lines   s,   (*
) l,X&4dh6GH"4/GT\%<G]( $ 8 !0|/
 
 
  "$--//	
#k)TjQQQRRRJ(1133I #  	"b>D	4DOt  D "JrNr)   )
NNr   r   r   Nr`   FNr   )r/   rL   r1   )r#   r$   r%   r   r	   strr   r&   rF   r   r5   r   r   r   BaseExceptionr   r   intr   r|   r
   rz   r   listrJ   r   r(   r)   r*   rL   rL   ^   s"        -1'+ +/$)'+#$33 33=>33 S5[)33 e_	33
 33 33 33 "%33 33 "33 8$33 !33 33 33 33j
 
 
 
 
   %4./% M*% M*	%
 
% % % %/ /# /XcCi%8 /D / / / /2 2382	%,hz.BBC	D2 2 2 2@. .HUO .t . . . .D T+->      r)   rL   c                       e Zd Z	 	 	 	 	 	 	 	 	 	 dded         dedeeez           dee         d	ee         d
ededededeee	z           dee         dee         ddfdZ
ddZdedededeeez           fdZdS )ImageParagraphNFr   r8   r9   namer   widthheight
fill_widthkeep_aspect_ratiorc   rd   r   titlealt_textr/   c                    || _         || _        d | _        |rXt          j        |          }|t          j        t          j        t          j        fvrt          d|j	         d          || _        || _
        || _        || _        || _        || _        |	| _        |
| _        || _        || _        d | _        d | _        | | _        d S )Nz1Align must be 'LEFT', 'CENTER', or 'RIGHT', not 'rl   )r8   r   r   r   rq   rr   rs   rt   rv   rw   r   r   r   r   rc   rd   r   r   r   imginforK   )r6   r8   r   r   r   r   r   r   rc   rd   r   r   r   
align_convs                 r*   r5   zImageParagraph.__init__  s     	&*
 	$e,,J%'57EG!<<< \
HX\\\   $DJ
$!2$*	
 (,AE	$(			r)   c                 t    t          | j        j        j        | j                  \  | _        | _        | _        | S r1   )r   r8   rp   image_cacher   r   r   rC   s    r*   
build_linezImageParagraph.build_line'  s5     *7KO'*
 *
&	48TY r)   col_left	col_width
max_heightc                 f   | j         t          d          t          | j         t                    }t	          d          x}}| j        r| j        }n2t          t          | j         d                   | j        j        j	        z  }| j
        r| j
        }nDt          t          | j         d                   | j        j        j	        z  }||k    s| j        r|}n|}| j        s||z  |z  }||k    rd S |}	| j        r>| j        t          j        k    r	|	||z
  z  }	n | j        t          j        k    r|	||z
  dz  z  }	|rp| j        j                            | j        t          d| j                  t          t          | j                   |	d ||| j        | j        | j        | j                  }
|
S t.          r#t          | j        t0                    s| j        J | j        j                            | j        | j        t          t4          | j                   |	d ||| j        | j        | j        d | j                  }
|
S )	Nz;ImageParagraph.build_line() must be called before render().r   r   wrm   r   )r   svgr   xyr   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   dimsr   )r   RuntimeErrorr{   r   r&   r   r   r8   rp   ry   r   r   r   r   rt   rs   _vector_imager   r   r   r   r   r   r   r   _raster_imager   )r6   r   r   r   is_svgnative_hr   r   native_wr   return_infos              r*   renderzImageParagraph.render/  sP    9M   DI77Qxx1; 	GAAE49S>22T[_5FFH: 	
AA"5$)C.99DKO<MMH)##t#{ 	 
 z>>4: 	)zUW$$Y]"uw&&i!mq(( 	--[$(33oty99*!]&*&< .     	P!$(I66O48;O;OOKO))YH/4955Yj"&"8 *   	  r)   
NNNFFr   r   NNN)r/   r   )r#   r$   r%   r   r   r	   r   r&   rF   r   r5   r   r   r   r   r(   r)   r*   r   r      sR       
 (,!%"& "' $(#"&$) $)=>$) $) e$	$)
 $) $) $)  $) $) $) sSy!$) }$) 3-$) 
$) $) $) $)L   GG*/G=BG	/O3	4G G G G G Gr)   r   c                       e Zd Zdddddddddddded	ee         d
eez  dedededee	         dee         dededdf fdZ
d3dZdeee                  dee         dee         ddfdZd4dZ	 d5d	edeeez           ddfdZd5dee         ddfdZ	 	 	 	 	 	 	 	 	 	 d6d
ee         dee         ded ee         d!ee         d"ee         d#ee         d$ee         dee	         d%ee         defd&Zd4d'Z	 	 	 	 	 	 	 	 	 	 d7d(ed)eeez           d*ee         d+ee         d,ed-ed ed!edeeez           d.ee         d/ee         ddfd0Zed4d1            Zed+edefd2            Z xZS )8r;   NLEFTg      ?F)r   ra   rb   r   rg   rh   r   img_fill_widthrp   r   r-   r   ra   rb   r   rg   rh   r   r   r.   r/   c                   || _         t          j        |          | _        | j        t          j        t          j        t          j        t          j        fvrt          d| j        j	         d          || _
        || _        |t          j        |          nt          j        | _        || _        g | _        d | _         t%                      j        |g|
R i | |r|                     |           |r|                     ||	           d S d S )Nrk   rl   )r   )rp   r   rq   ra   rr   rs   rt   ru   rv   rw   rb   r   r   CHARrh   rg   _paragraphs_active_paragraphr4   r5   r   image)r6   rp   r   ra   rb   r   rg   rh   r   r   r-   r.   r7   s               r*   r5   z ParagraphCollectorMixin.__init__z  s    ,z22?57EGUWeg"FFFmTXTcTimmm   ' )1)=HOH%%%8= 	 $7 =?04.t...v... 	JJt 	7JJs~J66666	7 	7r)   c                    | j                             |           rt          d| j        j         d          | j         j        | _        | j                                          d| j         _        | j                             |            | S )NzUnable to enter the same z context recursively.r   )	rp   rA   r   r7   r#   page_page_push_local_stackr>   rC   s    r*   r   z!ParagraphCollectorMixin.__enter__  s    8**400 	ZDN,CZZZ   X]
""$$$%%d+++r)   r   r   r   c                     | j                                          | j        | j         _        | j                                          |                                  d S r1   )rp   r3   r   r   _pop_local_stackr   r   s       r*   r   z ParagraphCollectorMixin.__exit__  sH     	""$$$
!!###r)   c                     | j         dk    rt          d          | j         ?t          | | j        | j                  }| j                            |           d| _         d S d S )NEXPLICITzaConflicts with active paragraph. Either close the current paragraph or write your text inside it.)r8   ra   rg   AUTOr   r   rL   ra   rg   r   r   )r6   ps     r*   _check_paragraphz(ParagraphCollectorMixin._check_paragraph  s    !Z//s   !)?$($<  A
 ##A&&&%+D""" *)r)   r   c                     |                                   t          | j        d         t                    r"| j        d                             |           d S d S Nr   )r   r{   r   rL   r   )r6   r   r   s      r*   r   zParagraphCollectorMixin.write  s\    
 	d&r*I66 	-R &&t,,,,,	- 	-r)   r   c                     |                                   t          | j        d         t                    r"| j        d                             |           d S d S r   )r   r{   r   rL   r   )r6   r   s     r*   r   zParagraphCollectorMixin.ln  sZ    d&r*I66 	'R ##A&&&&&	' 	'r)   r   r`   rc   rd   re   rf   rT   ri   c                     | j         dk    rt          d          t          | |p| j        ||p| j        |	|pd|pd|pd|
pd|pd|          }| j                            |           d| _         |S )a~  
        Args:
            text_align (Align, optional): the horizontal alignment of the paragraph.
            line_height (float, optional): factor by which the line spacing will be different from the font height. (Default: by region)
            top_margin (float, optional):  how much spacing is added above the paragraph.
                No spacing will be added at the top of the paragraph if the current y position is at (or above) the
                top margin of the page. (Default: 0.0)
            bottom_margin (float, optional): those two values determine how much spacing is added below the paragraph.
                No spacing will be added at the bottom if it would result in overstepping the bottom margin of the page. (Default: 0.0)
            indent (float, optional): determines the indentation of the paragraph. (Default: 0.0)
            bullet_string (str, optional): determines the fragments and text lines of the bullet. (Default: "")
            bullet_r_margin (float, optional): determines the spacing between the bullet and the bulleted line
            skip_leading_spaces (float, optional): removes all space characters at the beginning of each line. (Default: False)
            wrapmode (WrapMode): determines the way text wrapping is handled. (Default: None)
            first_line_indent (float, optional): left spacing before first line of text in paragraph.
        r   Unable to nest paragraphs.r   r`   )r8   ra   rb   rg   rh   rc   rd   re   ri   rf   rT   r   )r6   ra   rb   rg   rc   rd   re   rf   rT   rh   ri   r   s               r*   rM   z!ParagraphCollectorMixin.paragraph  s    : !Z// <===!4T_# 3 Ot7O!Q',1;Q/41'-2+
 
 
 	"""!+r)   c                 @    | j         st          d          d | _         d S )NzNo active paragraph to end.)r   r   rC   s    r*   r   z%ParagraphCollectorMixin.end_paragraph  s*    % 	? =>>>!%r)   r   r   r   r   r   r   r   r   c                     | j         dk    rt          d          | j         r|                                  t          | |||||||||	|
|          }| j                            |           d S )Nr   r   )
r   r   r   r   r   rc   rd   r   r   r   )r   r   r   r   r   r   )r6   r   r   r   r   r   r   rc   rd   r   r   r   r   s                r*   r   zParagraphCollectorMixin.image  s     !Z// <===! 	!   !/!'
 
 
 	"""""r)   c                     d S r1   r(   rC   s    r*   r   zParagraphCollectorMixin.render&  s    !cr)   c                     d S r1   r(   )r6   r   s     r*   r[   z!ParagraphCollectorMixin.get_width)  s    14r)   )r/   r;   rD   r1   )
NNFr   r   r   r`   NNr   r   )r#   r$   r%   r   r	   r   r   r&   rF   r   r5   r   r   r   r   r   r   r   r   r   rL   rM   r   r   r   r   r[   rG   rH   s   @r*   r;   r;   y  s       
 #"( $)'+!$ 7  7  7 7  7 sm	 7
 %K 7  7  7 " 7 8$ 7 c] 7  7  7 
 7  7  7  7  7  7D	 	 	 		4./	 M*	 M*		
 
	 	 	 	, , , ," %)- -- sSy!- 
	- - - -' 'HUO 't ' ' ' ' '+'+$)&')*"#')+/'+-.. .UO. e_. "	.
 UO.  . .  }. "%. 8$. $E?. 
. . . .`& & & & (,!%"& "' $(#"& #  # # e$ # 	 #
  #  #   #  #  # sSy! # } # 3- # 
 #  #  #  #D !!! ^!44%444 ^44444r)   r;   c                       e Zd ZdZdededeeef         fdZdedee	e
z           fdZdeeez           d	ed
edefdZdeeez           fdZddZdedefdZdS )r:   z3Abstract base class for all text region subclasses.r   r   r/   c                     t                      )aZ  
        Return the horizontal extents of the current line.
        Columnar regions simply return the boundaries of the column.
        Regions with non-vertical boundaries need to check how the largest
        font-height in the current line actually fits in there.
        For that reason we include the current y and the line height.
        NotImplementedError)r6   r   r   s      r*   current_x_extentszTextRegion.current_x_extents0  s     "###r)   rM   c                    |j         r4| j        j        | j        j        k    r| j        xj        |j         z  c_        |                     | j        j        d          \  }}| j        j        | j        j        z
  }|| j        j        z
  }|                    |||z
  |          }|r1|j        }|r(| j        j        |z   |k     r| j        xj        |z  c_        |S rZ   )	rc   rp   r   t_marginr   r   b_marginr   rd   )r6   rM   r   	col_rightbottomr   renderedmargins           r*   _render_image_paragraphz"TextRegion._render_image_paragraph:  s      	/DHJ1B$B$BHJJ)..JJ"44TXZCC)dh//dhj(
##Hi(.BJOO 	%,F %48:.&88

f$

r)   r   topr   c           	         |sdS || j         _        d}d }d}|D ]}t          |t                    r|                     |          r|dz  }3 n{|j        }d}	|j        }
|
j        }|j        D ]}|j	        rd}	 n|	rD|j
        r=|s;|
j        r4| j         j        | j         j        k    r| j         xj        |
j        z  c_        | j         j        |j        z   |k    r|} n|pd}|j        }|                     | j         j        d          \  }}| j         j        |k     s| j         j        |k    r|| j         _        | j         xj        |
j        z  c_        |r|j        s|                                |j        z   }| j         xj        |z  c_        |j        J | j                             |j        |j        j        dt,          j        t0          j        d           d|_        | j         xj        |z  c_        | j         xj        |j        z  c_        | j                             ||j        dt,          j        t0          j        d           | j         xj        |j        z  c_        | j         xj        |
j        z  c_        |j        r8|
j        }|r/|	r-| j         j        |z   |k     r| j         xj        |
j        z  c_        |dz  }|j        r n|r|d |= |pdS )Nr   r   FT)r   bordernew_xnew_yfill)rp   r   r{   r   r  rK   rM   r}   rV   
charactersrN   rc   r   r   r   r   re   rX   r^   rW   rS   _render_styled_text_liner   r   r   TOPNEXTrO   rd   trailing_form_feed)r6   r   r  r   prev_line_heightlast_line_heightrendered_lines
tl_wrapperrS   text_renderedcur_paragraph
cur_bulletr]   r   r   bullet_indent_shiftr  s                    r*   _render_column_lineszTextRegion._render_column_linesI  sT     	1
"#,0$ D	 D	J*n55 C//
;; "a'NNE&O	 % * 4*1
%/  D (, ";"-; '; &0	; 
TX%666HJJ-"::JJ8:	 00699'7$E#3#8q #,#3 &*&<&<TXZ&K&K#)8:((DHJ),C,C!)DHJ

m22

 6j&> 6"6688:;NN ( HJJ"55JJ%/;;;H55",$.5 "i"h" 6    04J,HJJ"55JJ

i..

11&)) 2    

i..



m22

' B*8F B- BTXZ&5HF4R4R

m&AA

!#/ E 	,?N?+$1$r)   c                     g }| j         D ]s}t          |t                    r*|                                }|                    |           A|                    | j                  }|s^|                    |           t|S r1   )r   r{   r   r   r   r   r   r   )r6   r   rM   rK   	cur_liness        r*   collect_lineszTextRegion.collect_lines  s    9;
) 	- 	-I)^44 - ++--!!$''''%11$-@@	  !!),,,,r)   Nc                     t                      r1   r   rC   s    r*   r   zTextRegion.render  s    !###r)   c                     |                      | j        j        |          \  }}| j        j        |k    r| j        j        |k     r| j        j        }||z
  }|S r1   )r   rp   r   r   )r6   r   startendress        r*   r[   zTextRegion.get_width  sS    ++DHJ??
s8:$(*s"2"2HJEEk
r)   rD   )r#   r$   r%   rE   r&   r|   r   r   r	   r   r   r  r   rJ   r  r  r   r[   r(   r)   r*   r:   r:   -  s"       ==$5 $% $E%,<O $ $ $ $'	/O3	4   S%+56S% S% 	S%
 
S% S% S% S%jtN[$@A    $ $ $ $ %      r)   r:   c                        e Zd ZU dZded<   ddddddedee         dee         d	ed
df fdZdee         dee         d
dfdZ	 xZ
S )TextColumnarMixinz*Enable a TextRegion to perform page breaksr   rp   N)l_marginrW   r-   r!  rW   r.   r/   c                     t                      j        |i | ||j        n|| _        | j        }||j        n|| _        |j        | j        z
  }|                     ||           d S r1   )r4   r5   r!  rW   r   _set_left_right)	r6   rp   r!  rW   r-   r.   r!   r"   r7   s	           r*   r5   zTextColumnarMixin.__init__  sv     	$)&)))(0(8h}(0(8h%T5)))))r)   r!   r"   c                     || j         j        n|}|| j         j        | j         j        z
  n|}||k    r"t	          | j        j         d| d| d          t          ||          | _        d S )Nz(): Right limit (z) lower than left limit (z).)	rp   r!  r   rW   r   r7   r#   r    extents)r6   r!   r"   s      r*   r#  z!TextColumnarMixin._set_left_right  s    $(Ltx  d49Mdh///uD==>* I I %I I@DI I I   tU++r)   )r#   r$   r%   rE   r'   r   r	   r&   r5   r#  rG   rH   s   @r*   r   r     s         44	KKK %)$(* * ** * 5/	*
 5/* * 
* * * * * *,HUO ,HUO ,PT , , , , , , , ,r)   r   c                        e Zd Zdddddddeded	ed
ededdf fdZd fdZddZ	de
eez           dededdfdZddZdededeeef         fdZ xZS )TextColumnsr   
   F)ncolsgutterbalancerp   r   r-   r)  r*  r+  r.   r/   Nc                    t                      j        |g|R i | d| _        || _        || _        | j        j        | j        j        z
  }||dz
  |z  z
  |z  }| j        j        }	t          |	|	|z             g| _	        t          d|          D ]5}
|	||z   z  }	| j	                            t          |	|	|z                        6t          | j        j        | j        j                  | _        d S )Nr   r   )r4   r5   _cur_column_ncolsr+  r%  r"   r!   r    _colsranger   maxrp   r   r   _first_page_top)r6   rp   r)  r*  r+  r-   r.   total_wr   c_left_r7   s              r*   r5   zTextColumns.__init__  s    	.t...v...,$t|'88	V33u<	"ffy&899:
q% 	C 	CAi&((FJgffy.@AABBBB"48#4dhjAAr)   c                     t                                                       t          | j        j        | j        j                  | _        | j        r(d| _        | j	        | j                 j
        | j        _        | S rZ   )r4   r   r1  rp   r   r   r2  r+  r-  r/  r!   r   )r6   r7   s    r*   r   zTextColumns.__enter__  sa    "48#4dhjAA< 	; DD$45:DHJr)   c                     | j         rGt          | j         d         t                    r'| j         d                             t                     dS |                     t                     dS )z?End the current column and continue at the top of the next one.r   N)r   r{   rL   r   r   rC   s    r*   
new_columnzTextColumns.new_column  s`     	"
4+;B+? K K 	"R &&y11111JJy!!!!!r)   r   r  r   c                    d}| j         j        }| j        r|}|sdS t          d |D                       }|| j        z  }||z
  }	||	k     rad}||z   }t          j        t          |          | j        z            dz   }
|d         j        j	        pd}||
z  }||k    r||z   }||k    r|}d}t          | j        | j                  D ]}|s dS || j        k    r|| _        |                     dd          \  }}| j         j        |k     s| j         j        |k    r|| j         _        |r'|| j        dz
  k    r| j         j        | j         j        z
  }|                     |||           | j         j        |k    r| j         j        }|| j         _        dS )z?Rendering a set of lines in one or several columns on one page.FNc              3   2   K   | ]}|j         j        pd V  dS )r   N)rK   r   ).0ls     r*   	<genexpr>z1TextColumns._render_page_lines.<locals>.<genexpr>  s+      DDAQV]/aDDDDDDr)   Tg      ?r   r   )rp   r   r+  sumr.  mathceilr   rK   r   r0  r-  r   r   r   r   r  )r6   r   r  r   	balancingnext_ypage_bottom
tot_height
col_heightavail_heightlines_per_columnfirst_line_heightmult_heightcr   r   s                   r*   _render_page_lineszTextColumns._render_page_lines  s    	< 	& !K DDDDDDDJ#dk1J!C<LL(( 	z)#'9S__t{-J#K#Kc#Q $.qM$6$=$B!/2BB++ ;.FK''(F %It'55 	$ 	$A D$$$#$ "&"8"8A">">HixzH$$
i(?(?%
 8Q4;?33dh&77%%j#v>>>xzF""


r)   c                    | j         sd S |                                 }|sd S | j        j        | j        j        z
  }t          | j        j        | j        j                  }|                     |||           |rT| j        	                    | j        j                  }|sd S d| _
        |                     || j        j        |           |Rd S d S rZ   )r   r  rp   r   r   r1  r   r   rK  _perform_page_break_if_need_ber-  )r6   r   rC  first_page_top
page_breaks        r*   r   zTextColumns.render1  s     	F''))
 	Fhj48#44TX.
;;
NKHHH 	I@@
 J   D##J
KHHH  	I 	I 	I 	I 	Ir)   r   r   c                 4    | j         | j                 \  }}||fS r1   )r/  r-  )r6   r   r   r!   r"   s        r*   r   zTextColumns.current_x_extentsE  s    j!12eU{r)   )r/   r'  rD   )r#   r$   r%   r   r   r&   rF   r5   r   r8  r   r   rJ   rK  r   r|   r   rG   rH   s   @r*   r'  r'    sf        B B BB B 	B
 B B B 
B B B B B B.     " " " "2+562 2 	2
 
2 2 2 2hI I I I(5 % E%,<O        r)   r'  )2rE   r?  abcr   r   typesr   typingr   r   r   r	   r
   r   r   r   enumsr   r   r   r   errorsr   image_datastructuresr   r   image_parsingr   
line_breakr   r   utilr   fpdfr   r   r   r   r   r   r    r,   rJ   rQ   rL   r   r;   r:   r   r'  r(   r)   r*   <module>r[     sd     # # # # # # # #      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 / . . . . . . . . . . . ! ! ! ! ! ! B B B B B B B B ( ( ( ( ( ( 1 1 1 1 1 1 1 1 " " " " " "  ........    j   
* * * * *c * * *,	 	 	 	 	* 	 	 	       &_ _ _ _ _ _ _ _Dv v v v v v v vrq5 q5 q5 q5 q5c q5 q5 q5hF F F F F( F F FR, , , , , , , ,>r r r r r*/ r r r r rr)   