
    'j                     &   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dvd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<   dwd"Z$dxd'Z% G d( d)e
j                  Z& G d* d+e&          Z' G d, d-e'          Z( G d. d/e(          Z) G d0 d1e(          Z* G d2 d3e(          Z+ G d4 d5e'          Z, G d6 d7          Z- G d8 d9e,          Z.dydzd?Z/dyd{dAZ0 G dB dCe,          Z1e.e1fZ2e)e*e+fZ3e.e*fZ4d|dDZ5 G dE dFe&          Z6 G dG dHe'          Z7 G dI dJe6          Z8 G dK dLe6          Z9 G dM dNe6          Z:d}dRZ; G dS dTe,          Z<d~dUZ=ddXZ> G dY dZe          Z? G d[ d\ej                  Z@ G d] d^e,          ZA G d_ d`eA          ZBddaZCddcZDddgZE G dh dieB          ZF G dj dkeA          ZG G dl dmeG          ZH G dn doeG          ZIdduZJdS )    )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dS )LayoutErrorN__name__
__module____qualname__     Q/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/tools/text_layout.pyr   r              Dr   r   c                      e Zd ZdZdZdZdS )Stackingr         N)r   r   r   OVERLINESLANTEDr   r   r   r   r      s        DDGGGr   r   c                  2    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )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LLLr   r   c                      e Zd ZdZdZdZdS )CellAlignmentr   r   r   N)r   r   r   BOTTOMCENTERTOPr   r   r   r1   r1      s        FF
CCCr   r1   c                      e Zd ZdZdZdZdZdS )ParagraphAlignmentr   r   r    r!   N)r   r   r   LEFTRIGHTr3   	JUSTIFIEDr   r   r   r6   r6      s"        DEFIIIr   r6   c                      e Zd ZdZdZdZdS )TabStopTyper   r   r   N)r   r   r   r7   r8   r3   r   r   r   r;   r;      s        DEFFFr   r;   c                  6    e Zd ZU dZded<   ej        Zded<   dS )TabStop        floatposr;   kindN)r   r   r   r@   __annotations__r;   r7   rA   r   r   r   r=   r=      s7         C#(D((((((r   r=   d   c                ~    t          j        t          j        t                                                    |           S N)	itertoolsislicecycleLOREM_IPSUMsplit)counts    r   lorem_ipsumrL      s+    IOK,=,=,?,?@@%HHHr   c                  Z    e Zd Zej        	 ddd            Zej        	 ddd            ZdS )ContentRendererNleftr?   bottomrighttopmr
   returnNonec                    dS )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   selfrO   rP   rQ   rR   rS   s         r   renderzContentRenderer.render         r   x1y1x2y2c                    dS )z&Draw a line from (x1, y1) to (x2, y2).Nr   rX   r[   r\   r]   r^   rS   s         r   linezContentRenderer.line   rZ   r   rE   rO   r?   rP   r?   rQ   r?   rR   r?   rS   r
   rT   rU   r[   r?   r\   r?   r]   r?   r^   r?   rS   r
   rT   rU   )r   r   r   abcabstractmethodrY   ra   r   r   r   rN   rN      sl             ( 	HL5 5 5 5 5 5 5r   rN   c                  &    e Zd Z	 dddZ	 dddZdS )DoNothingRendererNrO   r?   rP   rQ   rR   rS   r
   rT   rU   c                    d S rE   r   rW   s         r   rY   zDoNothingRenderer.render   s	     	r   r[   r\   r]   r^   c                    d S rE   r   r`   s         r   ra   zDoNothingRenderer.line   	     	r   rE   rb   rc   )r   r   r   rY   ra   r   r   r   rg   rg      sR              IM      r   rg   r	   Tuple4fTuple2fmarginsOptional[Sequence[float]]rT   c                L   | dS 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 dS )zDReturns the box margins in CSS like order: top, right, bottom, left.N)r   r   r   r   r!   r   r   r   r    )len)rm   rK   s     r   resolve_marginsrq      s    zLLEzzqz71:wqz71:==zzqz71:wqz71:==zzqz71:wqz71:==zzqz71:wqz71:==:r   alignwidthr?   heightc                   d}d}|dz  }|dz  }| t           j        k    rn| t           j        k    r| d}}n| t           j        k    r| d}}n| t           j        k    rd|}}nl| t           j        k    r| |}}nV| t           j        k    r| |}}n@| t           j        k    rd|}}n+| t           j        k    r| |}}n| 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/   )rr   rs   rt   rO   rR   centermiddles          r   insert_locationry      s   DCS[Fc\F(((	/,	,	,Wac	/+	+	+VQc	/-	-	-c	//	/	/Wfc	/.	.	.VVc	/-	-	-c	//	/	/Wfc	/.	.	.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d
S )BoxrT   r?   c                    d S rE   r   rX   s    r   total_widthzBox.total_width  s    $'Cr   c                    d S rE   r   r}   s    r   total_heightzBox.total_height  s    %(Sr   xyc                    dS (x, y) is the top/left cornerNr   rX   r   r   s      r   placez	Box.place#  rZ   r   tuple[float, float]c                    dS )z1Returns the final location as the top/left cornerNr   r}   s    r   final_locationzBox.final_location'  rZ   r   NrS   r
   rU   c                    dS z%Render content at the final location.Nr   rX   rS   s     r   rY   z
Box.render+  rZ   r   r   c                    	 |                                  \  }}n# t          t          f$ r d\  }}Y nw xY wt          ||f|| j        z   || j        z
  fg          S )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/  sw    
	&&((DAqqY' 	 	 	DAqqq	q!fq4+;';QAR=R&STUUUs    33rT   r?   r   r?   r   r?   rT   r   rE   rS   r
   rT   rU   )rT   r   )r   r   r   propertyrd   re   r~   r   r   r   rY   r   r   r   r   r{   r{     s        '''  X'(((  X(, , , , 	@ @ @ @ 	4 4 4 4 4	V 	V 	V 	V 	V 	Vr   r{   c                  ,    e Zd ZdZddZddZdddZd	S )CellFr   r?   r   c                    d S rE   r   r   s      r   r   z
Cell.place>  rj   r   rT   r   c                    dS )Nr   r   r}   s    r   r   zCell.final_locationC  s	     tr   NrS   r
   rU   c                    d S rE   r   r   s     r   rY   zCell.renderH      r   r   r   rE   r   )r   r   r   
is_visibler   r   rY   r   r   r   r   r   ;  sZ        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dS )GluetupleEMPTYNrs   r?   	min_widthOptional[float]	max_widthc                v    t          |          | _        |rt          |          n| j        | _        || _        d S rE   )r?   _width
_min_width
_max_width)rX   rs   r   r   s       r   __init__zGlue.__init__O  s7     #5\\.7H%	***T[+4r   c                l    | j         }|t          ||          }t          || j                  | _        d S rE   )r   minmaxr   r   )rX   rs   r   s      r   resizezGlue.resizeY  s5    O	 	5))E%11r   c                "    | j         | j        k     S rE   )r   r   r}   s    r   
can_shrinkzGlue.can_shrink_  s    ,,r   c                4    | j         d u p| j        | j         k     S rE   )r   r   r}   s    r   can_growzGlue.can_growc  s    $&G$+*GGr   rT   c                    | j         S rE   r   r}   s    r   r~   zGlue.total_widthg  
    {r   c                    dS Nr   r   r}   s    r   r   zGlue.total_heightk  s    qr   Spacec                B    t          | j        | j        | j                  S rE   )r   r   r   r   r}   s    r   to_spacezGlue.to_spaceo  s    T[$/4?CCCr   )NN)rs   r?   r   r   r   r   rs   r?   r   )rT   r   )r   r   r   r   r   rB   r   r   r   r   r   r~   r   r   r   r   r   r   r   L  s         577E
 &*%)	5 5 5 5 52 2 2 2 - - X- H H XH    X    XD D D D D Dr   r   c                      e Zd ZdS )r   Nr   r   r   r   r   r   s  r   r   r   c                      e Zd ZdS )NonBreakingSpaceNr   r   r   r   r   r   w  r   r   r   c                      e Zd ZdS )	TabulatorNr   r   r   r   r   r   {  r   r   r   c                  t    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dS )ContentCella  Represents visible content like text or fractions.

    Supported vertical alignments (IntEnum):

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

    TNrs   r?   rt   valignr1   rendererOptional[ContentRenderer]c                    d | _         d | _        t          |          | _        t          |          | _        t          |          | _        || _        d S rE   )_final_x_final_yr?   r   _heightr1   r   r   )rX   rs   rt   r   r   s        r   r   zContentCell.__init__  sF     *.)-EllV}}#F++ r   r   r   c                "    || _         || _        d S rE   r   r   r   s      r   set_final_locationzContentCell.set_final_location  s    r   c                    | j         | j        fS rE   r   r}   s    r   r   zContentCell.final_location  s    }dm++r   rT   c                    | j         S rE   r   r}   s    r   r~   zContentCell.total_width  r   r   c                    | j         S rE   r   r}   s    r   r   zContentCell.total_height  
    |r   c                "    || _         || _        dS r   r   r   s      r   r   zContentCell.place  s    r   )rs   r?   rt   r?   r   r1   r   r   r   r   )r   r   r   __doc__r   r1   r2   r   r   r   r   r~   r   r   r   r   r   r   r     s          J !. 4.2! ! ! ! !   , , ,    X    X     r   r   c                  "    e Zd ZdZdZdZdZdZdS )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HHHr   r   c                  Z     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.

    Nrs   r?   rt   r   r1   strokeintr   r   c                x    t                                          ||||           t          |          | _        d S rE   )superr   r   r   )rX   rs   rt   r   r   r   	__class__s         r   r   zText.__init__  s4     	999&kkr   rS   Optional[Matrix44]rT   rU   c                    |                                  \  }}| j        }||z
  }|| j        z   }| j                            |||||           d S )N)rO   rP   rQ   rR   rS   )r   r   r~   r   rY   )rX   rS   rO   rR   rt   rP   rQ   s          r   rY   zText.render  si    ''))	c"vt''fEsa 	 	
 	
 	
 	
 	
r   r   extend_leftextend_rightr
   c                   |                                  \  }}||z  }| j        }||z
  }|| j        z   |z   }| j        }	|	J |dz  }
| j        t
          j        z  r||
z
  }|	                    |||||           | j        t
          j        z  r!||z   dz  }|	                    |||||           | j        t
          j	        z  r ||
z   }|	                    |||||           d S d S )Nr"   r   )
r   r   r~   r   r   r   r   ra   r   r   )rX   r   r   rS   rO   rR   rt   rP   rQ   r   spacingr   s               r   render_strokezText.render_stroke  s    ''))	c"vt'',6=### 1*;)) 	0 AMM$5!Q///;.. 	0v"AMM$5!Q///;( 	0gAMM$5!Q/////	0 	0r   )
rs   r?   rt   r?   r   r1   r   r   r   r   rE   rS   r   rT   rU   )r   r   N)r   r?   r   r?   rS   r
   rT   rU   )r   r   r   r   r1   r2   r   r   r   rY   r   __classcell__r   s   @r   r   r     s         . !. 4&.2	" 	" 	" 	" 	" 	" 	"
 
 
 
 
 	0 0 0 0 0 0 0 0 0r   r   cellsIterable[Cell]rS   r
   rU   c                H    | D ]}|j         r|                    |           d S rE   )r   rY   )r   rS   cells      r   render_cellsr     s5      ? 	KKNNN r   
list[Cell]c                      fd}t                     D ]X\  }t          |t                    r>|j        r7|j        t          j        z  r
 |            nd}|                    ||           YdS )z+Render text cell strokes across glue cells.c                     d} dz   }t                    }||k     r4|         }t          |t                    r| |j        z  } nn|dz  }||k     4| S )Nr   r   )rp   
isinstancer   r~   )extendirK   r   r   indexs       r   stroke_extensionz-render_text_strokes.<locals>.stroke_extension  sm    AIE

%ii8D$%% $**FA %ii r   r   )r   rS   N)	enumerater   r   r   r   r   r   )r   rS   r   r   r   r   s   `    @r   render_text_strokesr     s          !'' 9 9tdD!! 	9dk 	9+/;+HO%%'''aFFa8889 9r   c                  d     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?NrR   r   rP   stackingr   r   r1   r   r   c                    t                                          dd||           || _        || _        || _        |                                  d S r   )r   r   	_stacking_top_content_bottom_content_update_size)rX   rR   rP   r   r   r   r   s         r   r   zFraction.__init__1  sR     	Avx000!%r   c                   | j         }| j        }| j        t          j        k    r*|j        |j        z   | _        |j        |j        z   | _        d S | j	        |j        |j        z   z  | _        t          |j        |j                  | _        d S rE   )r   r   r   r   r   r   r   r~   r   HEIGHT_SCALEr   )rX   rR   rP   s      r   r  zFraction._update_size?  s}    %>X---+f.AADL/F,>>DKKK,0@6CV0VWDLcov/ABBDKKKr   r   r?   r   c                   || _         || _        | j        }| j        }| j        }| j        }||t          d          | j        t          j	        k    rH|
                    ||           |||j        z
  z  }|||j        z
  z  }|
                    ||           dS ||dz  z   }||j        dz  z
  }|
                    ||           ||j        dz  z
  }|||j        z
  z  }|
                    ||           dS )r   Nzno content setr   )r   r   r~   r   r   r   r   r   r   r   r   )rX   r   r   rs   rt   top_contentbottom_contentrw   s           r   r   zFraction.placeI  s%    "'-."8.///>X---a###333A.555A  A&&&&&]F0144Aa###3a77A.555A  A&&&&&r   rS   r
   rT   rU   c                    | j                             |           | j                            |           | j        t          j        k    r|                     |           d S d S rE   )r   rY   r   r   r   r   _render_liner   s     r   rY   zFraction.rendera  sa      #####A&&&>X]**a      +*r   c                d   |                                  \  }}| j        }| j        }| j        t          j        k    r|}||z   }||dz  z
  x}}	nEt          ||          dz  }
