U
    [ªSh8  ã                   @   sŒ   d Z ddlmZ z(ddlZddlmZ ddlmZ dZW n e	k
rP   dZY nX dd	d
gZ
G dd„ deƒZG dd„ dƒZG dd„ dƒZdS )z@Lexical analysis of formal languages (i.e. code) using Pygments.é    )ÚApplicationErrorN)Úget_lexer_by_name)Ú_get_ttype_classTFÚtokenÚtextÚ c                   @   s   e Zd ZdS )Ú
LexerErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úO/root/rtd-docs/venv/lib/python3.8/site-packages/docutils/utils/code_analyzer.pyr      s   r   c                   @   s*   e Zd ZdZd
dd„Zdd„ Zdd„ Zd	S )ÚLexera¡  Parse `code` lines and yield "classified" tokens.

    Arguments

      code       -- string of source code to parse,
      language   -- formal language the code is written in,
      tokennames -- either 'long', 'short', or 'none' (see below).

    Merge subsequent tokens of the same token-type.

    Iterating over an instance yields the tokens as ``(tokentype, value)``
    tuples. The value of `tokennames` configures the naming of the tokentype:

      'long':  downcased full token type name,
      'short': short name defined by pygments.token.STANDARD_TYPES
               (= class argument used in pygments html output),
      'none':  skip lexical analysis.
    Úshortc                 C   sr   || _ || _|| _d| _|dks(|dkr,dS ts8tdƒ‚zt| jƒ| _W n$ tjj	k
rl   td| ƒ‚Y nX dS )zE
        Set up a lexical analyzer for `code` in `language`.
        N)r   r   Únonez0Cannot analyze code. Pygments package not found.z6Cannot analyze code. No Pygments lexer found for "%s".)
ÚcodeÚlanguageÚ
tokennamesÚlexerÚwith_pygmentsr   r   ÚpygmentsÚutilÚClassNotFound)Úselfr   r   r   r   r   r   Ú__init__/   s    ÿzLexer.__init__c                 c   sp   t |ƒ}t|ƒ\}}|D ].\}}||kr2||7 }q||fV  || }}q| d¡r^|dd… }|rl||fV  dS )zrMerge subsequent tokens of same token-type.

           Also strip the final newline (added by pygments).
        Ú
Néÿÿÿÿ)ÚiterÚnextÚendswith)r   ÚtokensZlasttypeZlastvalÚttypeÚvaluer   r   r   ÚmergeJ   s    


zLexer.mergec                 c   s‚   | j dkrg | jfV  dS t | j| j ¡}|  |¡D ]H\}}| jdkrZt|ƒ ¡  d¡}n
t	|ƒg}dd„ |D ƒ}||fV  q4dS )z7Parse self.code and yield "classified" tokens.
        NÚlongÚ.c                 S   s   g | ]}|t kr|‘qS r   )Úunstyled_tokens)Ú.0Úclsr   r   r   Ú
<listcomp>h   s      z"Lexer.__iter__.<locals>.<listcomp>)
r   r   r   Úlexr#   r   ÚstrÚlowerÚsplitr   )r   r    Ú	tokentyper"   Úclassesr   r   r   Ú__iter__\   s    


zLexer.__iter__N)r   )r	   r
   r   Ú__doc__r   r#   r0   r   r   r   r   r      s   
r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚNumberLinesaq  Insert linenumber-tokens at the start of every code line.

    Arguments

       tokens    -- iterable of ``(classes, value)`` tuples
       startline -- first line number
       endline   -- last line number

    Iterating over an instance yields the tokens with a
    ``(['ln'], '<the line number>')`` token added for every code line.
    Multi-line tokens are split.c                 C   s"   || _ || _dtt|ƒƒ | _d S )Nz%%%dd )r    Ú	startlineÚlenr+   Úfmt_str)r   r    r3   Úendliner   r   r   r   y   s    zNumberLines.__init__c                 c   s~   | j }dg| j| fV  | jD ]Z\}}| d¡}|d d… D ],}||d fV  |d7 }dg| j| fV  q<||d fV  qd S )NÚlnr   r   é   )r3   r5   r    r-   )r   Úlinenor!   r"   ÚlinesÚliner   r   r   r0      s    
zNumberLines.__iter__N)r	   r
   r   r1   r   r0   r   r   r   r   r2   l   s   r2   )r1   Zdocutilsr   r   Zpygments.lexersr   Zpygments.formatters.htmlr   r   ÚImportErrorr&   r   r   r2   r   r   r   r   Ú<module>   s   
þQ