VBFj, ^UdZddlmZddlZddlZddlmZGddejZeddd d ed dd d ed dd d eddd d edddd edddd dZ de d<GddejZ GddejZ dS)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)wcswidthc8eZdZUded<ded<ded<ded<dS) _FieldMetastrnameintlowhighdefaultN)__name__ __module__ __qualname____annotations__AC:\PYTHON\_runtimes\venv\Lib\site-packages\wcwidth/text_sizing.pyrr*s4 III HHH IIILLLLLrrscale)r r r r width numerator denominatorvertical_alignhorizontal_align)swndvhzdict[str, _FieldMeta]TEXT_FIELD_MAPPINGceZdZUdZdZded<dZded<dZded<dZded<dZ ded <dZ ded <dd Z ddZ e dddZdS)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). rr rrrrrrrreturnrcdfdtD}jjd|dS)z Return a compact representation including only non-default fields. This avoids verbose output when most fields are defaults. z, c3K|]A}t|j|jk |jdt|jVBdS)=N)getattrr r ).0fieldselfs r z,TextSizingParams.__repr__..UshLL!& 'ej 9 9U] J J!& HHWT5:-F-FHH J J J JLLr())joinr$values __class__r)r.repr_fmts` r__repr__zTextSizingParams.__repr__Nsq99LLLL*<*C*C*E*ELLLLL.)77H7777rcg}tD]?\}}t||jx}|jkr||d|@d|S)z0Build and return sub-part of an OSC 66 sequence.r*:)r$itemsr+r r appendr2)r.parts field_keyr-vals r make_sequencezTextSizingParams.make_sequenceZsv 2 8 8 : : 3 3 IutUZ000U]BB 11C11222xxrparseraw control_codesci}|s |S|dD]7}d|vr|dkrtd|d|#|d\}}}t|}||dkrtd|d|t t |} n6#t$r)} |dkrtd |d|d | | Yd} ~ d} ~ wwxYw|dkrF| |jks | |jkr0td |d|d |d |jd|jd|j t|jt|j| ||j<9|di|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) r8r*strictz5Expected '=' in text sizing parameter (key=val), got z in OSC 66 sequence, NzUnknown text sizing field 'z' in OSC 66 sequence, zIllegal 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 maxmin) clsr@rAkwargspartkey_eqr=r-valueexcs r from_paramszTextSizingParams.from_paramscso$)+ 355LIIcNN H HD$ H,,$&Q,0&Q&QIL&Q&QRRR NN3//MCc&**3//E} H,,$&D3&D&D classmethodrQrrrr&r&:s  ENNNNENNNNIKN 8 8 8 80000[000rr&c^eZdZUdZded<ded<ded<eddd ZdddZddZdS) TextSizingzBBasic horizontal width measurement for kitty text sizing protocol.r&paramsrtext terminatorr?match re.Match[str]rAr'c|t|d||d|dS)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)rAr)rXrYrZ)r&rQgroup)rJr[rAs r from_matchzTextSizing.from_matchsX&s*66u{{1~~Ub6cc A#kk!nn... .rrambiguous_widthr c|jjdkr|jj|jjzSt|j|}|dkrd}|jj|zS)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)ra)rXrrrrY)r.rars r display_widthzTextSizing.display_widths[ ; q ;$t{'88 8 TY @ @ @ q55A{ 1$$rcXd|jd|j|jS)z3Build and return complete OSC 66 Terminal Sequence.z]66;;)rXr>rYrZ)r.s rr>zTextSizing.make_sequences/T$+3355TT T4?TTTrNrS)r[r\rArr'rW)r)rar r'r rR) rrrrTrrUr`rcr>rrrrWrWsLL IIIOOO....[.,%%%%%&UUUUUUrrW) rT __future__rretyping _wcswidthr NamedTuplerr$rr&rWrrrrks<#"""""  " aa ; ; ; aa ; ; ; !"a @ @ @ AB B B B )qq! D D D +A F F F -H-HHHHHZZZZZv(ZZZz3U3U3U3U3U"3U3U3U3U3Ur