o
    °-$`r  ã                   @   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	y'   dZY nw g d¢Z
G d	d
„ d
eƒZG dd„ deƒZG dd„ deƒ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   ú>/usr/lib/python3/dist-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   sj   || _ || _|| _d| _|dv s|dkrdS tstdƒ‚z	t| jƒ| _W dS  tjj	y4   td| ƒ‚w )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__0   s   ÿÿzLexer.__init__c                 c   sv   � t |ƒ}t|ƒ\}}|D ]\}}||u r||7 }q||fV  ||}}q| d¡r0|dd… }|r9||fV  dS dS )zrMerge subsequent tokens of same token-type.

           Also strip the final newline (added by pygments).
        Ú
Néÿÿÿÿ)ÚiterÚnextÚendswith)r   ÚtokensÚlasttypeÚlastvalÚttypeÚvaluer   r   r   ÚmergeK   s   €


ÿzLexer.mergec                 c   s„   � | j du rg | jfV  dS t | j| j ¡}|  |¡D ]$\}}| jdkr.t|ƒ ¡  d¡}nt	|ƒg}dd„ |D ƒ}||fV  qdS )z7Parse self.code and yield "classified" tokens.
        NÚlongÚ.c                 S   s   g | ]}|t vr|‘qS r   )Úunstyled_tokens)Ú.0Úclsr   r   r   Ú
<listcomp>i   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%   r2   r   r   r   r   r      s
    
r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚNumberLinesat  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 splitted.c                 C   s"   || _ || _dtt|ƒƒ | _d S )Nz%%%dd )r    Ú	startlineÚlenr-   Úfmt_str)r   r    r5   Úendliner   r   r   r   z   s   zNumberLines.__init__c                 c   s€   � | j }dg| j| fV  | jD ]-\}}| d¡}|d d… D ]}||d fV  |d7 }dg| j| fV  q||d fV  qd S )NÚlnr   r   é   )r5   r7   r    r/   )r   Úlinenor#   r$   ÚlinesÚliner   r   r   r2   €   s   €
úzNumberLines.__iter__N)r	   r
   r   r3   r   r2   r   r   r   r   r4   m   s    r4   )r3   Údocutilsr   r   Úpygments.lexersr   Úpygments.formatters.htmlr   r   ÚImportErrorr(   r   Úobjectr   r4   r   r   r   r   Ú<module>   s   ÿQ