a
    hbòfÁ|  ã                   @   sÀ  d Z ddlZddlZddl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lmZmZmZmZmZmZ ddlmZ g d¢Zg d	¢Zed
d„ ƒZG dd„ deƒZG dd„ ded�ZG dd„ deƒZG dd„ deƒZ G dd„ dƒZ!e!ƒ Z"G dd„ de#ƒZ$G dd„ dƒZ%dd„ Z&G dd„ dƒZ'e'ƒ Z(dd „ Z)G d!d"„ d"ƒZ*G d#d$„ d$eƒZ+G d%d&„ d&eƒZ,G d'd(„ d(ee,d�Z-G d)d*„ d*ƒZ.G d+d,„ d,e-ƒZ/d-d.„ Z0G d/d0„ d0e,ƒZ1G d1d2„ d2e-e1d�Z2dS )3z´
    pygments.lexer
    ~~~~~~~~~~~~~~

    Base lexer classes.

    :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
é    N)Úapply_filtersÚFilter)Úget_filter_by_name)ÚErrorÚTextÚOtherÚ
_TokenType)Úget_bool_optÚget_int_optÚget_list_optÚmake_analysatorÚFutureÚguess_decode)Ú	regex_opt)ÚLexerÚ
RegexLexerÚExtendedRegexLexerÚDelegatingLexerÚLexerContextÚincludeÚinheritÚbygroupsÚusingÚthisÚdefaultÚwords))s   ï»¿úutf-8)s   ÿþ  zutf-32)s     þÿzutf-32be)s   ÿþzutf-16)s   þÿzutf-16bec                 C   s   dS )Nç        © ©Úxr   r   úW/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/pip/_vendor/pygments/lexer.pyÚ<lambda>!   ó    r"   c                   @   s   e Zd ZdZdd„ ZdS )Ú	LexerMetaz‚
    This metaclass automagically converts ``analyse_text`` methods into
    static methods which always return float values.
    c                 C   s(   d|v rt |d ƒ|d< t | |||¡S )NÚanalyse_text)r   ÚtypeÚ__new__)ÚmcsÚnameÚbasesÚdr   r   r!   r'   *   s    zLexerMeta.__new__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   r   r   r   r!   r$   $   s   r$   c                   @   sZ   e Zd ZdZdZg Zg Zg Zg ZdZ	dd„ Z
dd„ Zdd	„ Zd
d„ Zddd„Zdd„ ZdS )r   aÈ  
    Lexer for a specific language.

    Basic options recognized:
    ``stripnl``
        Strip leading and trailing newlines from the input (default: True).
    ``stripall``
        Strip all leading and trailing whitespace from the input
        (default: False).
    ``ensurenl``
        Make sure that the input ends with a newline (default: True).  This
        is required for some lexers that consume input linewise.

        .. versionadded:: 1.3

    ``tabsize``
        If given and greater than 0, expand tabs in the input (default: 0).
    ``encoding``
        If given, must be an encoding name. This encoding will be used to
        convert the input string to Unicode, if it is not already a Unicode
        string (default: ``'guess'``, which uses a simple UTF-8 / Locale /
        Latin1 detection.  Can also be ``'chardet'`` to use the chardet
        library, if it is installed.
    ``inencoding``
        Overrides the ``encoding`` if given.
    Nr   c                 K   s„   || _ t|ddƒ| _t|ddƒ| _t|ddƒ| _t|ddƒ| _| dd	¡| _| d
¡pZ| j| _g | _	t
|ddƒD ]}|  |¡ qpd S )NÚstripnlTÚstripallFÚensurenlÚtabsizer   ÚencodingÚguessÚ
inencodingÚfiltersr   )Úoptionsr	   r0   r1   r2   r
   r3   Úgetr4   r7   r   Ú
add_filter)Úselfr8   Úfilter_r   r   r!   Ú__init__^   s    zLexer.__init__c                 C   s(   | j rd| jj| j f S d| jj S d S )Nz<pygments.lexers.%s with %r>z<pygments.lexers.%s>)r8   Ú	__class__r,   ©r;   r   r   r!   Ú__repr__j   s
    ÿzLexer.__repr__c                 K   s*   t |tƒst|fi |¤Ž}| j |¡ dS )z8
        Add a new stream filter to this lexer.
        N)Ú
isinstancer   r   r7   Úappend)r;   r<   r8   r   r   r!   r:   q   s    
zLexer.add_filterc                 C   s   dS )a~  
        Has to return a float between ``0`` and ``1`` that indicates
        if a lexer wants to highlight this text. Used by ``guess_lexer``.
        If this method returns ``0`` it won't highlight it in any case, if
        it returns ``1`` highlighting with this lexer is guaranteed.

        The `LexerMeta` metaclass automatically wraps this function so
        that it works like a static method (no ``self`` or ``cls``
        parameter) and the return value is automatically converted to
        `float`. If the return value is an object that is boolean `False`
        it's the same as if the return values was ``0.0``.
        Nr   )Útextr   r   r!   r%   y   s    zLexer.analyse_textFc              
      s¾  t ˆtƒ�sˆ jdkr$tˆƒ\‰}nàˆ jdkrÜzddlm} W n. tyl } ztdƒ|‚W Y d}~n
d}~0 0 d}tD ].\}}ˆ |¡rvˆt	|ƒd…  
|d¡} q¦qv|du rÖ| ˆdd… ¡}	ˆ 
|	 d	¡pÐd
d¡}|‰n(ˆ 
ˆ j¡‰ˆ d¡�r"ˆt	dƒd… ‰nˆ d¡�r"ˆt	dƒd… ‰ˆ dd¡‰ˆ dd¡‰ˆ j�rLˆ ¡ ‰nˆ j�r^ˆ d¡‰ˆ jdk�rvˆ ˆ j¡‰ˆ j�r’ˆ d¡�s’ˆd7 ‰‡ ‡fdd„}
|
ƒ }|�sºt|ˆ jˆ ƒ}|S )a=  
        Return an iterable of (tokentype, value) pairs generated from
        `text`. If `unfiltered` is set to `True`, the filtering mechanism
        is bypassed even if filters are defined.

        Also preprocess the text, i.e. expand tabs and strip it if
        wanted and applies registered filters.
        r5   Úchardetr   )rD   zkTo enable chardet encoding guessing, please install the chardet library from http://chardet.feedparser.org/NÚreplacei   r4   r   u   ï»¿z
Ú
úc                  3   s$   ˆ   ˆ¡D ]\} }}||fV  q
d S ©N)Úget_tokens_unprocessed)Ú_ÚtÚv©r;   rC   r   r!   Ústreamerº   s    z"Lexer.get_tokens.<locals>.streamer)rA   Ústrr4   r   Úpip._vendorrD   ÚImportErrorÚ_encoding_mapÚ
startswithÚlenÚdecodeÚdetectr9   rE   r1   Ústripr0   r3   Ú
expandtabsr2   Úendswithr   r7   )r;   rC   Ú
unfilteredrJ   rD   ÚeÚdecodedÚbomr4   ÚencrN   Ústreamr   rM   r!   Ú
get_tokens‡   sR    	

þ
ÿ

