
    Og                       U d dl mZ d dlmZmZmZmZmZ d dlm	Z	 d dl
Z
d dlZd dlZd dlmZmZ d dlmZ 	 dZ G d d	e      Z G d
 dej*                        Z G d dej*                        Z G d dej*                        Z G d dej*                        Z G d dej*                        Z G d de      ZdZdZ G d de
j:                        Z G d de      Zee e e e f   Z!de"d<   ee e f   Z#de"d<   d[dZ$d\dZ% G d  d!e
j:                        Z& G d" d#e&      Z' G d$ d%e'      Z( G d& d'e(      Z) G d( d)e(      Z* G d* d+e(      Z+ G d, d-e'      Z, G d. d/      Z- G d0 d1e,      Z.d]d^d2Z/d]d_d3Z0 G d4 d5e,      Z1e.e1fZ2e)e*e+fZ3e.e*fZ4d`d6Z5 G d7 d8e&      Z6 G d9 d:e'      Z7 G d; d<e6      Z8 G d= d>e6      Z9 G d? d@e6      Z:dadAZ; G dB dCe,      Z<dbdDZ=dcdEZ> G dF dGe      Z? G dH dIej*                        Z@ G dJ dKe,      ZA G dL dMeA      ZBdddNZCdedOZDdfdPZE G dQ dReB      ZF G dS dTeA      ZG G dU dVeG      ZH G dW dXeG      ZI	 	 	 	 	 	 	 	 dgdYZJy)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                      e Zd Zy)LayoutErrorN__name__
__module____qualname__     \/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/tools/text_layout.pyr   r          r   r   c                      e Zd ZdZdZdZy)Stackingr         N)r   r   r   OVERLINESLANTEDr   r   r   r   r      s    DDGr   r   c                  0    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zy
)LayoutAlignmentr   r                     	   N)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      s/    HJIKMLKMLr   r   c                      e Zd ZdZdZdZy)CellAlignmentr   r   r   N)r   r   r   BOTTOMCENTERTOPr   r   r   r1   r1      s    FF
Cr   r1   c                      e Zd ZdZdZdZdZy)ParagraphAlignmentr   r   r    r!   N)r   r   r   LEFTRIGHTr3   	JUSTIFIEDr   r   r   r6   r6      s    DEFIr   r6   c                      e Zd ZdZdZdZy)TabStopTyper   r   r   N)r   r   r   r7   r8   r3   r   r   r   r;   r;      s    DEFr   r;   c                  >    e Zd ZU dZded<   ej                  Zded<   y)TabStop        floatposr;   kindN)r   r   r   r@   __annotations__r;   r7   rA   r   r   r   r=   r=      s    C#((D+(r   r=   c                x    t        j                  t        j                  t        j	                               |       S N)	itertoolsislicecycleLOREM_IPSUMsplit)counts    r   lorem_ipsumrK      s'    IOOK,=,=,?@%HHr   c                      e Zd Zej                  	 d	 	 	 	 	 	 	 	 	 	 	 dd       Zej                  	 d	 	 	 	 	 	 	 	 	 	 	 dd       Zy)ContentRendererNc                     y)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   renderzContentRenderer.render       r   c                     y)z&Draw a line from (x1, y1) to (x2, y2).Nr   rP   x1y1x2y2rU   s         r   linezContentRenderer.line   rW   r   rD   rQ   r?   rR   r?   rS   r?   rT   r?   rU   r
   returnNonerZ   r?   r[   r?   r\   r?   r]   r?   rU   r
   r`   ra   )r   r   r   abcabstractmethodrV   r^   r   r   r   rM   rM      s       	
   
 ( 	HL55"5(-5385=E5	5 5r   rM   c                  P    e Zd Z	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 	 	 ddZy)DoNothingRendererNc                     y rD   r   rO   s         r   rV   zDoNothingRenderer.render   s     	r   c                     y rD   r   rY   s         r   r^   zDoNothingRenderer.line        	r   rD   r_   rb   )r   r   r   rV   r^   r   r   r   rf   rf      s       	
   
 IM"(-38=E	r   rf   r	   Tuple4fTuple2fc                    | yt        |       }|dk(  r| d   | d   | d   | d   fS |dk(  r| d   | d   | d   | d   fS |dk(  r| d   | d   | d   | d   fS |dk(  r| d   | d   | d   | d   fS y)zDReturns the box margins in CSS like order: top, right, bottom, left.)r   r   r   r   r!   r   r   r   r    )len)marginsrJ   s     r   resolve_marginsro      s    LEzqz71:wqz71:==zqz71:wqz71:==zqz71:wqz71:==zqz71:wqz71:==r   c                
   d}d}|dz  }|dz  }| t         j                  k(  r	 ||fS | t         j                  k(  r	| d}}||fS | t         j                  k(  r	| d}}||fS | t         j                  k(  rd|}}||fS | t         j
                  k(  r	| |}}||fS | t         j                  k(  r	| |}}||fS | t         j                  k(  rd|}}||fS | t         j                  k(  r	| |}}||fS | t         j                  k(  r| |}}||fS )z<Returns the left top corner adjusted to the given alignment.r>          @r   )
r   r'   r(   r)   r*   r+   r,   r-   r.   r/   )alignwidthheightrQ   rT   centermiddles          r   insert_locationrw      sm   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                      e Zd Zeej
                  dd              Zeej
                  dd              Zej
                  d	d       Zej
                  d
d       Z	ej
                  ddd       Z
ddZy)Boxc                     y rD   r   rP   s    r   total_widthzBox.total_width  s    $'r   c                     y rD   r   r{   s    r   total_heightzBox.total_height  s    %(r   c                     y(x, y) is the top/left cornerNr   rP   xys      r   placez	Box.place#  rW   r   c                     y)z1Returns the final location as the top/left cornerNr   r{   s    r   final_locationzBox.final_location'  rW   r   Nc                     yz%Render content at the final location.Nr   rP   rU   s     r   rV   z
Box.render+  rW   r   c                    	 | j                         \  }}t        ||f|| j                  z   || j
                  z
  fg      S # t        t        f$ r d\  }}Y Aw xY w)zyReturns 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   bboxzBox.bbox/  si    
	&&(DAq q!fq4+;+;';QARAR=R&STUU Y' 	DAq	s   A   AAr`   r?   r   r?   r   r?   r`   ztuple[float, float]rD   rU   r
   r`   ra   )r`   r   )r   r   r   propertyrc   rd   r|   r~   r   r   rV   r   r   r   r   ry   ry     s    '  '(  (, , 	@ @ 	4 4	Vr   ry   c                  *    e Zd ZdZddZddZdd	dZy)
CellFc                     y rD   r   r   s      r   r   z
Cell.place>  ri   r   c                     y)Nr   r   r{   s    r   r   zCell.final_locationC  s     r   Nc                     y rD   r   r   s     r   rV   zCell.renderH      r   r   r   rD   r   )r   r   r   
is_visibler   r   rV   r   r   r   r   r   ;  s    J

r   r   c                      e Zd ZU  e       Zded<   	 	 d	 	 	 	 	 ddZddZed        Z	ed        Z
edd       Zedd	       Zdd
Zy)GluetupleEMPTYNc                n    t        |      | _        |rt        |      n| j                  | _        || _        y rD   )r?   _width
_min_width
_max_width)rP   rs   	min_width	max_widths       r   __init__zGlue.__init__O  s*     #5\.7%	*T[[+4r   c                n    | j                   }|t        ||      }t        || j                        | _        y rD   )r   minmaxr   r   )rP   rs   r   s      r   resizezGlue.resizeY  s/    OO	 	5)E%1r   c                4    | j                   | j                  k  S rD   )r   r   r{   s    r   
can_shrinkzGlue.can_shrink_  s    ,,r   c                T    | j                   d u xs | j                  | j                   k  S rD   )r   r   r{   s    r   can_growzGlue.can_growc  s#    $&G$++*GGr   c                    | j                   S rD   r   r{   s    r   r|   zGlue.total_widthg      {{r   c                     yNr   r   r{   s    r   r~   zGlue.total_heightk  s    r   c                X    t        | j                  | j                  | j                        S rD   )Spacer   r   r   r{   s    r   to_spacezGlue.to_spaceo  s    T[[$//4??CCr   )NN)rs   r?   r   Optional[float]r   r   rs   r?   r   )r`   r   )r   r   r   r   r   rB   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                      e Zd Zy)r   Nr   r   r   r   r   r   s  r   r   r   c                      e Zd Zy)NonBreakingSpaceNr   r   r   r   r   r   w  r   r   r   c                      e Zd Zy)	TabulatorNr   r   r   r   r   r   {  r   r   r   c                  ~    e Zd ZdZdZej                  df	 	 	 	 	 	 	 d
dZddZd Z	e
dd       Ze
dd       Zdd	Zy)ContentCella  Represents visible content like text or fractions.

    Supported vertical alignments (IntEnum):

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

    TNc                    d | _         d | _        t        |      | _        t        |      | _        t        |      | _        || _        y rD   )_final_x_final_yr?   r   _heightr1   valignrenderer)rP   rs   rt   r   r   s        r   r   zContentCell.__init__  s;     *.)-ElV}#F+ r   c                     || _         || _        y rD   r   r   r   s      r   set_final_locationzContentCell.set_final_location  s    r   c                2    | j                   | j                  fS rD   r   r{   s    r   r   zContentCell.final_location  s    }}dmm++r   c                    | j                   S rD   r   r{   s    r   r|   zContentCell.total_width  r   r   c                    | j                   S rD   r   r{   s    r   r~   zContentCell.total_height      ||r   c                     || _         || _        yr   r   r   s      r   r   zContentCell.place  s    r   )rs   r?   rt   r?   r   r1   r   Optional[ContentRenderer]r   r   )r   r   r   __doc__r   r1   r2   r   r   r   r   r|   r~   r   r   r   r   r   r     s~     J !. 4 4.2!! ! 	!
 ,!,    r   r   c                       e Zd ZdZdZdZdZdZy)Stroker   r   r   r!   r%   N)r   r   r   	NO_STROKE	UNDERLINESTRIKE_THROUGHOVERLINECONTINUEr   r   r   r   r     s    IINHHr   r   c                       e Zd ZdZej
                  ej                  df	 	 	 	 	 	 	 	 	 d fdZdddZ		 	 	 d		 	 	 	 	 	 	 d
dZ
 xZS )Texta  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                J    t         |   ||||       t        |      | _        y rD   )superr   intstroke)rP   rs   rt   r   r   r   	__class__s         r   r   zText.__init__  s#     	9&kr   c                    | j                         \  }}| j                  }||z
  }|| j                  z   }| j                  j	                  |||||       y )N)rQ   rR   rS   rT   rU   )r   r~   r|   r   rV   )rP   rU   rQ   rT   rt   rR   rS   s          r   rV   zText.render  sZ    '')	c""vt'''fEsa 	 	
r   c                   | j                         \  }}||z  }| j                  }||z
  }|| j                  z   |z   }| j                  }	|	J |dz  }
| j                  t
        j                  z  r||
z
  }|	j                  |||||       | j                  t
        j                  z  r||z   dz  }|	j                  |||||       | j                  t
        j                  z  r||
z   }|	j                  |||||       y y )Nr"   r   )
r   r~   r|   r   r   r   r   r^   r   r   )rP   extend_leftextend_rightrU   rQ   rT   rt   rR   rS   r   spacingr   s               r   render_strokezText.render_stroke  s     '')	c""vt''',6==### 1*;;))) AMM$5!Q/;;...v"AMM$5!Q/;;(gAMM$5!Q/ )r   )
rs   r?   rt   r?   r   r1   r   r   r   r   rD   rU   zOptional[Matrix44]r`   ra   )r   r   N)r   r?   r   r?   rU   r
   r`   ra   )r   r   r   r   r1   r2   r   r   r   rV   r   __classcell__r   s   @r   r   r     s    . !. 4 4&&.2	"	" 	" 		"
 	" ,	"
 	00 0 	0
 
0r   r   c                N    | D ]   }|j                   s|j                  |       " y rD   )r   rV   )cellsrU   cells      r   render_cellsr     s#     ??KKNr   c                      fd}t               D ]\  \  }t        |t              s|j                  s$|j                  t        j
                  z  r |       nd}|j                  ||       ^ y)z+Render text cell strokes across glue cells.c                     d} dz   }t              }||k  r3|   }t        |t              r| |j                  z  } n	 | S |dz  }||k  r3| S )Nr   r   )rm   
