##// END OF EJS Templates
Merge pull request #12016 from Carreau/cleanup-cast...
Merge pull request #12016 from Carreau/cleanup-cast Cleanup cast_unicode

File last commit:

r25162:e5dc064e
r25336:ad716972 merge
Show More
latextools.py
220 lines | 7.0 KiB | text/x-python | PythonLexer
Brian Granger
More improvements to the display system....
r3279 # -*- coding: utf-8 -*-
Min RK
make lib.latextools accept unicode...
r19562 """Tools for handling LaTeX."""
Brian Granger
More improvements to the display system....
r3279
Min RK
make lib.latextools accept unicode...
r19562 # Copyright (c) IPython Development Team.
Brian Granger
More improvements to the display system....
r3279 # Distributed under the terms of the Modified BSD License.
Min RK
make lib.latextools accept unicode...
r19562 from io import BytesIO, open
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306 import os
import tempfile
import shutil
import subprocess
Srinivas Reddy Thatiparthy
remove code specific to python2
r23063 from base64 import encodebytes
Matthias Bussonnier
Use explicit fully qualified name instead of uncommon alias....
r25162 import textwrap
Brian Granger
More improvements to the display system....
r3279
Takafumi Arakaki
Check if latex/dvipng exist before calling them
r7330 from IPython.utils.process import find_cmd, FindCmdError
Min RK
update dependency imports...
r21253 from traitlets.config import get_config
from traitlets.config.configurable import SingletonConfigurable
from traitlets import List, Bool, Unicode
Srinivas Reddy Thatiparthy
remove python2 specific cast_unicode_py2 function
r23669 from IPython.utils.py3compat import cast_unicode
Matthias Bussonnier
Remove deprecated encodestring infavor of encodebytes
r21869
Brian Granger
More improvements to the display system....
r3279
Takafumi Arakaki
Make lib.latextools configurable...
r7861 class LaTeXTool(SingletonConfigurable):
"""An object to store configuration of the LaTeX tool."""
Min RK
hook up latex tools config to global instance...
r19565 def _config_default(self):
return get_config()
Oscar Gustafsson
Enable changing the font color for LaTeX rendering
r25160
Takafumi Arakaki
Make lib.latextools configurable...
r7861 backends = List(
Jason Grout
Fix one more deprecated trait type vs. instance case
r21538 Unicode(), ["matplotlib", "dvipng"],
Takafumi Arakaki
Make lib.latextools configurable...
r7861 help="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. ",
# It is a List instead of Enum, to make configuration more
# flexible. For example, to use matplotlib mainly but dvipng
# for display style, the default ["matplotlib", "dvipng"] can
# be used. To NOT use dvipng so that other repr such as
# unicode pretty printing is used, you can use ["matplotlib"].
Matthias Bussonnier
Update /IPython/lib/latextool.py to use new traitlets API.
r22343 ).tag(config=True)
Takafumi Arakaki
Make lib.latextools configurable...
r7861
Min RK
make lib.latextools accept unicode...
r19562 use_breqn = Bool(
Takafumi Arakaki
Make lib.latextools configurable...
r7861 True,
help="Use breqn.sty to automatically break long equations. "
"This configuration takes effect only for dvipng backend.",
Matthias Bussonnier
Update /IPython/lib/latextool.py to use new traitlets API.
r22343 ).tag(config=True)
Takafumi Arakaki
Make lib.latextools configurable...
r7861
packages = List(
['amsmath', 'amsthm', 'amssymb', 'bm'],
help="A list of packages to use for dvipng backend. "
"'breqn' will be automatically appended when use_breqn=True.",
Matthias Bussonnier
Update /IPython/lib/latextool.py to use new traitlets API.
r22343 ).tag(config=True)
Takafumi Arakaki
Make lib.latextools configurable...
r7861
Min RK
make lib.latextools accept unicode...
r19562 preamble = Unicode(
Takafumi Arakaki
Make lib.latextools configurable...
r7861 help="Additional preamble to use when generating LaTeX source "
"for dvipng backend.",
Matthias Bussonnier
Update /IPython/lib/latextool.py to use new traitlets API.
r22343 ).tag(config=True)
Takafumi Arakaki
Make lib.latextools configurable...
r7861
Oscar Gustafsson
Better color options and added scale
r25161 def latex_to_png(s, encode=False, backend=None, wrap=False, color='Black',
scale=1.0):
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306 """Render a LaTeX string to PNG.
Brian Granger
More improvements to the display system....
r3279
Parameters
----------
klonuo
Fix argument type in docsting
r22484 s : str
Brian Granger
More improvements to the display system....
r3279 The raw string containing valid inline LaTeX.
encode : bool, optional
Min RK
make lib.latextools accept unicode...
r19562 Should the PNG data base64 encoded to make it JSON'able.
Takafumi Arakaki
Make lib.latextools configurable...
r7861 backend : {matplotlib, dvipng}
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306 Backend for producing PNG data.
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 wrap : bool
If true, Automatically wrap `s` as a LaTeX equation.
Oscar Gustafsson
Enable changing the font color for LaTeX rendering
r25160 color : string
Oscar Gustafsson
Better color options and added scale
r25161 Foreground color name among dvipsnames, e.g. 'Maroon' or on hex RGB
format, e.g. '#AA20FA'.
scale : float
Scale factor for the resulting PNG.
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306
Takafumi Arakaki
latex_to_png returns None when the backend cannot be used...
r7309 None is returned when the backend cannot be used.
Brian Granger
More improvements to the display system....
r3279 """
Min RK
make lib.latextools accept unicode...
r19562 s = cast_unicode(s)
Takafumi Arakaki
Make lib.latextools configurable...
r7861 allowed_backends = LaTeXTool.instance().backends
if backend is None:
backend = allowed_backends[0]
if backend not in allowed_backends:
return None
if backend == 'matplotlib':
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306 f = latex_to_png_mpl
elif backend == 'dvipng':
f = latex_to_png_dvipng
Oscar Gustafsson
Better color options and added scale
r25161 if color.startswith('#'):
# Convert hex RGB color to LaTeX RGB color.
if len(color) == 7:
try:
color = "RGB {}".format(" ".join([str(int(x, 16)) for x in
Matthias Bussonnier
Use explicit fully qualified name instead of uncommon alias....
r25162 textwrap.wrap(color[1:], 2)]))
Oscar Gustafsson
Better color options and added scale
r25161 except ValueError:
raise ValueError('Invalid color specification {}.'.format(color))
else:
raise ValueError('Invalid color specification {}.'.format(color))
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306 else:
raise ValueError('No such backend {0}'.format(backend))
Oscar Gustafsson
Better color options and added scale
r25161 bin_data = f(s, wrap, color, scale)
Takafumi Arakaki
latex_to_png returns None when the backend cannot be used...
r7309 if encode and bin_data:
Matthias Bussonnier
Remove deprecated encodestring infavor of encodebytes
r21869 bin_data = encodebytes(bin_data)
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306 return bin_data
Oscar Gustafsson
Better color options and added scale
r25161 def latex_to_png_mpl(s, wrap, color='Black', scale=1.0):
Takafumi Arakaki
latex_to_png returns None when the backend cannot be used...
r7309 try:
from matplotlib import mathtext
Carlos Cordoba
Latextools: Use the right exceptions to catch errors
r22075 from pyparsing import ParseFatalException
Takafumi Arakaki
latex_to_png returns None when the backend cannot be used...
r7309 except ImportError:
return None
Carlos Cordoba
Latextools: Use the right exceptions to catch errors
r22075
Min RK
mpl mathtext doesn't support display math...
r19564 # mpl mathtext doesn't support display math, force inline
s = s.replace('$$', '$')
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 if wrap:
Min RK
make lib.latextools accept unicode...
r19562 s = u'${0}$'.format(s)
Carlos Cordoba
Latextools: Make latex_to_png_mpl not fail on errors...
r22050
try:
mt = mathtext.MathTextParser('bitmap')
f = BytesIO()
Oscar Gustafsson
Better color options and added scale
r25161 dpi = 120*scale
mt.to_png(f, s, fontsize=12, dpi=dpi, color=color)
Carlos Cordoba
Latextools: Make latex_to_png_mpl not fail on errors...
r22050 return f.getvalue()
Carlos Cordoba
Latextools: Use the right exceptions to catch errors
r22075 except (ValueError, RuntimeError, ParseFatalException):
Carlos Cordoba
Latextools: Make latex_to_png_mpl not fail on errors...
r22050 return None
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306
Oscar Gustafsson
Better color options and added scale
r25161 def latex_to_png_dvipng(s, wrap, color='Black', scale=1.0):
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306 try:
Takafumi Arakaki
Check if latex/dvipng exist before calling them
r7330 find_cmd('latex')
find_cmd('dvipng')
except FindCmdError:
return None
try:
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306 workdir = tempfile.mkdtemp()
tmpfile = os.path.join(workdir, "tmp.tex")
dvifile = os.path.join(workdir, "tmp.dvi")
outfile = os.path.join(workdir, "tmp.png")
Min RK
make lib.latextools accept unicode...
r19562 with open(tmpfile, "w", encoding='utf8') as f:
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 f.writelines(genelatex(s, wrap))
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306
Min RK
make lib.latextools accept unicode...
r19562 with open(os.devnull, 'wb') as devnull:
Jörgen Stenarson
Fix for latextools commandline arguments...
r8255 subprocess.check_call(
Thomas Kluyver
Use batchmode in latex_to_png_dvipng...
r17891 ["latex", "-halt-on-error", "-interaction", "batchmode", tmpfile],
cwd=workdir, stdout=devnull, stderr=devnull)
Jörgen Stenarson
Fix for latextools commandline arguments...
r8255
Oscar Gustafsson
Better color options and added scale
r25161 resolution = round(150*scale)
Jörgen Stenarson
Fix for latextools commandline arguments...
r8255 subprocess.check_call(
Oscar Gustafsson
Better color options and added scale
r25161 ["dvipng", "-T", "tight", "-D", str(resolution), "-z", "9",
Oscar Gustafsson
Enable changing the font color for LaTeX rendering
r25160 "-bg", "transparent", "-o", outfile, dvifile, "-fg", color],
cwd=workdir, stdout=devnull, stderr=devnull)
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306
Thomas Kluyver
Fix IPython.lib.latextools for Python 3
r8013 with open(outfile, "rb") as f:
Abhinav Upadhyay
Avoid temprary variable assignment by returning value directly from try...
r12883 return f.read()
Carlos Cordoba
Latextools: Use the right exceptions to catch errors
r22075 except subprocess.CalledProcessError:
Carlos Cordoba
Latextools: Make latex_to_png_mpl not fail on errors...
r22050 return None
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306 finally:
shutil.rmtree(workdir)
Brian Granger
More improvements to the display system....
r3279
Brian Granger
Added mdboom's math_to_image from matplotlib.
r3881
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 def kpsewhich(filename):
"""Invoke kpsewhich command with an argument `filename`."""
try:
find_cmd("kpsewhich")
proc = subprocess.Popen(
["kpsewhich", filename],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
Min RK
make lib.latextools accept unicode...
r19562 return stdout.strip().decode('utf8', 'replace')
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 except FindCmdError:
pass
def genelatex(body, wrap):
"""Generate LaTeX document for dvipng backend."""
Takafumi Arakaki
Make lib.latextools configurable...
r7861 lt = LaTeXTool.instance()
breqn = wrap and lt.use_breqn and kpsewhich("breqn.sty")
Srinivas Reddy Thatiparthy
remove python2 specific cast_unicode_py2 function
r23669 yield r'\documentclass{article}'
Takafumi Arakaki
Make lib.latextools configurable...
r7861 packages = lt.packages
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 if breqn:
Takafumi Arakaki
Make lib.latextools configurable...
r7861 packages = packages + ['breqn']
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 for pack in packages:
Srinivas Reddy Thatiparthy
remove python2 specific cast_unicode_py2 function
r23669 yield r'\usepackage{{{0}}}'.format(pack)
yield r'\pagestyle{empty}'
Takafumi Arakaki
Make lib.latextools configurable...
r7861 if lt.preamble:
yield lt.preamble
Srinivas Reddy Thatiparthy
remove python2 specific cast_unicode_py2 function
r23669 yield r'\begin{document}'
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 if breqn:
Srinivas Reddy Thatiparthy
remove python2 specific cast_unicode_py2 function
r23669 yield r'\begin{dmath*}'
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 yield body
Srinivas Reddy Thatiparthy
remove python2 specific cast_unicode_py2 function
r23669 yield r'\end{dmath*}'
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 elif wrap:
Min RK
make lib.latextools accept unicode...
r19562 yield u'$${0}$$'.format(body)
Takafumi Arakaki
Use breqn.sty in dvipng backend if possible
r7852 else:
yield body
Matthias Bussonnier
fix some other syntax warnings
r24780 yield u'\\end{document}'
Takafumi Arakaki
Add dvipng backend to latex_to_png
r7306
Min RK
make lib.latextools accept unicode...
r19562 _data_uri_template_png = u"""<img src="data:image/png;base64,%s" alt=%s />"""
Brian Granger
More improvements to the display system....
r3279
def latex_to_html(s, alt='image'):
"""Render 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.
"""
Min RK
make lib.latextools accept unicode...
r19562 base64_data = latex_to_png(s, encode=True).decode('ascii')
Takafumi Arakaki
latex_to_png returns None when the backend cannot be used...
r7309 if base64_data:
return _data_uri_template_png % (base64_data, alt)
Brian Granger
More improvements to the display system....
r3279
Brian Granger
Added mdboom's math_to_image from matplotlib.
r3881