B
    "ecn                 @   s  d Z ddlmZ ddlmZmZmZ ddlmZ ddl	m
Z
mZmZ ddlmZ erpddlmZmZ dd	lmZ d
ddgZG dd
 d
eZG dd dZdejfed eddddZd ed ddddZd!eeddddZddddZded dddZdS )"z
Search operations.

For the key bindings implementation with attached filters, check
`prompt_toolkit.key_binding.bindings.search`. (Use these for new key bindings
instead of calling these function directly.)
    )Enum)TYPE_CHECKINGDictOptional   )get_app)FilterOrBoolis_searching	to_filter)	InputMode)BufferControlSearchBufferControl)LayoutSearchDirectionstart_searchstop_searchc               @   s   e Zd ZdZdZdS )r   FORWARDBACKWARDN)__name__
__module____qualname__r   r    r   r   4lib/python3.7/site-packages/prompt_toolkit/search.pyr      s   c               @   sN   e Zd ZdZdZdejdfeeeddddZ	ed	d
dZ
d d	ddZdS )SearchStateaw  
    A search 'query', associated with a search field (like a SearchToolbar).

    Every searchable `BufferControl` points to a `search_buffer_control`
    (another `BufferControls`) which represents the search field. The
    `SearchState` attached to that search field is used for storing the current
    search query.

    It is possible to have one searchfield for multiple `BufferControls`. In
    that case, they'll share the same `SearchState`.
    If there are multiple `BufferControls` that display the same `Buffer`, then
    they can have a different `SearchState` each (if they have a different
    search control).
    )text	directionignore_case FN)r   r   r   returnc             C   s   || _ || _t|| _d S )N)r   r   r
   r   )selfr   r   r   r   r   r   __init__1   s    zSearchState.__init__)r   c             C   s   d | jj| j| j| jS )Nz*{}({!r}, direction={!r}, ignore_case={!r}))format	__class__r   r   r   r   )r   r   r   r   __repr__<   s
    zSearchState.__repr__c             C   s,   | j tjkrtj}ntj}t| j|| jdS )zm
        Create a new SearchState where backwards becomes forwards and the other
        way around.
        )r   r   r   )r   r   r   r   r   r   r   )r   r   r   r   r   
__invert__D   s
    zSearchState.__invert__)r   r   r   __doc__	__slots__r   r   strr   r    r#   r$   r   r   r   r   r      s   
r   Nr   )buffer_controlr   r   c             C   s~   ddl m} | dks"t| |s"tt j}| dkrHt|j|sBdS |j} | j}|rz|| j_	|
| | |j|< tjt j_dS )z
    Start search through the given `buffer_control` using the
    `search_buffer_control`.

    :param buffer_control: Start search for this `BufferControl`. If not given,
        search through the current control.
    r   )r   N)prompt_toolkit.layout.controlsr   
isinstanceAssertionErrorr   layoutcurrent_controlsearch_buffer_controlsearch_stater   focussearch_linksr   ZINSERTvi_state
input_mode)r(   r   r   r,   r.   r   r   r   r   S   s    

)r(   r   c             C   s|   t  j}| dkr*|j} | dkr"dS | j}n| |j ks<tt||  }||  |dk	rl|j|= |j	
  tjt  j_dS )z9
    Stop search through the given `buffer_control`.
    N)r   r,   search_target_buffer_controlr.   r1   valuesr+   _get_reverse_search_linksr0   bufferresetr   Z
NAVIGATIONr2   r3   )r(   r,   r.   r   r   r   r   z   s    

)r   countr   c             C   s~   t  s
tt j}ddlm} |j}t||s2dS |j}|dkrDdS |j	}|j
| k}|jj|_| |_
|sz|jj|d|d dS )z7
    Apply search, but keep search buffer focused.
    r   )r   NF)include_current_positionr9   )r	   r+   r   r,   r)   r   r-   r*   r4   r/   r   r7   r   apply_search)r   r9   r,   r   search_controlZprev_controlr/   Zdirection_changedr   r   r   do_incremental_search   s     



r=   )r   c              C   sx   t  j} | j}| j}ddlm} t||s.dS |dkr:dS |j}|jj	rR|jj	|_	|jj
|dd |j  t| dS )zL
    Accept current search query. Focus original `BufferControl` again.
    r   )r   NT)r:   )r   r,   r-   r4   r)   r   r*   r/   r7   r   r;   Zappend_to_historyr   )r,   r<   Ztarget_buffer_controlr   r/   r   r   r   accept_search   s    



r>   r   )r,   r   c             C   s   dd | j  D S )zC
    Return mapping from BufferControl to SearchBufferControl.
    c             S   s   i | ]\}}||qS r   r   ).0r.   r(   r   r   r   
<dictcomp>   s   z-_get_reverse_search_links.<locals>.<dictcomp>)r1   items)r,   r   r   r   r6      s    r6   )N)r   )r%   enumr   typingr   r   r   Zapplication.currentr   filtersr   r	   r
   Zkey_binding.vi_stater   r)   r   r   Zprompt_toolkit.layout.layoutr   __all__r   r   r   r   r   intr=   r>   r6   r   r   r   r   <module>   s*   5$!#