summaryrefslogtreecommitdiff
path: root/sphinx/ext/pngmath.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/ext/pngmath.py')
-rw-r--r--sphinx/ext/pngmath.py43
1 files changed, 30 insertions, 13 deletions
diff --git a/sphinx/ext/pngmath.py b/sphinx/ext/pngmath.py
index e03c82acf..85010b799 100644
--- a/sphinx/ext/pngmath.py
+++ b/sphinx/ext/pngmath.py
@@ -20,20 +20,31 @@ from subprocess import Popen, PIPE
from hashlib import sha1
from six import text_type
+
from docutils import nodes
import sphinx
from sphinx.errors import SphinxError, ExtensionError
+from sphinx.util import logging
from sphinx.util.png import read_png_depth, write_png_depth
from sphinx.util.osutil import ensuredir, ENOENT, cd
from sphinx.util.pycompat import sys_encoding
from sphinx.ext.mathbase import setup_math as mathbase_setup, wrap_displaymath
+if False:
+ # For type annotation
+ from typing import Any, Dict, Tuple # NOQA
+ from sphinx.application import Sphinx # NOQA
+ from sphinx.ext.mathbase import math as math_node, displaymath # NOQA
+
+logger = logging.getLogger(__name__)
+
class MathExtError(SphinxError):
category = 'Math extension error'
def __init__(self, msg, stderr=None, stdout=None):
+ # type: (unicode, unicode, unicode) -> None
if stderr:
msg += '\n[stderr]\n' + stderr.decode(sys_encoding, 'replace')
if stdout:
@@ -71,6 +82,7 @@ depth_re = re.compile(br'\[\d+ depth=(-?\d+)\]')
def render_math(self, math):
+ # type: (nodes.NodeVisitor, unicode) -> Tuple[unicode, int]
"""Render the LaTeX math expression *math* using latex and dvipng.
Return the filename relative to the built document and the "depth",
@@ -107,9 +119,8 @@ def render_math(self, math):
else:
tempdir = self.builder._mathpng_tempdir
- tf = codecs.open(path.join(tempdir, 'math.tex'), 'w', 'utf-8')
- tf.write(latex)
- tf.close()
+ with codecs.open(path.join(tempdir, 'math.tex'), 'w', 'utf-8') as tf:
+ tf.write(latex)
# build latex command; old versions of latex don't have the
# --output-directory option, so we have to manually chdir to the
@@ -125,9 +136,9 @@ def render_math(self, math):
except OSError as err:
if err.errno != ENOENT: # No such file or directory
raise
- self.builder.warn('LaTeX command %r cannot be run (needed for math '
- 'display), check the pngmath_latex setting' %
- self.builder.config.pngmath_latex)
+ logger.warning('LaTeX command %r cannot be run (needed for math '
+ 'display), check the pngmath_latex setting',
+ self.builder.config.pngmath_latex)
self.builder._mathpng_warned_latex = True
return None, None
@@ -150,9 +161,9 @@ def render_math(self, math):
except OSError as err:
if err.errno != ENOENT: # No such file or directory
raise
- self.builder.warn('dvipng command %r cannot be run (needed for math '
- 'display), check the pngmath_dvipng setting' %
- self.builder.config.pngmath_dvipng)
+ logger.warning('dvipng command %r cannot be run (needed for math '
+ 'display), check the pngmath_dvipng setting',
+ self.builder.config.pngmath_dvipng)
self.builder._mathpng_warned_dvipng = True
return None, None
stdout, stderr = p.communicate()
@@ -171,23 +182,26 @@ def render_math(self, math):
def cleanup_tempdir(app, exc):
+ # type: (Sphinx, Exception) -> None
if exc:
return
if not hasattr(app.builder, '_mathpng_tempdir'):
return
try:
- shutil.rmtree(app.builder._mathpng_tempdir)
+ shutil.rmtree(app.builder._mathpng_tempdir) # type: ignore
except Exception:
pass
def get_tooltip(self, node):
+ # type: (nodes.NodeVisitor, math_node) -> unicode
if self.builder.config.pngmath_add_tooltips:
return ' alt="%s"' % self.encode(node['latex']).strip()
return ''
def html_visit_math(self, node):
+ # type: (nodes.NodeVisitor, math_node) -> None
try:
fname, depth = render_math(self, '$' + node['latex'] + '$')
except MathExtError as exc:
@@ -195,7 +209,7 @@ def html_visit_math(self, node):
sm = nodes.system_message(msg, type='WARNING', level=2,
backrefs=[], source=node['latex'])
sm.walkabout(self)
- self.builder.warn('display latex %r: ' % node['latex'] + msg)
+ logger.warning('display latex %r: %s', node['latex'], msg)
raise nodes.SkipNode
if fname is None:
# something failed -- use text-only as a bad substitute
@@ -210,6 +224,7 @@ def html_visit_math(self, node):
def html_visit_displaymath(self, node):
+ # type: (nodes.NodeVisitor, displaymath) -> None
if node['nowrap']:
latex = node['latex']
else:
@@ -222,7 +237,7 @@ def html_visit_displaymath(self, node):
sm = nodes.system_message(msg, type='WARNING', level=2,
backrefs=[], source=node['latex'])
sm.walkabout(self)
- self.builder.warn('inline latex %r: ' % node['latex'] + msg)
+ logger.warning('inline latex %r: %s', node['latex'], msg)
raise nodes.SkipNode
self.body.append(self.starttag(node, 'div', CLASS='math'))
self.body.append('<p>')
@@ -239,7 +254,9 @@ def html_visit_displaymath(self, node):
def setup(app):
- app.warn('sphinx.ext.pngmath has been deprecated. Please use sphinx.ext.imgmath instead.')
+ # type: (Sphinx) -> Dict[unicode, Any]
+ logger.warning('sphinx.ext.pngmath has been deprecated. '
+ 'Please use sphinx.ext.imgmath instead.')
try:
mathbase_setup(app, (html_visit_math, None), (html_visit_displaymath, None))
except ExtensionError: