
    _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       H/home/rurouni/.local/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 'ejj 9U]] J I

|1WT5::-F,GH*Es
   (A,A())joinr'   values	__class__r   )r1   repr_fmts   ` r   __repr__TextSizingParams.__repr__N   sL     99 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tZZ00]]B	{!C512 !; xx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  XR                  :  d  XR                  :  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   $ )+5LIIcND$ H,$ (,,083H&Q R R NN3/MCc&**3/E} H,$'B3% H<<?7&D E E C (ejj.@EIIDU #DSE J88;w ?77:e3uzzl K'',yykejj\"C D D "%UYYEJJ0F!GF::7 #8 }V}   H,$'B3% H<<?7"SE&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    
 E3NE3NIsKNC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6u{{1~Ub6cA#kk!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TYY@{{  3q!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6a		{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   < # 
   ""  
aa	;	aa	;	!"a	@	AB	B	)qq!	D	+A	F-H ) HZv(( Zz1U"" 1Ur   