
    h                        % S SK Jr  S SKJrJrJrJrJr  S SKJ	r	  S SK
r
S SKrS SKrS SKJrJr  S SKJr   Sr " S S	\5      r " S
 S\R*                  5      r " S S\R*                  5      r " S S\R*                  5      r " S S\R*                  5      r " S S\R*                  5      r " S S\5      rSZS jr " S S\
R:                  5      r " S S\5      r\\ \ \ \ 4   r!S\"S'   \\ \ 4   r#S\"S'   S[S jr$S\S jr% " S  S!\
R:                  5      r& " S" S#\&5      r' " S$ S%\'5      r( " S& S'\(5      r) " S( S)\(5      r* " S* S+\(5      r+ " S, S-\'5      r, " S. S/5      r- " S0 S1\,5      r.S]S^S2 jjr/S]S_S3 jjr0 " S4 S5\,5      r1\.\14r2\)\*\+4r3\.\*4r4S`S6 jr5 " S7 S8\&5      r6 " S9 S:\'5      r7 " S; S<\65      r8 " S= S>\65      r9 " S? S@\65      r:SaSA jr; " SB SC\,5      r<SbSD jr=ScSE jr> " SF SG\5      r? " SH SI\R*                  5      r@ " SJ SK\,5      rA " SL SM\A5      rBSdSN jrCSeSO jrDSfSP jrE " SQ SR\B5      rF " SS ST\A5      rG " SU SV\G5      rH " SW SX\G5      rI        SgSY jrJg)h    )annotations)SequenceIterableOptionalTuple
NamedTuple)	TypeAliasN)Matrix44BoundingBox2d)leadinga+  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed 
diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed 
diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet 
clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
c                      \ rS rSrSrg)LayoutError    N__name__
__module____qualname____firstlineno____static_attributes__r       I/var/www/html/env/lib/python3.13/site-packages/ezdxf/tools/text_layout.pyr   r          r   r   c                       \ rS rSrSrSrSrSrg)Stacking   r         r   N)r   r   r   r   OVERLINESLANTEDr   r   r   r   r   r      s    DDGr   r   c                  8    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrg)LayoutAlignment   r   r                     	   r   N)r   r   r   r   TOP_LEFT
TOP_CENTER	TOP_RIGHTMIDDLE_LEFTMIDDLE_CENTERMIDDLE_RIGHTBOTTOM_LEFTBOTTOM_CENTERBOTTOM_RIGHTr   r   r   r   r#   r#      s/    HJIKMLKMLr   r#   c                       \ rS rSrSrSrSrSrg)CellAlignment   r   r   r   r   N)r   r   r   r   BOTTOMCENTERTOPr   r   r   r   r6   r6      s    FF
Cr   r6   c                  $    \ rS rSrSrSrSrSrSrg)ParagraphAlignment   r   r   r%   r&   r   N)	r   r   r   r   LEFTRIGHTr9   	JUSTIFIEDr   r   r   r   r<   r<      s    DEFIr   r<   c                       \ rS rSrSrSrSrSrg)TabStopType   r   r   r   r   N)r   r   r   r   r>   r?   r9   r   r   r   r   rB   rB      s    DEFr   rB   c                  F    \ rS rSr% SrS\S'   \R                  rS\S'   Sr	g)	TabStop           floatposrB   kindr   N)
r   r   r   r   rI   __annotations__rB   r>   rJ   r   r   r   r   rE   rE      s    C#((D+(r   rE   c                |    [         R                  " [         R                  " [        R	                  5       5      U 5      $ N)	itertoolsislicecycleLOREM_IPSUMsplit)counts    r   lorem_ipsumrT      s'    IOOK,=,=,?@%HHr   c                      \ rS rSr\R
                   S           SS jj5       r\R
                   S           SS jj5       rSrg)	ContentRenderer   Nc                    g)a  Render content into the given borders (lower left and upper right
corners).

Args:
    left: x coordinate of the left border
    bottom: y coordinate of the bottom border
    right: x coordinate of the right border
    top: y coordinate of the top border
    m: transformation Matrix44

Nr   selfleftbottomrighttopms         r   renderContentRenderer.render       r   c                    g)z&Draw a line from (x1, y1) to (x2, y2).Nr   rZ   x1y1x2y2r_   s         r   lineContentRenderer.line   rb   r   r   rM   r[   rH   r\   rH   r]   rH   r^   rH   r_   r
   returnNonere   rH   rf   rH   rg   rH   rh   rH   r_   r
   rl   rm   )	r   r   r   r   abcabstractmethodr`   ri   r   r   r   r   rV   rV      s       	
   
 ( 	HL55"5(-5385=E5	5 5r   rV   c                  `    \ rS rSr S           SS jjr S           SS jjrSrg)	DoNothingRenderer   Nc                    g rM   r   rY   s         r   r`   DoNothingRenderer.render   s     	r   c                    g rM   r   rd   s         r   ri   DoNothingRenderer.line        	r   r   rM   rk   rn   )r   r   r   r   r`   ri   r   r   r   r   rr   rr      s       	
   
 IM"(-38=E	 r   rr   r	   Tuple4fTuple2fc                    U c  g[        U 5      nUS:X  a  U S   U S   U S   U S   4$ US:X  a  U S   U S   U S   U S   4$ US:X  a  U S   U S   U S   U S   4$ US:X  a  U S   U S   U S   U S   4$ g)zDReturns the box margins in CSS like order: top, right, bottom, left.)r   r   r   r   r&   r   r   r   r%   )len)marginsrS   s     r   resolve_marginsr~      s    LEzqz71:wqz71:==zqz71:wqz71:==zqz71:wqz71:==zqz71:wqz71:==r   c                   SnSnUS-  nUS-  nU [         R                  :X  a   X44$ U [         R                  :X  a  U* SpCX44$ U [         R                  :X  a  U* SpCX44$ U [         R                  :X  a  SUpCX44$ U [         R
                  :X  a  U* UpCX44$ U [         R                  :X  a  U* UpCX44$ U [         R                  :X  a  SUpCX44$ U [         R                  :X  a  U* UpCX44$ U [         R                  :X  a  U* UpCX44$ )z<Returns the left top corner adjusted to the given alignment.rG          @r   )
r#   r,   r-   r.   r/   r0   r1   r2   r3   r4   )alignwidthheightr[   r^   centermiddles          r   insert_locationr      sK   DCS[Fc\F(((" 9! 
/,,	,Wac 9 
/++	+VQc 9 
/--	-c 9 
///	/Wfc 9 
/..	.VVc 9 
/--	-c
 9	 
///	/Wfc 9 
/..	.VVc9r   c                      \ rS rSr\\R                  S
S j5       5       r\\R                  S
S j5       5       r\R                  SS j5       r	\R                  SS j5       r
\R                  SSS jj5       rSS jrS	rg)Boxi  c                    g rM   r   rZ   s    r   total_widthBox.total_width  s    $'r   c                    g rM   r   r   s    r   total_heightBox.total_height  s    %(r   c                    g(x, y) is the top/left cornerNr   rZ   xys      r   place	Box.place#  rb   r   c                    g)z1Returns the final location as the top/left cornerNr   r   s    r   final_locationBox.final_location'  rb   r   Nc                    gz%Render content at the final location.Nr   rZ   r_   s     r   r`   
Box.render+  rb   r   c                     U R                  5       u  p[        X4XR                  -   X R
                  -
  4/5      $ ! [        [        4 a    Su  p N>f = f)ziReturns the 2D bounding box of the container. If the cell is not placed the 
top/left corner is (0, 0).

r   r   )r   r   	TypeErrorr   r   r   r   s      r   bboxBox.bbox/  sa    
	&&(DA qfq+;+;';QARAR=R&STUU Y' 	DAq	s   < AAr   rl   rH   r   rH   r   rH   rl   ztuple[float, float]rM   r_   r
   rl   rm   )rl   r   )r   r   r   r   propertyro   rp   r   r   r   r   r`   r   r   r   r   r   r   r     s    '  '(  (, , 	@ @ 	4 4	Vr   r   c                  :    \ rS rSrSrSS jrS	S jrS
SS jjrSrg)Celli;  Fc                    g rM   r   r   s      r   r   
Cell.place>  rx   r   c                    g)Nr   r   r   s    r   r   Cell.final_locationC  s     r   Nc                    g rM   r   r   s     r   r`   Cell.renderH      r   r   r   r   rM   r   )	r   r   r   r   
is_visibler   r   r`   r   r   r   r   r   r   ;  s    J

 r   r   c                      \ rS rSr% \" 5       rS\S'     S     SS jjrSS jr\	S 5       r
\	S 5       r\	SS	 j5       r\	SS
 j5       rSS jrSrg)GlueiL  tupleEMPTYNc                v    [        U5      U l        U(       a  [        U5      OU R                  U l        X0l        g rM   )rH   _width
_min_width
_max_width)rZ   r   	min_width	max_widths       r   __init__Glue.__init__O  s(     #5\.7%	*T[[+4r   c                l    U R                   nUb  [        X!5      n[        XR                  5      U l        g rM   )r   minmaxr   r   )rZ   r   r   s      r   resizeGlue.resizeY  s+    OO	 	)E%1r   c                4    U R                   U R                  :  $ rM   )r   r   r   s    r   
can_shrinkGlue.can_shrink_  s    ,,r   c                ^    U R                   S L =(       d    U R                  U R                   :  $ rM   )r   r   r   s    r   can_growGlue.can_growc  s#    $&G$++*GGr   c                    U R                   $ rM   r   r   s    r   r   Glue.total_widthg      {{r   c                    gNr   r   r   s    r   r   Glue.total_heightk  s    r   c                X    [        U R                  U R                  U R                  5      $ rM   )Spacer   r   r   r   s    r   to_spaceGlue.to_spaceo  s    T[[$//4??CCr   )r   r   r   )NN)r   rH   r   Optional[float]r   r   r   rH   r   )rl   r   )r   r   r   r   r   r   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   L  s    7E5
 &*%)	55 #5 #	52 - - H H    Dr   r   c                      \ rS rSrSrg)r   is  r   Nr   r   r   r   r   r   s  r   r   r   c                      \ rS rSrSrg)NonBreakingSpaceiw  r   Nr   r   r   r   r   r   w  r   r   r   c                      \ rS rSrSrg)	Tabulatori{  r   Nr   r   r   r   r   r   {  r   r   r   c                      \ rS rSrSrSr\R                  S4       SS jjrSS jr	S r
\SS j5       r\SS	 j5       rSS
 jrSrg)ContentCelli  zRepresents visible content like text or fractions.

