U
    ‰dë  ã                   @  s¦   d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZ ddd	d
dgZdddœdd„Zdddœdd„Zdddœdd	„Zdddœdd
„Zdddœdd„ZdS )z¿
Utilities for manipulating formatted text.

When ``to_formatted_text`` has been called, we get a list of ``(style, text)``
tuples. This file contains functions for manipulating such a list.
é    )Úannotations)ÚIterableÚcast©Ú
get_cwidthé   )ÚAnyFormattedTextÚOneStyleAndTextTupleÚStyleAndTextTuplesÚto_formatted_textÚto_plain_textÚfragment_list_lenÚfragment_list_widthÚfragment_list_to_textÚsplit_linesr   Ústr)ÚvalueÚreturnc                 C  s   t t| ƒƒS )z?
    Turn any kind of formatted text back into plain text.
    )r   r   )r   © r   úG/tmp/pip-unpacked-wheel-4x_7prb2/prompt_toolkit/formatted_text/utils.pyr      s    r
   Úint)Ú	fragmentsr   c                   s   d‰ t ‡ fdd„| D ƒƒS )z²
    Return the amount of characters in this text fragment list.

    :param fragments: List of ``(style_str, text)`` or
        ``(style_str, text, mouse_handler)`` tuples.
    ú[ZeroWidthEscape]c                 3  s&   | ]}ˆ |d  krt |d ƒV  qdS ©r   r   N)Úlen©Ú.0Úitem©ZZeroWidthEscaper   r   Ú	<genexpr>,   s      z$fragment_list_len.<locals>.<genexpr>©Úsum©r   r   r   r   r   $   s    c                   s   d‰ t ‡ fdd„| D ƒƒS )zÞ
    Return the character width of this text fragment list.
    (Take double width characters into account.)

    :param fragments: List of ``(style_str, text)`` or
        ``(style_str, text, mouse_handler)`` tuples.
    r   c                 3  s0   | ](}|d  D ]}ˆ |d krt |ƒV  qqdS )r   r   Nr   )r   r   Úcr   r   r   r   8   s
   
 ýz&fragment_list_width.<locals>.<genexpr>r    r"   r   r   r   r   /   s    þc                   s   d‰ d  ‡ fdd„| D ƒ¡S )zœ
    Concatenate all the text parts again.

    :param fragments: List of ``(style_str, text)`` or
        ``(style_str, text, mouse_handler)`` tuples.
    r   Ú c                 3  s"   | ]}ˆ |d  kr|d V  qdS r   r   r   r   r   r   r   H   s      z(fragment_list_to_text.<locals>.<genexpr>)Újoinr"   r   r   r   r   @   s    zIterable[StyleAndTextTuples]c                 c  s|   g }| D ]h^}}}|  d¡}|dd… D ]*}|rH| tt||f|˜ƒ¡ |V  g }q(| tt||d f|˜ƒ¡ q|V  dS )a  
    Take a single list of (style_str, text) tuples and yield one such list for each
    line. Just like str.split, this will yield at least one item.

    :param fragments: List of (style_str, text) or (style_str, text, mouse_handler)
                      tuples.
    Ú
Néÿÿÿÿ)ÚsplitÚappendr   r	   )r   ÚlineÚstyleÚstringZmouse_handlerÚpartsÚpartr   r   r   r   K   s    
N)Ú__doc__Ú
__future__r   Útypingr   r   Zprompt_toolkit.utilsr   Úbaser   r	   r
   r   Ú__all__r   r   r   r   r   r   r   r   r   Ú<module>   s   û	