VBFj0dZddlmZddlZddlmZddlmZmZm Z erddlm Z GddeZ ej d Z ej d Zd ZGd d e ZeZd"dZd#dZd$dZd%dZd&dZd'd!ZdS)(as SGR (Select Graphic Rendition) state tracking for terminal escape sequences. This module provides functions for tracking and propagating terminal styling (bold, italic, colors, etc.) via public API propagate_sgr(), and its dependent functions, cut() and wrap(). It only has attributes necessary to perform its functions, eg 'RED' and 'BLUE' attributes are not defined. ) annotationsN)IntEnum) TYPE_CHECKINGIterator NamedTuple)SequenceceZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d S)!_SGRz SGR (Select Graphic Rendition) parameter codes. References: - https://invisible-island.net/xterm/ctlseqs/ctlseqs.html - https://github.com/tehmaze/ansi/tree/master/ansi/colour r %&'(/01ZadkN)"__name__ __module__ __qualname____doc__RESETBOLDDIMITALIC UNDERLINEBLINK RAPID_BLINKINVERSEHIDDEN STRIKETHROUGHDOUBLE_UNDERLINE BOLD_DIM_OFF ITALIC_OFF UNDERLINE_OFF BLINK_OFF INVERSE_OFF HIDDEN_OFFSTRIKETHROUGH_OFFFG_BLACKFG_WHITE FG_EXTENDED FG_DEFAULTBG_BLACKBG_WHITE BG_EXTENDED BG_DEFAULTFG_BRIGHT_BLACKFG_BRIGHT_WHITEBG_BRIGHT_BLACKBG_BRIGHT_WHITE?C:\PYTHON\_runtimes\venv\Lib\site-packages\wcwidth/sgr_state.pyr r s E D C FI EKG FMLJMIKJHHKJHHKJOOOOOOrKr z\x1b\[([\d;:]*)mz\x1b\[[\d;:]*mzceZdZUdZdZded<dZded<dZded<dZded<dZ ded<dZ ded <dZ ded <dZ ded <dZ ded <dZded <dZded<dZded<dS) _SGRStatea Track active SGR terminal attributes by category (immutable). :param bold: Bold attribute (SGR 1). :param dim: Dim/faint attribute (SGR 2). :param italic: Italic attribute (SGR 3). :param underline: Underline attribute (SGR 4). :param blink: Slow blink attribute (SGR 5). :param rapid_blink: Rapid blink attribute (SGR 6). :param inverse: Inverse/reverse attribute (SGR 7). :param hidden: Hidden/invisible attribute (SGR 8). :param strikethrough: Strikethrough attribute (SGR 9). :param double_underline: Double underline attribute (SGR 21). :param foreground: Foreground color as tuple of SGR params, or None for default. :param background: Background color as tuple of SGR params, or None for default. Fboolbolddimitalic underlineblink rapid_blinkinversehidden strikethroughdouble_underlineNtuple[int, ...] | None foreground background)r(r)r*r+rP__annotations__rQrRrSrTrUrVrWrXrYr[r\rJrKrLrNrNKs"DCFIEKGFM""""")-J----)-J------rKrNstatereturnrOc|jpP|jpI|jpB|jp;|jp4|jp-|jp&|jp|jp|j p|j dup|j duS)z Return True if any attributes are set. :param state: The SGR state to check. :returns: True if any attribute differs from default. N) rPrQrRrSrTrUrVrWrXrYr[r\)r^s rL_sgr_state_is_activeraos J L%) Lu| Lu L{ L#/ L38= LDIL L" L&+&< Lt+ L05/?t/KMrKstrc  t|sdS|jdf|jdf|jdf|jdf|jdf|jdf|jdf|jd f|j d f|j d fg }d |D}|j 7| d d|j D|j7| d d|jDdd |dS)z Generate minimal SGR sequence to restore this state from reset. :param state: The SGR state to convert. :returns: SGR escape sequence string, or empty string if no attributes set. 12345678921cg|] \}}|| SrJrJ).0activecodes rL z*_sgr_state_to_sequence..s! < < <|vtV z)_sgr_state_to_sequence..(@@!s1vv@@@@@@rKc34K|]}t|VdSrvrwrxs rLrzz)_sgr_state_to_sequence..r{rKz[m)rarPrQrRrSrTrUrVrWrXrYr[appendjoinr\)r^ bool_attrsparamss rL_sgr_state_to_sequencer|s)  & &r SEIs+elC-@ #c 2U5F4L u|S1E4G3M  & J = [1, 31, 4]. Empty params (e.g., ``\x1b[m``) are treated as [0] (reset). Colon-separated extended colors like ``\x1b[38:2::255:0:0m`` are returned as tuples: [(38, 2, 255, 0, 0)]. :param sequence: SGR escape sequence string. :returns: List of integer parameters or tuples for colon-separated colors. r rrt:c4g|]}|rt|ndS)r)intrxs rLrsz%_parse_sgr_params..s'BBBAq'SVVVaBBBrK) _SGR_PATTERNmatchgroupsplitr~tupler)rr params_strresultparampartss rL_parse_sgr_paramsrs   x ( (E  QJ s *,F!!#&&66 %<<CBS1A1ABBBE MM%,, ' ' ' ' MM4#e***1 5 5 5 5 MrKrIterator[int | tuple[int, ...]]baserrZc t|}t|trdS|dkr8t|}t|trdSt|d|fS|dkrt|t|t|}}}t|ts*t|tst|trdSt|d|||fSn#t$rYnwxYwdS)a9 Parse extended color (256-color or RGB) from parameter iterator. :param params: Iterator of remaining SGR parameters (semicolon-separated format). :param base: Base code (38 for foreground, 48 for background). :returns: Color tuple like (38, 5, N) or (38, 2, R, G, B), or None if malformed. Nrr )next isinstancerr StopIteration)rrmodenrgbs rL_parse_extended_colorrs  F|| dE " " 4 199V A!U## tIIq!$ $ 1996llDLL$v,,!qA!U## z!U';'; z!U?S?S tIIq!Q* *       4s)$C/*C/C/&A2C/C// C<;C<c( t|}t|}|D]}t|trt |dkr-|dt jkr||}n?t |dkr,|dt jkr||}|t j krt}|t j kr|d}|t j kr|d}|t j kr|d}&|t jkr|d }N|t jkr|d }v|t jkr|d }|t jkr|d }|t jkr|d }|t jkr|d}|t jkr|d}>|t jkr|dd}g|t jkr|d}|t jkr|dd}|t jkr|dd}|t jkr|d } |t jkr|d }1|t jkr|d}Yt j|cxkrt jks&nt j|cxkrt jkrnn||f}t j |cxkrt j!ks&nt j"|cxkrt j#krnn||f}|t j$kr|d}A|t j%kr|d}i|t jkr4tM|t jx}r||}|t jkr2tM|t jx}r||}|S)z Parse SGR sequence and return new state with updates applied. :param state: Current SGR state. :param sequence: SGR escape sequence string. :returns: New SGRState with updates applied. r r)r[)r\T)rP)rQ)rR)rS)rT)rU)rV)rW)rX)rYF)rPrQ)rSrY)rTrUN)'riterrrlenr r@_replacerDr,_SGR_STATE_DEFAULTr-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?rFrGrBrCrHrIrArEr)r^r params_listrrycolors rL_sgr_state_updaters$H--K +  F A9A9 a   1vv{{qtt'777!44Q11)9!9!9!44   ??&EE $)^^NNN--EE $(]]NNtN,,EE $+  NN$N//EE $. NNTN22EE $*__NNN..EE $" " "NNtN44EE $,  NN4N00EE $+  NN$N//EE $$ $ $NNN66EE $' ' 'NNDN99EE $# # #NN5N99EE $/ ! !NN%N00EE $$ $ $NNUUNKKEE $. NNENBBEE $" " "NN5N11EE $/ ! !NN%N00EE $( ( (NNN77EEmq1111DM1111%BBBBd.BBBBBBNNqdN33EEmq1111DM1111%BBBBd.BBBBBBNNqdN33EE $/ ! !NNdN33EE $/ ! !NNdN33EE $" " "-fd6FGGGu 9%88 $" " "-fd6FGGGu 9%88 LrKlines Sequence[str] list[str]ctd|Dr|st|Sg}t}|D]}t|}t|D]$}t ||}%|r||zn|}t|r |tz}| ||S)a' Propagate SGR codes across wrapped lines. When text with SGR styling is wrapped across multiple lines, each line needs to be self-contained for proper display. This function: - Ends each line with ``\x1b[0m`` if styles are active (prevents bleeding) - Starts each subsequent line with the active style restored :param lines: List of text lines, possibly containing SGR sequences. :returns: List of lines with SGR codes propagated. Example:: >>> propagate_sgr(['\x1b[31mhello', 'world\x1b[0m']) ['\x1b[31mhello\x1b[0m', '\x1b[31mworld\x1b[0m'] This is useful in cases of making special editors and viewers, and is used for the default modes (propagate_sgr=True) of :func:`wcwidth.wrap` and :func:`wcwidth.clip`. When wrapping and clipping text containing SGR sequences, maybe a previous line enabled the BLUE color--if we are viewing *only* the line following, we would want the carry over the BLUE color, and all lines with sequences should end with terminating reset (``\x1b[0m``). c3JK|]}t|VdSrv)_SGR_QUICK_CHECKsearch)rplines rLrzz propagate_sgr..>s1??&&t,,??????rK) anylistrrrfinditerrrra _SGR_RESETr~)rrr^rprefixr output_lines rL propagate_sgrr$s4 ????? ? ?uE{{F E # #'.."**400 < rs#""""" 6666666666 &&&&&7&&&Zrz-.. 2:/00 ..... ...BY[[ M M M M''''8<:NNNNb//////rK