ó
    Ð]j  ã                  ó   • % S r SSKJr  SSKrSSKrSSKJr   " S S\R                  5      r\" SSS	SS
9\" SSS	SS
9\" SSSSS
9\" SSSSS
9\" SSSSS
9\" SSSSS
9S.r	S\
S'    " S S\R                  5      r " S S\R                  5      rg)aV  
`kitty text sizing protocol`_ (OSC 66) parsing and measurement.

The kitty text sizing protocol allows terminal apps to explicitly tell
terminals how many cells text occupies, using the escape sequence::

    ESC ] 66 ; metadata ; text BEL/ST

Metadata is colon-separated ``key=value`` pairs:

- ``s``: scale
- ``w``: width in cells
- ``n``: fractional numerator
- ``d``: fractional denominator
- ``v``: vertical alignment
- ``h``: horizontal alignment

Parsing is pretty straight-forward:

- When ``w > 0``, return ``s * w``.
- Otherwise ``w == 0``, ``s * wcswidth(inner_text_width)`` cells.

Numerator, denominator, and alignment codes and values are parsed but otherwise ignored
and have no effect on measurements made in this library.

.. _`kitty text sizing protocol`: https://sw.kovidgoyal.net/kitty/text-sizing-protocol/

.. versionadded:: 0.7.0
é    )ÚannotationsNé   )Úwcswidthc                  ó>   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   Srg	)
Ú
_FieldMetaé*   ÚstrÚnameÚintÚlowÚhighÚdefault© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Ú__static_attributes__r   ó    ÚP/home/mande/repo/quber/.venv/lib/python3.13/site-packages/wcwidth/text_sizing.pyr   r   *   s   ‡ Ø
ƒIØ	ƒHØ
ƒIØ†Lr   r   Úscaleé   )r
   r   r   r   ÚwidthÚ	numeratoré   ÚdenominatorÚvertical_aligné   Úhorizontal_align)ÚsÚwÚnÚdÚvÚhzdict[str, _FieldMeta]ÚTEXT_FIELD_MAPPINGc                  óš   • \ rS rSr% SrSrS\S'   SrS\S'   SrS\S'   Sr	S\S	'   Sr
S\S
'   SrS\S'   SS jrSS jr\SSS jj5       rSrg)ÚTextSizingParamsé:   a  
Parsed parameters from a text sizing escape sequence (OSC 66).

:param scale: Scale factor (1-7). Text occupies ``scale`` rows tall and ``scale * width``
    columns wide.
:param width: Width in cells (0-7). When 0, width is auto-calculated from the inner text.
:param numerator: Fractional scaling numerator (0-15).
:param denominator: Fractional scaling denominator (0-15).
:param vertical_align: Vertical alignment (0=top, 1=bottom, 2=center).
:param horizontal_align: Horizontal alignment (0=left, 1=right, 2=center).
r   r   r   r   r   r   r   r   r    c                ó–   ^ • SR                  U 4S j[        R                  5        5       5      nT R                  R                   SU S3$ )z
Return a compact representation including only non-default fields.

This avoids verbose output when most fields are defaults.
z, c              3  óº   >#   • U  HP  n[        TUR                  5      UR                  :w  d  M)  UR                   S [        TUR                  5       3v •  MR     g7f)Ú=N)Úgetattrr
   r   )Ú.0ÚfieldÚselfs     €r   Ú	<genexpr>Ú,TextSizingParams.__repr__.<locals>.<genexpr>U   sN   øé € ð LÚ*E Ü '¨¨e¯j©jÓ 9¸U¿]¹]Ñ Jó I §