|| j        j        z   }|| j        j        z
  }||
z
  }||
z
  }||
z   }||
z   }	| j        	                    ||||	|           d S Nr   )
r   r~   r   r   r   r   r   r   r   ra   )rX   rS   r   r   twthr[   r]   r\   r^   deltacxcys                r   r  zFraction._render_lineg  s    ""$$1>X]**BRB"q&j BBKK!OET&22BT&33BeBeBeBeB2r2r1-----r   )
rR   r   rP   r   r   r   r   r1   r   r   r   rE   r   )r   r   r   r   r  r   r   r1   r2   r   r  r   rY   r  r   r   s   @r   r   r      s          L &] - 4.2      C C C' ' ' '0! ! ! ! !. . . . . . . .r   r   c                .    fd} fd}g t                      d t                     D ]\  }t          |t                    r%t          t                    rt	          d          n=t          |t
                    r( |            r|                                } |             |                    |           rLt          d         t                    r1	                                 rt          d         t                    1S )Nc                     t                    dz
  } | dk    rD|          }t          |t                    r|                                | <   | dz  } nd S | dk    Bd S d S Nr   r   )rp   r   r   r   )r   r   contents     r   replace_pending_nbsp_by_spacesz7normalize_cells.<locals>.replace_pending_nbsp_by_spaces  sl    Gq qjj5>D$ 011 !%
 qjjjjjjr   c                     	 dz            } n# t           $ r Y dS w xY wt          t                    rt          | t                    sdS dS )Nr   TF)
