U
    d;                  	   @  s4  d dl 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 er\d dlmZ d dlmZ dddd	d
ddddg	Ze	eeef eeeeegdf f f Zee Zerd dlmZ G dd deZe	edeeg ef df Zd"d	dddddd
ZdddddZG dd deZG dd dZdd	d d!dZdS )#    )annotations)TYPE_CHECKINGAnyCallableIterableListTupleUnioncast)
MouseEvent)Protocol)NotImplementedOrNoneOneStyleAndTextTupleStyleAndTextTuplesMagicFormattedTextAnyFormattedTextto_formatted_textis_formatted_textTemplatemerge_formatted_textFormattedTextr   )	TypeGuardc                   @  s   e Zd ZdZddddZdS )r   zi
        Any object that implements ``__pt_formatted_text__`` represents formatted
        text.
        r   returnc                 C  s   d S N selfr   r   F/tmp/pip-unpacked-wheel-4x_7prb2/prompt_toolkit/formatted_text/base.py__pt_formatted_text__)   s    z(MagicFormattedText.__pt_formatted_text__N)__name__
__module____qualname____doc__r   r   r   r   r   r   #   s   N Fstrbool)valuestyleauto_convertr   c                   s   | dkrg }nvt | tr$d| fg}n`t | tr4| }nPt| drNtd|  }n6t| rdt|   dS |rvd|  fg}ntd| f  rtt	 fdd|D }t |t
r|S t
|S dS )	at  
    Convert the given value (which can be formatted text) into a list of text
    fragments. (Which is the canonical form of formatted text.) The outcome is
    always a `FormattedText` instance, which is a list of (style, text) tuples.

    It can take a plain text string, an `HTML` or `ANSI` object, anything that
    implements `__pt_formatted_text__` or a callable that takes no arguments and
    returns one of those.

    :param style: An additional style string which is applied to all text
        fragments.
    :param auto_convert: If `True`, also accept other types, and convert them
        to a string first.
    Nr$   r   r   r(   z]No formatted text. Expecting a unicode object, HTML, ANSI or a FormattedText instance. Got %rc                   s"   g | ]^}} d  | f|qS ) r   ).0Z
item_stylerestr*   r   r   
<listcomp>`   s     z%to_formatted_text.<locals>.<listcomp>)
isinstancer%   listhasattrr
   r   callabler   
ValueErrorr   r   )r'   r(   r)   resultr   r*   r   r   7   s2    



objectzTypeGuard[AnyFormattedText])r'   r   c                 C  s0   t | rdS t| ttfrdS t| dr,dS dS )z
    Check whether the input is valid formatted text (for use in assert
    statements).
    In case of a callable, it doesn't check the return type.
    Tr   F)r2   r/   r%   r0   r1   )r'   r   r   r   r   l   s    
c                      s4   e Zd ZdZddddZdd fddZ  ZS )	r   z
    A list of ``(style, text)`` tuples.

    (In some situations, this can also be ``(style, text, mouse_handler)``
    tuples.)
    r   r   c                 C  s   | S r   r   r   r   r   r   r      s    z#FormattedText.__pt_formatted_text__r%   c                   s   dt    S )NzFormattedText(%s))super__repr__r   	__class__r   r   r7      s    zFormattedText.__repr__)r    r!   r"   r#   r   r7   __classcell__r   r   r8   r   r   {   s   c                   @  s0   e Zd ZdZdddddZdddd	d
ZdS )r   z
    Template for string interpolation with formatted text.

    Example::

        Template(' ... {} ... ').format(HTML(...))

    :param text: Plain text.
    r%   None)textr   c                 C  s   d|kst || _d S )Nz{0})AssertionErrorr<   )r   r<   r   r   r   __init__   s    zTemplate.__init__r   )valuesr   c                   s   dd fdd}|S )Nr   r   c                    sp    j d} t| d tks$tt }t| D ]$\}}|d|f |t| q4|d| d f |S )Nz{}   r$   )	r<   splitlenr=   r   zipappendextendr   )partsr4   partvalr   r?   r   r   
get_result   s    z#Template.format.<locals>.get_resultr   )r   r?   rK   r   rJ   r   format   s    zTemplate.formatN)r    r!   r"   r#   r>   rL   r   r   r   r   r      s   
zIterable[AnyFormattedText])itemsr   c                   s   dd fdd}|S )zH
    Merge (Concatenate) several pieces of formatted text together.
    r   r   c                    s"   t  }  D ]}| t| q
| S r   )r   rF   r   )r4   irM   r   r   _merge_formatted_text   s    z3merge_formatted_text.<locals>._merge_formatted_textr   )rM   rP   r   rO   r   r      s    )r$   F)
__future__r   typingr   r   r   r   r   r   r	   r
   Zprompt_toolkit.mouse_eventsr   Ztyping_extensionsr   Z'prompt_toolkit.key_binding.key_bindingsr   __all__r%   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sJ   ("

   5