¡
˜|¨1¬W°T¸5¿:¹:Ó-FÐ,GÕHÚ*Eùs
   ƒ(A¯,AÚ(Ú))Újoinr'   ÚvaluesÚ	__class__r   )r1   Úrepr_fmts   ` r   Ú__repr__ÚTextSizingParams.__repr__N   sL   ø€ ð —9‘9ô LÜ*<×*CÑ*CÔ*EóLó Lˆð —.‘.×)Ñ)Ð*¨!¨H¨:°QÐ7Ð7r   c                óÚ   • / n[         R                  5        HA  u  p#[        XR                  5      =oCR                  :w  d  M+  UR                  U SU 35        MC     SR                  U5      $ )z0Build and return sub-part of an OSC 66 sequence.r-   Ú:)r'   Úitemsr.   r
   r   Úappendr6   )r1   ÚpartsÚ	field_keyr0   Úvals        r   Úmake_sequenceÚTextSizingParams.make_sequenceZ   s\   € àˆä 2× 8Ñ 8Ö :ÑˆIÜ˜t§Z¡ZÓ0Ð0�·]±]ÕBØ—‘ 	˜{¨!¨C¨5Ð1Ö2ñ !;ð �x‰x˜‹Ðr   c                óâ  • 0 nU(       d  U " 5       $ UR                  S5       GH  nSU;  a  US:X  a  [        SU< SU< 35      eM%  UR                  S5      u  pVn[        R	                  U5      nUc  US:X  a  [        SU SU< 35      eMk   [        U5      n	US:X  aZ  X˜R                  :”  d  X˜R                  :  a<  [        SU SU< SU SUR                   SUR                   SUR                   35      e[        UR                  [        UR                  U	5      5      X8R                  '   GM     U " S0 UD6$ ! [         a(  n
US:X  a  [        S	U SU< S
U
 35      U
e Sn
A
GMG  Sn
A
ff = f)a0  
Parse colon-separated ``key=value`` metadata string.

:param raw: Metadata string, e.g. ``'s=2:w=3'``.
:param control_codes: 'parse' or 'strict'.
:raises ValueError: If ``control_codes='strict'`` unrecognized text sizing parameters raise
    ValueError.
:returns: Parsed parameters with values clamped to valid ranges.
    Unknown keys are ignored. Non-integer values use defaults.

Example::

    >>> TextSizingParams.from_params('s=2:w=3')
    TextSizingParams(scale=2, width=3, numerator=0, denominator=0,             vertical_align=0, horizontal_align=0)
r=   r-   Ústrictz5Expected '=' in text sizing parameter (key=val), got z in OSC 66 sequence, NzUnknown text sizing field 'z' in OSC 66 sequence, zIllegal text sizing value 'z: z!Out of bounds text sizing value 'z: allowed range for 'z' (z) is z to r   )ÚsplitÚ
ValueErrorÚ	partitionr'   Úgetr   r   r   r
   ÚmaxÚmin)ÚclsÚrawÚcontrol_codesÚkwargsÚpartÚkeyÚ_eqrB   r0   ÚvalueÚexcs              r   Úfrom_paramsÚTextSizingParams.from_paramsc   s·  € ð$ )+ˆÞÙ“5ˆLØ—I‘I˜c—NˆDØ˜$‹Ø  HÓ,Ü$ð (,Ø,0©8Ð3HÈÉð&Qó Rð RáØ ŸN™N¨3Ó/‰MˆC�cÜ&×*Ñ*¨3Ó/ˆEØ‰}Ø  HÓ,Ü$Ð'BÀ3À%ð H<Ø<?¹7ð&Dó Eð Eñ ðÜ˜C›�ð  Ó(¨e·j±jÓ.@ÀEÏIÉIÓDUÜ Ð#DÀSÀEð J8Ø8;±wð ?7Ø7:°e¸3¸u¿z¹z¸lð K'Ø',§y¡y k°°e·j±j°\ð"Có Dð Dô "% U§Y¡Y´°E·J±JÀÓ0FÓ!GˆF—:‘:Ôñ7 #ñ8 ‰}�V‰}Ðøô ó Ø  HÓ,Ü$Ð'BÀ3À%ð H<Ø<?¹7À"ÀSÀEð&Kó LØQTðUö ûðús   ÂD<Ä<
E.ÅE)Å)E.r   N©Úreturnr	   ©Úparse)rN   r	   rO   r	   rY   r)   )r   r   r   r   Ú__doc__r   r   r   r   r   r   r    r:   rC   ÚclassmethodrV   r   r   r   r   r)   r)   :   sb   ‡ ñ
ð €Eˆ3ƒNØ€Eˆ3ƒNØ€IˆsÓØ€K�ÓØ€N�CÓØÐ�cÓô
8ôð õ0ó ó0r   r)   c                  óh   • \ rS rSr% SrS\S'   S\S'   S\S'   \SSS jj5       rSSS	 jjrSS
 jr	Sr
