U
    1e                     @   s   d Z ddlmZmZ ddlZddlZddlZddlZddlm	Z	 ddl
Z
ddlmZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ G dd deZdddZdddZd ddZdd Zdd ZdZ d!ddZ!dS )"zTools for handling LaTeX.    )BytesIOopenN)encodebytes)Path)find_cmdFindCmdError
get_config)SingletonConfigurable)ListBoolUnicode)cast_unicodec                   @   sv   e Zd ZdZdd Zee ddgddjdd	Ze	dd
djdd	Z
eddddgddjdd	Zeddjdd	ZdS )	LaTeXToolz3An object to store configuration of the LaTeX tool.c                 C   s   t  S )Nr   )self r   :/tmp/pip-unpacked-wheel-3hxk2k58/IPython/lib/latextools.py_config_default   s    zLaTeXTool._config_default
matplotlibdvipnga  Preferred backend to draw LaTeX math equations. Backends in the list are checked one by one and the first usable one is used.  Note that `matplotlib` backend is usable only for inline style equations.  To draw  display style equations, `dvipng` backend must be specified. )helpT)configzmUse breqn.sty to automatically break long equations. This configuration takes effect only for dvipng backend.ZamsmathZamsthmZamssymbZbmziA list of packages to use for dvipng backend. 'breqn' will be automatically appended when use_breqn=True.zKAdditional preamble to use when generating LaTeX source for dvipng backend.N)__name__
__module____qualname____doc__r   r   r   tagbackendsr   	use_breqnpackagespreambler   r   r   r   r      s4    
r   FBlack      ?c           
   
   C   s  t | } t j}|dkr"|d }||kr.dS |dkr<t}n|dkrt}|drt|dkrz.dd	d	d
 t
|dd dD }W q tk
r } ztd||W 5 d}~X Y qX qtd|ntd||| |||}	|r|	rt|	}	|	S )al  Render a LaTeX string to PNG.

    Parameters
    ----------
    s : str
        The raw string containing valid inline LaTeX.
    encode : bool, optional
        Should the PNG data base64 encoded to make it JSON'able.
    backend : {matplotlib, dvipng}
        Backend for producing PNG data.
    wrap : bool
        If true, Automatically wrap `s` as a LaTeX equation.
    color : string
        Foreground color name among dvipsnames, e.g. 'Maroon' or on hex RGB
        format, e.g. '#AA20FA'.
    scale : float
        Scale factor for the resulting PNG.
    None is returned when the backend cannot be used.

    Nr   r   r   #   zRGB {} c                 S   s   g | ]}t t|d qS )   )strint).0xr   r   r   
<listcomp>a   s     z latex_to_png.<locals>.<listcomp>      zInvalid color specification {}.zNo such backend {0})r   r   instancer   latex_to_png_mpllatex_to_png_dvipng
startswithlenformatjointextwrapwrap
ValueErrorr   )
sencodebackendr6   colorscaleZallowed_backendsfeZbin_datar   r   r   latex_to_png=   s0    

$r?   c              
   C   s  z0ddl m}m}m} ddlm} ddlm} W n tk
rF   Y d S X | 	dd} |rbd
| } z|jdd	}	d
| }
t }|d}|j| d|	d\}}}}}|j|d |d fd}|jd|| | |	|d || |j||
ddd | W S  tt|fk
r   Y d S X d S )Nr   )figurefont_managermathtext)backend_agg)ParseFatalExceptionz$$$z${0}$   )sizex   pathH   )dpiprop)Zfigsize)Zfontpropertiesr;   ZpngT)rK   r3   Ztransparent)r   r@   rA   rB   Zmatplotlib.backendsrC   	pyparsingrD   ImportErrorreplacer3   ZFontPropertiesr   ZMathTextParserparseZFiguretextZFigureCanvasAggZsavefiggetvaluer7   RuntimeError)r8   r6   r;   r<   r@   rA   rB   rC   rD   rL   rK   bufferparserwidthheightdepth_Zfigr   r   r   r/   o   s,    



r/   c                 C   sn  zt d t d W n tk
r*   Y d S X d }tjdkrRt }| jtjO  _zzt
t }d}d}d}||jddd	}	|	t| | W 5 Q R X tjdd
dd|g|tjtj|d td| }
tjddddt|
ddddd||d|g|tjtj|d ||d}	|	 W  5 Q R  W W .S Q R X W n tjk
rX   Y W 
d S X W 5 t	| X d S )NZlatexr   ntztmp.texztmp.dviztmp.pngwutf8)encodingz-halt-on-errorz-interactionZ	batchmode)cwdstdoutstderrstartupinfo   z-TZtightz-Dz-z9z-bgZTransparentz-oz-fgrb)r   r   osname
subprocessZSTARTUPINFOZdwFlagsZSTARTF_USESHOWWINDOWshutilrmtreer   tempfilemkdtempjoinpathr   
writelines	genelatex
check_callDEVNULLroundr'   readCalledProcessError)r8   r6   r;   r<   ra   ZworkdirZtmpfileZdvifileoutfiler=   
resolutionr   r   r   r0      sd    
$r0   c                 C   sX   z>t d tjd| gtjtjd}| \}}| ddW S  tk
rR   Y nX dS )z5Invoke kpsewhich command with an argument `filename`.	kpsewhich)r_   r`   r\   rO   N)r   rg   PopenPIPEcommunicatestripdecoder   )filenameprocr_   r`   r   r   r   rv      s     rv   c                 c   s   t  }|o|jotd}dV  |j}|r4|dg }|D ]}d|V  q8dV  |jr^|jV  dV  |r|dV  | V  dV  n|rd	| V  n| V  d
V  dS )z+Generate LaTeX document for dvipng backend.z	breqn.styz\documentclass{article}breqnz\usepackage{{{0}}}z\pagestyle{empty}z\begin{document}z\begin{dmath*}z\end{dmath*}z$${0}$$z\end{document}N)r   r.   r   rv   r   r3   r    )bodyr6   ltr~   r   packr   r   r   rn      s(    
rn   z-<img src="data:image/png;base64,%s" alt=%s />imagec                 C   s&   t | ddd}|r"t||f S dS )zRender LaTeX to HTML with embedded PNG data using data URIs.

    Parameters
    ----------
    s : str
        The raw string containing valid inline LateX.
    alt : str
        The alt text to use for the HTML.
    T)r9   asciiN)r?   r{   _data_uri_template_png)r8   ZaltZbase64_datar   r   r   latex_to_html   s    
r   )FNFr!   r"   )r!   r"   )r!   r"   )r   )"r   ior   r   re   rj   rh   rg   base64r   r5   pathlibr   ZIPython.utils.processr   r   Ztraitlets.configr	   Ztraitlets.config.configurabler
   Z	traitletsr   r   r   ZIPython.utils.py3compatr   r   r?   r/   r0   rv   rn   r   r   r   r   r   r   <module>   s.   %  
2

>