B
    ¿Âûb–#  ã               @   s6  d Z ddlZddlmZ e d¡Ze dejejB ejB ¡Z	e dej
ejB ejB ¡Ze dej¡ZG dd	„ d	eƒZG d
d„ deƒZd2dd„Zd3dd„Zd4dd„Zd5dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zi Zdd „ Zd!d"„ Zd6d#d$„Zd7d&d'„ZG d(d)„ d)ƒZ d*d+„ Z!d,d-„ Z"d.d/„ Z#G d0d1„ d1eƒZ$dS )8z±
    pygments.util
    ~~~~~~~~~~~~~

    Utility functions.

    :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
é    N)ÚTextIOWrapperz[/\\ ]z”
    <!DOCTYPE\s+(
     [a-zA-Z_][a-zA-Z0-9]*
     (?: \s+      # optional in HTML5
     [a-zA-Z_][a-zA-Z0-9]*\s+
     "[^"]*")?
     )
     [^>]*>
z<(.+?)(\s.*?)?>.*?</.+?>z\s*<\?xml[^>]*\?>c               @   s   e Zd ZdZdS )ÚClassNotFoundzCRaised if one of the lookup functions didn't find a matching class.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú,lib/python3.7/site-packages/pygments/util.pyr      s   r   c               @   s   e Zd ZdS )ÚOptionErrorN)r   r   r   r   r   r   r	   r
   "   s   r
   Fc             C   s@   |   ||¡}|r| ¡ }||kr<td|d tt|ƒ¡f ƒ‚|S )Nz%Value for option %s must be one of %sz, )ÚgetÚlowerr
   ÚjoinÚmapÚstr)ÚoptionsÚoptnameZallowedÚdefaultÚnormcaseÚstringr   r   r	   Úget_choice_opt&   s    r   c             C   s|   |   ||¡}t|tƒr|S t|tƒr,t|ƒS t|tƒsHtd||f ƒ‚n0| ¡ dkrXdS | ¡ dkrhdS td||f ƒ‚d S )NzBInvalid type %r for option %s; use 1/0, yes/no, true/false, on/off)Ú1ZyesÚtrueZonT)Ú0ÚnoZfalseZoffFzCInvalid value %r for option %s; use 1/0, yes/no, true/false, on/off)r   Ú
isinstanceÚboolÚintr   r
   r   )r   r   r   r   r   r   r	   Úget_bool_opt0   s    