zLexer.get_tokensc                 C   s   t ‚dS )zú
        Return an iterable of (index, tokentype, value) pairs where "index"
        is the starting position of the token within the input text.

        In subclasses, implement this method as a generator to
        maximize effectiveness.
        N)ÚNotImplementedErrorrM   r   r   r!   rI   Â   s    zLexer.get_tokens_unprocessed)F)r,   r-   r.   r/   r)   ÚaliasesÚ	filenamesÚalias_filenamesÚ	mimetypesÚpriorityr=   r@   r:   r%   r`   rI   r   r   r   r!   r   0   s   
;r   )Ú	metaclassc                   @   s$   e Zd ZdZefdd„Zdd„ ZdS )r   a   
    This lexer takes two lexer as arguments. A root lexer and
    a language lexer. First everything is scanned using the language
    lexer, afterwards all ``Other`` tokens are lexed using the root
    lexer.

    The lexers from the ``template`` lexer package use this base lexer.
    c                 K   s<   |f i |¤Ž| _ |f i |¤Ž| _|| _tj| fi |¤Ž d S rH   )Ú
root_lexerÚlanguage_lexerÚneedler   r=   )r;   Ú_root_lexerÚ_language_lexerÚ_needler8   r   r   r!   r=   ×   s    zDelegatingLexer.__init__c                 C   sŠ   d}g }g }| j  |¡D ]H\}}}|| ju rP|rF| t|ƒ|f¡ g }||7 }q| |||f¡ q|rx| t|ƒ|f¡ t|| j |¡ƒS )NÚ )ri   rI   rj   rB   rT   Údo_insertionsrh   )r;   rC   ÚbufferedÚ
insertionsÚ
lng_bufferÚirK   rL   r   r   r!   rI   Ý   s    


ÿz&DelegatingLexer.get_tokens_unprocessedN)r,   r-   r.   r/   r   r=   rI   r   r   r   r!   r   Í   s   	r   c                   @   s   e Zd ZdZdS )r   zI
    Indicates that a state should include rules from another state.
    N©r,   r-   r.   r/   r   r   r   r!   r   ô   s   r   c                   @   s   e Zd ZdZdd„ ZdS )Ú_inheritzC
    Indicates the a state should inherit from its superclass.
    c                 C   s   dS )Nr   r   r?   r   r   r!   r@   ÿ   s    z_inherit.__repr__N)r,   r-   r.   r/   r@   r   r   r   r!   ru   û   s   ru   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Úcombinedz:
    Indicates a state combined from multiple states.
    c                 G   s   t  | |¡S rH   )Útupler'   )ÚclsÚargsr   r   r!   r'   
  s    zcombined.__new__c                 G   s   d S rH   r   )r;   ry   r   r   r!   r=     s    zcombined.__init__N)r,   r-   r.   r/   r'   r=   r   r   r   r!   rv     s   rv   c                   @   sF   e Zd ZdZdd„ Zddd„Zddd„Zdd	d
„Zdd„ Zdd„ Z	dS )Ú_PseudoMatchz:
    A pseudo match object constructed from a string.
    c                 C   s   || _ || _d S rH   )Ú_textÚ_start)r;   ÚstartrC   r   r   r!   r=     s    z_PseudoMatch.__init__Nc                 C   s   | j S rH   )r|   ©r;   Úargr   r   r!   r}     s    z_PseudoMatch.startc                 C   s   | j t| jƒ S rH   )r|   rT   r{   r~   r   r   r!   Úend  s    z_PseudoMatch.endc                 C   s   |rt dƒ‚| jS )NzNo such group)Ú
IndexErrorr{   r~   r   r   r!   Úgroup!  s    z_PseudoMatch.groupc                 C   s   | j fS rH   )r{   r?   r   r   r!   Úgroups&  s    z_PseudoMatch.groupsc                 C   s   i S rH   r   r?   r   r   r!   Ú	groupdict)  s    z_PseudoMatch.groupdict)N)N)N)
r,   r-   r.   r/   r=   r}   r€   r‚   rƒ   r„   r   r   r   r!   rz     s   


rz   c                     s   d‡ fdd„	}|S )zL
    Callback that yields multiple actions for each group in the match.
    Nc                 3   s¼   t ˆ ƒD ] \}}|d u rqqt|ƒtu rR| |d ¡}|r¨| |d ¡||fV  q| |d ¡}|d ur|r|| |d ¡|_|| t| |d ¡|ƒ|ƒD ]}|r˜|V  q˜q|r¸| ¡ |_d S )Né   )Ú	enumerater&   r   r‚   r}   Úposrz   r€   )ÚlexerÚmatchÚctxrs   ÚactionÚdataÚitem©ry   r   r!   Úcallback1  s$    ÿ
zbygroups.<locals>.callback)Nr   )ry   r�   r   rŽ   r!   r   -  s    r   c                   @   s   e Zd ZdZdS )Ú_ThiszX
    Special singleton used for indicating the caller class.
    Used by ``using``.
    Nrt   r   r   r   r!   r�   G  s   r�   c                    sj   i ‰dˆv r:ˆ  d¡}t|ttfƒr.|ˆd< nd|fˆd< ˆ tu rTd‡‡fdd„	}nd	‡ ‡‡fdd„	}|S )
aÂ  
    Callback that processes the match with a different lexer.

    The keyword arguments are forwarded to the lexer, except `state` which
    is handled separately.

    `state` specifies the state that the new lexer will start in, and can
    be an enumerable such as ('root', 'inline', 'string') or a simple
    string which is assumed to be on top of the root state.

    Note: For that to work, `_other` must not be an `ExtendedRegexLexer`.
    ÚstateÚstackÚrootNc                 3   sr   ˆr"ˆ  | j¡ | jf i ˆ¤Ž}n| }| ¡ }|j| ¡ fi ˆ ¤ŽD ]\}}}|| ||fV  qD|rn| ¡ |_d S rH   )Úupdater8   r>   r}   rI   r‚   r€   r‡   ©rˆ   r‰   rŠ   ÚlxÚsrs   rK   rL   )Ú	gt_kwargsÚkwargsr   r!   r�   f  s     zusing.<locals>.callbackc                 3   sf   ˆ  | j¡ ˆ f i ˆ¤Ž}| ¡ }|j| ¡ fi ˆ¤ŽD ]\}}}|| ||fV  q8|rb| ¡ |_d S rH   )r”   r8   r}   rI   r‚   r€   r‡   r•   ©Ú_otherr˜   r™   r   r!   r�   u  s     )N)N)ÚpoprA   Úlistrw   r   )r›   r™   r—   r�   r   rš   r!   r   P  s    


r   c                   @   s   e Zd ZdZdd„ ZdS )r   zÑ
    Indicates a state or state action (e.g. #pop) to apply.
    For example default('#pop') is equivalent to ('', Token, '#pop')
    Note that state tuples may be used as well.

    .. versionadded:: 2.0
    c                 C   s
   || _ d S rH   )r‘   )r;   r‘   r   r   r!   r=   Š  s    zdefault.__init__N)r,   r-   r.   r/   r=   r   r   r   r!   r   ‚  s   r   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )	r   z•
    Indicates a list of literal words that is transformed into an optimized
    regex that matches any of the words.

    .. versionadded:: 2.0
    rn   c                 C   s   || _ || _|| _d S rH   )r   ÚprefixÚsuffix)r;   r   rž   rŸ   r   r   r!   r=   •  s    zwords.__init__c                 C   s   t | j| j| jd�S )N©rž   rŸ   )r   r   rž   rŸ   r?   r   r   r!   r9   š  s    z	words.getN)rn   rn   )r,   r-   r.   r/   r=   r9   r   r   r   r!   r   Ž  s   
r   c                   @   sJ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	dd„ Z
d
S )ÚRegexLexerMetazw
    Metaclass for RegexLexer, creates the self._tokens attribute from
    self.tokens on the first instantiation.
    c                 C   s    t |tƒr| ¡ }t ||¡jS )zBPreprocess the regular expression component of a token definition.)rA   r   r9   ÚreÚcompiler‰   )rx   ÚregexÚrflagsr‘   r   r   r!   Ú_process_regex¤  s    
zRegexLexerMeta._process_regexc                 C   s&   t |ƒtu s"t|ƒs"J d|f ƒ‚|S )z5Preprocess the token component of a token definition.z2token type must be simple type or callable, not %r)r&   r   Úcallable)rx   Útokenr   r   r!   Ú_process_tokenª  s    ÿzRegexLexerMeta._process_tokenc                 C   s  t |tƒrd|dkrdS ||v r$|fS |dkr0|S |dd… dkrRt|dd… ƒ S dsbJ d| ƒ‚n®t |tƒrÊd	| j }|  jd
7  _g }|D ],}||ks¦J d| ƒ‚| |  |||¡¡ qŽ|||< |fS t |tƒ�r |D ] }||v sÚ|dv sÚJ d| ƒ‚qÚ|S d�sJ d| ƒ‚dS )z=Preprocess the state transition action of a token definition.ú#popéÿÿÿÿú#pushNé   z#pop:Fzunknown new state %rz_tmp_%dr…   zcircular state ref %r)rª   r¬   zunknown new state zunknown new state def %r)rA   rO   Úintrv   Ú_tmpnameÚextendÚ_process_staterw   )rx   Ú	new_stateÚunprocessedÚ	processedÚ	tmp_stateÚitokensÚistater   r   r!   Ú_process_new_state°  s<    



ÿÿþz!RegexLexerMeta._process_new_statec                 C   s’  t |ƒtu sJ d| ƒ‚|d dks0J d| ƒ‚||v r@|| S g  }||< | j}|| D �]0}t|tƒr˜||ks~J d| ƒ‚| |  ||t|ƒ¡¡ qZt|tƒr¤qZt|tƒrØ|  	|j
||¡}| t d¡jd|f¡ qZt |ƒtu sðJ d| ƒ‚z|  |d ||¡}W n@ t�yF }	 z&td	|d || |	f ƒ|	‚W Y d}	~	n
d}	~	0 0 |  |d
 ¡}
t|ƒdk�rjd}n|  	|d ||¡}| ||
|f¡ qZ|S )z%Preprocess a single state definition.zwrong state name %rr   ú#zinvalid state name %rzcircular state reference %rrn   Nzwrong rule def %rz+uncompilable regex %r in state %r of %r: %sr…   é   )r&   rO   ÚflagsrA   r   r°   r±   ru   r   r¸   r‘   rB   r¢   r£   r‰   rw   r¦   Ú	ExceptionÚ
ValueErrorr©   rT   )rx   r³   r´   r‘   Útokensr¥   Útdefr²   ÚrexÚerrr¨   r   r   r!   r±   Ó  sH    
ÿ

ÿÿ
ÿzRegexLexerMeta._process_stateNc                 C   s<   i  }| j |< |p| j| }t|ƒD ]}|  |||¡ q$|S )z-Preprocess a dictionary of token definitions.)Ú_all_tokensr¾   r�   r±   )rx   r)   Ú	tokendefsr´   r‘   r   r   r!   Úprocess_tokendefÿ  s
    zRegexLexerMeta.process_tokendefc           
   
   C   sÖ   i }i }| j D ]Â}|j di ¡}| ¡ D ]¦\}}| |¡}|du rz|||< z| t¡}W n tyn   Y q(Y n0 |||< q(| |d¡}|du r�q(||||d …< z| t¡}	W n tyÀ   Y q(0 ||	 ||< q(q|S )a  
        Merge tokens from superclasses in MRO order, returning a single tokendef
        dictionary.

        Any state that is not defined by a subclass will be inherited
        automatically.  States that *are* defined by subclasses will, by
        default, override that state in the superclass.  If a subclass wishes to
        inherit definitions from a superclass, it can use the special value
        "inherit", which will cause the superclass' state definition to be
        included at that point in the state.
        r¾   Nr…   )Ú__mro__Ú__dict__r9   ÚitemsÚindexr   r½   rœ   )
rx   r¾   ÚinheritableÚcÚtoksr‘   rÇ   ÚcuritemsÚinherit_ndxÚnew_inh_ndxr   r   r!   Úget_tokendefs  s0    


zRegexLexerMeta.get_tokendefsc                 O   sR   d| j vr:i | _d| _t| dƒr(| jr(n|  d|  ¡ ¡| _tj	| g|¢R i |¤ŽS )z:Instantiate cls after preprocessing its token definitions.Ú_tokensr   Útoken_variantsrn   )
rÆ   rÂ   r¯   ÚhasattrrÑ   rÄ   rÏ   rÐ   r&   Ú__call__)rx   ry   Úkwdsr   r   r!   rÓ   8  s    
zRegexLexerMeta.__call__)N)r,   r-   r.   r/   r¦   r©   r¸   r±   rÄ   rÏ   rÓ   r   r   r   r!   r¡   ž  s   #,
1r¡   c                   @   s$   e Zd ZdZejZi Zddd„ZdS )r   z±
    Base for simple stateful regular expression-based lexers.
    Simplifies the lexing process so that you need only
    provide a list of states and regular expressions.
    ©r“   c                 c   sÀ  d}| j }t|ƒ}||d  }|D �](\}}}	|||ƒ}
|
r"|durrt|ƒtu rb|||
 ¡ fV  n|| |
ƒE dH  |
 ¡ }|	du�rHt|	tƒrÚ|	D ]D}|dkr´t|ƒdkrÖ| 	¡  q’|dkrÌ| 
|d ¡ q’| 
|¡ q’nbt|	tƒ�rt|	ƒt|ƒk�r|dd…= n
||	d…= n,|	dk�r*| 
|d ¡ nd�s<J d|	 ƒ‚||d  } qq"zP|| d	k�r„d
g}|d
 }|td	fV  |d7 }W q|t|| fV  |d7 }W q t�y¸   Y �q¼Y q0 qdS )z}
        Split ``text`` into (tokentype, text) pairs.

        ``stack`` is the inital stack (default: ``['root']``)
        r   r«   Nrª   r…   r¬   Fúwrong state def: %rrF   r“   )rÐ   r�   r&   r   r‚   r€   rA   rw   rT   rœ   rB   r®   Úabsr   r   r�   )r;   rC   r’   r‡   rÃ   Ú
statestackÚstatetokensÚrexmatchr‹   r²   Úmr‘   r   r   r!   rI   i  sR    




z!RegexLexer.get_tokens_unprocessedN)rÕ   )	r,   r-   r.   r/   r¢   Ú	MULTILINEr»   r¾   rI   r   r   r   r!   r   F  s   r   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )r   z9
    A helper object that holds lexer position data.
    Nc                 C   s*   || _ || _|pt|ƒ| _|p"dg| _d S )Nr“   )rC   r‡   rT   r€   r’   )r;   rC   r‡   r’   r€   r   r   r!   r=   ¬  s    zLexerContext.__init__c                 C   s   d| j | j| jf S )NzLexerContext(%r, %r, %r))rC   r‡   r’   r?   r   r   r!   r@   ²  s    ÿzLexerContext.__repr__)NN)r,   r-   r.   r/   r=   r@   r   r   r   r!   r   §  s   
r   c                   @   s   e Zd ZdZddd„ZdS )r   zE
    A RegexLexer that uses a context object to store its state.
    Nc                 c   s:  | j }|st|dƒ}|d }n|}||jd  }|j}|D �]`\}}}|||j|jƒ}	|	r:|dur°t|ƒtu rŒ|j||	 ¡ fV  |	 ¡ |_n$|| |	|ƒE dH  |s°||jd  }|du�r˜t	|t
