diff --git a/doc/usage/extensions/math.rst b/doc/usage/extensions/math.rst index 62630608993..9a042f631a6 100644 --- a/doc/usage/extensions/math.rst +++ b/doc/usage/extensions/math.rst @@ -133,6 +133,10 @@ are built: elements (cf the `dvisvgm FAQ`_). This option is used only when ``imgmath_image_format`` is ``'svg'``. +.. confval:: imgmath_embed + + Default: ``False``. If true, inline LaTeX output as HTML base64 images + instead of separate png/svg files. :mod:`sphinx.ext.mathjax` -- Render math via JavaScript ------------------------------------------------------- diff --git a/sphinx/ext/imgmath.py b/sphinx/ext/imgmath.py index f0096ff2cd7..deb89d479fe 100644 --- a/sphinx/ext/imgmath.py +++ b/sphinx/ext/imgmath.py @@ -5,9 +5,10 @@ import shutil import subprocess import tempfile -from os import path +from os import path, remove from subprocess import PIPE, CalledProcessError from typing import Any, Dict, List, Optional, Tuple +import base64 from docutils import nodes from docutils.nodes import Element @@ -25,6 +26,7 @@ from sphinx.util.png import read_png_depth, write_png_depth from sphinx.util.template import LaTeXRenderer from sphinx.writers.html import HTMLTranslator +from sphinx.util.images import guess_mimetype logger = logging.getLogger(__name__) @@ -283,6 +285,18 @@ def get_tooltip(self: HTMLTranslator, node: Element) -> str: return '' +def html_get_img_src(self: HTMLTranslator, fname: str) -> str: + if self.builder.config.imgmath_embed: + bname = path.basename(fname) + outfn = path.join(self.builder.outdir, self.builder.imagedir, 'math', bname) + mimetype = guess_mimetype(outfn, default='*') + encoded = base64.b64encode(open(outfn, "rb").read()).decode() + remove(outfn) + return f'data:{mimetype};base64,{encoded}' + else: + return fname + + def html_visit_math(self: HTMLTranslator, node: nodes.math) -> None: try: fname, depth = render_math(self, '$' + node.astext() + '$') @@ -298,7 +312,8 @@ def html_visit_math(self: HTMLTranslator, node: nodes.math) -> None: self.body.append('%s' % self.encode(node.astext()).strip()) else: - c = ('') @@ -331,7 +346,8 @@ def html_visit_displaymath(self: HTMLTranslator, node: nodes.math_block) -> None self.body.append('%s

\n' % self.encode(node.astext()).strip()) else: - self.body.append(('

\n') raise nodes.SkipNode @@ -354,5 +370,6 @@ def setup(app: Sphinx) -> Dict[str, Any]: app.add_config_value('imgmath_latex_preamble', '', 'html') app.add_config_value('imgmath_add_tooltips', True, 'html') app.add_config_value('imgmath_font_size', 12, 'html') + app.add_config_value('imgmath_embed', False, 'html') app.connect('build-finished', cleanup_tempdir) return {'version': sphinx.__display_version__, 'parallel_read_safe': True}