ó
    Ãu„j"  ã                  ór  • S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJr  SS	KJrJr  SS
KJr  \" S5      SS j5       r " S S\5      rSS jr          SS jrSS jr          SS jr            SS jr\R6                  " S5      r\R:                  4       SS jjrg)z6
Tools for processing Segments, or lists of Segments.
é    )ÚannotationsN)Ú	lru_cache)ÚIterable©ÚSegment)ÚStyle)Úcell_len)ÚAlignHorizontalÚAlignVertical)ÚSizei    c                ó    • [        SU -  U5      $ )zrMake a blank segment.

Args:
    width: Width of blank.
    style: Style of blank.

Returns:
    A single segment
Ú r   )ÚwidthÚstyles     Ú¤C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\textual/_segment_tools.pyÚ
make_blankr      s   € ô �3˜‘; Ó&Ð&ó    c                  ó   • \ rS rSrSrg)ÚNoCellPositionForIndexé!   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   r   r   r   r   !   s   † Úr   r   c                ó:  • U (       d  [         eUS:X  a  gSnSnSnSnSn[        U 5      n XA:  a<  [        U5      nUR                  n[	        U5      n[        U5      nX%-  nXC-  nXA:  a  M<  XC-
  n	X-
  n
X%-
  nU[        USU
 5      -   $ ! [         a    [         ef = f)aÛ  Given a character index, return the cell position of that character within
an Iterable of Segments. This is the sum of the cell lengths of all the characters
*before* the character at `index`.

Args:
    segments: The segments to find the cell position within.
    index: The index to convert into a cell position.

Returns:
    The cell position of the character at `index`.

Raises:
    NoCellPositionForIndex: If the supplied index doesn't fall within the given segments.
r   Ú N)r   ÚiterÚnextÚtextÚlenr	   ÚStopIteration)ÚsegmentsÚindexÚcell_position_endÚsegment_lengthÚsegment_end_indexÚsegment_cell_lengthr!   Úiter_segmentsÚsegmentÚsegment_index_startÚindex_within_segmentÚsegment_cell_starts               r   Úindex_to_cell_positionr/   %   sÔ   € ö Ü$Ð$à�ƒzØàÐØ€NØÐØÐØ€DÜ˜“N€Mð	%ØÓ'Ü˜=Ó)ˆGØ—<‘<ˆDÜ  ›YˆNÜ"*¨4£.ÐØÑ4ÐØÑ/Ðð  Õ'ð ,Ñ<ÐØ Ñ6ÐØ*Ñ@Ðà¤¨Ð.CÐ/CÐ)DÓ EÑEÐEøô ó %Ü$Ð$ð%ús   «?B	 Â	Bc                óÈ  • [         nSn/ nUR                  n[        U 5      nSn	U H6  n	XT" U	R                  5      -   n
X¡:”  a  U	R	                  X-
  5      S   n	  OU
nM8     / $ X#:¼  a"  U	(       a  U" U	5        UR                  U5        U$ UnU	bT  XT" U	R                  5      -   n
X¢:  a	  U" U	5        OU" U	R	                  X%-
  5      S   5         U$ U
n[        US5      n	U	b  MT  U$ )a  Crops a list of segments between two cell offsets.

Args:
    segments: A list of Segments for a line.
    start: Start offset (cells)
    end: End offset (cells, exclusive)
    total: Total cell length of segments.
Returns:
    A new shorter list of segments
r   Né   )r	   Úappendr   r!   Úsplit_cellsÚextendr    )r$   ÚstartÚendÚtotalÚ	_cell_lenÚposÚoutput_segmentsÚadd_segmentr*   r+   Úend_poss              r   Ú	line_cropr=   S   s  € ô" €IØ
€CØ%'€OØ!×(Ñ(€KÜ˜“N€MØ"€GÛ ˆØ˜	 '§,¡,Ó/Ñ/ˆØ‹?Ø×)Ñ)¨%©+Ó6°qÑ9ˆGÙØŠñ !ð ˆ	à
ƒ|æÙ˜Ô Ø×Ñ˜}Ô-ØÐà
€CØ
Ñ
Ø˜	 '§,¡,Ó/Ñ/ˆØ‹=Ù˜Õ á˜×+Ñ+¨C©IÓ6°qÑ9Ô:Øð Ðð ˆÜ�} dÓ+ˆð Ó
ð Ðr   c                ó‚  • U R                  5       n U (       aD  U(       a=  U S   R                  S5      u  p4UR                  (       a  X@S'   OU R                  S5        U (       a\  U(       aU  U S   nUR                  [	        UR                  5      S-
  5      u  pSUR                  (       a  XPS'   U $ U R                  5         U $ )zãOptionally remove a cell from the start and / or end of a list of segments.

Args:
    segments: A line (list of Segments)
    start: Remove cell from start.
    end: Remove cell from end.

Returns:
    A new list of segments.
r   r1   éÿÿÿÿ)Úcopyr3   r!   Úpopr"   )r$   r5   r6   Ú_Úfirst_segmentÚlast_segments         r   Ú	line_trimrE   ˆ   s�   € ð �}‰}‹€HÞ–EØ# A™;×2Ñ2°1Ó5ÑˆØ××Ø'�QŠKà�L‰L˜ŒOÞ–CØ ‘|ˆØ&×2Ñ2´3°|×7HÑ7HÓ3IÈAÑ3MÓN‰ˆØ××Ø'�R‰Lð €Oð �L‰LŒNØ€Or   c                ó¼   • U(       a   U(       a  [        X5      /U Q[        X#5      P$ U(       a  [        X5      /U Q$ U(       a  / U Q[        X#5      P$ [        U 5      $ )a  Adds padding to the left and / or right of a list of segments.

Args:
    segments: A line of segments.
    pad_left: Cells to pad on the left.
    pad_right: Cells to pad on the right.
    style: Style of padded cells.

Returns:
    A new line with padding.
)r   Úlist)r$   Úpad_leftÚ	pad_rightr   s       r   Úline_padrJ   ¤   s�   € ö –Iä�xÓ'ð
àð
ô �yÓ(ð
ð 	
ö
 
ä�xÓ'ð
àð
ð 	
ö 
ð
Øð
ä�yÓ(ð
ð 	
ô �‹>Ðr   c              #  ó  ^^#   • U (       d  gUu  mn[         R                  nU  Vs/ s H
  ov" U5      PM     nn[        U5      n	[        U5      n
SUU4S jjnS=pÍ[        SXZ-
  5      nUS:X  a  UnOUS:X  a
  US-  nXì-
  nOUS:X  a  UnU(       a  U" U5       Sh  v•N   US:X  a4  [	        X€5       H$  u  p÷UT:X  a  Uv •  M  [        USTU-
  T5      v •  M&     OˆUS	:X  aI  [        STU	-
  5      S-  n[	        X€5       H'  u  p÷UT:X  a  Uv •  M  [        UUTU-
  U-
  T5      v •  M)     O9US
:X  a3  [	        X€5       H$  u  p÷TU:X  a  Uv •  M  [        UTU-
  ST5      v •  M&     U(       a  U" U5       Sh  v•N   ggs  snf  Nä N7f)zÏAlign lines.

Args:
    lines: A list of lines.
    style: Background style.
    size: Size of container.
    horizontal: Horizontal alignment.
    vertical: Vertical alignment.

Returns:
    Aligned lines.
Nc                ó&   >• [        TT5      //U -  $ )zjCreate blank lines.

Args:
    count: Desired number of blank lines.

Returns:
    A list of blank lines.
)r   )Úcountr   r   s    €€r   Úblank_linesÚ align_lines.<locals>.blank_linesà   s   ø€ ô ˜E 5Ó)Ð*Ð+¨eÑ3Ð3r   r   ÚtopÚmiddleé   ÚbottomÚleftÚcenterÚright)rM   ÚintÚreturnúlist[list[Segment]])r   Úget_line_lengthÚmaxr"   ÚziprJ   )Úlinesr   ÚsizeÚ
horizontalÚverticalÚheightrZ   ÚlineÚline_lengthsÚshape_widthÚshape_heightrN   Útop_blank_linesÚbottom_blank_linesÚvertical_excess_spaceÚcell_lengthÚ
left_spacer   s    `               @r   Úalign_linesrk   Å   s¾  ùé € ö& ØØ�M€Eˆ6Ü×-Ñ-€OÙ6;Ó<²e¨d�O DÖ)±e€LÐ<Ü�lÓ#€KÜ�|Ó$€L÷	4ð 	4ð ,-Ð,€OÜ  6Ñ#8Ó9Ðà�5ÓØ2ÑØ	�XÓ	Ø/°1Ñ4ˆØ2ÑDÑØ	�XÓ	Ø/ˆæÙ˜Ó/×/Ð/à�VÓÜ!$ \Ö!9ÑˆKØ˜eÓ#Ø”
ä˜t Q¨°Ñ(;¸UÓCÔCò	 ":ð 
�xÓ	Ü˜˜E KÑ/Ó0°AÑ5ˆ
Ü!$ \Ö!9ÑˆKØ˜eÓ#Ø”
äØ˜* e¨kÑ&9¸JÑ&FÈóô ò	 ":ð 
�wÓ	Ü!$ \Ö!9ÑˆKØ˜Ó#Ø”
ä˜t U¨[Ñ%8¸!¸UÓCÔCñ	 ":ö ÙÐ1Ó2×2Ñ2ð ùòk =ñ6 	0ñ6 	3ùs/   „"F¦E<·A%FÂFÂCFÅ5FÅ6FÆFz	(\s+|\S+)c              #  ó   #   • [         nU  Hn  nSUR                  ;  a  Uv •  M  Uu  pgnU" U5       HD  n	U	(       d  M  U	R                  5       (       a  U" U[        U	5      -  U5      v •  M:  U" X—5      v •  MF     Mp     g7f)zÕReplace run of spaces with another character + style.

Args:
    segments: Segments to process.
    character: Character to replace spaces.
    hatch_style: Style of replacement characters.

Yields:
    Segments.
r   N)r   r!   Úisspacer"   )
r$   Ú	characterÚhatch_styleÚ_splitÚ_Segmentr+   r!   r   rB   Útokens
             r   Úapply_hatchrs     so   é € ô  €HÛˆØ�g—l‘lÓ"ØŒMà$‰NˆD˜Ù ž�ß�5Ø—}‘}—‘Ù& y´3°u³:Ñ'=¸{ÓKÔKá& uÓ4Ô4ó &ò ùs   ‚7A>½AA>)r   r   rX   r   )r$   úIterable[Segment]r%   rW   rX   rW   )
r$   úlist[Segment]r5   rW   r6   rW   r7   rW   rX   ru   )r$   ru   r5   Úboolr6   rv   rX   ru   )
r$   rt   rH   rW   rI   rW   r   r   rX   ru   )r]   rY   r   r   r^   r   r_   r
   r`   r   rX   zIterable[list[Segment]])r$   rt   rn   Ústrro   r   rX   rt   )Ú__doc__Ú
__future__r   ÚreÚ	functoolsr   Útypingr   Úrich.segmentr   Ú
rich.styler   Útextual._cellsr	   Útextual.css.typesr
   r   Útextual.geometryr   r   Ú	Exceptionr   r/   r=   rE   rJ   rk   ÚcompileÚ
_re_spacesÚsplitrs   r   r   r   Ú<module>r†      s=  ðñõ #ã 	Ý Ý å  Ý å #ß <Ý !ñ ˆ8Óó
'ó ð
'ô	˜Yô 	ô+Fð\2Øð2Ø$'ð2Ø.1ð2Ø:=ð2àô2ôjð8ØðØ+.ðØ;>ðØGLðàôðBM3ØðM3àðM3ð ðM3ð  ð	M3ð
 ðM3ð ôM3ð` �ZŠZ˜Ó%€
ð ×Ñð	5Øð5àð5ð ð5ð
 ö5r   