ƒ�r|D ]P}
|
dkrðt|jƒdkrî|j ¡  qÊ|
dk�r|j |jd ¡ qÊ|j |
¡ qÊnlt	|tƒ�rZt|ƒt|jƒk�rL|jdd…= n|j|d…= n0|dk�rx|j |jd ¡ nd�sŠJ d	| ƒ‚||jd  } q6q:zz|j|jk�r´W �q6||j d
k�rôdg|_|d }|jtd
fV  | jd7  _W q6|jt||j fV  | jd7  _W q6 t�y2   Y �q6Y q60 q6dS )z
        Split ``text`` into (tokentype, text) pairs.
        If ``context`` is given, use this lexer context instead.
        r   r“   r«   Nrª   r…   r¬   FrÖ   rF   )rÐ   r   r’   rC   r‡   r€   r&   r   r‚   rA   rw   rT   rœ   rB   r®   r×   r‘   r   r   r�   )r;   rC   ÚcontextrÃ   rŠ   rÙ   rÚ   r‹   r²   rÛ   r‘   r   r   r!   rI   ¼  s`    




z)ExtendedRegexLexer.get_tokens_unprocessed)NN)r,   r-   r.   r/   rI   r   r   r   r!   r   ·  s   r   c              	   c   s¨  t | ƒ} zt| ƒ\}}W n ty6   |E dH  Y dS 0 d}d}|D ]ð\}}}|du rZ|}d}	|�r|t|ƒ |k�r||	|| … }
|
r¢|||
fV  |t|
ƒ7 }|D ]"\}}}|||fV  |t|ƒ7 }q¦|| }	zt| ƒ\}}W q^ t�y    d}Y �qY q^0 q^|	t|ƒk rD||||	d… fV  |t|ƒ|	 7 }qD|�r¤|�pDd}|D ]$\}}}|||fV  |t|ƒ7 }�qJzt| ƒ\}}W n t�yž   d}Y �q¤Y n0 �q6dS )ag  
    Helper for lexers which must combine the results of several
    sublexers.

    ``insertions`` is a list of ``(index, itokens)`` pairs.
    Each ``itokens`` iterable should be inserted at position
    ``index`` into the token stream given by the ``tokens``
    argument.

    The result is a combined token stream.

    TODO: clean up the code here.
    NTr   F)ÚiterÚnextÚStopIterationrT   )rq   r¾   rÈ   r¶   ÚrealposÚinsleftrs   rK   rL   ÚoldiÚtmpvalÚit_indexÚit_tokenÚit_valueÚpr   r   r!   ro   ÿ  sN    

ro   c                   @   s   e Zd ZdZdd„ ZdS )ÚProfilingRegexLexerMetaz>Metaclass for ProfilingRegexLexer, collects regex timing info.c                    sL   t |tƒr t|j|j|jd�‰n|‰t ˆ|¡‰tjf‡ ‡‡‡fdd„	}|S )Nr    c                    s`   ˆ j d  ˆˆfddg¡}t ¡ }ˆ | ||¡}t ¡ }|d  d7  < |d  || 7  < |S )Nr«   r   r   r…   )Ú
_prof_dataÚ
setdefaultÚtimer‰   )rC   r‡   ÚendposÚinfoÚt0ÚresÚt1©rx   ÚcompiledrÀ   r‘   r   r!   Ú
match_funcJ  s    z:ProfilingRegexLexerMeta._process_regex.<locals>.match_func)	rA   r   r   rž   rŸ   r¢   r£   ÚsysÚmaxsize)rx   r¤   r¥   r‘   rô   r   rò   r!   r¦   B  s    