IndexErrorr   	_no_break)peekr   r   prevs    r   is_useless_nbspz(normalize_cells.<locals>.is_useless_nbsp  sg    	#DD 	 	 	44	$	** 	*T92M2M 	4us    
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!    sX              GKKED '' 	 	tdH%% 	-$)) C!"ABBBC.// 	-OO4E4E 	-==??D**,,,t  je44   je44  Nr   c                  h   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dS ),	ContainerNrs   r   rt   rm   rn   r   r   c                t    d | _         d | _        || _        || _        t	          |          | _        || _        d S rE   )r   r   _content_width_content_heightrq   _marginsr   )rX   rs   rt   rm   r   s        r   r   zContainer.__init__  sD     *.)- 05 17 "1!9!9 4<r   r   r?   r   c                J    || _         || _        |                                  d S rE   )r   r   place_contentr   s      r   r   zContainer.place  s(    r   c                d    |                                  st          d          | j        | j        fS )NzContainer is not placed.)	is_placedr   r   r   r}   s    r   r   zContainer.final_location  s2    ~~ 	:8999}dm++r   rT   boolc                &    | j         d uo| j        d uS rE   r   r}   s    r   r+  zContainer.is_placed  s    }D(FT]$-FFr   r{   c                    d S rE   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   r2  r}   s    r   right_marginzContainer.right_margin  r4  r   c                    | j         d         S r
  r2  r}   s    r   bottom_marginzContainer.bottom_margin  r4  r   c                    | j         d         S )Nr    r2  r}   s    r   left_marginzContainer.left_margin  r4  r   c                "    | j         dS | j         S r   )r%  r}   s    r   content_widthzContainer.content_width  s    &1&&r   c                0    | j         | j        z   | j        z   S rE   )r=  r7  r;  r}   s    r   r~   zContainer.total_width  s    !D$558HHHr   c                "    | j         dS | j         S r   r&  r}   s    r   content_heightzContainer.content_height  s    '1''r   c                    | j         d u S rE   r@  r}   s    r   has_flex_heightzContainer.has_flex_height  s    #t++r   c                0    | j         | j        z   | j        z   S rE   )rA  r3  r9  r}   s    r   r   zContainer.total_height  s    "T_4t7IIIr   rS   r
   rU   c                    |                                  st          d          | j        r|                     |           |                     |           dS )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   rY   zContainer.render  s^    
 ~~ 	JHIII= 	&""1%%%Ar   c                    dS )z.Place container content at the final location.Nr   r}   s    r   r)  zContainer.place_content  rj   r   c                :    | D ]}|                     |           dS r   )rY   )rX   rS   entitys      r   rG  zContainer.render_content
  s0     	 	FMM!	 	r   c                    |                                  \  }}| j        r1| j                            ||| j        z
  ||| j        z   |           dS dS )z(Render background at the final location.)rO   rP   rR   rQ   rS   N)r   r   rY   r   r~   )rX   rS   r   r   s       r   rF  zContainer.render_background  su     ""$$1= 	M  4,,$** !     	 	r   NNN)rs   r   rt   r   rm   rn   r   r   r   rT   r,  )rT   r{   r   rE   r   )r   r   r   r   r   r   r+  rd   re   r/  r   r3  r7  r9  r;  r=  r~   rA  rC  r   rY   r)  rG  rF  r   r   r   r#  r#    s        #'-1.2< < < < <,   
, , ,
G G G G 	          X        X        X        X  ' ' ' X' I I I XI ( ( ( X( , , X, J J J XJ	 	 	 	 	 	      
     r   r#  c                  v    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
dS )EmptyParagraphzVSpacer between two paragraphs, represents empty lines like in
    "line1

line2".
    r   
cap_heightr?   line_spacingc                R    || _         d| _        t          ||          |z
  | _        d S r   )r   r   r   _last_line_spacing)rX   rP  rQ  s      r   r   zEmptyParagraph.__init__#  s-    (")*l"C"Cj"Pr   rT   c                    | j         S rE   r   r}   s    r   r~   zEmptyParagraph.total_width(  r   r   c                    | j         S rE   r   r}   s    r   r   zEmptyParagraph.total_height,  r   r   rs   c                    || _         d S rE   r   rX   rs   s     r   set_total_widthzEmptyParagraph.set_total_width0  s    r   Nrt   r   c                    d S rE   r   rX   rt   s     r   distribute_contentz!EmptyParagraph.distribute_content3  r   r   c                    | j         S rE   rS  r}   s    r   distance_to_next_paragraphz)EmptyParagraph.distance_to_next_paragraph6      &&r   )r   )rP  r?   rQ  r?   r   r   rE   )rt   r   )r   r   r   r   r   r   r~   r   rX  r[  r^  r   r   r   rO  rO    s         Q Q Q Q Q
    X    X        ' ' ' X' ' 'r   rO  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 )0	ParagraphN)r   r   r   r   rs   r   rr   r6   indenttuple[float, float, float]rQ  r?   rm   rn   	tab_stopsOptional[Sequence[TabStop]]r   r   c                    t                                          |d ||           || _        |\  }}	}
|| _        |	| _        |
| _        || _        |pg | _        g | _        g | _	        d| _
        d S )Nr>   )r   r   _align_indent_first_indent_left_indent_right_line_spacing
_tab_stops_cells_linesrS  )rX   rs   rr   rb  rQ  rm   rd  r   firstrO   rQ   r   s              r   r   zParagraph.__init__<  s     	gx888#tU" ")#/r #% +- #&r   c                *    t          | j                  S rE   )iterrn  r}   s    r   r/  zParagraph.__iter__X      DK   r   c                    | j         S rE   r]  r}   s    r   r^  z$Paragraph.distance_to_next_paragraph[  r_  r   c                h    || j         z
  | j        z
  | _        | j        dk     rt          d          d S )Ngư>z#invalid width, no usable space left)r;  r7  r%  r   rW  s     r   rX  zParagraph.set_total_width_  s?    #d&669JJ%%CDDD &%r   r  r   c                :    | j                             |           d S rE   )rm  r   )rX   r  s     r   append_contentzParagraph.append_contentd  s    7#####r   ro  r,  rT   c                J    | j         }||r| j        n| j        z  }| j        |z
  S rE   )rj  rh  ri  r=  )rX   ro  rb  s      r   
line_widthzParagraph.line_widthg  s2    #D$$$43DD!F**r   c                   |                                  \  }}|| j        z  }|| j        z  }d}| j        }|D ]M}|                     ||          }|                    ||           |t          |j        | j                  z  }d}Nd S )NTF)	r   r;  r3  rn  _left_borderr   r   r   rk  )rX   r   r   ro  linesra   x_finals          r   r)  zParagraph.place_contentl  s    ""$$1	T	T_ 	 	D''511GJJw"""*D,>???AEE		 	r   r   c                ,    |r| j         n| j        }||z   S )z)Apply indentation and paragraph alignment)rh  ri  )rX   r   ro  left_indents       r   rz  zParagraph._left_borderx  s!    ,1Hd((t7H;r   c                    | j         }| j        d}t          |          rO|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  B   K   | ]}t          |j                  V  d S rE   )r   r   ).0ra   rQ  s     r   	<genexpr>z6Paragraph._calculate_content_height.<locals>.<genexpr>  sA        =A)<88     r   N)rn  rk  rp   sumr   r   rS  )rX   r{  rt   	last_linelast_line_heightrQ  s        @r   _calculate_content_heightz#Paragraph._calculate_content_height}  s     )u:: 
	'b	I    EJ3B3Z    F  )5(,77:JJ # &&Fr   rt   Optional[Paragraph]c                
    d fd}t           j                  }t          |          } j                                          j        d}t          |          }d j         j        z   }t          t                    \  }}}	||k     rO|}
 | 
                                        }|j        }||k     r||         }t          |t                    r:|r8|                    ||dz            |          }||k    r|dz  }n"|j        s|dz  }n|                    |          }||k    r|dz  }n||k    rn||	k    r|dz  }n||k     |j        r|                                 ||k     r t          ||         t$                    r|dz  }|j        }|||z   |k    r|
}n;d
 j                            |           |t+          | j                  z  }||k     O||k     }t.          j        k    rU|rt           j                  nd} j        d	|         D ]-}t          |t2                    sJ |                                 .                                  _        |r                     ||d	                   S d	S )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

        rs   r?   rT   AbstractLinec                   t           j        t           j        fv rWrj        nj        }t          j        | |           }t           j        k    rt          | |          nt          | |          S t           j	        k    rt          |           S t           j        k    rt          |           S t                    rE   )r6   r7   r9   rh  ri  shift_tab_stopsrl  LeftLineJustifiedLiner8   	RightLiner3   