Supported vertical alignments (IntEnum):

    === =================
    int CellAlignment
    === =================
    0   BOTTOM
    1   CENTER
    2   TOP
    === =================

TNc                    S U l         S U l        [        U5      U l        [        U5      U l        [        U5      U l        X@l        g rM   )_final_x_final_yrH   r   _heightr6   valignrenderer)rZ   r   r   r   r   s        r   r   ContentCell.__init__  s9     *.)-ElV}#F+ r   c                    Xl         X l        g rM   r   r   r   s      r   set_final_locationContentCell.set_final_location  s    r   c                2    U R                   U R                  4$ rM   r   r   s    r   r   ContentCell.final_location  s    }}dmm++r   c                    U R                   $ rM   r   r   s    r   r   ContentCell.total_width  r   r   c                    U R                   $ rM   r   r   s    r   r   ContentCell.total_height      ||r   c                    Xl         X l        gr   r   r   s      r   r   ContentCell.place  s    r   )r   r   r   r   r   r   )r   rH   r   rH   r   r6   r   Optional[ContentRenderer]r   r   )r   r   r   r   __doc__r   r6   r8   r   r   r   r   r   r   r   r   r   r   r   r   r     s~     J !. 4 4.2!! ! 	!
 ,!,    r   r   c                  (    \ rS rSrSrSrSrSrSrSr	g)	Strokei  r   r   r   r&   r*   r   N)
r   r   r   r   	NO_STROKE	UNDERLINESTRIKE_THROUGHOVERLINECONTINUEr   r   r   r   r   r     s    IINHHr   r   c                     ^  \ rS rSrSr\R                  \R                  S4         SU 4S jjjr	S	S
S jjr
   S       SS jjrSrU =r$ )Texti  a  Represents visible text content.

Supported strokes as bit values (flags), can be combined:

    === =================
    int Stroke
    === =================
    0   NO_STROKE
    1   UNDERLINE
    2   STRIKE THROUGH
    4   OVERLINE
    8   CONTINUE
    === =================

The CONTINUE flag extends the stroke of the current text cell across the
glue cells to the following text cell.

