
    F,                        S r SSKJr  SSKJrJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJr  SS	KJr  SS
KrSS
KrSr " S S\" \\5      5      r " S S\5      r " S S\" \\5      5      r " S S\5      r " S S\5      r " S S\5      rg
)zC
Lexer interface and implementation.
Used for syntax highlighting.
    )unicode_literals)ABCMetaabstractmethod)with_metaclass)range)Token)to_cli_filter   )split_linesN)LexerSimpleLexerPygmentsLexer
SyntaxSyncSyncFromStart	RegexSyncc                   (    \ rS rSrSr\S 5       rSrg)r      z
Base class for all lexers.
c                     g)z
Takes a :class:`~prompt_toolkit.document.Document` and returns a
callable that takes a line number and returns the tokens for that line.
N )selfclidocuments      /lib/third_party/prompt_toolkit/layout/lexers.pylex_documentLexer.lex_document           r   N)__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes__r   r   r   r   r      s      r   r   c                   ,    \ rS rSrSr\S4S jrS rSrg)r   '   z{
Lexer that doesn't do any tokenizing and returns the whole input as one token.

:param token: The `Token` for this lexer.
Nc                 $    Xl         Ub  X l         g g Ntoken)r   r)   default_tokens      r   __init__SimpleLexer.__init__.   s    
$&J %r   c                 0   ^ ^ UR                   mUU 4S jnU$ )Nc                 N   >  TR                   TU    4/$ ! [         a    / s $ f = f)z&Return the tokens for the given line. )r)   
IndexError)linenolinesr   s    r   get_line*SimpleLexer.lex_document.<locals>.get_line7   s2    U6]344 	s    $$)r1   )r   r   r   r2   r1   s   `   @r   r   SimpleLexer.lex_document4   s    	 r   r(   )	r   r   r    r!   r"   r   r+   r   r#   r   r   r   r   r   '   s     #$ '	r   r   c                   (    \ rS rSrSr\S 5       rSrg)r   @   a  
Syntax synchroniser. This is a tool that finds a start position for the
lexer. This is especially important when editing big documents; we don't
want to start the highlighting by running the lexer from the beginning of
the file. That is very slow when editing.
c                     g)z
Return the position from where we can start lexing as a (row, column)
tuple.

:param document: `Document` instance that contains all the lines.
:param lineno: The line that we want to highlight. (We need to return
    this line, or an earlier position.)
Nr   r   r   r0   s      r   get_sync_start_position"SyntaxSync.get_sync_start_positionG   r   r   r   N)r   r   r    r!   r"   r   r9   r#   r   r   r   r   r   @   s      r   r   c                       \ rS rSrSrS rSrg)r   R   z:
Always start the syntax highlighting from the beginning.
c                     g)Nr   r   r   r8   s      r   r9   %SyncFromStart.get_sync_start_positionV   s    r   r   N)r   r   r    r!   r"   r9   r#   r   r   r   r   r   R   s    r   r   c                   <    \ rS rSrSrSrSrS rS r\	S 5       r
Srg	)
r   Z   zI
Synchronize by starting at a line that matches the given regex pattern.
i  d   c                 |    [        U[        R                  5      (       d   e[        R                  " U5      U l        g r'   )
isinstancesix	text_typerecompile_compiled_pattern)r   patterns     r   r+   RegexSync.__init__f   s*    '3==1111!#G!4r   c                    U R                   nUR                  n[        U[        SX R                  -
  5      S5       H0  nUR                  XE   5      nU(       d  M  XVR                  5       4s  $    X R                  :  a  gUS4$ )z7Scan backwards, and find a possible position to start. r>   r   )rI   r1   r   maxMAX_BACKWARDSmatchstartFROM_START_IF_NO_SYNC_POS_FOUND)r   r   r0   rJ   r1   irP   s          r   r9   !RegexSync.get_sync_start_positionj   s{    (( vs2v0B0B'BCRHAMM%(+Eu++-'' I 88819r   c                 X    SSSSS.nUR                  UR                  S5      nU " U5      $ )zF
Create a :class:`.RegexSync` instance for this Pygments lexer class.
z^\s*(class|def)\s+z
<[/a-zA-Z]z\bfunction\b)PythonzPython 3HTML
JavaScript^)getname)cls	lexer_clspatternsps       r   from_pygments_lexer_cls!RegexSync.from_pygments_lexer_cls~   s:     .- " *
 LL-1vr   )rI   N)r   r   r    r!   r"   rO   rR   r+   r9   classmethodr`   r#   r   r   r   r   r   Z   s4    
 M '*#5(  r   r   c                   D    \ rS rSrSrSrSrS
S jr\SS j5       r	S r
S	rg)r      aX  
Lexer that calls a pygments lexer.

Example::

    from pygments.lexers import HtmlLexer
    lexer = PygmentsLexer(HtmlLexer)

Note: Don't forget to also load a Pygments compatible style. E.g.::

    from prompt_toolkit.styles.from_pygments import style_from_pygments
    from pygments.styles import get_style_by_name
    style = style_from_pygments(get_style_by_name('monokai'))