r   c             C   s`   |   ||¡}yt|ƒS  tk
r8   td||f ƒ‚Y n$ tk
rZ   td||f ƒ‚Y nX d S )Nz=Invalid type %r for option %s; you must give an integer valuez>Invalid value %r for option %s; you must give an integer value)r   r   Ú	TypeErrorr
   Ú
ValueError)r   r   r   r   r   r   r	   Úget_int_optD   s    r    c             C   sH   |   ||¡}t|tƒr| ¡ S t|ttfƒr4t|ƒS td||f ƒ‚d S )Nz9Invalid type %r for option %s; you must give a list value)r   r   r   ÚsplitÚlistÚtupler
   )r   r   r   Úvalr   r   r	   Úget_list_optR   s    
r%   c             C   sR   | j s
dS g }x4| j  ¡  ¡ D ]"}| ¡ r>| d| ¡  ¡ qP qW d |¡ ¡ S )NÚ ú )r   ÚstripÚ
splitlinesÚappendr   Úlstrip)ÚobjZresÚliner   r   r	   Údocstring_headline^   s    r.   c                s   ‡ fdd„}ˆ j |_ t|ƒS )zAReturn a static text analyser function that returns float values.c          	      s\   yˆ | ƒ}W n t k
r    dS X |s*dS ytdtdt|ƒƒƒS  ttfk
rV   dS X d S )Ng        g      ð?)Ú	ExceptionÚminÚmaxÚfloatr   r   )ÚtextÚrv)Úfr   r	   Útext_analysel   s    z%make_analysator.<locals>.text_analyse)r   Ústaticmethod)r5   r6   r   )r5   r	   Úmake_analysatorj   s    r8   c             C   sœ   |   d¡}|dkr$| d|…  ¡ }n|  ¡ }| d¡r˜y(dd„ t |dd…  ¡ ¡D ƒd }W n tk
rr   d	S X t d
| tj	¡}| 
|¡dk	r˜dS d	S )aò  Check if the given regular expression matches the last part of the
    shebang if one exists.

        >>> from pygments.util import shebang_matches
        >>> shebang_matches('#!/usr/bin/env python', r'python(2\.\d)?')
        True
        >>> shebang_matches('#!/usr/bin/python2.4', r'python(2\.\d)?')
        True
        >>> shebang_matches('#!/usr/bin/python-ruby', r'python(2\.\d)?')
        False
        >>> shebang_matches('#!/usr/bin/python/ruby', r'python(2\.\d)?')
        False
        >>> shebang_matches('#!/usr/bin/startsomethingwith python',
        ...                 r'python(2\.\d)?')
        True

    It also checks for common windows executable file extensions::

        >>> shebang_matches('#!C:\\Python2.4\\Python.exe', r'python(2\.\d)?')
        True

    Parameters (``'-f'`` or ``'--foo'`` are ignored so ``'perl'`` does
    the same as ``'perl -e'``)

    Note that this method automatically searches the whole string (eg:
    the regular expression is wrapped in ``'^$'``)
    Ú
r   Nz#!c             S   s   g | ]}|r|  d ¡s|‘qS )ú-)Ú
startswith)Ú.0Úxr   r   r	   ú
<listcomp>ž   s    z#shebang_matches.<locals>.<listcomp>é   éÿÿÿÿFz^%s(\.(exe|cmd|bat|bin))?$T)Úfindr   r;   Úsplit_path_rer!   r(   Ú
IndexErrorÚreÚcompileÚ
IGNORECASEÚsearch)r3   ÚregexÚindexZ
first_lineÚfoundr   r   r	   Úshebang_matches{   s    


rK   c             C   s<   t  | ¡}|dkrdS | d¡}t |tj¡ | ¡ ¡dk	S )zÁCheck if the doctype matches a regular expression (if present).

    Note that this method only checks the first part of a DOCTYPE.
    eg: 'html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"'
    NFé   )Údoctype_lookup_rerG   ÚgrouprD   rE   ÚIÚmatchr(   )r3   rH   ÚmZdoctyper   r   r	   Údoctype_matches¨   s
    

rR   c             C   s
   t | dƒS )z3Check if the file looks like it has a html doctype.Zhtml)rR   )r3   r   r   r	   Úhtml_doctype_matchesµ   s    rS   c             C   sl   t  | ¡rdS t| ƒ}yt| S  tk
rf   t | ¡}|dk	rDdS t | dd… ¡dk	}|t|< |S X dS )z2Check if a doctype exists or if we have some tags.TNiè  )Úxml_decl_rerP   ÚhashÚ_looks_like_xml_cacheÚKeyErrorrM   rG   Útag_re)r3   ÚkeyrQ   r4   r   r   r	   Úlooks_like_xml½   s    

rZ   c             C   s   d| d?  d| d@  fS )zoGiven a unicode character code with length greater than 16 bits,
    return the two 16 bit surrogate pair.
    iÀ×  é
   i Ü  iÿ  r   )Úcr   r   r	   ÚsurrogatepairÍ   s    r]   c       	      C   s¬   g }d| d }d|d  d }|  ||  d ¡ |rXx\|D ]}|  || d ¡ q<W n<x:|D ]2}t|d ƒ}|  ||dd…  |d	  d ¡ q^W |  |d
 ¡ d |¡S )z)Formats a sequence of strings for output.r'   é   rL   z = (ú,ú"Néþÿÿÿr@   ú)r9   )r*   Úreprr   )	Zvar_nameÚseqÚrawZindent_levelÚlinesZbase_indentZinner_indentÚiÚrr   r   r	   Úformat_linesÖ   s    

&ri   r   c             C   sB   g }t ƒ }x2| D ]*}||ks||kr&q| |¡ | |¡ qW |S )za
    Returns a list with duplicates removed from the iterable `it`.

    Order is preserved.
    )Úsetr*   Úadd)ÚitZalready_seenZlstÚseenrg   r   r   r	   Úduplicates_removedé   s    

rn   c               @   s   e Zd ZdZdd„ ZdS )ÚFuturez‡Generic class to defer some work.

    Handled specially in RegexLexerMeta, to support regex string construction at
    first use.
    c             C   s   t ‚d S )N)ÚNotImplementedError)Úselfr   r   r	   r   ÿ   s    z
Future.getN)r   r   r   r   r   r   r   r   r	   ro   ù   s   ro   c             C   st   y|   d¡} | dfS  tk
rn   y ddl}| ¡ }|   ¡ } | |fS  ttfk
rh   |   d¡} | dfS X Y nX dS )zÃDecode *text* with guessed encoding.

    First try UTF-8; this should fail for non-UTF-8 encodings.
    Then try the preferred locale encoding.
    Fall back to latin-1, which always works.
    zutf-8r   NÚlatin1)ÚdecodeÚUnicodeDecodeErrorÚlocaleÚgetpreferredencodingÚLookupError)r3   ru   Zprefencodingr   r   r	   Úguess_decode  s    

rx   c             C   sD   t |ddƒr<y|  |j¡} W n tk
r0   Y nX | |jfS t| ƒS )zÊDecode *text* coming from terminal *term*.

    First try the terminal encoding, if given.
    Then try UTF-8.  Then try the preferred locale encoding.
    Fall back to latin-1, which always works.
    ÚencodingN)Úgetattrrs   ry   rt   rx   )r3   Útermr   r   r	   Úguess_decode_from_terminal  s    
r|   c             C   s"   t | ddƒr| jS ddl}| ¡ S )z7Return our best guess of encoding for the given *term*.ry   Nr   )rz   ry   ru   rv   )r{   ru   r   r   r	   Úterminal_encoding)  s    r}   c               @   s   e Zd Zdd„ ZdS )ÚUnclosingTextIOWrapperc             C   s   |   ¡  d S )N)Úflush)rq   r   r   r	   Úclose3  s    zUnclosingTextIOWrapper.closeN)r   r   r   r€   r   r   r   r	   r~   1  s   r~   )NF)N)N)N)Fr   )r   )%r   rD   Úior   rE   rB   ÚDOTALLÚ	MULTILINEÚVERBOSErM   rF   rX   rO   rT   r   r   r/   r
   r   r   r    r%   r.   r8   rK   rR   rS   rV   rZ   r]   ri   rn   ro   rx   r|   r}   r~   r   r   r   r	   Ú<module>	   s:   





-	