Nc                F   > [         TU ]  XX55        [        U5      U l        g rM   )superr   intstroke)rZ   r   r   r   r  r   	__class__s         r   r   Text.__init__  s     	9&kr   c                    U R                  5       u  p#U R                  nX4-
  nX R                  -   nU R                  R	                  X%XcUS9  g )N)r[   r\   r]   r^   r_   )r   r   r   r   r`   )rZ   r_   r[   r^   r   r\   r]   s          r   r`   Text.render  sP    '')	""'''Ea 	 	
r   c                   U R                  5       u  pEXA-  nU R                  nXV-
  nX@R                  -   U-   nU R                  n	U	c   eUS-  n
U R                  [
        R                  -  (       a  Xz-
  nU	R                  XKXU5        U R                  [
        R                  -  (       a  XW-   S-  nU	R                  XKXU5        U R                  [
        R                  -  (       a  XZ-   nU	R                  XKXU5        g g )Nr'   r   )
r   r   r   r   r  r   r   ri   r   r   )rZ   extend_leftextend_rightr_   r[   r^   r   r\   r]   r   spacingr   s               r   render_strokeText.render_stroke  s     '')	""''',6==### 1*;;))) AMM$5Q/;;..."AMM$5Q/;;(AMM$5Q/ )r   )r  )
r   rH   r   rH   r   r6   r  r   r   r   rM   r_   zOptional[Matrix44]rl   rm   )r   r   N)r  rH   r  rH   r_   r
   rl   rm   )r   r   r   r   r   r6   r8   r   r   r   r`   r
  r   __classcell__r  s   @r   r   r     s    . !. 4 4&&.2	"	" 	" 		"
 	" ,	" 	"
 	00 0 	0
 
0 0r   r   c                ^    U  H'  nUR                   (       d  M  UR                  U5        M)     g rM   )r   r`   )cellsr_   cells      r   render_cellsr    s     ???KKN r   c                  ^ ^ U U4S jn[        T 5       Hj  u  mn[        U[        5      (       d  M  UR                  (       d  M0  UR                  [        R
                  -  (       a  U" 5       OSnUR                  XAS9  Ml     g)z+Render text cell strokes across glue cells.c                    > Sn TS-   n[        T5      nX:  a8  TU   n[        U[        5      (       a  XR                  -  n O U $ US-  nX:  a  M8  U $ )Nr   r   )r|   
isinstancer   r   )extendirS   r  r  indexs       r   stroke_extension-render_text_strokes.<locals>.stroke_extension  sd    AIE
i8D$%%*** FA i r   r   )r  r_   N)	enumerater  r   r  r   r   r
  )r  r_   r  r  r  r  s   `    @r   render_text_strokesr    s]     !'tdD!!dkkk+/;;+H%'aFF8 (r   c                     ^  \ rS rSrSrSr\R                  \R                  S4         SU 4S jjjr
S rSS jrSSS jjrSS	 jrS
rU =r$ )Fractioni   aN  Represents visible fractions.

Supported stacking A/B (IntEnum):

    === =========== =========
    int Stacking    Description
    === =========== =========
    0   OVER        A over B, without horizontal line
    1   LINE        A over B, horizontal line between
    2   SLANTED     A slanted line B
    === =========== =========

g333333?Nc                l   > [         TU ]  SSXE5        X0l        Xl        X l        U R                  5         g r   )r   r   	_stacking_top_content_bottom_content_update_size)rZ   r^   r\   stackingr   r   r  s         r   r   Fraction.__init__1  s3     	Av0!%r   c                   U R                   nU R                  nU R                  [        R                  :X  a=  UR
                  UR
                  -   U l        UR                  UR                  -   U l        g U R                  UR
                  UR
                  -   -  U l        [        UR                  UR                  5      U l        g rM   )r!  r"  r   r   r!   r   r   r   r   HEIGHT_SCALEr   )rZ   r^   r\   s      r   r#  Fraction._update_size?  s    %%>>X---++f.A.AADL//F,>,>>DK,,0@0@6CVCV0VWDLcoov/A/ABDKr   c                   Xl         X l        U R                  nU R                  nU R                  nU R
                  nUb  Uc  [        S5      eU R                  [        R                  :X  aE  UR                  X5        XUR                  -
  -  nX$UR                  -
  -  nUR                  X5        gXS-  -   nXuR                  S-  -
  nUR                  X5        XvR                  S-  -
  nX$UR                  -
  -  nUR                  X5        g)r   Nzno content setr   )r   r   r   r   r!  r"  r   r   r   r!   r   )rZ   r   r   r   r   top_contentbottom_contentr   s           r   r   Fraction.placeI  s     ""''--."8.//>>X---a#3333A.5555A  &]F00144Aa#33a77A.5555A  &r   c                    U R                   R                  U5        U R                  R                  U5        U R                  [        R
                  :w  a  U R                  U5        g g rM   )r!  r`   r"  r   r   r   _render_liner   s     r   r`   Fraction.rendera  sM      ###A&>>X]]*a  +r   c                   U R                  5       u  p#U R                  nU R                  nU R                  [        R
                  :X  a  UnX$-   nX5S-  -
  =pON[        XE5      S-  n
X R                  R                  -   nX0R                  R                  -
  nX-
  nX-
  nX-   nX-   n	U R                  R                  XhXyU5        g Nr   )
r   r   r   r   r   r    r   r!  r   ri   )rZ   r_   r   r   twthre   rg   rf   rh   deltacxcys                r   r.  Fraction._render_lineg  s    ""$>>X]]*BBq&j BK!OE&&222B&&333BBBBB221-r   )r"  r   r   r   r   r!  r   )
r^   r   r\   r   r$  r   r   r6   r   r   r   rM   r   )r   r   r   r   r   r'  r   r   r6   r8   r   r#  r   r`   r.  r   r  r  s   @r   r  r     sx     L &]] - 4 4.2  	
  , C'0!. .r   r  c                  ^ ^^^ U4S jnU UU4S jn/ m[        T 5      m S m[        T 5       H  u  mn[        U[        5      (       a!  [        T[        5      (       a  [	        S5      eO8[        U[
        5      (       a#  U" 5       (       a  UR                  5       nU" 5         UmTR                  U5        M     T(       aI  [        TS   [        5      (       a1  TR                  5         T(       a  [        TS   [        5      (       a  M1  T$ )Nc                    > [        T5      S-
  n U S:  a=  TU    n[        U[        5      (       a  UR                  5       TU '   U S-  n Og U S:  a  M<  g g Nr   r   )r|   r  r   r   )r  r  contents     r   replace_pending_nbsp_by_spaces7normalize_cells.<locals>.replace_pending_nbsp_by_spaces  sS    Gq qj5>D$ 011!%
 qjr   c                    >  TTS-      n [        T[        5      (       a  [        U [        5      (       d  gg! [          a     gf = f)Nr   TF)
IndexErrorr  	_no_break)peekr  r  prevs    r   is_useless_nbsp(normalize_cells.<locals>.is_useless_nbsp  sK    	#D $	***T92M2M	  		s   7 
AAzno glue between content cells)
listr  r  _contentr   r   r   append_gluepop)r  r<  rC  r  r;  r  rB  s   `   @@@r   normalize_cellsrK    s     GKED 'tdH%%$))!"ABB *.//O4E4E==?D*,t ( je44 je44 Nr   c                  r   \ rS rSr   S       SS jjrSS jrS rSS jr\R                  SS j5       r
\SS j5       r\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       r\SS j5       r\SS j5       r\S 5       r\SS j5       rSSS jjr\R                  S 5       rSSS jjrSS jrSrg)	Containeri  Nc                d    S U l         S U l        Xl        X l        [	        U5      U l        X@l        g rM   )r   r   _content_width_content_heightr~   _marginsr   )rZ   r   r   r}   r   s        r   r   Container.__init__  s7     *.)- 05 17 "1!9 4<r   c                <    Xl         X l        U R                  5         g rM   )r   r   place_contentr   s      r   r   Container.place  s    r   c                r    U R                  5       (       d  [        S5      eU R                  U R                  4$ )NzContainer is not placed.)	is_placedr   r   r   r   s    r   r   Container.final_location  s.    ~~899}}dmm++r   c                H    U R                   S L=(       a    U R                  S L$ rM   r   r   s    r   rW  Container.is_placed  s    }}D(FT]]$-FFr   c                    g rM   r   r   s    r   __iter__Container.__iter__      r   c                     U R                   S   $ r   rQ  r   s    r   
top_marginContainer.top_margin      }}Qr   c                     U R                   S   $ Nr   r`  r   s    r   right_marginContainer.right_margin  rc  r   c                     U R                   S   $ r1  r`  r   s    r   bottom_marginContainer.bottom_margin  rc  r   c                     U R                   S   $ )Nr%   r`  r   s    r   left_marginContainer.left_margin  rc  r   c                6    U R                   c  gU R                   $ r   )rO  r   s    r   content_widthContainer.content_width  s    &&&&r   c                N    U R                   U R                  -   U R                  -   $ rM   )ro  rf  rl  r   s    r   r   Container.total_width  s$    !!D$5$558H8HHHr   c                6    U R                   c  gU R                   $ r   rP  r   s    r   content_heightContainer.content_height  s    ''''r   c                    U R                   S L $ rM   rt  r   s    r   has_flex_heightContainer.has_flex_height  s    ##t++r   c                N    U R                   U R                  -   U R                  -   $ rM   )ru  ra  ri  r   s    r   r   Container.total_height  s"    ""T__4t7I7IIIr   c                    U R                  5       (       d  [        S5      eU R                  (       a  U R                  U5        U R	                  U5        g)z9Render container content.

(x, y) is the top/left corner
z(Layout has to be placed before renderingN)rW  r   r   render_backgroundrender_contentr   s     r   r`   Container.render  s@    
 ~~HII==""1%Ar   c                    g)z.Place container content at the final location.Nr   r   s    r   rT  Container.place_content  rx   r   c                8    U  H  nUR                  U5        M     gr   )r`   )rZ   r_   entitys      r   r~  Container.render_content
  s    FMM! r   c                    U R                  5       u  p#U R                  (       a6  U R                  R                  UX0R                  -
  UX R                  -   US9  gg)z(Render background at the final location.)r[   r\   r^   r]   r_   N)r   r   r`   r   r   )rZ   r_   r   r   s       r   r}  Container.render_background  sX     ""$==MM  ,,,*** !  r   )rP  rO  r   r   rQ  r   NNN)r   r   r   r   r}   Optional[Sequence[float]]r   r   r   rl   bool)rl   r   r   rM   r   )r   r   r   r   r   r   r   rW  ro   rp   r\  r   ra  rf  ri  rl  ro  r   ru  rx  r   r`   rT  r~  r}  r   r   r   r   rM  rM    sC    #'-1.2<<  < +	<
 ,<,
,
G 	                  ' ' I I ( ( , , J J	 	 
r   rM  c                  z    \ rS rSrSrSSS jjr\SS j5       r\SS j5       rSS jr	SSS jjr
\SS	 j5       rS
rg)EmptyParagraphi  zVSpacer between two paragraphs, represents empty lines like in
    "line1

line2".
    c                D    Xl         SU l        [        X5      U-
  U l        g r   )r   r   r   _last_line_spacing)rZ   
cap_heightline_spacings      r   r   EmptyParagraph.__init__#  s     (")*"Cj"Pr   c                    U R                   $ rM   r   r   s    r   r   EmptyParagraph.total_width(  r   r   c                    U R                   $ rM   r   r   s    r   r   EmptyParagraph.total_height,  r   r   c                    Xl         g rM   r   rZ   r   s     r   set_total_widthEmptyParagraph.set_total_width0  s    r   Nc                    g rM   r   rZ   r   s     r   distribute_content!EmptyParagraph.distribute_content3  r   r   c                    U R                   $ rM   r  r   s    r   distance_to_next_paragraph)EmptyParagraph.distance_to_next_paragraph6      &&&r   )r   r  r   )r   )r  rH   r  rH   r   r   rM   )r   r   )r   r   r   r   r   r   r   r   r   r  r  r  r   r   r   r   r  r    sS    Q
     ' 'r   r  c                     ^  \ rS rSrS\R
                  SSSSS4             SU 4S jjjrS r\S 5       r	SS jr
SS	 jrSS
 jrS rSS jrSS jrSSS jjrSS jrSrU =r$ )	Paragraphi;  N)r   r   r   r   c                   > [         TU ]  US XW5        X l        Uu  pn
Xl        Xl        Xl        X@l        U=(       d    / U l        / U l        / U l	        SU l
        g )NrG   )r   r   _align_indent_first_indent_left_indent_right_line_spacing
_tab_stops_cells_linesr  )rZ   r   r   indentr  r}   	tab_stopsr   firstr[   r]   r  s              r   r   Paragraph.__init__<  sd     	g8#U" ")#/r #% +- #&r   c                ,    [        U R                  5      $ rM   )iterr  r   s    r   r\  Paragraph.__iter__X      DKK  r   c                    U R                   $ rM   r  r   s    r   r  $Paragraph.distance_to_next_paragraph[  r  r   c                z    XR                   -
  U R                  -
  U l        U R                  S:  a  [        S5      eg )Ngư>z#invalid width, no usable space left)rl  rf  rO  r   r  s     r   r  Paragraph.set_total_width_  s=    #&6&669J9JJ%CDD &r   c                :    U R                   R                  U5        g rM   )r  r  )rZ   r;  s     r   append_contentParagraph.append_contentd  s    7#r   c                z    U R                   nX!(       a  U R                  OU R                  -  nU R                  U-
  $ rM   )r  r  r  ro  )rZ   r  r  s      r   
line_widthParagraph.line_widthg  s8    ##$$$43D3DD!!F**r   c                   U R                  5       u  pXR                  -  nX R                  -  nSnU R                  nU HJ  nU R	                  X5      nUR                  Xb5        U[        UR                  U R                  5      -  nSnML     g )NTF)	r   rl  ra  r  _left_borderr   r   r   r  )rZ   r   r   r  linesri   x_finals          r   rT  Paragraph.place_contentl  s    ""$		__D''1GJJw"**D,>,>??AE	 r   c                H    U(       a  U R                   OU R                  nX-   $ )z)Apply indentation and paragraph alignment)r  r  )rZ   r   r  left_indents       r   r  Paragraph._left_borderx  s    ,1d((t7H7Hr   c                   ^ U R                   nU R                  mSn[        U5      (       aA  US   n[        U4S jUSS  5       5      nUR                  n[        UT5      U-
  U l        X$-  nU$ )zGReturns the actual content height determined by the distributed
lines.
rG   rE  c              3  P   >#    U  H  n[        UR                  T5      v   M     g 7frM   )r   r   ).0ri   r  s     r   	<genexpr>6Paragraph._calculate_content_height.<locals>.<genexpr>  s$      EOT))<88Zs   #&N)r  r  r|   sumr   r   r  )rZ   r  r   	last_linelast_line_heightr  s        @r   _calculate_content_height#Paragraph._calculate_content_height}  s     ))u::b	I EJ3BZ F  )55(,7:JJ # &Fr   c                  ^ ^^ SUUU 4S jjn[        T R                  5      n[        U5      nT R                  R                  5         T R                  mSn[        U5      nSmT R                  T R                  -   n[        [        5      u  pxn	XE:  GaQ  Un
U" T R                  T5      5      nUR                  nXE:  a  X4   n[        U[        5      (       a@  U(       a9  UR                  X4S-      U5      nX:X  a  US-  nO(UR                  (       d  US-  nOUR!                  U5      nX:X  a  US-  nOX:X  a  OX:X  a  US-  nOXE:  a  M  UR                  (       a  UR#                  5         XE:  a  [        X4   [$        5      (       a  US-  nUR&                  nUb  Xo-   U:  a  U
nO>SmT R(                  R!                  U5        U[+        UT R,                  5      -  nXE:  a  GMQ  XE:  nT[.        R0                  :X  a[  U(       a  [        T R(                  5      OSnT R(                  SU  H*  n[        U[2        5      (       d   eUR5                  5         M,     T R7                  5       T l        U(       a  T R;                  X4S T5      $ g)	zDistribute the raw content into lines. Returns the cells which do
not fit as a new paragraph.

Args:
    height: available total height (margins + content), ``None`` for
        unrestricted paragraph height

c                  > T[         R                  [         R                  4;   aa  T(       a  TR                  OTR                  n[        TR                  U* U 5      nT[         R                  :X  a  [        X5      $ [        X5      $ T[         R                  :X  a  [        U 5      $ T[         R                  :X  a  [        U 5      $ [        T5      erM   )r<   r>   r@   r  r  shift_tab_stopsr  LeftLineJustifiedLiner?   	RightLiner9   
CenterLiner   )r   r  r  r   r  rZ   s      r   new_line.Paragraph.distribute_content.<locals>.new_line  s    +002D2N2NOO/4++$:K:K+DOOfWeL	  2 7 77 U. 'u8
 ,222 '',333!%((!%((r   r   Tr   NFrE  )r   rH   rl   AbstractLine)rK  r  group_non_breakable_cellsclearr  r|   ra  ri  r  
AppendTyper  has_tab_supportr  r   append_with_tabhas_contentrH  remove_line_breaking_spacer   r   r  r   r  r<   r@   r  
distributer  rP  _new_paragraph)rZ   r   r  r  r  rS   paragraph_heightFAILSUCCESSFORCEDundori   r  r  append_stateline_heightnot_all_cells_processedendr   r  s   `                 @@r   r  Paragraph.distribute_content  sf   	) 	)  ,DKK8)%0$(KKZ #'//D4F4F"F !%Z 0vm DDOOE23D"22O-|dI..?#'#7#7 ai(	$L $.
!-- 
#';;t#4L*QJE!)!+QJE3 -6 //1=Ze%D%DQJE"//&(6? !E!EKK&&t,$T=O=O(PP$e mf #(-&000 '>#dkk"2CDS)!$6666! *
  $==? #&&uV}e<<r   c           	     0   U(       a  U R                   OU R                  nX0R                  U R                  4n[        U R                  U R
                  UU R                  U R                  U R                  U R                  5      nUR                  U5        U$ rM   )r  r  r  r  rO  r  r  rQ  r  r   r  )rZ   r  r  indent_firstr  	paragraphs         r   r  Paragraph._new_paragraph  s~    -2t))8I8I 1 143E3EFKKMMOOMM
	 	  'r   )r  r  rP  rO  r  r  r  r  r  r  r  )r   r   r   r<   r  ztuple[float, float, float]r  rH   r}   r  r  Optional[Sequence[TabStop]]r   r   r   )r;  Iterable[Cell])r  r  rl   rH   )r   rH   r  r  rl   rH   r   rM   )r   r   rl   zOptional[Paragraph])r  
list[Cell]r  r  rl   r  )r   r   r   r   r<   r>   r   r\  r   r  r  r  r  rT  r  r  r  r  r   r  r  s   @r   r  r  ;  s     "&$6$;$;-6-115.2&& "& +	&
 & +& /& ,& &8! ' 'E
$+


(n` r   r  c                     ^  \ rS rSr    S         SU 4S jjjrSS jrS rS r\SS j5       r	SS jr
\S 5       r\SS	 j5       r\SS
 j5       rS rSS jrSrU =r$ )Columni  c                @   > [         TU ]  XXE5        X0l        / U l        g rM   )r   r   _gutter_paragraphs)rZ   r   r   gutterr}   r   r  s         r   r   Column.__init__  s!     	:,.r   c           	         U R                  U R                  U R                  U R                  U R                  U R
                  U R                  U R                  4U R                  S9$ )N)r   r   r  r}   r   )	r  ro  ru  r  ra  rf  ri  rl  r   r   s    r   clone_emptyColumn.clone_empty   sa    ~~$$&&;;!!""  	 ]]  
 	
r   c                ,    [        U R                  5      $ rM   )r  r  r   s    r   r\  Column.__iter__.  s    D$$%%r   c                ,    [        U R                  5      $ rM   )r|   r  r   s    r   __len__Column.__len__1  s    4##$$r   c                D    U R                   nUc  U R                  5       $ U$ )z_Returns the current content height for flexible columns and the
max. content height otherwise.
max_content_heightused_content_height)rZ   
max_heights     r   ru  Column.content_height4  s*    
 ,,
++--r   c                |    U R                   nSnU(       a&  [        S US S  5       5      nX!S   R                  -  nU$ )NrG   c              3  R   #    U  H  oR                   UR                  -   v   M     g 7frM   )r   r  )r  ps     r   r  -Column.used_content_height.<locals>.<genexpr>C  s       GV!!=!==   %'rE  )r  r  r   )rZ   
paragraphsr   s      r   r  Column.used_content_height?  sM    %%
 GQRUSU F n111Fr   c                    U R                   $ rM   )r  r   s    r   r  Column.gutterI  r   r   c                    U R                   $ rM   rt  r   s    r   r  Column.max_content_heightM      ###r   c                X    U R                   c  gU R                  5       U R                   :  $ NTr  r   s    r   has_free_spaceColumn.has_free_spaceQ  s+    ""*'')D,C,CCCr   c                    U R                  5       u  pXR                  -  nX R                  -  nU R                   H/  nUR	                  X5        X#R
                  UR                  -   -  nM1     g rM   )r   rl  ra  r  r   r   r  )rZ   r   r   r  s       r   rT  Column.place_contentW  s^    ""$		__!!AGGAM!">">>>A "r   c                l   / nU H  nU(       a  UR                  U5        M  UR                  U R                  5        U R                  (       a  S nOU R                  U R                  5       -
  nUR                  U5      nU R                  R                  U5        Uc  M  UR                  U5        M     U$ rM   )rH  r  ro  rx  r  r  r  r  )rZ   r  	remainderr  r   rests         r   append_paragraphsColumn.append_paragraphs_  s    %'	#I  +%%d&8&89##0043K3K3MM//7D##I.  & $ r   )r  r  )Nr   NN)
r   rH   r   r   r  rH   r}   r  r   r   rl   r  r   )rl   r   r  )r  Iterable[Paragraph]rl   zlist[Paragraph])r   r   r   r   r   r  r\  r  r   ru  r  r  r  r  rT  r   r   r  r  s   @r   r  r    s     #'-1.2//  / 	/
 +/ ,/ /
&%     $ $ D D
? r   r  c                    ^  \ rS rSr   S       SU 4S jjjrS rS r\S 5       r\S 5       r	SS jr
\S 5       rSS	 jrS
S
\R                  4     SU 4S jjjrS r     S           SS jjrSS jrSS jrSS jrSrU =r$ )Layoutiq  c                N   > [         TU ]  XX45        Xl        SU l        / U l        g r   )r   r   _reference_column_width_current_column_columns)rZ   r   r   r}   r   r  s        r   r   Layout.__init__r  s)     	:',$ &(r   c                ,    [        U R                  5      $ rM   )r  r)  r   s    r   r\  Layout.__iter__~  s    DMM""r   c                ,    [        U R                  5      $ rM   )r|   r)  r   s    r   r  Layout.__len__  s    4==!!r   c                    U R                   $ rM   )r(  r   s    r   current_column_indexLayout.current_column_index  r  r   c                `    U R                   nU R                  (       a  U R                  5       nU$ rM   )rO  r)  _calculate_content_widthr  s     r   ro  Layout.content_width  s'    ##==113Er   c                    [        S U R                  S S  5       5      nU R                  (       a  XR                  S   R                  -  nU$ )Nc              3  R   #    U  H  oR                   UR                  -   v   M     g 7frM   )r   r  r  cs     r   r  2Layout._calculate_content_width.<locals>.<genexpr>  s     I6HMMAHH,6Hr  rE  )r  r)  r   r  s     r   r3  Layout._calculate_content_width  s@    IdmmCR6HII==]]2&222Er   c                n    U R                   nU R                  (       a  U R                  5       nU$ Uc  SnU$ r   )rP  r)  r  r  s     r   ru  Layout.content_height  s:    %%==335F  ^Fr   c                :    [        S U R                   5       5      $ )Nc              3  8   #    U  H  oR                   v   M     g 7frM   r   r7  s     r   r  3Layout._calculate_content_height.<locals>.<genexpr>  s     9=a>>=   )r   r)  r   s    r   r   Layout._calculate_content_height  s    94==999r   r   c                z   > U R                   nU R                  n[        X4U5      u  pg[        TU ]  X-   X'-   5        g)a  Place layout and all sub-entities at the final location, relative
to the insertion point (x, y) by the alignment defined by the argument
`align` (IntEnum).

=== ================
int LayoutAlignment
=== ================
1   TOP_LEFT
2   TOP_CENTER
3   TOP_RIGHT
4   MIDDLE_LEFT
5   MIDDLE_CENTER
6   MIDDLE_RIGHT
7   BOTTOM_LEFT
8   BOTTOM_CENTER
9   BOTTOM_RIGHT
=== ================

It is possible to add content after calling :meth:`place`, but
:meth:`place` has to be called again before calling :meth:`render`.

It is recommended to place the layout at origin (0, 0) and use a
transformation matrix to move the layout to the final location in
the target DXF layout.

N)r   r   r   r   r   )	rZ   r   r   r   r   r   r[   r^   r  s	           r   r   Layout.place  s<    B   ""#E&9	ah(r   c                    U R                  5       u  pXR                  -   nX R                  -
  nU  H/  nUR                  X5        XR                  UR
                  -   -  nM1     g)z$Place content at the final location.N)r   rl  ra  r   r   r  )rZ   r   r   columns       r   rT  Layout.place_content  sY    ""$   FLL##fmm33A r   c                x    U(       d  U R                   n[        XX4US9nU R                  R                  U5        U$ )z"Append a new column to the layout.)r  r}   r   )r'  r  r)  rH  )rZ   r   r   r  r}   r   rF  s          r   append_columnLayout.append_column  s<     00E&H
 	V$r   c                   [        U5      nU R                  nU R                  [        U5      :  a_  X0R                     nUR	                  U5      n[        U5      S:X  a  g U =R                  S-  sl        U R                  [        U5      :  a  M_  U(       ac  U R                  5       n[        U R                  5      S-
  U l        UR	                  U5      nU R                  S:  a  [        S5      eU(       a  Mb  g g )Nr   r   d   z#Internal error - not enough space!?)rF  r)  r(  r|   r   _new_columnr   )rZ   r  r  columnsrF  s        r   r   Layout.append_paragraphs  s    $	--""S\1112F00;I9~"  A%  ""S\1 %%'F#&t}}#5#9D 00;I##c)!"GHH ir   c                    [        U R                  5      S:X  a  [        S5      eU R                  S   R                  5       nU R                  R	                  U5        U$ )Nr   zno column existrE  )r|   r)  r   r  rH  )rZ   emptys     r   rM  Layout._new_column  sM    t}}"/00b!--/U#r   c                    U =R                   S-  sl         U R                   [        U R                  5      :  a  U R                  5         g g re  )r(  r|   r)  rM  r   s    r   next_columnLayout.next_column  s;    !3t}}#55 6r   )r)  r(  r'  r  )r   rH   r   r   r}   r  r   r   r   )r   rH   r   rH   r   r#   )NNr   NN)r   r   r   r   r  rH   r}   r  r   r   rl   r  )r  r#  r"  )rl   rm   )r   r   r   r   r   r\  r  r   r0  ro  r3  ru  r  r#   r,   r   rT  rI  r   rM  rT  r   r  r  s   @r   r%  r%  q  s0    #'-1.2
)
)  
) +	
)
 ,
) 
)#" $ $    :
 !0!9!9	$)$) $) 	$) $)L4 "&"&-1.2   	
 + , 
"I& r   r%  c                T    U  H"  nUR                  X5        XR                  -  nM$     g rM   )r   r   )r  r   r   r  s       r   linear_placingrW    s&    

1	 r   c                     ^  \ rS rSrS\R
                  4 SU 4S jjjrS r\SS j5       r	\SS j5       r
SSS jjrSU 4S jjrSS	 jrS
rU =r$ )RigidConnectioni  Nc                b   > [         TU ]  SSUS9  U(       a  [        U5      U l        g / U l        g )Nr   )r   )r   r   rF  r  )rZ   r  r   r  s      r   r   RigidConnection.__init__  s,     	Af-16$u+Br   c                ,    [        U R                  5      $ rM   )r  r  r   s    r   r\  RigidConnection.__iter__  r  r   c                :    [        S U R                   5       5      $ )Nc              3  8   #    U  H  oR                   v   M     g 7frM   r   r  r  s     r   r  .RigidConnection.total_width.<locals>.<genexpr>  s     <##rA  )r  r  r   s    r   r   RigidConnection.total_width  s    <<<<r   c                :    [        S U R                   5       5      $ )Nc              3  8   #    U  H  oR                   v   M     g 7frM   r?  ra  s     r   r  /RigidConnection.total_height.<locals>.<genexpr>  s     =$$rA  )r   r  r   s    r   r   RigidConnection.total_height  s    ====r   c                \    [        U R                  U5        [        U R                  U5        g rM   )r  r  r  r   s     r   r`   RigidConnection.render  s    T[[!$DKK+r   c                P   > [         TU ]  X5        [        U R                  X5        g rM   )r   r   rW  r  rZ   r   r   r  s      r   r   RigidConnection.place  s    at{{A)r   c                (    S U R                    5       $ )Nc              3  z   #    U  H1  n[        U[        5      (       d  M  UR                  (       d  M-  Uv   M3     g 7frM   )r  r   r   ra  s     r   r  0RigidConnection.growable_glue.<locals>.<genexpr>"  s&      
(TJtT,BDt}}DD[s   ;;	;r  r   s    r   growable_glueRigidConnection.growable_glue!  s    
![[
 	
r   rp  )r  zOptional[Iterable[Cell]]r   rM   r  r   )rl   zIterable[Glue])r   r   r   r   r6   r8   r   r\  r   r   r   r`   r   rq  r   r  r  s   @r   rY  rY    sa    04]=Q=Q?-? ?! = = > >,*
 
r   rY  c                D  ^ ^ SU U4S jjnSn[        T 5      n/ mX#:  a  T U   n[        U[        5      (       aI  UnUS-  nX#:  a-  [        T U   [        5      (       d	  U" XR5        OUS-  nX#:  a  M-  X#:X  a	  U" XR5        OMh  TR                  U5        US-  nX#:  a  M  T$ )Nc                   > TX n[        U5      S:  a  TR                  [        U5      5        g TR                  US   5        g r:  )r|   rH  rY  )se_rigid_contentr  	new_cellss      r   append_rigid_content7group_non_breakable_cells.<locals>.append_rigid_content(  s?    q~"_^<=^A./r   r   r   )ru  r   rv  r   )r|   r  r@  rH  )r  ry  r  rS   r  startrx  s   `     @r   r  r  '  s    0 0 EJEI
-U|dI&&EQJE-!%,	::(6
	 -
 ~$U2T"
! -" r   c                    Sn[        U [        5      (       aP  U R                  [        R                  :w  a2  U R
                  U-
  nU R                  [        R                  :X  a  US-  nU$ )NrG   r   )r  r   r   r6   r:   r   r9   )r  group_heightdys      r   vertical_cell_shiftr  F  sU    	B$$$8I8I)I-;;-...#IBIr   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
LineCelliO  r   r  rH   offsetr  lockedr   N)r   r   r   r   rK   r   r   r   r   r  r  O  s    
JMLr   r  c                       \ rS rSrSrSrSrSrg)r  iU  r   r   r   r   N)r   r   r   r   r  r  r  r   r   r   r   r  r  U  s    DGFr   r  c                    ^  \ rS rSrSrSU 4S jjrS r\R                  SS j5       r	\R                  SS j5       r
\S 5       rSU 4S jjr\SS	 j5       r\SS
 j5       r\SS j5       rSS jrSS jrSSS jjrSS jrSrU =r$ )r  i[  Fc                \   > [         TU ]  US[        R                  S9  / U l        SU l        g )Nr   )r   r   r   rG   )r   r   r6   r8   r  _current_offset)rZ   r   r  s     r   r   AbstractLine.__init__^  s,    uQ}7K7KL&(&)r   c                "    U R                  5       $ rM   )flattenr   s    r   r\  AbstractLine.__iter__c  s    ||~r   c                    g)z;Append cell to the line content and report SUCCESS or FAIL.Nr   rZ   r  s     r   rH  AbstractLine.appendf  rx   r   c                    g)zZAppend cell with preceding tabulator cell to the line content
and report SUCCESS or FAIL.
Nr   rZ   r  tabs      r   r  AbstractLine.append_with_tabk  s    
 	r   c                ,    [        U R                  5      $ rM   )r  r  r   s    r   r  AbstractLine.has_contentr  s    DKK  r   c                   > [         TU ]  X5        U R                  nU R                   H<  nUR                  nXR
                  -   nU[        XS5      -   nUR                  Xg5        M>     g rM   )r   r   r   r  r  r  r  )	rZ   r   r   r}  	line_cellr  r5  r6  r  s	           r   r   AbstractLine.placev  s[    a((I>>D%%%B(<<BJJr	 %r   c                    U R                   $ rM   r   r   s    r   r  AbstractLine.line_width  r   r   c                    Sn[        U R                  5      (       a2  U R                  S   nUR                  UR                  R                  -   nU$ )NrG   rE  )r|   r  r  r  r   )rZ   r   	last_cells      r   r   AbstractLine.total_width  sB    t{{BI$$y~~'A'AAEr   c                p    [        U R                  5      (       a  [        S U R                   5       5      $ g)Nc              3  L   #    U  H  oR                   R                  v   M     g 7frM   )r  r   r7  s     r   r  ,AbstractLine.total_height.<locals>.<genexpr>  s     @Kqvv**K   "$rG   )r|   r  r   r   s    r   r   AbstractLine.total_height  s)    t{{@DKK@@@r   c                X    U R                    Vs/ s H  oR                  PM     sn$ s  snf )z.Yield line content including RigidConnections.)r  r  )rZ   r8  s     r   r  AbstractLine.cells  s      $,1,,,s   'c              #     #    U R                  5        H(  n[        U[        5      (       a  U Sh  vN   M$  Uv   M*     g N7f)z2Yield line content with resolved RigidConnections.N)r  r  rY  r  s     r   r  AbstractLine.flatten  s1     JJLD$00
	 !s   .AA Ac                b    [        U R                  5       5      n[        X!5        [        X!5        g rM   )rF  r  r  r  )rZ   r_   r  s      r   r`   AbstractLine.render  s"    TZZ\"UE%r   c                    U R                   nU(       a3  [        US   R                  [        5      (       a  UR	                  5         gg)zMRemove the last space in the line. Returns True if such a space was
removed.
rE  TF)r  r  r  r   rJ  )rZ   r  s     r   r  'AbstractLine.remove_line_breaking_space  s3     j%88JJLr   )r  r  r   r  r   rl   r  r  r   r  r   rl   r  r   r   )rl   r  rM   r   r  )r   r   r   r   r  r   r\  ro   rp   rH  r  r   r  r   r  r   r   r  r  r`   r  r   r  r  s   @r   r  r  [  s    O*
 	  	  ! !      
-&
 r   r  c                     ^  \ rS rSrSrSSU 4S jjjr S       SS jjrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrS rSrU =r$ )r  i  Tc                @   > [         TU ]  US9  U=(       d    / U l        g )N)r   )r   r   r  )rZ   r   r  r  s      r   r   LeftLine.__init__  s    u%#/rr   c                N    U R                   R                  [        XU5      5        g rM   )r  rH  r  )rZ   r  r  r  s       r   _append_line_cellLeftLine._append_line_cell  s     	8D&9:r   c                j   UR                   nU R                  U-   U R                  ::  a@  U R                  XR                  5        U =R                  U-  sl        [        R
                  $ [        U R                  5      S:X  a"  U R                  US5        [        R                  $ [        R                  $ r   )
r   r  r  r  r  r  r|   r  r  r  rZ   r  r   s      r   rH  LeftLine.append  s      %'4??:""4)=)=>  E) %%%t{{q  ""4+$$$r   c                   UR                   nU R                  nXC-   U R                  :  a  [        R                  $ UnXCS-  -   nXC-   nU R                  XVU5      nUc  U R                  X!5      $ UR                  [        R                  :X  a  U R                  XR                  5      $ UR                  [        R                  :X  a  U R                  XR                  5      $ U R                  XR                  5      $ r1  )r   r  r  r  r  _next_tab_stop_append_unlocked_tabrJ   rB   r>   _append_leftrI   r9   _append_center_append_right)	rZ   r  r  r   rI   left_pos
center_pos	right_postab_stops	            r   r  LeftLine.append_with_tab  s      "";(??" 19_
K	&&xYG,,S77}} 0 00((||<<+"4"44**4>>))$==r   c                (   U R                   nUR                  5       nX4R                  -   nUR                  nXV-   U R                  ::  a;  U R	                  XC5        U R	                  X%5        XV-   U l         [
        R                  $ [
        R                  $ rM   )r  r   r   r  r  r  r  r  )rZ   r  r  pos0spacepos1r   s          r   r  LeftLine._append_unlocked_tab  s{    ##'''  <4??*""5/""4.#'<D %%%r   c                    UR                   nX#-   U R                  ::  a+  U R                  XS5        X#-   U l        [        R
                  $ [        R                  $ r  )r   r  r  r  r  r  r  )rZ   r  rI   r   s       r   r  LeftLine._append_left  sK      ;$//)""4d3#&;D %%%r   c                   UR                   S-  nU R                  U-   U:  a  U R                  U5      $ X#-   U R                  ::  a.  U R	                  XU-
  S5        X#-   U l        [
        R                  $ [
        R                  $ )Nr   T)r   r  rH  r  r  r  r  r  )rZ   r  rI   width2s       r   r  LeftLine._append_center  sv    !!A%&(3.;;t$$\T__,""4vt<#&<D %%%r   c                    UR                   nU R                  U-   nX@R                  :  a  [        R                  $ XB:  a  U R                  U5      $ U R                  XU-
  S5        X l        [        R                  $ r  )r   r  r  r  r  rH  r  r  )rZ   r  rI   r   end_of_cell_poss        r   r  LeftLine._append_right  sl      ..6__,??" ;;t$$t5[$7"!!!r   c                Z   U R                    H  nUR                  [        R                  :X  a  UR                  U:  a  Us  $ UR                  [        R
                  :X  a  UR                  U:  a  Us  $ UR                  [        R                  :X  d  M  UR                  U:  d  M  Us  $    g rM   )r  rJ   rB   r>   rI   r9   r?   )rZ   r[   r   r]   r  s        r   r  LeftLine._next_tab_stop  sy    ??Cxx;+++$
[///CGGf4D
[...377U?
 # r   )r  r  rM   )r   rH   r  r  )F)r  r   r  rH   r  r  rl   rm   r  r  )rl   r  )r   r   r   r   r  r   r  rH  r  r  r  r  r  r  r   r  r  s   @r   r  r    sd    O* *
 9>;;"';15;	;
>,	" r   r  c                &    [        S U  5       5      $ )Nc              3  8   #    U  H  oR                   v   M     g 7frM   r`  ra  s     r   r   content_width.<locals>.<genexpr>  s     2EDErA  )r  )r  s    r   ro  ro    s    2E222r   c                    / nU  Hr  n[        U[        5      (       a$  UR                  (       a  UR                  U5        M<  [        U[        5      (       d  MS  UR                  UR                  5       5        Mt     U$ rM   )r  r   r   rH  rY  r  rq  )r  growabler  s      r   growable_cellsr    sY    HdD!!dmmOOD!o..OOD..01	 
 Or   c                    [        U 5      nUS:X  d  X:  a  g XS-
     nUR                  UR                  R                  -   nX:  a7  X   R                  n[	        XTS5      X'   XER                  -  nUS-  nX:  a  M6  g g )Nr   r   F)r|   r  r  r   r  )r  r  rS   r  r  r  s         r   update_offsetsr    s}    JEzU]ai I	 : ::F
-|  e4"""
	 -r   c                  ,    \ rS rSrS rS rS rS rSrg)r  i-  c                   U R                   nU R                  5       nU[        U5      :X  a  g U R                  U5      nXS-   S   Vs/ s H  oDR                  PM     nnSn [        U5      n[        U5      S:X  a  ONU[        U5      -
  nUS::  a  O9U[        U5      -  nU H!  n	U	R                  U	R                  U-   5        M#     SnMi  U(       a  [        U R                   US-   5        g g s  snf )Nr   FTr   g&.>)
r  _last_locked_cellr|   _available_spacer  r  ro  r   r   r  )
rZ   r  last_locked_cellavailable_spacer8  modifiedr  space_to_distributer4  r  s
             r   r  JustifiedLine.distribute.  s    113s5z)//0@A!&!';'=!>?!>A!>?%e,H8}!"1M%4H"H"d*'#h-7E D,,u45 !H  4;;(81(<= ! @s   C,c                f    U R                   U   nUR                  UR                  R                  -   $ rM   )r  r  r  r   )rZ   r  r  s      r   _end_offsetJustifiedLine._end_offsetH  s)    {{5!{{TYY2222r   c                >    U R                   U R                  U5      -
  $ rM   )r  r  )rZ   r  s     r   r  JustifiedLine._available_spaceL  s    !1!1%!888r   c                    U R                   n[        U5      S-
  nUS:  a"  X   R                  (       a  U$ US-  nUS:  a  M"  gr:  )r  r|   r  )rZ   r  r  s      r   r  JustifiedLine._last_locked_cellO  sF    E
Qai|""QJE ai r   r   N)	r   r   r   r   r  r  r  r  r   r   r   r   r  r  -  s    >439r   r  c                  p   ^  \ rS rSrSrSrS	S jrS
S jrSU 4S jjr\	R                  SS j5       rSrU =r$ )	NoTabLineiY  z.Base class for lines without tab stop support!Fc                   [        U[        5      (       a  UR                  5       nUR                  nU R                  U-   U R
                  :  aT  U R                  R                  [        XR                  S5      5        U =R                  U-  sl        [        R                  $ [        U R                  5      S:X  a6  U R                  R                  [        USS5      5        [        R                  $ [        R                  $ )NFr   )r  r   r   r   r  r  r  rH  r  r  r  r|   r  r  r  s      r   rH  NoTabLine.append^  s    dI&&==?D  %'$//9KKx.B.BEJK  E) %%%t{{q  KKxa78$$$r   c                    [        5       e)zNo tabulator support!)NotImplementedErrorr  s      r   r  NoTabLine.append_with_tabm  s    !##r   c                F   > [         TU ]  XR                  5       -   U5        g rM   )r   r   start_offsetrk  s      r   r   NoTabLine.placeq  s    a++--q1r   c                    g rM   r   r   s    r   r  NoTabLine.start_offsetu  r^  r   r   r  r  r   r   )r   r   r   r   r   r  rH  r  r   ro   rp   r  r   r  r  s   @r   r  r  Y  s4    8O$2 	 r   r  c                  "    \ rS rSrSrSS jrSrg)r  iz  -Right aligned lines do not support tab stops!c                ^    [        S U R                   5       5      nU R                  U-
  S-  $ )Nc              3  L   #    U  H  oR                   R                  v   M     g 7frM   r  r   r7  s     r   r  *CenterLine.start_offset.<locals>.<genexpr>~       A[++[r  r   r  r  r  rZ   
real_widths     r   r  CenterLine.start_offset}  s*    AT[[AA
*,11r   r   Nr   r   r   r   r   r   r  r   r   r   r   r  r  z  s
    72r   r  c                  "    \ rS rSrSrSS jrSrg)r  i  r  c                X    [        S U R                   5       5      nU R                  U-
  $ )Nc              3  L   #    U  H  oR                   R                  v   M     g 7frM   r  r7  s     r   r  )RightLine.start_offset.<locals>.<genexpr>  r  r  r  r  s     r   r  RightLine.start_offset  s%    AT[[AA
++r   r   Nr   r  r   r   r   r  r    s
    7,r   r  c                   ^ U4S jU  5        Vs/ s H"  nSUR                   s=:  a  U::  d  M  O  M   UPM$     sn$ s  snf )Nc              3  F   >#    U  H  u  p[        UT-   U5      v   M     g 7frM   )rE   )r  rI   rJ   r  s      r   r  "shift_tab_stops.<locals>.<genexpr>  s!     Pivt44is   !r   )rI   )r  r  right_borderr  s    `  r   r  r    sI    
 QiPPHx||+|+ 	+ 	P  s   <<<)rL  )r}   r  rl   ry   )r   r#   r   rH   r   rH   rl   rz   rM   )r  r  r_   r
   rl   rm   )r  r  r_   r
   rl   rm   )r  r  rl   r  )r  zSequence[Cell]r   rH   r   rH   )r  r  rl   r  )r  r   r}  rH   rl   rH   )r  r  rl   rH   )r  r  rl   z
list[Glue])r  zlist[LineCell]r  r   rl   rm   )r  zIterable[TabStop]r  rH   r  rH   rl   zlist[TabStop])K
__future__r   typingr   r   r   r   r   typing_extensionsr	   ro   rN   enum
ezdxf.mathr
   r   ezdxf.tools.textr   rQ   	Exceptionr   IntEnumr   r#   r6   r<   rB   rE   rT   ABCrV   rr   rH   ry   rK   rz   r~   r   r   r   r   r   r   r   r   r   r   r  r  r  rG  rI  r@  rK  rM  r  r  r  r%  rW  rY  r  r  r  r  r  r  ro  r  r  r  r  r  r  r  r   r   r   <module>r     s   # B B ' 
   . $un	) 	t|| 	dll 	DLL  $,, )j )
I5cgg 5: " 5%56 65%<( ( 6V#'' VB3 "$D4 $DN	D 		t 		 	1$ 1h @0; @0F96W.{ W.t (	 ),#$	&Rs sl'T ':T	 Tn\Y \~MY M`
k 
@>z  O; Oda| aH3)H )X B2 2,	 , */?Dr   