:param pygments_lexer_cls: A `Lexer` from Pygments.
:param sync_from_start: Start lexing at the start of the document. This
    will always give the best results, but it will be slow for bigger
    documents. (When the last part of the document is display, then the
    whole document will be lexed by Pygments on every key stroke.) It is
    recommended to disable this for inputs that are expected to be more
    than 1,000 lines.
:param syntax_sync: `SyntaxSync` object.
2   rB   Nc                     Ub  [        U[        5      (       d   eXl        [        U5      U l        U" SSSS9U l        U=(       d    [        R                  U5      U l        g )NF)stripnlstripallensurenl)	rD   r   pygments_lexer_clsr	   sync_from_startpygments_lexerr   r`   syntax_sync)r   rj   rk   rm   s       r   r+   PygmentsLexer.__init__   s`    "jj&I&III"4,_= 1 '_)*K*KL^*_r   c                 z    SSK Jn  SSKJn   U" U5      nU " UR                  US9$ ! U a    [        5       s $ f = f)z#
Create a `Lexer` from a filename.
r   )ClassNotFound)get_lexer_for_filename)rk   )pygments.utilrp   pygments.lexersrq   	__class__r   )r\   filenamerk   rp   rq   rl   s         r   from_filenamePygmentsLexer.from_filename   sH     	0:	R3H=N ~//QQ  	!= 	!s   ' ::c                 t   ^ ^^^^^^^^	 0 m0 m	UU 4S jmU	U 4S jmSUU 4S jjmUUUUU	U 4S jmUUU	4S jnU$ )z
Create a lexer function that takes a line number and returns the list
of (Token, text) tuples as the Pygments lexer returns for that line.
c                  \   > TR                  T 5      (       a
  [        5       $ TR                  $ )z9The Syntax synchronisation objcet that we currently use. )rk   r   rm   )r   r   s   r   get_syntax_sync3PygmentsLexer.lex_document.<locals>.get_syntax_sync   s(    ##C(($&'''r   c                 r   > TR                  5        H"  u  pX :  d  M  X-
  TR                  :  d  M   Us  $    g)zAReturn a generator close to line 'i', or None if none was fonud. N)itemsREUSE_GENERATOR_MAX_DISTANCE)rS   	generatorr0   line_generatorsr   s      r   find_closest_generator:PygmentsLexer.lex_document.<locals>.find_closest_generator   s3    %4%:%:%<!	:!*t/P/P"P$$ &=r   c                 N   >^ ^ UUUU 4S jn[        [        U" 5       5      T 5      $ )zw
Create a generator that yields the lexed lines.
Each iteration it yields a (line_number, [(token, text), ...]) tuple.
c               3      >#    SR                  TR                  TS  5      TS  n TR                  R                  U 5       H  u  pnX#4v   M     g 7f)N
)joinr1   rl   get_tokens_unprocessed)text_tvcolumnr   r   start_linenos       r   
get_tokensMPygmentsLexer.lex_document.<locals>.create_line_generator.<locals>.get_tokens   sO     yy!>?H  $22II$OGA!$J  Ps   AA)	enumerater   )r   r   r   r   r   s   `` r   create_line_generator9PygmentsLexer.lex_document.<locals>.create_line_generator   s#    
  [6EEr   c                   > T" U 5      nU(       a  U$ [        SU T	R                  -
  5      n U S:X  a  SnSnOT" 5       R                  TU 5      u  p#T" U 5      nU(       a  U$ T" X#5      nU(       a  [        U5        US-  nUTU'   U$ )zG
Find an already started generator that is close, or create a new one.
r   r
   )rN   MIN_LINES_BACKWARDSr9   next)
rS   r   rowr   r   r   r   rz   r   r   s
       r   get_generator1PygmentsLexer.lex_document.<locals>.get_generator  s    
 /q1I   Aq43334AAv-/GGRST /q1I  1#>	
 Yq),OI&r   c                    >  TU    $ ! [          a>    T" U 5      nU H,  u  p#UTU'   X :X  d  M  U TU'   US-   T;   a  TUS-   	 TU   s  s $     / $ f = f)z+Return the tokens for a given line number. r
   )KeyError)rS   r   numlinecacher   r   s       r   r2   ,PygmentsLexer.lex_document.<locals>.get_line(  sz    *Qx *)!,	 "+IC!%E#Jx56	2 7e+ %cAg$Sz) "+ I%*s    !AA
AA)r   r   )
r   r   r   r2   r   r   r   r   rz   r   s
   ``` @@@@@@r   r   PygmentsLexer.lex_document   s?      	(	%	F 	F"%	 %	N	0 r   )rl   rj   rk   rm   )TN)T)r   r   r    r!   r"   r   r~   r+   rb   rv   r   r#   r   r   r   r   r      s9    8 
 $' ` R Rhr   r   )r"   
__future__r   abcr   r   rE   r   	six.movesr   prompt_toolkit.tokenr   prompt_toolkit.filtersr	   utilsr   rG   __all__objectr   r   r   r   r   r   r   r   r   <module>r      s    ( '   & 0  	 
	N7F+ 	% 20 $J 8
 8vkE kr   