o
    Œõ±jUY  ã                   @  sP  d Z ddlmZ ddlmZ g d¢ZddlmZ ddlm	Z	 ddl
m
Z
 dd	lmZmZmZ dd
lmZmZmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZ ddlm Z m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) dZ*e+ ,ddd -dd„ e.ddƒD ƒ¡d d -dd„ e.ddƒD ƒ¡ ¡Z/		d,d-d!d"„Z0d#d$ddd%œd.d)d*„Z1d+S )/z8This is a high-level width() supporting terminal output.é    )Úannotations)ÚLiteral)	zwcwidth._constantszwcwidth._wcswidthzwcwidth._wcwidthzwcwidth.bisearchzwcwidth.control_codeszwcwidth.escape_sequenceszwcwidth.table_graphemezwcwidth.table_vs16zwcwidth.text_sizingé   )Útable_grapheme_overrides©Úwcwidth)Úbisearch)ÚwcswidthÚ	wcstwidthÚ_scan_zwj_cluster_end)Ú_EMOJI_ZWJ_SETÚ_ISC_VIRAMA_SETÚ_CATEGORY_MC_TABLEÚ_FITZPATRICK_RANGEÚ_REGIONAL_INDICATOR_SETÚresolve_terminalÚget_term_overridesÚ_clamp_ambiguous_width)ÚVS15_WIDE_TO_NARROW)ÚVS16_NARROW_TO_WIDE)Ú
TextSizingÚTextSizingParams)ÚILLEGAL_CTRLÚVERTICAL_CTRLÚHORIZONTAL_CTRLÚZERO_WIDTH_CTRL)Ú_SEQUENCE_CLASSIFYÚTEXT_SIZING_PATTERNÚCURSOR_MOVEMENT_SEQUENCEÚINDETERMINATE_EFFECT_SEQUENCEÚstrip_sequencesé   Ú c                 c  ó   � | ]}t |ƒV  qd S ©N©Úchr©Ú.0Úc© r*   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/wcwidth/_width.pyÚ	<genexpr>1   ó   € r,   é    úc                 c  r#   r$   r%   r'   r*   r*   r+   r,   3   r-   é€   é    FÚtextÚstrÚambiguous_widthÚintÚterm_programú
bool | strÚreturnc                 C  s6   |du rt t| ƒ t¡|d�S tt| ƒ t¡||d�S )z�
    Fast path for width() with control_codes='ignore'.

    Strips escape sequences and control characters, then measures remaining text.
    F©r4   )r4   r6   )r	   r    Ú	translateÚ_CONTROL_CHAR_TABLEr
   )r2   r4   r6   r*   r*   r+   Ú_width_ignored_codes7   s   þýr<   Úparseé   )Úcontrol_codesÚtabsizer4   r6   r?   ú$Literal['parse', 'strict', 'ignore']r@   c          8        sl	  |   ¡ r|  ¡ rt| ƒS tˆ ƒ‰ |dkr6t| ƒtkr6d| vr6d| vr6d| vr6d| vs4t | ¡s6t | ¡s6d}|dkrAt| ˆ |d�S t	|ƒ}|rct