ÿz&ProfilingRegexLexerMeta._process_regexN)r,   r-   r.   r/   r¦   r   r   r   r!   ré   ?  s   ré   c                   @   s"   e Zd ZdZg ZdZddd„ZdS )ÚProfilingRegexLexerzFDrop-in replacement for RegexLexer that does profiling of its regexes.é   rÕ   c                 #   sÂ   ˆ j j i ¡ t ˆ ||¡E d H  ˆ j j ¡ }tdd„ | ¡ D ƒ‡ fdd„dd�}tdd„ |D ƒƒ}t	ƒ  t	dˆ j j
t|ƒ|f ƒ t	d	ƒ t	d
d ƒ t	dƒ |D ]}t	d| ƒ q¤t	d	ƒ d S )Nc                 s   sN   | ]F\\}}\}}|t |ƒ d ¡ dd¡dd… |d| d| | fV  qdS )zu'z\\ú\NéA   iè  )ÚreprrW   rE   )Ú.0r—   ÚrÚnrK   r   r   r!   Ú	<genexpr>`  s   þÿz=ProfilingRegexLexer.get_tokens_unprocessed.<locals>.<genexpr>c                    s
   | ˆ j  S rH   )Ú_prof_sort_indexr   r?   r   r!   r"   c  r#   z<ProfilingRegexLexer.get_tokens_unprocessed.<locals>.<lambda>T)ÚkeyÚreversec                 s   s   | ]}|d  V  qdS )é   Nr   )rü   r    r   r   r!   rÿ   e  r#   z2Profiling result for %s lexing %d chars in %.3f mszn==============================================================================================================z$%-20s %-64s ncalls  tottime  percall)r‘   r¤   zn--------------------------------------------------------------------------------------------------------------z%-20s %-65s %5d %8.4f %8.4f)r>   rê   rB   r   rI   rœ   ÚsortedrÇ   ÚsumÚprintr,   rT   )r;   rC   r’   ÚrawdatarŒ   Ú	sum_totalr+   r   r?   r!   rI   [  s(    þ
üÿz*ProfilingRegexLexer.get_tokens_unprocessedN)rÕ   )r,   r-   r.   r/   rê   r   rI   r   r   r   r!   r÷   U  s   r÷   )3r/   r¢   rõ   rì   Úpip._vendor.pygments.filterr   r   Úpip._vendor.pygments.filtersr   Úpip._vendor.pygments.tokenr   r   r   r   Úpip._vendor.pygments.utilr	   r
   r   r   r   r   Úpip._vendor.pygments.regexoptr   Ú__all__rR   ÚstaticmethodÚ_default_analyser&   r$   r   r   rO   r   ru   r   rw   rv   rz   r   r�   r   r   r   r   r¡   r   r   r   ro   ré   r÷   r   r   r   r!   Ú<module>   sD   
  '2 )aH@