B
    kb|                 @   s   d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZmZ ddlmZ ejd	fd
dZe
G dd de	ZdS )zExtra magics for terminal use.    )errorN)TryNext
UsageError)Magicsmagics_class
line_magic)ClipboardEmpty)SListstrip_email_quotes)	py3compatFc             c   s`   |st d|   d}nd}x@y||}|| kr2dS |V  W q tk
rV   t d dS X qW dS )zH Yield pasted lines until the user enters the given sentinel value.
    zAPasting code; enter '%s' alone on the line to stop or use Ctrl-D.: Nz<EOF>)printEOFError)sentinelZl_inputquietpromptl r   6lib/python3.7/site-packages/IPython/terminal/magics.pyget_pasted_lines   s    
r   c                   sv   e Zd Z fddZdd Zdd Zddd	ZedddZedddZ	edddZ
ejdkrnedd Z  ZS )TerminalMagicsc                s   t t| | d S )N)superr   __init__)selfshell)	__class__r   r   r   (   s    zTerminalMagics.__init__c             C   sd   |r&t | | jj|< td|  n:| |}|| jjd< d| j_z| j| W dd| j_X dS )zM Execute a block, or store it in a variable, per the user's request.
        zBlock assigned to '%s'pasted_blockTNF)r	   
splitlinesr   user_nsr   preclean_inputZusing_paste_magicsrun_cell)r   blocknamebr   r   r   store_or_execute+   s    
zTerminalMagics.store_or_executec             C   s8   |  }x |r(|d  s(|dd  }q
W td|S )Nr      
)r   stripr
   join)r   r"   linesr   r   r   r    ;   s    zTerminalMagics.preclean_inputr   c             C   s`   | j j|}|dkrtdt|ts0tdtd|ddd t|f  | j 	| dS )z, Rerun a previously pasted command.
        Nz"No previous pasted block availablez6Variable 'pasted_block' is not a string, can't executezRe-executing '%s...' (%d chars)r'   r&   r   )
r   r   getr   
isinstancestrr   splitlenr!   )r   r#   r$   r   r   r   rerun_pastedA   s    
 zTerminalMagics.rerun_pastedr   c             C   s$   | j   tdddg| j j  dS )z%Toggle autoindent on/off (deprecated)zAutomatic indentation is:ZOFFZONN)r   Zset_autoindentr   
autoindent)r   parameter_sr   r   r   r1   P   s    
zTerminalMagics.autoindentc             C   s^   | j |ddd\}}d|kr(|   dS d|k}|dd}d	t||d
}| || dS )u  Paste & execute a pre-formatted code block from clipboard.

        You must terminate the block with '--' (two minus-signs) or Ctrl-D
        alone on the line. You can also provide your own sentinel with '%paste
        -s %%' ('%%' is the new sentinel for this operation).

        The block is dedented prior to execution to enable execution of method
        definitions. '>' and '+' characters at the beginning of a line are
        ignored, to allow pasting directly from e-mails, diff files and
        doctests (the '...' continuation prompt is also stripped).  The
        executed block is also assigned to variable named 'pasted_block' for
        later editing with '%edit pasted_block'.

        You can also pass a variable name as an argument, e.g. '%cpaste foo'.
        This assigns the pasted block to variable 'foo' as string, without
        dedenting or executing it (preceding >>> and + is still stripped)

        '%cpaste -r' re-executes the block previously entered by cpaste.
        '%cpaste -q' suppresses any additional output messages.

        Do not be alarmed by garbled output on Windows (it's a readline bug).
        Just press enter and type -- (and press enter again) and the block
        will be what was just pasted.

        Shell escapes are not supported (yet).

        See also
        --------
        paste: automatically pull code from clipboard.

        Examples
        --------
        ::

          In [8]: %cpaste
          Pasting code; enter '--' alone on the line to stop.
          :>>> a = ["world!", "Hello"]
          :>>> print(" ".join(sorted(a)))
          :--
          Hello world!

        ::
          In [8]: %cpaste
          Pasting code; enter '--' alone on the line to stop.
          :>>> %alias_magic t timeit
          :>>> %t -n1 pass
          :--
          Created `%t` as an alias for `%timeit`.
          Created `%%t` as an alias for `%%timeit`.
          354 ns ± 224 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)
        zrqs:string)moderNqsz--r'   )r   )parse_optionsr0   r+   r)   r   r%   )r   r2   optsr#   r   r   r"   r   r   r   cpasteV   s    5zTerminalMagics.cpastec          
   C   s   | j |ddd\}}d|kr(|   dS y| jj }W n` tk
r~ } z(t|d}|rft|d  ntd dS d}~X Y n tk
r   t	d	Y nX d
|kr| jj
}|| j| |ds|d |d | || dS )a  Paste & execute a pre-formatted code block from clipboard.

        The text is pulled directly from the clipboard without user
        intervention and printed back on the screen before execution (unless
        the -q flag is given to force quiet mode).

        The block is dedented prior to execution to enable execution of method
        definitions. '>' and '+' characters at the beginning of a line are
        ignored, to allow pasting directly from e-mails, diff files and
        doctests (the '...' continuation prompt is also stripped).  The
        executed block is also assigned to variable named 'pasted_block' for
        later editing with '%edit pasted_block'.

        You can also pass a variable name as an argument, e.g. '%paste foo'.
        This assigns the pasted block to variable 'foo' as string, without
        executing it (preceding >>> and + is still stripped).

        Options:

          -r: re-executes the block previously entered by cpaste.

          -q: quiet mode: do not echo the pasted text back to the terminal.

        IPython statements (magics, shell escapes) are not supported (yet).

        See also
        --------
        cpaste: manually paste code into terminal until you mark its end.
        Zrqr3   )r4   r5   Nargsr   z&Could not get text from the clipboard.z!The clipboard appears to be emptyr6   r'   z## -- End pasted text --
)r8   r0   r   ZhooksZclipboard_getr   getattrr   r   r   writeZ
pycolorizeendswithr%   )r   r2   r9   r#   r"   Zclipboard_excmessager=   r   r   r   paste   s*    

zTerminalMagics.pasteZwin32c             C   s   t d dS )zClear screen.
            clsN)ossystem)r   r7   r   r   r   rA      s    zTerminalMagics.cls)r   )r   )r   )r   )__name__
__module____qualname__r   r%   r    r0   r   r1   r:   r@   sysplatformrA   __classcell__r   r   )r   r   r   &   s   
?9
r   )__doc__Zloggingr   rB   rG   ZIPython.core.errorr   r   ZIPython.core.magicr   r   r   ZIPython.lib.clipboardr   ZIPython.utils.textr	   r
   ZIPython.utilsr   inputr   r   r   r   r   r   <module>   s   