VBFjX dZddlmZddlmZgdZddlmZddlm Z ddl m Z dd l m Z m Z mZdd lmZmZmZmZmZmZmZdd lmZdd lmZdd lmZmZddlmZm Z m!Z!m"Z"ddl#m$Z$m%Z%m&Z&m'Z'm(Z(dZ)e*+ddd,de-ddDdzd,de-ddDzZ. d)d*d Z/d!d"ddd#d+d'Z0d(S),z8This is a high-level width() supporting terminal output.) annotations)Literal) zwcwidth._constantszwcwidth._wcswidthzwcwidth._wcwidthzwcwidth.bisearchzwcwidth.control_codeszwcwidth.escape_sequenceszwcwidth.table_graphemezwcwidth.table_vs16zwcwidth.text_sizing)table_grapheme_overrideswcwidth)bisearch)wcswidth wcstwidth_scan_zwj_cluster_end)_EMOJI_ZWJ_SET_ISC_VIRAMA_SET_CATEGORY_MC_TABLE_FITZPATRICK_RANGE_REGIONAL_INDICATOR_SETresolve_terminalget_term_overrides)VS15_WIDE_TO_NARROW)VS16_NARROW_TO_WIDE) TextSizingTextSizingParams) ILLEGAL_CTRL VERTICAL_CTRLHORIZONTAL_CTRLZERO_WIDTH_CTRL)_SEQUENCE_CLASSIFYTEXT_SIZING_PATTERNCURSOR_MOVEMENT_SEQUENCEINDETERMINATE_EFFECT_SEQUENCEstrip_sequencesc#4K|]}t|VdSNchr.0cs r+0( . .qCFF . . . . . . c#4K|]}t|VdSr$r%r's r*r+r+2r,r-Ftextstrambiguous_widthint term_program bool | strreturnc|dur6tt|t|St t|t||S)z Fast path for width() with control_codes='ignore'. Strips escape sequences and control characters, then measures remaining text. F)r5)r5r7)r r translate_CONTROL_CHAR_TABLEr )r3r5r7s r*_width_ignored_codesr=6s|u D ! ! + +,? @ @+     ''(;<<'!   r-parse) control_codestabsizer5r7r@$Literal['parse', 'strict', 'ignore']rAc |r#|rt|S|dkrRt|tkr:d|vr6d|vr2d|vr.d|vs(t j|st j|sd}|dkrt||St|}|rNt|}|j }|j }|j } |j } |j} |j} t!j|} nd}d}d} d} d} d} i} |d k}d }d }d }t|}d krt$nfd }d }d}d }d}d }d}d }d }d }t&d}t(d}t*}||krk||} | dkr|r||z }||kr|}d }t-j||}!|!s|d z }n|!}"|r)t3j|"rt5d|d|"|!dx}#2|#rt7|#nd }$|rt5d|d|"d|$d z }n |!dx}%||%rt7|%nd z }n|!dx}&B|&rt7|&nd }'|r|'|krt5d|d|'d|d||'z}|d krd }n|!dx}(m|!d})|!d}*|)|*Jt9t;j|(| |)|*}+||+z }|! }d }d}d}||kr|}| tBvrC|r#t5d!tE| d"d#||r||z }||kr|}d }|d z }d }d}d}H| tFvrC|r#t5d$tE| d"d#||r||z }||kr|}d }|d z }d }d}d}| tHvrm|r||z }||kr|}d }| dkr|d kr ||||zz z }n/| dkr |d kr|d z}n| dkr|rt5d%|d&d }||kr|}|d z }d }d}d} | tJvr|r||z }||kr|}d }|d z }d }d}d}1tE| },|,d'kr|r|d z }n|d z|krs| rg|d kra|tLvrXtO|||}-|||-}.| |.}/|/&||/|z z }tQ||}d }d}d }d}d}|-}d }d}|d(z }nd}|d z }|,d)kr,|d kr&|r |||rn|||rd(}d }|d z }|,d*krP|d krJ|}0t+|0|}1| rt+|0| rd}1|1r|d(kr|d z}tQ||}|d z }[|,d+kr|,tRvrhd }2|d z }3|3d krHtE||3tRvr,|2d z }2|3d z}3|3d krtE||3tRv,|2d(zd kr |,}|d z }n6tTd |,cxkrtTd krnn|tLvr|d z }|| }4|4d(kr|rt+|,|rd }4n|4d(kr| rt+|,| rd }4|4d kr| rt+|,| rd(}4n|4d kr| rt+|,| rd }4|4d kr|rd(}n|rd}5| r|d kr{|||d z}6| |6}/|/||/z}tQ||}d,}5d }nB|||}7| |7}/|/||/z}tQ||}n ||z }n||z }||kr|}|5s|4}|}|}|}n|4}|}|}|}|}|,}|4}|}d}n,|,tVvrd,}n |d kr||,tXrd(}d }d}nd}|d z }||kk|rZ| rK|d krE|||}7| |7}/|/||/z}tQ||}n||z }||kr|}n ||z }||kr|}|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)r7strictrrc&t|dS)Nautor)r)r5s r*zwidth..sgaQ`>a>ar-Fz9.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 startts_metats_textts_term)r@zIllegal control character z#xz at position zVertical movement character z-Horizontal movement character \r at position z: indeterminate starting columni iiiT)-isascii isprintablelen_WIDTH_FAST_PATH_MIN_LENrsearchrr=rrnarrower vs16_narrower vs15_widerzeroer narrow_wider narrow_zeroerrgetrrrr rmatchgroupr ValueErrorr6rr from_params display_widthendrordrrrr r maxrrrr)8r3r@rAr5r7term_canonical overrides _narrower_vs16_narrower _vs15_wider_zeroer _narrow_wider_narrow_zeroer_grapheme_overridesrJ current_col max_extentidxtext_len_wcwidthlast_measured_idxlast_measured_ucslast_measured_wprev_was_virama_max_extent_before cluster_startcol_before_clustermax_extent_before_cluster cluster_width vs16_nw_table vs15_wn_table _bisearchcharmseqrP target_colrQrR n_backwardrSrTrU text_sizeucs cluster_endcluster override_wbase_ucs vs15_narrow ri_beforejwflushed candidate cluster_texts8 ` r*widthrIsv h ||~~$**,,4yyCII0H$H$H t  D 0 0T5E5ET!!,3D99"+2488"!)   #D/ UUUU&l33N!&~66 & "0* "!. "06:>JJ     h &FKJ C4yyH *Q..ww4a4a4a4aHOOM !M'0M'0MI ..Cy 6>> "}, ++!,J ! "(s33A* qggiib;A#FFb$%`RU%`%`Y\%`%`aaaWWW---E:/4!;U!J(ASAA"AAA#-q.KK$%GGL$9$99jFj#G3z???aGKK%&WW]%;%;;kH5@!G[!1!1!1aJ*{":":(666)66CN666  :-K"Q&' !"!3!33g@ggi00Gggi00G".73F3FF *(4WMZZZ!*!*I 9#:#:?#K#KKKeegg "  " MZ''(  <   ` !^c$ii!^!^!^Y\!^!^___ "}, ++!,J ! 1HC "  " M  =  b !`D !`!`!`[^!`!`aaa "}, ++!,J ! 1HC "  " M  ? " " "}, ++!,J ! t||! w+*?@@ ??1$K$8888 Z''( 1HC "  " M  ? " " "}, ++!,J ! 1HC "  " M $ii &== qq8##'!-22-??"7>OQY"Z"ZK"#4[#@AG!4!8!8!A!AJ!-# _(DE %([%A%A ,.),.)*+*/(* ) #$"'q"'q  &==.!33 ")),=~"N"N ",m<< " ! "  1HC  &==.!33(H"8];;K $x+>> $#  B!33q  !3[AA 1HC  <<--- !G1ffT!W1H!H!HNIFA1ffT!W1H!H!Hq=A%%(+%1HC&%Q'3GGGG2DQ2GGGGGG'>99q HTNN 66i6HS)$<$<6AA !VVVHS'$:$:VA 66m6m(D(D6AA !VVV8C+H+HVA q55# 7 ! ! 7&1=A+=+= $]37%: ;I!4!8!8!C!CJ!-&8:&E %()BK%P%P "&() '+M#,='> %8%<%<\%J%J %1*>J%0:=  !:KHH }, ++!,J = (KZ''( r-N)rF)r3r4r5r6r7r8r9r6) r3r4r@rBrAr6r5r6r7r8r9r6)1__doc__ __future__rtypingr__lazy_modules__r"rrxrr _wcswidthr r r _constantsr rrrrrr table_vs15r table_vs16r text_sizingrrr@rrrrescape_sequencesrrrrr rZr4 maketransjoinranger<r=rrIr-r*rs|>>""""""   '&&&&&AAAAAAAAAA------------------,+++++++++++55555555XXXXXXXXXXXX00000000000000mmBGG . .EE$-- . . ...  GG . .EE$-- . . .../<=49,;B$ zzzzzzzzr-