g)Ú
TextSizingé—   zBBasic horizontal width measurement for kitty text sizing protocol.r)   Úparamsr	   ÚtextÚ
terminatorc                ó�   • U " [         R                  UR                  S5      US9UR                  S5      UR                  S5      S9$ )aÆ  
Parse using matching OSC 66 Sequence.

:param match: match object from :attr:`wcwidth.escape_sequences.TEXT_SIZING_PATTERN`.
:param control_codes: 'parse' or 'strict', same meaning as delegated by
    :func:`wcwidth.width`.
:raises ValueError: When ``control_codes='strict'`` for unrecognized, invalid, or out of
    bounds text sizing parameters.
:returns: TextSizing object from parsed sequence

Example::

    from wcwidth.escape_sequences import TEXT_SIZING_PATTERN
    >>> TextSizing.from_match(TEXT_SIZING_PATTERN.match('\x1b]66;w=2;XY\x07'))
    TextSizing(params=TextSizingParams(scale=1, width=2, numerator=0, denominator=0, \
    vertical_align=0, horizontal_align=0), text='XY', terminator='\x07')
r   )rO   r   é   )ra   rb   rc   )r)   rV   Úgroup)rM   ÚmatchrO   s      r   Ú
from_matchÚTextSizing.from_matchž   sC   € ñ& Ô*×6Ñ6°u·{±{À1³~ÐUbÐ6ÐcØŸ™ A›Ø#Ÿk™k¨!›nñ.ð 	.r   c                óþ   • U R                   R                  S:”  a-  U R                   R                  U R                   R                  -  $ [        U R                  US9nU R                   R                  [        SU5      -  $ )aÌ  
Calculate the display width of a text sizing sequence.

:param ambiguous_width: Width for East Asian Ambiguous characters.
:returns: Display width in terminal cells. When ``width > 0``, returns
    ``params.scale * params.width``. When ``width == 0``, returns
    ``params.scale * measured_inner_width``.

.. note: Fractional scaling (numerator/denominator) does not affect the
    cell count, it adjusts only the font size within the cells allocated by 'w'.
r   )Úambiguous_width)ra   r   r   r   rb   rK   )r1   rk   r"   s      r   Údisplay_widthÚTextSizing.display_widthµ   s`   € ð �;‰;×Ñ˜qÓ Ø—;‘;×$Ñ$ t§{¡{×'8Ñ'8Ñ8Ð8Ü�T—Y‘Y°Ñ@ˆØ�{‰{× Ñ ¤3 q¨!£9Ñ,Ð,r   c                ón   • SU R                   R                  5        SU R                   U R                   3$ )z3Build and return complete OSC 66 Terminal Sequence.z]66;Ú;)ra   rC   rb   rc   )r1   s    r   rC   ÚTextSizing.make_sequenceÆ   s0   € à˜$Ÿ+™+×3Ñ3Ó5Ð6°a¸¿	¹	°{À4Ç?Á?ÐBSÐTÐTr   r   NrZ   )rg   zre.Match[str]rO   r	   rY   r_   )r   )rk   r   rY   r   rX   )r   r   r   r   r\   r   r]   rh   rl   rC   r   r   r   r   r_   r_   —   s2   ‡ ÙLàÓØ
ƒIØƒOàõ.ó ð.ö,-÷"Ur   r_   )r\   Ú
__future__r   ÚreÚtypingÚ	_wcswidthr   Ú
NamedTupler   r'   r   r)   r_   r   r   r   Ú<module>rv      sÁ   ðòõ< #ó 
ã õ  ô�×"Ñ"ô ñ 
˜ a¨a¸Ñ	;Ù	˜ a¨a¸Ñ	;Ù	˜¨!°"¸aÑ	@Ù	˜¨A°BÀÑ	BÙ	Ð)¨q°qÀ!Ñ	DÙ	Ð+°¸ÀAÑ	Fñ-HÐ Ð)ó HôZ�v×(Ñ(ô Zôz1U�×"Ñ"õ 1Ur   