U
    cc                     @   sb   d Z ddlmZmZmZ ddlmZmZmZ ddl	m
Z
 ddlmZmZ dgZG dd deZd	S )
z"
Completer for a regular grammar.
    )DictIterableList)CompleteEvent	Completer
Completion)Document   )Match_CompiledGrammarGrammarCompleterc                   @   sn   e Zd ZdZeeeef ddddZe	e
ee dddZee
ee d	d
dZee ee dddZdS )r   af  
    Completer which can be used for autocompletion according to variables in
    the grammar. Each variable can have a different autocompleter.

    :param compiled_grammar: `GrammarCompleter` instance.
    :param completers: `dict` mapping variable names of the grammar to the
                       `Completer` instances to be used for each variable.
    N)compiled_grammar
completersreturnc                 C   s   || _ || _d S N)r   r   )selfr   r    r   m/var/www/html/project/venv/lib/python3.8/site-packages/prompt_toolkit/contrib/regular_languages/completion.py__init__   s    zGrammarCompleter.__init__)documentcomplete_eventr   c                 c   s2   | j |j}|r.| | ||}|E d H  d S r   )r   Zmatch_prefixZtext_before_cursor_remove_duplicates_get_completions_for_match)r   r   r   mZcompletionsr   r   r   get_completions!   s    
z GrammarCompleter.get_completions)matchr   r   c                 c   s   |  D ]}|j}|j}| j|}|r|j}| j||}t|t	|}	|
|	|D ]J}
|dt	||
j  |
j }t| j|||t	|j |
j|
jdV  qVqdS )z
        Yield all the possible completions for this input string.
        (The completer assumes that the cursor position was at the end of the
        input string.)
        N)textstart_positiondisplaydisplay_meta)Z	end_nodesvarnamestartr   getvaluer   unescaper   lenr   r   r   r   escapestringr   r   )r   r   r   Zmatch_variabler    r!   Z	completerr   Zunwrapped_textr   
completionnew_textr   r   r   r   -   s&    z+GrammarCompleter._get_completions_for_match)itemsr   c                 C   s$   g }|D ]}||kr| | q|S )z
        Remove duplicates, while keeping the order.
        (Sometimes we have duplicates, because the there several matches of the
        same grammar, each yielding similar completions.)
        )append)r   r*   resultir   r   r   r   S   s
    z#GrammarCompleter._remove_duplicates)__name__
__module____qualname____doc__r   r   strr   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r      s   
 
  &N)r1   typingr   r   r   Zprompt_toolkit.completionr   r   r   Zprompt_toolkit.documentr   compilerr
   r   __all__r   r   r   r   r   <module>   s   