isinstancer   r|   )extendirJ   r   r   indexs       r   stroke_extensionz-render_text_strokes.<locals>.stroke_extension  sg    AIE
%i8D$%$*** FA %i r   r   )r   rU   N)	enumerater   r   r   r   r   r   )r   rU   r   r   r   r   s   `    @r   render_text_strokesr     s_     !' 9tdD!dkk+/;;+H%'aFFa89r   c                       e Zd ZdZdZej                  ej                  df	 	 	 	 	 	 	 	 	 d	 fdZ	d Z
d
dZdddZddZ xZS )Fractionar  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                t    t         |   dd||       || _        || _        || _        | j                          y r   )r   r   	_stacking_top_content_bottom_content_update_size)rP   rT   rR   stackingr   r   r   s         r   r   zFraction.__init__1  s;     	Avx0!%r   c                   | j                   }| j                  }| j                  t        j                  k(  r=|j
                  |j
                  z   | _        |j                  |j                  z   | _        y | j                  |j
                  |j
                  z   z  | _        t        |j                  |j                        | _        y rD   )r   r   r   r   r   r~   r   r|   r   HEIGHT_SCALEr   )rP   rT   rR   s      r   r   zFraction._update_size?  s    %%>>X---++f.A.AADL//F,>,>>DK,,0@0@6CVCV0VWDLcoov/A/ABDKr   c                .   || _         || _        | j                  }| j                  }| j                  }| j
                  }||t        d      | j                  t        j                  k(  rI|j                  ||       |||j                  z
  z  }|||j                  z
  z  }|j                  ||       y||dz  z   }||j                  dz  z
  }|j                  ||       ||j                  dz  z
  }|||j                  z
  z  }|j                  ||       y)r   Nzno content setr   )r   r   r|   r~   r   r   r   r   r   r   r   )rP   r   r   rs   rt   top_contentbottom_contentru   s           r   r   zFraction.placeI  s     ""''--."8.//>>X---a#3333A.5555A  A&]F00144Aa#33a77A.5555A  A&r   c                    | j                   j                  |       | j                  j                  |       | j                  t        j
                  k7  r| j                  |       y y rD   )r   rV   r   r   r   r   _render_liner   s     r   rV   zFraction.rendera  sM      ###A&>>X]]*a  +r   c                   | j                         \  }}| j                  }| j                  }| j                  t        j
                  k(  r|}||z   }||dz  z
  x}}	nUt        ||      dz  }
|| j                  j                  z   }|| j                  j                  z
  }||
z
  }||
z
  }||
z   }||
z   }	| j                  j                  ||||	|       y Nr   )
r   r|   r~   r   r   r   r   r   r   r^   )rP   rU   r   r   twthrZ   r\   r[   r]   deltacxcys                r   r  zFraction._render_lineg  s    ""$1>>X]]*BRB"q&j BBK!OET&&222BT&&333BeBeBeBeB2r2r1-r   )
rT   r   rR   r   r   r   r   r1   r   r   r   rD   r   )r   r   r   r   r   r   r   r1   r2   r   r   r   rV   r  r   r   s   @r   r   r      sn     L &]] - 4 4.2  	
  ,C'0!.r   r   c                    fd} fd}g t                d t               D ]q  \  }t        |t              rt        t              r9t	        d      t        |t
              r |       r|j                         } |        |j                  |       s r9t        d   t              r&j                          rt        d   t              r&S )Nc                     t              dz
  } | dk\  r6|    }t        |t              r|j                         | <   | dz  } ny | dk\  r5y y Nr   r   )rm   r   r   r   )r   r   contents     r   replace_pending_nbsp_by_spacesz7normalize_cells.<locals>.replace_pending_nbsp_by_spaces  sP    Gq qj5>D$ 01!%
 qjr   c                 x    	 dz      } t        t              rt        | t              syy# t         $ r Y yw xY w)Nr   TF)
IndexErrorr   	_no_break)peekr   r   prevs    r   is_useless_nbspz(normalize_cells.<locals>.is_useless_nbsp  sE    	#D $	**T92M	  		s   - 	99zno glue between content cells)
listr   r   _contentr   r   r   append_gluepop)r   r  r  r   r  r   r  s   `   @@@r   normalize_cellsr    s     GKED ' 	tdH%$)!"ABB./O4E==?D*,t	 je4 je4 Nr   c                  F   e Zd Z	 	 	 d	 	 	 	 	 	 	 ddZddZd ZddZej                  dd       Z	e
dd       Ze
dd       Ze
dd	       Ze
dd
       Ze