|ƒ}|j}|j}|j}	|j}
|j}|j}t |¡}nd}d}d}	d}
d}d}i }|d	k}d
}d
}d
}t| ƒ}ˆ dkr…tn‡ fdd„}d}d}d
}d}d
}d}d
}d
}d
}td }td }t}||k �rv| | } | dk�r—|rÃ||7 }||krÁ|}d
}t | |¡}!|!sÐ|d7 }n¹|! ¡ }"|råt |"¡råtd|› d|"›�ƒ‚|! d¡ }#du�r
|#rõt|#ƒnd}$|�rtd|› d|"›d�ƒ‚|$d }n{|! d¡ }%du�r ||%�rt|%ƒnd7 }ne|! d¡ }&du�rU|&�r1t|&ƒnd}'|�rI|'|k�rItd|› d|'› d|› d�ƒ‚||'8 }|d
k �rTd
}n0|! d¡ }(du�r…|! d¡�pfd })|! d!¡}*|*du�ssJ ‚ttj|(|d"�|)|*ƒ}+||+  ˆ ¡7 }|! !¡ }d}d}d}||k�r–|}q§| t"v �rÇ|�r¬td#t#| ƒd$›d%|› �ƒ‚|�r¼||7 }||k�rº|}d
}|d7 }d}d}d}q§| t$v �r÷|�rÜtd&t#| ƒd$›d%|› �ƒ‚|�rì||7 }||k�rê|}d
}|d7 }d}d}d}q§| t%v �rR|�r||7 }||k�r
|}d
}| dk�r|d
k�r||||  7 }n!| dk�r.|d
k�r-|d8 }n| dk�r@|�r>td'|› d(�ƒ‚d
}||k�rG|}|d7 }d}d}d}q§| t&v �rr|�rg||7 }||k�re|}d
}|d7 }d}d}d}q§t#| ƒ},|,d)k�rÕ|�rƒ|d7 }nQ|d |k �rÎ|�rÅ|d
k�rÅ|t'v �rÅt(| ||ƒ}-| ||-… }.| |.¡}/|/du�rÅ||/| 7 }t)||ƒ}d}d}d
}d}d}|-}q§d
}d}|d*7 }nd}|d7 }q§|,d+k�rø|d
k�rø|�ré|||ƒ�rén|||ƒ�rñd*}d}|d7 }q§|,d,k�r,|d
k�r,|}0t|0|ƒ}1|	�rt|0|	ƒ�rd}1|1�r%|d*k�r%|d8 }t)||ƒ}d}|d7 }q§|,d-k�r‹|,t*v �rod
}2|d }3|3d
k�r`t#| |3 ƒt*v �r`|2d7 }2|3d8 }3|3d
k�r`t#| |3 ƒt*v �sJ|2d* dk�rn|,}|d7 }q§nt+d
 |,  k�rt+d k�r‹n n
|t'v �r‹|d7 }q§|| ƒ}4|4d*k�r |�r t|,|ƒ�r d}4n|4d*k�r°|
�r°t|,|
ƒ�r°d
}4|4dk�rÁ|�rÁt|,|ƒ�rÁd*}4n|4dk�rÑ|�rÑt|,|ƒ�rÑd
}4|4d
k�rR|�rÜd*}nk|�r?d}5|�r(|d
k�r(| ||d … }6| |6¡}/|/du�r	||/ }t)||ƒ}d.}5d
}n#| ||… }7| |7¡}/|/du�r#||/ }t)||ƒ}n	||7 }n||7 }||k�r3|}|5�s>|4}|}|}|}n|4}|}|}|}|}|,}|4}|}d}n|,t,v �rZd.}n|d
k�rl||,t-ƒ�rld*}d}d}nd}|d7 }||k s¬|�r´|�r©|d
k�r©| ||… }7| |7¡}/|/du�rœ||/ }t)||ƒ}|S ||7 }||k�r§|}|S ||7 }||k�r´|}|S )/u  
    Return printable width of text containing many kinds of control codes and sequences.

    Unlike :func:`wcswidth`, this function handles most control characters and many popular terminal
    output sequences.  Never returns -1.

    :param text: String to measure.
    :param control_codes: How to handle control characters and sequences:

        - ``'parse'`` (default): Track horizontal cursor movement like BS ``\b``, CR ``\r``, TAB
          ``\t``, cursor left and right movement sequences.  Vertical movement (LF, VT, FF) and
          indeterminate terminal sequences are zero-width. OSC 66 Kitty Text Sizing protocol, OSC 8
          Hyperlink, and many other kinds of output sequences are parsed for displayed measurements.
        - ``'strict'``: Like parse, but raises :exc:`ValueError` on control characters with
          indeterminate results of the screen or cursor, like clear or vertical movement. Generally,
          these should be handled with a virtual terminal emulator (like 'pyte').
        - ``'ignore'``: All C0 and C1 control characters and escape sequences are measured as
          width 0. This is the fastest measurement for text already filtered or known not to contain
          any kinds of control codes or sequences. TAB ``\t`` is zero-width; to ensure
          tab expansion, pre-process text using :func:`str.expandtabs`.

    :param tabsize: Tab stop width for ``'parse'`` and ``'strict'`` modes. Default is 8.  Must be
        positive. Has no effect when ``control_codes='ignore'``.
    :param ambiguous_width: Width to use for East Asian Ambiguous (A) characters. Default is ``1``
        (narrow). Set to ``2`` for CJK contexts.
    :param term_program: Terminal software identifier for table correction.
        ``False`` (default) disables override lookup.  ``True`` reads the
        ``TERM_PROGRAM`` or ``TERM`` environment variable for auto-detection.
        Accepts a canonical terminal name matching :func:`list_term_programs`,
        such as from XTVERSION_, ENQ_, or ``TERM_PROGRAM``.

        .. versionadded:: 0.8.0
    :returns: Maximum cursor position reached, "extent", accounting for cursor movement sequences
        present in ``text`` according to given parameters.  This represents the rightmost column the
        cursor reaches.  Always a non-negative integer.
    :raises ValueError: If ``control_codes='strict'`` and control characters with indeterminate
        effects, such as vertical movement or clear sequences are encountered, or on unexpected
        C0 or C1 control code. Also raised when ``control_codes`` is not one of the valid values.

    .. versionadded:: 0.3.0

    .. versionchanged:: 0.7.0
       Expanded strict-mode to raise :exc:`ValueError` when cursor-left movement
       (CSI D) would move beyond the beginning of the string. Previously, cursor-left
       was silently clamped to column 0 in all modes.

       Support horizontal cursor sequences (``cub``, ``cuf``, ``hpa``). Cursor-left (``cub``) or
       backspace (``\b``) now overwrites text.  ``column_address`` (``hpa``) and carriage return
       (``\r``) are now parsed, and some values conditionally raise ``ValueError`` when
       ``control_codes='parse'``.

    Examples::

        >>> width('hello')
        5
        >>> width('ã‚³ãƒ³ãƒ‹ãƒ�ãƒ�')
        10
        >>> width('\x1b[31mred\x1b[0m')
        3
        >>> width('\x1b[31mred\x1b[0m', control_codes='ignore')  # same result (ignored)
        3
        >>> width('123\b4')     # backspace overwrites previous cell (outputs '124')
        3
        >>> width('abc\t')      # tab caused cursor to move to column 8
        8
        >>> width('1\x1b[10C')  # '1' + cursor right 10, cursor ends on column 11
        11
        >>> width('1\x1b[10C', control_codes='ignore')   # faster but wrong in this case
        1
    r=   úú	úúÚignore)r6   r*   Ústrictr   r   c                   s   t | dˆ ƒS )NÚautor   )r)   r9   r*   r+   Ú<lambda>Ö   s    zwidth.<locals>.<lambda>éþÿÿÿéÿÿÿÿFz9.0.0z*Indeterminate cursor sequence at position z, Úhpa_nNz.Indeterminate horizontal position at position z (absolute column unknown)Ú
cforward_nÚcbackward_nz!Cursor left movement at position z would move z cells left from column z, exceeding string startÚts_metaÚts_textr"   Úts_term)r?   zIllegal control character z#xz at position zVertical movement character z-Horizontal movement character \r at position z: indeterminate starting columni   é   iþ  iþ  iÿÿ  T).ÚisasciiÚisprintableÚlenr   Ú_WIDTH_FAST_PATH_MIN_LENr   Úsearchr   r<   r   r   ÚnarrowerÚvs16_narrowerÚ
vs15_widerÚzeroerÚnarrow_widerÚnarrow_zeroerr   Úgetr   r   r   r   r   ÚmatchÚgroupr   Ú
ValueErrorr5   r   r   Úfrom_paramsÚdisplay_widthÚendr   Úordr   r   r   r   r   Úmaxr   r   r   r   )8r2   r?   r@   r4   r6   Úterm_canonicalÚ	overridesÚ	_narrowerÚ_vs16_narrowerÚ_vs15_widerÚ_zeroerÚ_narrow_widerÚ_narrow_zeroerÚ_grapheme_overridesrG   Úcurrent_colÚ
max_extentÚidxÚtext_lenÚ_wcwidthÚlast_measured_idxÚlast_measured_ucsÚlast_measured_wÚprev_was_viramaÚ_max_extent_beforeÚcluster_startÚcol_before_clusterÚmax_extent_before_clusterÚcluster_widthÚvs16_nw_tableÚvs15_wn_tableÚ	_bisearchÚcharÚmÚseqrL   Ú
target_colrM   rN   Ú
n_backwardrO   rP   rQ   Ú	text_sizeÚucsÚcluster_endÚclusterÚ
override_wÚbase_ucsÚvs15_narrowÚ	ri_beforeÚjÚwÚflushedÚ	candidateÚcluster_textr*   r9   r+   ÚwidthJ   s^  Tÿþ


ÿÿ
ÿÿÿ
€
þ








€

ÿ














þý$








€
 � �ï  


	ù
ý
r“   N)r   F)r2   r3   r4   r5   r6   r7   r8   r5   )r2   r3   r?   rA   r@   r5   r4   r5   r6   r7   r8   r5   )2Ú__doc__Ú
__future__r   Útypingr   Ú__lazy_modules__r"   r   rt   r   r   Ú	_wcswidthr	   r
   r   Ú
_constantsr   r   r   r   r   r   r   r   Ú
table_vs15r   Ú
table_vs16r   Útext_sizingr   r   r?   r   r   r   r   Úescape_sequencesr   r   r   r   r    rV   r3   Ú	maketransÚjoinÚranger;   r<   r“   r*   r*   r*   r+   Ú<module>   s<    (
ÿþÿÿú