B
    <[?              	   @   s   d Z ddlmZ y(ddlZddlmZ ddlmZ dZW n e	e
fk
rT   dZY nX dd	d
g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   ;lib/python3.7/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 '' (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y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   Znonez0Cannot analyze code. Pygments package not found.z6Cannot analyze code. No Pygments lexer found for "%s".)
codelanguage
tokennameslexerwith_pygmentsr   r   pygmentsutilZClassNotFound)selfr   r   r   r   r   r   __init__0   s    zLexer.__init__c             c   st   t |}t|\}}x6|D ].\}}||kr4||7 }q||fV  || }}qW |drb|dd }|rp||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   mergeH   s    


zLexer.mergec             c   s   | j dkrg | jfV  dS t| j| j }xV| |D ]H\}}| jdkr\t| d}n
t	|g}dd |D }||fV  q6W dS )z7Parse self.code and yield "classified" tokens.
        NZlong.c             S   s   g | ]}|t kr|qS r   )unstyled_tokens).0clsr   r   r   
<listcomp>f   s    z"Lexer.__iter__.<locals>.<listcomp>)
r   r   r   Zlexr!   r   strlowersplitr   )r   r   Z	tokentyper    classesr   r   r   __iter__Z   s    


zLexer.__iter__N)r   )r	   r
   r   __doc__r   r!   r+   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   r.   Zendliner   r   r   r   w   s    zNumberLines.__init__c             c   s   | j }dg| j| fV  xh| jD ]^\}}|d}x<|d d D ],}||d fV  |d7 }dg| j| fV  q@W ||d fV  q W d S )NZlnr   r      )r.   r0   r   r)   )r   linenor   r    linesliner   r   r   r+   }   s    
zNumberLines.__iter__N)r	   r
   r   r,   r   r+   r   r   r   r   r-   j   s   r-   )r,   Zdocutilsr   r   Zpygments.lexersr   Zpygments.formatters.htmlr   r   ImportErrorSyntaxErrorr#   r   objectr   r-   r   r   r   r   <module>   s   
N