o
    j                     @  s   U d Z ddlmZ ddlZddlZddlmZ G dd dejZeddd	dd
eddd	dd
eddddd
eddddd
eddddd
eddddd
dZ	de
d< G dd dejZG dd dejZdS )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                   @  s.   e Zd ZU ded< ded< ded< ded< dS )
_FieldMetastrnameintlowhighdefaultN)__name__
__module____qualname____annotations__ r   r   T/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/wcwidth/text_sizing.pyr   *   s
   
 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                   @  s~   e Zd ZU dZdZded< dZded< dZded< dZded< dZ	ded	< dZ
ded
< dddZdddZeddddZdS )TextSizingParamsa/  
    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   returnr   c                   s0   d  fddt D } jj d| dS )z
        Return a compact representation including only non-default fields.

        This avoids verbose output when most fields are defaults.
        z, c                 3  s:    | ]}t  |j|jkr|j d t  |j V  qdS )=N)getattrr   r   ).0fieldselfr   r   	<genexpr>U   s    z,TextSizingParams.__repr__.<locals>.<genexpr>())joinr!   values	__class__r   )r)   repr_fmtr   r(   r   __repr__N   s   zTextSizingParams.__repr__c                 C  sJ   g }t  D ]\}}t| |j }|jkr|| d|  qd|S )z0Build and return sub-part of an OSC 66 sequence.r$   :)r!   itemsr%   r   r   appendr-   )r)   partsZ	field_keyr'   valr   r   r   make_sequenceZ   s   
zTextSizingParams.make_sequenceparserawcontrol_codesc                 C  sP  i }|s|  S | dD ]}d|vr!|dkr td|d|q|d\}}}t|}|du rA|dkr@td| d|qzt|}	W n$ tyk }
 z|dkratd	| d|d
|
 |
W Y d}
~
qd}
~
ww |dkr|	|jksz|	|jk rtd| d|d| d|j d|j d|j t	|jt
|j|	||j< q| di |S )a  
        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)
        r2   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)clsr9   r:   kwargspartkey_eqr6   r'   valueexcr   r   r   from_paramsc   s`   



zTextSizingParams.from_paramsNr#   r   r8   )r9   r   r:   r   r#   r"   )r   r   r   __doc__r   r   r   r   r   r   r   r1   r7   classmethodrI   r   r   r   r   r"   :   s   
 

	r"   c                   @  sP   e Zd ZU dZded< ded< ded< eddddZddddZdddZdS )
TextSizingzBBasic horizontal width measurement for kitty text sizing protocol.r"   paramsr   text
terminatorr8   matchre.Match[str]r:   r#   c                 C  s*   | t j|d|d|d|ddS )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   )r:   r      )rO   rP   rQ   )r"   rI   group)rB   rR   r:   r   r   r   
from_match   s   zTextSizing.from_matchr   ambiguous_widthr   c                 C  s<   | j jdkr| j j| j j S t| j|d}| j jtd| S )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   )rW   )rO   r   r   r   rP   r@   )r)   rW   r   r   r   r   display_width   s   zTextSizing.display_widthc                 C  s   d| j   d| j | j S )z3Build and return complete OSC 66 Terminal Sequence.z]66;;)rO   r7   rP   rQ   r(   r   r   r   r7      s   zTextSizing.make_sequenceNrK   )rR   rS   r:   r   r#   rN   )r   )rW   r   r#   r   rJ   )	r   r   r   rL   r   rM   rV   rX   r7   r   r   r   r   rN      s   
 rN   )rL   
__future__r   retypingZ	_wcswidthr   
NamedTupler   r!   r   r"   rN   r   r   r   r   <module>   s    	]