CenterLiner   )rs   rb  rd  rr   ro  rX   s      r   new_linez.Paragraph.distribute_content.<locals>.new_line  s    +02D2NOOO/4K++$:K+DOfWeLL	  2 777 UI...&ui88
 ,222 ''',333!%(((!%(((r   r   Tr   NFr  )rs   r?   rT   r  )r!  rm  group_non_breakable_cellsclearrg  rp   r3  r9  rq  
AppendTyperx  has_tab_supportr   r   append_with_tabhas_contentr  remove_line_breaking_spacer   r   rn  r   rk  r6   r9   r  
distributer  r&  _new_paragraph)rX   rt   r  r   r   rK   paragraph_heightFAILSUCCESSFORCEDundora   r  r   append_stateline_heightnot_all_cells_processedendrr   ro  s   `                 @@r   r[  zParagraph.distribute_content  s   	) 	) 	) 	) 	) 	) 	) 	)  ,DK88)%00$(KZZ #'/D4F"F !%Z 0 0gvemm D8DOOE2233D"2O%--U|dI.. 5? 5#'#7#7 eai(	$ $L $w..
!- # 
#';;t#4#4L7**QJEE!T))!V++QJE3 %--6  Q//1115==Zee%D%D=QJE"/&(;6?? !E!EK&&t,,,$T=O(P(PP$e emmf #(%-&000 '>E#dk"""2CDSD) " "!$66666!!!!  $==?? # 	&&uUVV}e<<<4r   r   r   c           	         |r| j         n| j        }|| j        | j        f}t          | j        | j        || j        | j        | j        | j	                  }|
                    |           |S rE   )rh  ri  rj  ra  r%  rg  rk  r'  rl  r   rv  )rX   r   ro  indent_firstrb  	paragraphs         r   r  zParagraph._new_paragraph  sw    -2It))8I 143EFKMOM
 
	 	  '''r   )rs   r   rr   r6   rb  rc  rQ  r?   rm   rn   rd  re  r   r   r   )r  r   )ro  r,  rT   r?   )r   r?   ro  r,  rT   r?   r   rE   )rt   r   rT   r  )r   r   ro  r,  rT   ra  )r   r   r   r6   r7   r   r/  r   r^  rX  rv  rx  r)  rz  r  r[  r  r   r   s   @r   ra  ra  ;  s0        "&$6$;-6-115.2& & & & & & &8! ! ! ' ' X'E E E E
$ $ $ $+ + + +

 
 
   
   (n n n n n`       r   ra  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 )#ColumnNr   rs   r?   rt   r   gutterrm   rn   r   r   c                l    t                                          ||||           || _        g | _        d S rE   )r   r   _gutter_paragraphs)rX   rs   rt   r  rm   r   r   s         r   r   zColumn.__init__  s8     	:::,.r   rT   c           	         |                      | j        | j        | j        | j        | j        | j        | j        f| j                  S )N)rs   rt   r  rm   r   )	r   r=  rA  r  r3  r7  r9  r;  r   r}   s    r   clone_emptyzColumn.clone_empty   sQ    ~~$&;!" 	 ]  
 
 	
r   c                *    t          | j                  S rE   )rq  r  r}   s    r   r/  zColumn.__iter__.  s    D$%%%r   c                *    t          | j                  S rE   )rp   r  r}   s    r   __len__zColumn.__len__1  s    4#$$$r   c                @    | j         }||                                 S |S )zoReturns the current content height for flexible columns and the
        max. content height otherwise.
        max_content_heightused_content_height)rX   
max_heights     r   rA  zColumn.content_height4  s*    
 ,
++---r   c                ~    | j         }d}|r1t          d |d d         D                       }||d         j        z  }|S )Nr>   c              3  4   K   | ]}|j         |j        z   V  d S rE   )r   r^  )r  ps     r   r  z-Column.used_content_height.<locals>.<genexpr>C  s=        BC!==     r   r  )r  r  r   )rX   
paragraphsrt   s      r   r  zColumn.used_content_height?  se    %
 	2  GQRUSURU    F jn11Fr   c                    | j         S rE   )r  r}   s    r   r  zColumn.gutterI  r   r   c                    | j         S rE   r@  r}   s    r   r  zColumn.max_content_heightM      ##r   r,  c                N    | j         dS |                                 | j         k     S NTr  r}   s    r   has_free_spacezColumn.has_free_spaceQ  s*    "*4''))D,CCCr   c                    |                                  \  }}|| j        z  }|| j        z  }| j        D ]*}|                    ||           ||j        |j        z   z  }+d S rE   )r   r;  r3  r  r   r   r^  )rX   r   r   r  s       r   r)  zColumn.place_contentW  ss    ""$$1	T	T_! 	? 	?AGGAqMMM!">>>AA	? 	?r   r  Iterable[Paragraph]list[Paragraph]c                P   g }|D ]}|r|                     |           |                    | j                   | j        rd }n| j        |                                 z
  }|                    |          }| j                             |           ||                     |           |S rE   )r  rX  r=  rC  r  r  r[  r  )rX   r  	remainderr  rt   rests         r   append_paragraphszColumn.append_paragraphs_  s    %'	# 	' 	'I   +++%%d&8999# N043K3K3M3MM//77D##I...  &&&r   )Nr   NN)
rs   r?   rt   r   r  r?   rm   rn   r   r   rT   r  r   )rT   r   rM  )r  r  rT   r  )r   r   r   r   r  r/  r  r   rA  r  r  r  r  r)  r  r   r   s   @r   r  r    s8        #'-1.2/ / / / / / /
 
 
 
& & &% % %    X      X $ $ $ X$ D D D X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 ),LayoutNrs   r?   rt   r   rm   rn   r   r   c                z    t                                          ||||           || _        d| _        g | _        d S r   )r   r   _reference_column_width_current_column_columns)rX   rs   rt   rm   r   r   s        r   r   zLayout.__init__r  s>     	:::',$ &(r   c                *    t          | j                  S rE   )rq  r  r}   s    r   r/  zLayout.__iter__~  s    DM"""r   c                *    t          | j                  S rE   )rp   r  r}   s    r   r  zLayout.__len__  s    4=!!!r   c                    | j         S rE   )r  r}   s    r   current_column_indexzLayout.current_column_index  r  r   c                J    | j         }| j        r|                                 }|S rE   )r%  r  _calculate_content_widthrW  s     r   r=  zLayout.content_width  s*    #= 	41133Er   rT   c                    t          d | j        d d         D                       }| j        r|| j        d         j        z  }|S )Nc              3  4   K   | ]}|j         |j        z   V  d S rE   )r~   r  r  cs     r   r  z2Layout._calculate_content_width.<locals>.<genexpr>  s+      IIAMAH,IIIIIIr   r  )r  r  r~   rW  s     r   r  zLayout._calculate_content_width  sL    IIdmCRC6HIIIII= 	3T]2&22Er   c                T    | j         }| j        r|                                 }n|d}|S r   )r&  r  r  rZ  s     r   rA  zLayout.content_height  s6    %= 	3355FF^Fr   c                >    t          d | j        D                       S )Nc              3  $   K   | ]}|j         V  d S rE   r   r  s     r   r  z3Layout._calculate_content_height.<locals>.<genexpr>  s$      99a1>999999r   )r   r  r}   s    r   r  z Layout._calculate_content_height  s!    994=999999r   r   r   r   rr   r   c                    | j         }| j        }t          |||          \  }}t                                          ||z   ||z              dS )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   ry   r   r   )	rX   r   r   rr   rs   rt   rO   rR   r   s	           r   r   zLayout.place  sQ    B  "#E5&99	ca$hC(((((r   c                    |                                  \  }}|| j        z   }|| j        z
  }| D ]*}|                    ||           ||j        |j        z   z  }+dS )z$Place content at the final location.N)r   r;  r3  r   r~   r  )rX   r   r   columns       r   r)  zLayout.place_content  ss    ""$$1   	4 	4FLLA#fm33AA	4 	4r   r  r  c                t    |s| j         }t          |||||          }| j                            |           |S )z"Append a new column to the layout.)r  rm   r   )r  r  r  r  )rX   rs   rt   r  rm   r   r  s          r   append_columnzLayout.append_column  sP      	10E6&'H
 
 
 	V$$$r   r  r  c                   t          |          }| j        }| j        t          |          k     r_|| j                 }|                    |          }t          |          dk    rd S | xj        dz  c_        | j        t          |          k     _|rc|                                 }t          | j                  dz
  | _        |                    |          }| j        dk    rt          d          |ad S d S )Nr   r   rC   z#Internal error - not enough space!?)r  r  r  rp   r  _new_columnr   )rX   r  r  columnsr  s        r   r  zLayout.append_paragraphs  s   $$	-"S\\11T12F00;;I9~~""  A%   "S\\11  	I%%''F#&t}#5#5#9D 00;;I#c))!"GHHH  	I 	I 	I 	I 	Ir   c                    t          | j                  dk    rt          d          | j        d                                         }| j                            |           |S )Nr   zno column existr  )rp   r  r   r  r  )rX   emptys     r   r  zLayout._new_column  sY    t}""/000b!--//U###r   rU   c                    | xj         dz  c_         | j         t          | j                  k    r|                                  d S d S r6  )r  rp   r  r  r}   s    r   next_columnzLayout.next_column  sN    !3t}#5#555 65r   rL  )rs   r?   rt   r   rm   rn   r   r   r   )r   r?   r   r?   rr   r   )NNr   NN)rs   r   rt   r   r  r?   rm   rn   r   r   rT   r  )r  r  r  )rT   rU   )r   r   r   r   r/  r  r   r  r=  r  rA  r  r   r'   r   r)  r  r  r  r  r   r   s   @r   r  r  q  s        #'-1.2
) 
) 
) 
) 
) 
) 
)# # #" " " $ $ X$   X      X: : : :
 !0!9	$) $) $) $) $) $) $)L4 4 4 "&"&-1.2    "I I I I&          r   r  Sequence[Cell]r   r   c                P    | D ]"}|                     ||           ||j        z  }#d S rE   )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 )RigidConnectionNr   Optional[Iterable[Cell]]c                    t                                          dd|           |rt          |          ng | _        d S )Nr   )r   )r   r   r  rm  )rX   r   r   r   s      r   r   zRigidConnection.__init__  s>     	Af---16">$u+++Br   c                *    t          | j                  S rE   )rq  rm  r}   s    r   r/  zRigidConnection.__iter__  rr  r   rT   r?   c                >    t          d | j        D                       S )Nc              3  $   K   | ]}|j         V  d S rE   r~   r  r   s     r   r  z.RigidConnection.total_width.<locals>.<genexpr>  s%      <<4#<<<<<<r   )r  rm  r}   s    r   r~   zRigidConnection.total_width  s!    <<<<<<<<r   c                >    t          d | j        D                       S )Nc              3  $   K   | ]}|j         V  d S rE   r  r  s     r   r  z/RigidConnection.total_height.<locals>.<genexpr>  s%      ==4$======r   )r   rm  r}   s    r   r   zRigidConnection.total_height  s!    ========r   rS   r   rU   c                Z    t          | j        |           t          | j        |           d S rE   )r   rm  r   r   s     r   rY   zRigidConnection.render  s,    T[!$$$DK+++++r   r   r   c                x    t                                          ||           t          | j        ||           d S rE   )r   r   r  rm  rX   r   r   r   s      r   r   zRigidConnection.place  s5    at{Aq)))))r   Iterable[Glue]c                $    d | j         D             S )Nc              3  R   K   | ]"}t          |t                    |j        |V  #d S rE   )r   r   r   r  s     r   r  z0RigidConnection.growable_glue.<locals>.<genexpr>"  sO       
 
JtT,B,B
GK}

 
 
 
 
 
r   rm  r}   s    r   growable_gluezRigidConnection.growable_glue!  s%    
 
![
 
 
 	
r   )r   r  r   rE   r   r   )rT   r  )r   r   r   r1   r2   r   r/  r   r~   r   rY   r   r  r   r   s   @r   r  r    s        04]=Q? ? ? ? ? ? ?! ! ! = = = X= > > > X>, , , , ,* * * * * *
 
 
 
 
 
 
 
r   r  c                l    d fd}d}t                     }g ||k     r |         }t          |t                    rT|}|dz  }||k     r3t           |         t                    s |||           n|dz  }||k     3||k    r |||           nw                    |           |dz  }||k     S )Nsr   ec                    | |         }t          |          dk    r$                    t          |                     d S                     |d                    d S r  )rp   r  r  )r  r   _rigid_contentr   	new_cellss      r   append_rigid_contentz7group_non_breakable_cells.<locals>.append_rigid_content(  sd    qs~""_^<<=====^A./////r   r   r   )r  r   r   r   )rp   r   r  r  )r   r  r   rK   r   startr  s   `     @r   r  r  '  s   0 0 0 0 0 0 0 EJJEI
%--U|dI&& 	#EQJE%--!%,	:: ((666
	 %--
 ~~$$UE2222T"""
! %--" r   r   group_heightc                    d}t          | t                    r9| j        t          j        k    r$| j        |z
  }| j        t          j        k    r|dz  }|S )Nr>   rv   )r   r   r   r1   r4   r   r3   )r   r  dys      r   vertical_cell_shiftr	  F  sS    	B$$$ 8I)I)I-;-...#IBIr   c                  .    e Zd ZU ded<   ded<   ded<   dS )LineCellr   r   r?   offsetr,  lockedN)r   r   r   rB   r   r   r   r  r  O  s+         JJJMMMLLLLLr   r  c                      e Zd ZdZdZdZdS )r  r   r   r   N)r   r   r   r  r  r  r   r   r   r  r  U  s        DGFFFr   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  Frs   r?   c                    t                                          |dt          j                   g | _        d| _        d S )Nr   )rs   rt   r   r>   )r   r   r1   r2   rm  _current_offset)rX   rs   r   s     r   r   zAbstractLine.__init__^  s:    uQ}7KLLL&(&)r   c                *    |                                  S rE   )flattenr}   s    r   r/  zAbstractLine.__iter__c  s    ||~~r   r   r   rT   r  c                    dS )z;Append cell to the line content and report SUCCESS or FAIL.Nr   rX   r   s     r   r  zAbstractLine.appendf  rj   r   tabr   c                    dS )zjAppend cell with preceding tabulator cell to the line content
        and report SUCCESS or FAIL.
        Nr   rX   r   r  s      r   r  zAbstractLine.append_with_tabk  s	    
 	r   c                *    t          | j                  S rE   )r,  rm  r}   s    r   r  zAbstractLine.has_contentr  s    DK   r   r   r   c                    t                                          ||           | j        }| j        D ]<}|j        }||j        z   }|t          ||          z   }|                    ||           =d S rE   )r   r   r   rm  r   r  r	  )	rX   r   r   r  	line_cellr   r  r  r   s	           r   r   zAbstractLine.placev  s~    a( 	 	I>DY%%B(|<<<BJJr2		 	r   c                    | j         S rE   r   r}   s    r   rx  zAbstractLine.line_width  r   r   c                t    d}t          | j                  r!| j        d         }|j        |j        j        z   }|S )Nr>   r  )rp   rm  r  r   r~   )rX   rs   	last_cells      r   r~   zAbstractLine.total_width  s<    t{ 	BBI$y~'AAEr   c                j    t          | j                  rt          d | j        D                       S dS )Nc              3  .   K   | ]}|j         j        V  d S rE   )r   r   r  s     r   r  z,AbstractLine.total_height.<locals>.<genexpr>  s'      @@qqv*@@@@@@r   r>   )rp   rm  r   r}   s    r   r   zAbstractLine.total_height  s9    t{ 	A@@DK@@@@@@sr   r   c                $    d | j         D             S )z.Yield line content including RigidConnections.c                    g | ]	}|j         
S r   r   r  s     r   
<listcomp>z&AbstractLine.cells.<locals>.<listcomp>  s    ,,,1,,,r   r  r}   s    r   r   zAbstractLine.cells  s    ,,,,,,r   c              #  |   K   |                                  D ]$}t          |t                    r	|E d{V   |V  %dS )z2Yield line content with resolved RigidConnections.N)r   r   r  r  s     r   r  zAbstractLine.flatten  sW      JJLL 	 	D$00 



		 	r   NrS   r
   rU   c                    t          |                                           }t          ||           t          ||           d S rE   )r  r   r   r   )rX   rS   r   s      r   rY   zAbstractLine.render  s=    TZZ\\""UAE1%%%%%r   r,  c                    | j         }|r6t          |d         j        t                    r|                                 dS dS )z]Remove the last space in the line. Returns True if such a space was
        removed.
        r  TF)rm  r   r   r   r   )rX   rm  s     r   r  z'AbstractLine.remove_line_breaking_space  sA      	j%88 	JJLLL4ur   r   r   r   rT   r  r   r   r  r   rT   r  r   r   )rT   r   rE   r   rM  )r   r   r   r  r   r/  rd   re   r  r  r   r  r   rx  r~   r   r   r  rY   r  r   r   s   @r   r  r  [  s       O* * * * * *
   	    	    ! ! X!         X    X    X
- - - -   & & & & &
       r   r  c                  h     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!dZd Z xZS )"r  TNrs   r?   rd  re  c                ^    t                                          |           |pg | _        d S )N)rs   )r   r   rl  )rX   rs   rd  r   s      r   r   zLeftLine.__init__  s-    u%%%#/rr   Fr   r   r  r  r,  rT   rU   c                X    | j                             t          |||                     d S rE   )rm  r  r  )rX   r   r  r  s       r   _append_line_cellzLeftLine._append_line_cell  s,     	8D&&99:::::r   r  c                0   |j         }| j        |z   | j        k    r7|                     || j                   | xj        |z  c_        t          j        S t          | j                  dk    r"|                     |d           t          j        S t          j	        S r   )
r~   r  rx  r-  r  r  rp   rm  r  r  rX   r   rs   s      r   r  zLeftLine.append  s     %'4?::""4)=>>>  E)  %%t{q   ""4+++$$r   r  r   c                   |j         }| j        }||z   | j        k    rt          j        S |}||dz  z   }||z   }|                     |||          }||                     ||          S |j        t          j	        k    r| 
                    ||j                  S |j        t          j        k    r|                     ||j                  S |                     ||j                  S r
  )r~   r  rx  r  r  _next_tab_stop_append_unlocked_tabrA   r;   r7   _append_leftr@   r3   _append_center_append_right)	rX   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G,,S$777} 000((x|<<<+"444**4>>>))$===r   c                   | j         }|                                }||j        z   }|j        }||z   | j        k    rB|                     ||           |                     ||           ||z   | _         t
          j        S t
          j        S rE   )r  r   r~   rx  r-  r  r  r  )rX   r  r   pos0spacepos1rs   s          r   r2  zLeftLine._append_unlocked_tab  s    #e'' %<4?**""5$///""4...#'%<D %%r   c                    |j         }||z   | j        k    r-|                     ||d           ||z   | _        t          j        S t          j        S r  )r~   rx  r-  r  r  r  r  )rX   r   r@   rs   s       r   r3  zLeftLine._append_left  sP     ;$/))""4d333#&;D %%r   c                    |j         dz  }| j        |z   |k    r|                     |          S ||z   | j        k    r0|                     |||z
  d           ||z   | _        t
          j        S t
          j        S )Nr   T)r~   r  r  rx  r-  r  r  r  )rX   r   r@   width2s       r   r4  zLeftLine._append_center  s~    !A%&(3..;;t$$$6\T_,,""4vt<<<#&<D %%r   c                    |j         }| j        |z   }|| j        k    rt          j        S ||k    r|                     |          S |                     |||z
  d           || _        t          j        S r  )r~   r  rx  r  r  r  r-  r  )rX   r   r@   rs   end_of_cell_poss        r   r5  zLeftLine._append_right  sv     .6T_,,?"S  ;;t$$$tS5[$777"!!r   c                    | j         D ]n}|j        t          j        k    r|j        |k    r|c S |j        t          j        k    r|j        |k    r|c S |j        t          j        k    r|j        |k    r|c S od S rE   )rl  rA   r;   r7   r@   r3   r8   )rX   rO   rw   rQ   r  s        r   r1  zLeftLine._next_tab_stop  s    ? 	 	Cx;+++$


[///CGf4D4D


[...37U??


tr   rE   )rs   r?   rd  re  )F)r   r   r  r?   r  r,  rT   rU   r(  r)  )rT   r  )r   r   r   r  r   r-  r  r  r2  r3  r4  r5  r1  r   r   s   @r   r  r    s        O* * * * * * *
 9>; ; ; ; ;
   > > > >,         	" 	" 	" 	"      r   r  c                4    t          d | D                       S )Nc              3  $   K   | ]}|j         V  d S rE   r  r  s     r   r  z content_width.<locals>.<genexpr>  s%      22Dt222222r   )r  )r   s    r   r=  r=    s    22E222222r   
list[Glue]c                    g }| D ]p}t          |t                    r|j        r|                    |           4t          |t                    r'|                    |                                           q|S rE   )r   r   r   r  r  r   r  )r   growabler   s      r   growable_cellsrI    s|    H 2 2dD!! 	2dm 	2OOD!!!!o.. 	2OOD..00111Or   list[LineCell]r   r   c                    t          |           }|dk    s||k    rd S | |dz
           }|j        |j        j        z   }||k     r8| |         j        }t	          ||d          | |<   ||j        z  }|dz  }||k     6d S d S )Nr   r   F)rp   r  r   r~   r  )r   r   rK   r  r  r   s         r   update_offsetsrL    s    JJEzzUU]]eai I	 ::F
%--U| fe44e$""
	 %------r   c                  &    e Zd Zd Zd Zd Zd ZdS )r  c                   | j         }|                                 }|t          |          k    rd S |                     |          }d ||dz   d          D             }d}	 t	          |          }t          |          dk    rnP|t          |          z
  }|dk    rn7|t          |          z  }|D ]}|                    |j        |z               d}s|rt          | j         |dz              d S d S )Nc                    g | ]	}|j         
S r   r#  r  s     r   r$  z,JustifiedLine.distribute.<locals>.<listcomp>5  s    ???A???r   r   FTr   g&.>)	rm  _last_locked_cellrp   _available_spacerI  r=  r   r~   rL  )	rX   r   last_locked_cellavailable_spacemodifiedrH  space_to_distributer  r   s	            r   r  zJustifiedLine.distribute.  s-   1133s5zz))F//0@AA??'7!';'='=!>???	%e,,H8}}!!"1M%4H4H"H"d**'#h--7E  6 6D,u45555H	  	>4;(81(<=====	> 	>r   c                D    | j         |         }|j        |j        j        z   S rE   )rm  r  r   r~   )rX   r   r   s      r   _end_offsetzJustifiedLine._end_offsetH  s     {5!{TY222r   c                <    | j         |                     |          z
  S rE   )rx  rW  )rX   r   s     r   rQ  zJustifiedLine._available_spaceL  s    !1!1%!8!888r   c                x    | j         }t          |          dz
  }|dk    r||         j        r|S |dz  }|dk    dS r  )rm  rp   r  )rX   r   r   s      r   rP  zJustifiedLine._last_locked_cellO  sP    E

QaiiU|" QJE aii qr   N)r   r   r   r  rW  rQ  rP  r   r   r   r  r  -  sP        > > >43 3 39 9 9    r   r  c                  Z     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!Fr   r   rT   r  c                   t          |t                    r|                                }|j        }| j        |z   | j        k     rJ| j                            t          || j        d                     | xj        |z  c_        t          j
        S t          | j                  dk    r5| j                            t          |dd                     t          j        S t          j        S )NFr   )r   r   r   r~   r  rx  rm  r  r  r  r  rp   r  r  r/  s      r   r  zNoTabLine.append^  s    dI&& 	#==??D %'$/99Kxd.BEJJKKK  E)  %%t{q   Kxa77888$$r   r  r   c                    t                      )zNo tabulator support!)NotImplementedErrorr  s      r   r  zNoTabLine.append_with_tabm  s    !###r   r   r?   r   c                v    t                                          ||                                 z   |           d S rE   )r   r   start_offsetr  s      r   r   zNoTabLine.placeq  s2    a$++---q11111r   c                    d S rE   r   r}   s    r   r`  zNoTabLine.start_offsetu  r0  r   r(  r)  r   r   )r   r   r   r   r  r  r  r   rd   re   r`  r   r   s   @r   r[  r[  Y  s        88O   $ $ $ $2 2 2 2 2 2 	       r   r[  c                      e Zd ZdZddZdS )r  -Right aligned lines do not support tab stops!rT   r?   c                X    t          d | j        D                       }| j        |z
  dz  S )Nc              3  .   K   | ]}|j         j        V  d S rE   r   r~   r  s     r   r  z*CenterLine.start_offset.<locals>.<genexpr>~  '      AA+AAAAAAr   r   r  rm  rx  rX   
real_widths     r   r`  zCenterLine.start_offset}  s2    AAT[AAAAA
*,11r   Nr   r   r   r   r   r`  r   r   r   r  r  z  s.        772 2 2 2 2 2r   r  c                      e Zd ZdZddZdS )r  rc  rT   r?   c                R    t          d | j        D                       }| j        |z
  S )Nc              3  .   K   | ]}|j         j        V  d S rE   rf  r  s     r   r  z)RightLine.start_offset.<locals>.<genexpr>  rg  r   rh  ri  s     r   r`  zRightLine.start_offset  s-    AAT[AAAAA
++r   Nr   rk  r   r   r   r  r    s.        77, , , , , ,r   r  rd  Iterable[TabStop]r  right_borderlist[TabStop]c                :    fdfd| D             D             S )Nc                >    g | ]}d |j         cxk     rk    n n|S )r   )r@   )r  r9  rp  s     r   r$  z#shift_tab_stops.<locals>.<listcomp>  sG       x|++++|+++++ 	+++r   c              3  D   K   | ]\  }}t          |z   |          V  d S rE   )r=   )r  r@   rA   r  s      r   r  z"shift_tab_stops.<locals>.<genexpr>  s5      PPdvt44PPPPPPr   r   )rd  r  rp  s    ``r   r  r    sC       PPPPiPPP   r   )rC   )rm   rn   rT   rk   )rr   r   rs   r?   rt   r?   rT   rl   rE   )r   r   rS   r
   rT   rU   )r   r   rS   r
   rT   rU   )r   r   rT   r   )r   r  r   r?   r   r?   )r   r   rT   r   )r   r   r  r?   rT   r?   )r   r   rT   r?   )r   r   rT   rF  )r   rJ  r   r   rT   rU   )rd  ro  r  r?   rp  r?   rT   rq  )K
__future__r   typingr   r   r   r   r   typing_extensionsr	   rd   rF   enum
ezdxf.mathr
   r   ezdxf.tools.textr   rI   	Exceptionr   IntEnumr   r   r1   r6   r;   r=   rL   ABCrN   rg   r?   rk   rB   rl   rq   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r!  r#  rO  ra  r  r  r  r  r  r	  r  r  r  r  r=  rI  rL  r  r[  r  r  r  r   r   r   <module>r~     s    # " " " " " " B B B B B B B B B B B B B B ' ' ' ' ' ' 



      . . . . . . . . $ $ $ $ $ $un	 	 	 	 	) 	 	 	    t|   	 	 	 	 	dl 	 	 	    DL              $,   ) ) ) ) )j ) ) )
I I I I5 5 5 5 5cg 5 5 5:       " 5%56 6 6 6 65%<( ( ( ( (       6V V V V V#' V V VB    3   "$D $D $D $D $D4 $D $D $DN	 	 	 	 	D 	 	 		 	 	 	 	t 	 	 		 	 	 	 	 	 	 	1 1 1 1 1$ 1 1 1h       @0 @0 @0 @0 @0; @0 @0 @0F    9 9 9 9 96W. W. W. W. W.{ W. W. W.t (	 ),#$	& & & &Rs s s s s s s sl' ' ' ' 'T ' ' ':T T T T T	 T T Tn\ \ \ \ \Y \ \ \~M M M M MY M M M`   
 
 
 
 
k 
 
 
@   >       z          O O O O O; O O Oda a a a a| a a aH3 3 3 3      ) ) ) ) )H ) ) )X       B2 2 2 2 2 2 2 2, , , , ,	 , , ,     r   