dd       Ze
dd       Ze
dd       Ze
d        Ze
dd       ZdddZej                  d        ZdddZddZy)	ContainerNc                j    d | _         d | _        || _        || _        t	        |      | _        || _        y rD   )r   r   _content_width_content_heightro   _marginsr   )rP   rs   rt   rn   r   s        r   r   zContainer.__init__  s=     *.)- 05 17 "1!9 4<r   c                @    || _         || _        | j                          y rD   )r   r   place_contentr   s      r   r   zContainer.place  s    r   c                h    | j                         st        d      | j                  | j                  fS )NzContainer is not placed.)	is_placedr   r   r   r{   s    r   r   zContainer.final_location  s+    ~~899}}dmm++r   c                >    | j                   d uxr | j                  d uS rD   r   r{   s    r   r%  zContainer.is_placed  s    }}D(FT]]$-FFr   c                     y rD   r   r{   s    r   __iter__zContainer.__iter__      r   c                     | j                   d   S r   r!  r{   s    r   
top_marginzContainer.top_margin      }}Qr   c                     | j                   d   S Nr   r+  r{   s    r   right_marginzContainer.right_margin  r-  r   c                     | j                   d   S r  r+  r{   s    r   bottom_marginzContainer.bottom_margin  r-  r   c                     | j                   d   S )Nr    r+  r{   s    r   left_marginzContainer.left_margin  r-  r   c                4    | j                   y| j                   S r   )r  r{   s    r   content_widthzContainer.content_width  s    &&&&r   c                N    | j                   | j                  z   | j                  z   S rD   )r6  r0  r4  r{   s    r   r|   zContainer.total_width  s$    !!D$5$558H8HHHr   c                4    | j                   y| j                   S r   r   r{   s    r   content_heightzContainer.content_height  s    ''''r   c                    | j                   d u S rD   r9  r{   s    r   has_flex_heightzContainer.has_flex_height  s    ##t++r   c                N    | j                   | j                  z   | j                  z   S rD   )r:  r,  r2  r{   s    r   r~   zContainer.total_height  s"    ""T__4t7I7IIIr   c                    | j                         st        d      | j                  r| j                  |       | j	                  |       y)zIRender container content.

        (x, y) is the top/left corner
        z(Layout has to be placed before renderingN)r%  r   r   render_backgroundrender_contentr   s     r   rV   zContainer.render  s=    
 ~~HII==""1%Ar   c                     y)z.Place container content at the final location.Nr   r{   s    r   r#  zContainer.place_content  ri   r   c                4    | D ]  }|j                  |        yr   )rV   )rP   rU   entitys      r   r@  zContainer.render_content
  s     	FMM!	r   c                    | j                         \  }}| j                  r;| j                  j                  ||| j                  z
  ||| j                  z   |       yy)z(Render background at the final location.)rQ   rR   rT   rS   rU   N)r   r   rV   r~   r|   )rP   rU   r   r   s       r   r?  zContainer.render_background  s^     ""$1==MM  4,,,$*** !  r   NNN)rs   r   rt   r   rn   Optional[Sequence[float]]r   r   r   r`   bool)r`   ry   r   rD   r   )r   r   r   r   r   r   r%  rc   rd   r(  r   r,  r0  r2  r4  r6  r|   r:  r<  r~   rV   r#  r@  r?  r   r   r   r  r    sC    #'-1.2<<  < +	<
 ,<,
,
G 	                  ' ' I I ( ( , , J J	 	 
r   r  c                  b    e Zd ZdZd	d
dZedd       Zedd       ZddZdddZ	edd       Z
y)EmptyParagraphzVSpacer between two paragraphs, represents empty lines like in
    "line1

line2".
    c                H    || _         d| _        t        ||      |z
  | _        y r   )r   r   r   _last_line_spacing)rP   
cap_heightline_spacings      r   r   zEmptyParagraph.__init__#  s$    (")*l"Cj"Pr   c                    | j                   S rD   r   r{   s    r   r|   zEmptyParagraph.total_width(  r   r   c                    | j                   S rD   r   r{   s    r   r~   zEmptyParagraph.total_height,  r   r   c                    || _         y rD   r   rP   rs   s     r   set_total_widthzEmptyParagraph.set_total_width0  s	    r   Nc                     y rD   r   rP   rt   s     r   distribute_contentz!EmptyParagraph.distribute_content3  r   r   c                    | j                   S rD   rL  r{   s    r   distance_to_next_paragraphz)EmptyParagraph.distance_to_next_paragraph6      &&&r   )r   )rM  r?   rN  r?   r   r   rD   )rt   r   )r   r   r   r   r   r   r|   r~   rS  rV  rY  r   r   r   rJ  rJ    sS    Q
     ' 'r   rJ  c                       e Zd Zdej                  dddddf	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZd Zed        ZddZ	ddZ
dd	Zd
 ZddZddZdddZddZ xZS )	ParagraphN)r   r   r   r   c                    t         |   |d ||       || _        |\  }}	}
|| _        |	| _        |
| _        || _        |xs g | _        g | _        g | _	        d| _
        y )Nr>   )r   r   _align_indent_first_indent_left_indent_right_line_spacing
_tab_stops_cells_linesrL  )rP   rs   rr   indentrN  rn   	tab_stopsr   firstrQ   rS   r   s              r   r   zParagraph.__init__<  sr     	gx8#tU" ")#/r #% +- #&r   c                ,    t        | j                        S rD   )iterre  r{   s    r   r(  zParagraph.__iter__X      DKK  r   c                    | j                   S rD   rX  r{   s    r   rY  z$Paragraph.distance_to_next_paragraph[  rZ  r   c                z    || j                   z
  | j                  z
  | _        | j                  dk  rt        d      y )Ngư>z#invalid width, no usable space left)r4  r0  r  r   rR  s     r   rS  zParagraph.set_total_width_  s?    #d&6&669J9JJ%CDD &r   c                :    | j                   j                  |       y rD   )rd  r   )rP   r  s     r   append_contentzParagraph.append_contentd  s    7#r   c                r    | j                   }||r| j                  n| j                  z  }| j                  |z
  S rD   )ra  r_  r`  r6  )rP   rh  rf  s      r   
line_widthzParagraph.line_widthg  s8    ##$$$43D3DD!!F**r   c                "   | j                         \  }}|| j                  z  }|| j                  z  }d}| j                  }|D ]K  }| j	                  ||      }|j                  ||       |t        |j                  | j                        z  }d}M y )NTF)	r   r4  r,  re  _left_borderr   r   r~   rb  )rP   r   r   rh  linesr^   x_finals          r   r#  zParagraph.place_contentl  s    ""$1	T	T__ 	D''51GJJw"**D,>,>??AE		r   c                @    |r| j                   n| j                  }||z   S )z)Apply indentation and paragraph alignment)r_  r`  )rP   r   rh  left_indents       r   rs  zParagraph._left_borderx  s!    ,1d((t7H7H;r   c                    | j                   }| j                  d}t        |      rA|d   }t        fd|dd D              }|j                  }t        |      |z
  | _        ||z  }|S )zWReturns the actual content height determined by the distributed
        lines.
        r>   r  c              3  J   K   | ]  }t        |j                          y wrD   )r   r~   ).0r^   rN  s     r   	<genexpr>z6Paragraph._calculate_content_height.<locals>.<genexpr>  s#      =A))<8s    #N)re  rb  rm   sumr~   r   rL  )rP   rt  rt   	last_linelast_line_heightrN  s        @r   _calculate_content_heightz#Paragraph._calculate_content_height}  s     ))u:b	I EJ3BZ F  )55(,7:JJ # &&Fr   c                    d fd}t         j                        }t        |      } j                  j                           j                  d}t        |      }d j                   j                  z   }t        t              \  }}}	||k  r8|}
 | j                              }|j                  }||k  r||   }t        |t              r7|r5|j                  ||dz      |      }||k(  r|dz  }n#|j                  s|dz  }n|j!                  |      }||k(  r|dz  }n||k(  rn||	k(  r|dz  }n||k  r|j                  r||j#                          ||k  rt        ||   t$              r|dz  }|j&                  }|||z   |kD  r|
}n=d j(                  j!                  |       |t+        | j,                        z  }||k  r8||k  }t.        j0                  k(  rO|rt         j(                        nd} j(                  d| D ]$  }t        |t2              sJ |j5                          &  j7                          _        |r j;                  ||d       S y)	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         j                  t         j                  fv r]rj                  nj                  }t        j                  | |       }t         j                  k(  rt        | |      S t        | |      S t         j                  k(  rt        |       S t         j                  k(  rt        |       S t              rD   )r6   r7   r9   r_  r`  shift_tab_stopsrc  LeftLineJustifiedLiner8   	RightLiner3   
CenterLiner   )rs   rf  rg  rr   rh  rP   s      r   new_linez.Paragraph.distribute_content.<locals>.new_line  s    +002D2N2NOO/4++$:K:K+DOOfWeL	  2 7 77 UI. 'ui8
 ,222 '',333!%((!%((r   r   Tr   NFr  )rs   r?   r`   AbstractLine)r  rd  group_non_breakable_cellsclearr^  rm   r,  r2  rj  
AppendTyperq  has_tab_supportr   r   append_with_tabhas_contentr  remove_line_breaking_spacer   r~   re  r   rb  r6   r9   r  
distributer  r   _new_paragraph)rP   rt   r  r   r   rJ   paragraph_heightFAILSUCCESSFORCEDundor^   r  r   append_stateline_heightnot_all_cells_processedendrr   rh  s   `                 @@r   rV  zParagraph.distribute_content  s|   	)  ,DKK8)%0$(KKZ #'//D4F4F"F !%Z 0gvem DDOOE23D"22O%-U|dI.?#'#7#7 eai(	$L $w.
!-- 
#';;t#4L7*QJE!T)!V+QJE3 %-6 //15=Zee%DQJE"//&(;6? !E!EKK&&t,$T=O=O(PP$e emf #(%-&000 '>#dkk"2CDS) "!$666!"
  $==? #&&uUV}e<<r   c           	     (   |r| j                   n| j                  }|| j                  | j                  f}t        | j                  | j
                  || j                  | j                  | j                  | j                        }|j                  |       |S rD   )r_  r`  ra  r\  r  r^  rb  r!  rc  r   ro  )rP   r   rh  indent_firstrf  	paragraphs         r   r  zParagraph._new_paragraph  s    -2t))8I8I 1 143E3EFKKMMOOMM
	 	  'r   )rs   r   rr   r6   rf  ztuple[float, float, float]rN  r?   rn   rF  rg  Optional[Sequence[TabStop]]r   r   r   )r  Iterable[Cell])rh  rH  r`   r?   )r   r?   rh  rH  r`   r?   r   rD   )rt   r   r`   zOptional[Paragraph])r   
list[Cell]rh  rH  r`   r\  )r   r   r   r6   r7   r   r(  r   rY  rS  ro  rq  r#  rs  r  rV  r  r   r   s   @r   r\  r\  ;  s     "&$6$;$;-6-115.2&& "& +	&
 & +& /& ,&8! ' 'E
$+


(n`r   r\  c                       e Zd Z	 	 	 	 d	 	 	 	 	 	 	 	 	 d fdZddZd Zd Zedd       ZddZ	ed        Z
edd       Zedd	       Zd
 ZddZ xZS )Columnc                F    t         |   ||||       || _        g | _        y rD   )r   r   _gutter_paragraphs)rP   rs   rt   gutterrn   r   r   s         r   r   zColumn.__init__  s'     	:,.r   c           	         | j                  | j                  | j                  | j                  | j                  | j
                  | j                  | j                  f| j                        S )N)rs   rt   r  rn   r   )	r   r6  r:  r  r,  r0  r2  r4  r   r{   s    r   clone_emptyzColumn.clone_empty   sa    ~~$$&&;;!!""  	 ]]  
 	
r   c                ,    t        | j                        S rD   )rj  r  r{   s    r   r(  zColumn.__iter__.  s    D$$%%r   c                ,    t        | j                        S rD   )rm   r  r{   s    r   __len__zColumn.__len__1  s    4##$$r   c                B    | j                   }|| j                         S |S )zoReturns the current content height for flexible columns and the
        max. content height otherwise.
        max_content_heightused_content_height)rP   
max_heights     r   r:  zColumn.content_height4  s*    
 ,,
++--r   c                t    | j                   }d}|r't        d |d d D              }||d   j                  z  }|S )Nr>   c              3  N   K   | ]  }|j                   |j                  z     y wrD   )r~   rY  )rz  ps     r   r{  z-Column.used_content_height.<locals>.<genexpr>C  s$      BC!=!==   #%r  )r  r|  r~   )rP   
paragraphsrt   s      r   r  zColumn.used_content_height?  sO    %%
 GQRUSU F jn111Fr   c                    | j                   S rD   )r  r{   s    r   r  zColumn.gutterI  r   r   c                    | j                   S rD   r9  r{   s    r   r  zColumn.max_content_heightM      ###r   c                V    | j                   y| j                         | j                   k  S NTr  r{   s    r   has_free_spacezColumn.has_free_spaceQ  s+    ""*'')D,C,CCCr   c                    | j                         \  }}|| j                  z  }|| j                  z  }| j                  D ]0  }|j	                  ||       ||j
                  |j                  z   z  }2 y rD   )r   r4  r,  r  r   r~   rY  )rP   r   r   r  s       r   r#  zColumn.place_contentW  sm    ""$1	T	T__!! 	?AGGAqM!">">>>A	?r   c                N   g }|D ]  }|r|j                  |       |j                  | j                         | j                  rd }n| j                  | j                         z
  }|j                  |      }| j                  j                  |       ||j                  |        |S rD   )r  rS  r6  r<  r  r  rV  r  )rP   r  	remainderr  rt   rests         r   append_paragraphszColumn.append_paragraphs_  s    %'	# 	'I  +%%d&8&89##0043K3K3MM//7D##I.  &	' r   )Nr   NN)
rs   r?   rt   r   r  r?   rn   rF  r   r   r`   r  r   )r`   r   rG  )r  Iterable[Paragraph]r`   zlist[Paragraph])r   r   r   r   r  r(  r  r   r:  r  r  r  r  r#  r  r   r   s   @r   r  r    s     #'-1.2//  / 	/
 +/ ,/
&%     $ $ D D
?r   r  c                       e Zd Z	 	 	 d	 	 	 	 	 	 	 d fdZd Zd Zed        Zed        ZddZ	ed        Z
ddZd	d	ej                  f	 	 	 	 	 d fd
Zd Z	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZddZddZddZ xZS )Layoutc                T    t         |   ||||       || _        d| _        g | _        y r   )r   r   _reference_column_width_current_column_columns)rP   rs   rt   rn   r   r   s        r   r   zLayout.__init__r  s/     	:',$ &(r   c                ,    t        | j                        S rD   )rj  r  r{   s    r   r(  zLayout.__iter__~  s    DMM""r   c                ,    t        | j                        S rD   )rm   r  r{   s    r   r  zLayout.__len__  s    4==!!r   c                    | j                   S rD   )r  r{   s    r   current_column_indexzLayout.current_column_index  r  r   c                V    | j                   }| j                  r| j                         }|S rD   )r  r  _calculate_content_widthrR  s     r   r6  zLayout.content_width  s'    ##==113Er   c                    t        d | j                  d d D              }| j                  r|| j                  d   j                  z  }|S )Nc              3  N   K   | ]  }|j                   |j                  z     y wrD   )r|   r  rz  cs     r   r{  z2Layout._calculate_content_width.<locals>.<genexpr>  s     IAMMAHH,Ir  r  )r|  r  r|   rR  s     r   r  zLayout._calculate_content_width  sB    IdmmCR6HII==T]]2&222Er   c                b    | j                   }| j                  r| j                         }|S |d}|S r   )r   r  r  rU  s     r   r:  zLayout.content_height  s:    %%==335F  ^Fr   c                :    t        d | j                  D              S )Nc              3  4   K   | ]  }|j                     y wrD   r~   r  s     r   r{  z3Layout._calculate_content_height.<locals>.<genexpr>  s     9a1>>9   )r   r  r{   s    r   r  z Layout._calculate_content_height  s    94==999r   r   c                    | j                   }| j                  }t        |||      \  }}t        |   ||z   ||z          y)aH  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~   rw   r   r   )	rP   r   r   rr   rs   rt   rQ   rT   r   s	           r   r   zLayout.place  sD    B   ""#E5&9	ca$hC(r   c                    | j                         \  }}|| j                  z   }|| j                  z
  }| D ]0  }|j                  ||       ||j                  |j
                  z   z  }2 y)z$Place content at the final location.N)r   r4  r,  r   r|   r  )rP   r   r   columns       r   r#  zLayout.place_content  sh    ""$1    	4FLLA##fmm33A	4r   c                x    |s| j                   }t        |||||      }| j                  j                  |       |S )z"Append a new column to the layout.)r  rn   r   )r  r  r  r  )rP   rs   rt   r  rn   r   r  s          r   append_columnzLayout.append_column  s@     00E6&'H
 	V$r   c                   t        |      }| j                  }| j                  t        |      k  r]|| j                     }|j	                  |      }t        |      dk(  ry | xj                  dz  c_        | j                  t        |      k  r]|r\| j                         }t        | j                        dz
  | _        |j	                  |      }| j                  dkD  rt        d      |r[y y )Nr   r   d   z#Internal error - not enough space!?)r  r  r  rm   r  _new_columnr   )rP   r  r  columnsr  s        r   r  zLayout.append_paragraphs  s    $	--""S\1T112F00;I9~"  A%  ""S\1 %%'F#&t}}#5#9D 00;I##c)!"GHH r   c                    t        | j                        dk(  rt        d      | j                  d   j                         }| j                  j	                  |       |S )Nr   zno column existr  )rm   r  r   r  r  )rP   emptys     r   r  zLayout._new_column  sM    t}}"/00b!--/U#r   c                    | xj                   dz  c_         | j                   t        | j                        k\  r| j                          y y r/  )r  rm   r  r  r{   s    r   next_columnzLayout.next_column  s;    !3t}}#55 6r   rE  )rs   r?   rt   r   rn   rF  r   r   r   )r   r?   r   r?   rr   r   )NNr   NN)rs   r   rt   r   r  r?   rn   rF  r   r   r`   r  )r  r  r  )r`   ra   )r   r   r   r   r(  r  r   r  r6  r  r:  r  r   r'   r   r#  r  r  r  r  r   r   s   @r   r  r  q  s!    #'-1.2
)
)  
) +	
)
 ,
)#" $ $    :
 !0!9!9	$)$) $) 	$)L4 "&"&-1.2   	
 + , 
"I&r   r  c                T    | D ]#  }|j                  ||       ||j                  z  }% y rD   )r   r|   )r   r   r   r   s       r   linear_placingr    s/     

1a	Tr   c                       e Zd Zdej                  f	 d	 fdZd Zed
d       Zed
d       Z	dddZ
d fdZddZ xZS )RigidConnectionNc                ^    t         |   dd|       |rt        |      | _        y g | _        y )Nr   )r   )r   r   r  rd  )rP   r   r   r   s      r   r   zRigidConnection.__init__  s,     	Af-16$u+Br   c                ,    t        | j                        S rD   )rj  rd  r{   s    r   r(  zRigidConnection.__iter__  rk  r   c                :    t        d | j                  D              S )Nc              3  4   K   | ]  }|j                     y wrD   r|   rz  r   s     r   r{  z.RigidConnection.total_width.<locals>.<genexpr>  s     <4##<r  )r|  rd  r{   s    r   r|   zRigidConnection.total_width  s    <<<<r   c                :    t        d | j                  D              S )Nc              3  4   K   | ]  }|j                     y wrD   r  r  s     r   r{  z/RigidConnection.total_height.<locals>.<genexpr>  s     =4$$=r  )r   rd  r{   s    r   r~   zRigidConnection.total_height  s    ====r   c                \    t        | j                  |       t        | j                  |       y rD   )r   rd  r   r   s     r   rV   zRigidConnection.render  s    T[[!$DKK+r   c                T    t         |   ||       t        | j                  ||       y rD   )r   r   r  rd  rP   r   r   r   s      r   r   zRigidConnection.place  s!    at{{Aq)r   c                (    d | j                   D        S )Nc              3  \   K   | ]$  }t        |t              s|j                  s!| & y wrD   )r   r   r   r  s     r   r{  z0RigidConnection.growable_glue.<locals>.<genexpr>"  s$      
JtT,Bt}}D
s   ,,,)rd  r{   s    r   growable_gluezRigidConnection.growable_glue!  s    
![[
 	
r   )r   zOptional[Iterable[Cell]]r   rD   r   r   )r`   zIterable[Glue])r   r   r   r1   r2   r   r(  r   r|   r~   rV   r   r  r   r   s   @r   r  r    sW    04]=Q=Q?-?! = = > >,*
r   r  c                *    d fd}d}t               }g ||k  ru |   }t        |t              rD|}|dz  }||k  r(t         |   t              s
 |||       n|dz  }||k  r(||k(  r
 |||       n^j                  |       |dz  }||k  ruS )Nc                    | | }t        |      dkD  rj                  t        |             y j                  |d          y r  )rm   r  r  )se_rigid_contentr   	new_cellss      r   append_rigid_contentz7group_non_breakable_cells.<locals>.append_rigid_content(  sA    q~"_^<=^A./r   r   r   )r  r   r  r   )rm   r   r  r  )r   r  r   rJ   r   startr  s   `     @r   r  r  '  s    0 EJEI
%-U|dI&EQJE%-!%,	:(6
	 %-
 ~$UE2T"
! %-" r   c                    d}t        | t              rN| j                  t        j                  k7  r1| j
                  |z
  }| j                  t        j                  k(  r|dz  }|S )Nr>   rq   )r   r   r   r1   r4   r~   r3   )r   group_heightdys      r   vertical_cell_shiftr  F  sR    	B$$8I8I)I-;;-...#IBIr   c                  ,    e Zd ZU ded<   ded<   ded<   y)LineCellr   r   r?   offsetrH  lockedN)r   r   r   rB   r   r   r   r  r  O  s    
JMLr   r  c                      e Zd ZdZdZdZy)r  r   r   r   N)r   r   r   r  r  r  r   r   r   r  r  U  s    DGFr   r  c                       e Zd ZdZd fdZd Zej                  dd       Zej                  dd       Z	e
d        Zd fdZe
dd       Ze
dd	       Ze
dd
       ZddZddZdddZddZ xZS )r  Fc                b    t         |   |dt        j                         g | _        d| _        y )Nr   )rs   rt   r   r>   )r   r   r1   r2   rd  _current_offset)rP   rs   r   s     r   r   zAbstractLine.__init__^  s,    uQ}7K7KL&(&)r   c                "    | j                         S rD   )flattenr{   s    r   r(  zAbstractLine.__iter__c  s    ||~r   c                     y)z;Append cell to the line content and report SUCCESS or FAIL.Nr   rP   r   s     r   r  zAbstractLine.appendf  ri   r   c                     y)zjAppend cell with preceding tabulator cell to the line content
        and report SUCCESS or FAIL.
        Nr   rP   r   tabs      r   r  zAbstractLine.append_with_tabk  s    
 	r   c                ,    t        | j                        S rD   )rH  rd  r{   s    r   r  zAbstractLine.has_contentr  s    DKK  r   c                    t         |   ||       | j                  }| j                  D ]>  }|j                  }||j
                  z   }|t        ||      z   }|j                  ||       @ y rD   )r   r   r~   rd  r   r  r  )	rP   r   r   r   	line_cellr   r  r	  r   s	           r   r   zAbstractLine.placev  sh    a(( 	I>>DY%%%B(|<<BJJr2		r   c                    | j                   S rD   r   r{   s    r   rq  zAbstractLine.line_width  r   r   c                    d}t        | j                        r2| j                  d   }|j                  |j                  j                  z   }|S )Nr>   r  )rm   rd  r  r   r|   )rP   rs   	last_cells      r   r|   zAbstractLine.total_width  s?    t{{BI$$y~~'A'AAEr   c                f    t        | j                        rt        d | j                  D              S y)Nc              3  H   K   | ]  }|j                   j                    y wrD   )r   r~   r  s     r   r{  z,AbstractLine.total_height.<locals>.<genexpr>  s     @qqvv**@    "r>   )rm   rd  r   r{   s    r   r~   zAbstractLine.total_height  s&    t{{@DKK@@@r   c                T    | j                   D cg c]  }|j                   c}S c c}w )z.Yield line content including RigidConnections.)rd  r   )rP   r  s     r   r   zAbstractLine.cells  s     $,1,,,s   %c              #  x   K   | j                         D ]!  }t        |t              r|E d{    | # y7 w)z2Yield line content with resolved RigidConnections.N)r   r   r  r  s     r   r  zAbstractLine.flatten  s4     JJL 	D$0
		s   ):8:c                f    t        | j                               }t        ||       t        ||       y rD   )r  r   r   r   )rP   rU   r   s      r   rV   zAbstractLine.render  s&    TZZ\"UAE1%r   c                |    | j                   }|r.t        |d   j                  t              r|j	                          yy)z]Remove the last space in the line. Returns True if such a space was
        removed.
        r  TF)rd  r   r   r   r  )rP   rd  s     r   r  z'AbstractLine.remove_line_breaking_space  s0     j%8JJLr   r   r   r   r`   r  r   r   r  r   r`   r  r   r   )r`   r  rD   r   rG  )r   r   r   r  r   r(  rc   rd   r  r  r   r  r   rq  r|   r~   r   r  rV   r  r   r   s   @r   r  r  [  s    O*
 	  	  ! !      
-&
r   r  c                  n     e Zd ZdZd
d fdZ	 d	 	 	 	 	 	 	 ddZddZddZddZddZ	ddZ
d	 Z xZS )r  Tc                <    t         |   |       |xs g | _        y )N)rs   )r   r   rc  )rP   rs   rg  r   s      r   r   zLeftLine.__init__  s    u%#/rr   c                P    | j                   j                  t        |||             y rD   )rd  r  r  )rP   r   r  r  s       r   _append_line_cellzLeftLine._append_line_cell  s     	8D&&9:r   c                h   |j                   }| j                  |z   | j                  k  rA| j                  || j                         | xj                  |z  c_        t        j
                  S t        | j                        dk(  r"| j                  |d       t        j                  S t        j                  S r   )
r|   r
  rq  r$  r  r  rm   rd  r  r  rP   r   rs   s      r   r  zLeftLine.append  s      %'4??:""4)=)=>  E) %%%t{{q  ""4+$$$r   c                :   |j                   }| j                  }||z   | j                  kD  rt        j                  S |}||dz  z   }||z   }| j                  |||      }|0| j                  |j                                | j                  |      S |j                  t        j                  k(  r| j                  ||j                        S |j                  t        j                  k(  r| j                  ||j                        S | j                  ||j                        S r  )r|   r
  rq  r  r  _next_tab_stopr  r   rA   r;   r7   _append_leftr@   r3   _append_center_append_right)	rP   r   r  rs   r@   left_pos
center_pos	right_postab_stops	            r   r  zLeftLine.append_with_tab  s      "";(??" 519_
%K	&&xYGKK';;t$$}} 0 00((x||<<+"4"44**4>>))$==r   c                    |j                   }||z   | j                  k  r-| j                  ||d       ||z   | _        t        j
                  S t        j                  S r  )r|   rq  r$  r
  r  r  r  )rP   r   r@   rs   s       r   r)  zLeftLine._append_left  sQ      ;$//)""4d3#&;D %%%r   c                
   |j                   dz  }| j                  |z   |kD  r| j                  |      S ||z   | j                  k  r0| j	                  |||z
  d       ||z   | _        t
        j                  S t
        j                  S )Nr   T)r|   r
  r  rq  r$  r  r  r  )rP   r   r@   width2s       r   r*  zLeftLine._append_center  s|    !!A%&(3.;;t$$6\T__,""4vt<#&<D %%%r   c                    |j                   }| j                  |z   }|| j                  kD  rt        j                  S ||kD  r| j                  |      S | j                  |||z
  d       || _        t        j                  S r  )r|   r
  rq  r  r  r  r$  r  )rP   r   r@   rs   end_of_cell_poss        r   r+  zLeftLine._append_right  st      ..6T__,??"S ;;t$$tS5[$7"!!!r   c                H   | j                   D ]  }|j                  t        j                  k(  r|j                  |kD  r|c S |j                  t        j
                  k(  r|j                  |kD  r|c S |j                  t        j                  k(  s|j                  |kD  s|c S  y rD   )rc  rA   r;   r7   r@   r3   r8   )rP   rQ   ru   rS   r  s        r   r(  zLeftLine._next_tab_stop  s~    ?? 	Cxx;+++$
[///CGGf4D
[...377U?
	 r   rD   )rs   r?   rg  r  )F)r   r   r  r?   r  rH  r`   ra   r  r   )r`   r  )r   r   r   r  r   r$  r  r  r)  r*  r+  r(  r   r   s   @r   r  r    sU    O*
 9>;;"';15;	;
>.	"r   r  c                &    t        d | D              S )Nc              3  4   K   | ]  }|j                     y wrD   r  r  s     r   r{  z content_width.<locals>.<genexpr>  s     2Dt2r  )r|  )r   s    r   r6  r6    s    2E222r   c                    g }| D ]`  }t        |t              r|j                  r|j                  |       1t        |t              sB|j                  |j                                b |S rD   )r   r   r   r  r  r   r  )r   growabler   s      r   growable_cellsr:  	  sX    H 2dD!dmmOOD!o.OOD..01	2
 Or   c                   t        |       }|dk(  s||kD  ry | |dz
     }|j                  |j                  j                  z   }||k  r:| |   j                  }t	        ||d      | |<   ||j                  z  }|dz  }||k  r9y y )Nr   r   F)rm   r  r   r|   r  )r   r   rJ   r  r  r   s         r   update_offsetsr<    s    JEzUU]eai I	 : ::F
%-U|  fe4e$"""
	 %-r   c                  $    e Zd Zd Zd Zd Zd Zy)r  c                   | j                   }| j                         }|t        |      k(  ry | j                  |      }||dz   d  D cg c]  }|j                   }}d}	 t        |      }t        |      dk(  rnJ|t        |      z
  }|dk  rn6|t        |      z  }|D ]   }	|	j                  |	j                  |z          " d}d|rt        | j                   |dz          y y c c}w )Nr   FTr   g&.>)
rd  _last_locked_cellrm   _available_spacer   r:  r6  r   r|   r<  )
rP   r   last_locked_cellavailable_spacer  modifiedr9  space_to_distributer  r   s
             r   r  zJustifiedLine.distribute"  s    113s5z)//0@A!&'7!';'=!>?A??%e,H8}!"1M%4H"H"d*'#h-7E  6D,,u456H  4;;(81(<= ! @s   C c                f    | j                   |   }|j                  |j                  j                  z   S rD   )rd  r  r   r|   )rP   r   r   s      r   _end_offsetzJustifiedLine._end_offset<  s)    {{5!{{TYY2222r   c                >    | j                   | j                  |      z
  S rD   )rq  rF  )rP   r   s     r   r@  zJustifiedLine._available_space@  s    !1!1%!888r   c                z    | j                   }t        |      dz
  }|dkD  r||   j                  r|S |dz  }|dkD  ryr  )rd  rm   r  )rP   r   r   s      r   r?  zJustifiedLine._last_locked_cellC  sH    E
QaiU|""QJE ai r   N)r   r   r   r  rF  r@  r?  r   r   r   r  r  !  s    >439r   r  c                  ^     e Zd ZdZdZddZddZd	 fdZej                  d
d       Z
 xZS )	NoTabLinez.Base class for lines without tab stop support!Fc                   t        |t              r|j                         }|j                  }| j                  |z   | j
                  k  rU| j                  j                  t        || j                  d             | xj                  |z  c_        t        j                  S t        | j                        dk(  r6| j                  j                  t        |dd             t        j                  S t        j                  S )NFr   )r   r   r   r|   r
  rq  rd  r  r  r  r  rm   r  r  r&  s      r   r  zNoTabLine.appendR  s    dI&==?D  %'$//9KKxd.B.BEJK  E) %%%t{{q  KKxa78$$$r   c                    t               )zNo tabulator support!)NotImplementedErrorr  s      r   r  zNoTabLine.append_with_taba  s    !##r   c                H    t         |   || j                         z   |       y rD   )r   r   start_offsetr  s      r   r   zNoTabLine.placee  s    a$++--q1r   c                     y rD   r   r{   s    r   rO  zNoTabLine.start_offseti  r)  r   r  r   r   r   )r   r   r   r   r  r  r  r   rc   rd   rO  r   r   s   @r   rJ  rJ  M  s4    8O$2 	 r   rJ  c                      e Zd ZdZddZy)r  -Right aligned lines do not support tab stops!c                ^    t        d | j                  D              }| j                  |z
  dz  S )Nc              3  H   K   | ]  }|j                   j                    y wrD   r   r|   r  s     r   r{  z*CenterLine.start_offset.<locals>.<genexpr>r       A++Ar  r   r|  rd  rq  rP   
real_widths     r   rO  zCenterLine.start_offsetq  s*    AT[[AA
*,11r   Nr   r   r   r   r   rO  r   r   r   r  r  n  s
    72r   r  c                      e Zd ZdZddZy)r  rR  c                X    t        d | j                  D              }| j                  |z
  S )Nc              3  H   K   | ]  }|j                   j                    y wrD   rU  r  s     r   r{  z)RightLine.start_offset.<locals>.<genexpr>z  rV  r  rW  rX  s     r   rO  zRightLine.start_offsety  s%    AT[[AA
++r   Nr   rZ  r   r   r   r  r  v  s
    7,r   r  c                p    fd| D        D cg c]  }d|j                   cxk  r|k  rn n| c}S c c}w )Nc              3  B   K   | ]  \  }}t        |z   |        y wrD   )r=   )rz  r@   rA   r  s      r   r{  z"shift_tab_stops.<locals>.<genexpr>  s      Pdvt4Ps   r   )r@   )rg  r  right_borderr/  s    `  r   r  r  ~  s<    
 QiPx||+|+ 	  s   !3)r  )rn   rF  r`   rj   )rr   r   rs   r?   rt   r?   r`   rk   rD   )r   r  rU   r
   r`   ra   )r   r  rU   r
   r`   ra   )r   r  r`   r  )r   zSequence[Cell]r   r?   r   r?   )r   r  r`   r  )r   r   r   r?   r`   r?   )r   r  r`   r?   )r   r  r`   z
list[Glue])r   zlist[LineCell]r   r   r`   ra   )rg  zIterable[TabStop]r  r?   r`  r?   r`   zlist[TabStop])K
__future__r   typingr   r   r   r   r   typing_extensionsr	   rc   rE   enum
ezdxf.mathr
   r   ezdxf.tools.textr   rH   	Exceptionr   IntEnumr   r   r1   r6   r;   r=   rK   ABCrM   rf   r?   rj   rB   rk   ro   rw   ry   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  rJ  r\  r  r  r  r  r  r  r  r  r  r  r6  r:  r<  r  rJ  r  r  r  r   r   r   <module>rj     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U| Up3)H )X B2 2,	 , */?Dr   