Skip to content

Commit

Permalink
Fix sphinx-doc#9864: mathjax: Failed to render equations via MathJax v2
Browse files Browse the repository at this point in the history
MathJax library has been loaded via "defer" method since v4.3.0.  But
it prevents to work MathJax v2.  This rollbacks the change and use
"async" method as default again.

To support changing the loading method, this allows to specify it via
mathjax_options.
  • Loading branch information
tk0miya committed Nov 21, 2021
1 parent e5424b3 commit e2c6146
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 4 deletions.
5 changes: 5 additions & 0 deletions CHANGES
Expand Up @@ -13,11 +13,16 @@ Deprecated
Features added
--------------

* #9864: mathjax: Support chnaging the loading method of MathJax to "defer" via
:confval:`mathjax_options`

Bugs fixed
----------

* #9838: autodoc: AttributeError is raised on building document for functions
decorated by functools.lru_cache
* #9864: mathjax: Failed to render equations via MathJax v2. The loading method
of MathJax is back to "async" method again

Testing
--------
Expand Down
5 changes: 5 additions & 0 deletions doc/usage/extensions/math.rst
Expand Up @@ -200,6 +200,11 @@ Sphinx but is set to automatically include it from a third-party site.

.. versionadded:: 1.8

.. versionchanged:: 4.4.1

Allow to change the loading method (async or defer) of MathJax if "async"
or "defer" key is set.

.. confval:: mathjax3_config

The configuration options for MathJax v3 (which is used by default).
Expand Down
12 changes: 10 additions & 2 deletions sphinx/ext/mathjax.py
Expand Up @@ -81,10 +81,18 @@ def install_mathjax(app: Sphinx, pagename: str, templatename: str, context: Dict
domain = cast(MathDomain, app.env.get_domain('math'))
if app.registry.html_assets_policy == 'always' or domain.has_equations(pagename):
# Enable mathjax only if equations exists
options = {'defer': 'defer'}
options = {}
if app.config.mathjax_options:
options.update(app.config.mathjax_options)
app.add_js_file(app.config.mathjax_path, **options) # type: ignore
if 'async' not in options and 'defer' not in options:
print(options, app.config.mathjax3_config)
if app.config.mathjax3_config:
# Load MathJax v3 via "defer" method
options['defer'] = 'defer'
else:
# Load other MathJax via "async" method
options['async'] = 'async'
app.add_js_file(app.config.mathjax_path, **options)

if app.config.mathjax2_config:
if app.config.mathjax_path == MATHJAX_URL:
Expand Down
28 changes: 26 additions & 2 deletions tests/test_ext_math.py
Expand Up @@ -71,7 +71,7 @@ def test_mathjax_options(app, status, warning):
app.builder.build_all()

content = (app.outdir / 'index.html').read_text()
assert ('<script defer="defer" integrity="sha384-0123456789" '
assert ('<script async="async" integrity="sha384-0123456789" '
'src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">'
'</script>' in content)

Expand Down Expand Up @@ -221,6 +221,7 @@ def test_mathjax3_config(app, status, warning):

content = (app.outdir / 'index.html').read_text()
assert MATHJAX_URL in content
assert ('<script defer="defer" src="%s">' % MATHJAX_URL in content)
assert ('<script>window.MathJax = {"extensions": ["tex2jax.js"]}</script>' in content)


Expand All @@ -231,12 +232,35 @@ def test_mathjax2_config(app, status, warning):
app.builder.build_all()

content = (app.outdir / 'index.html').read_text()
assert MATHJAX_URL in content
assert ('<script async="async" src="%s">' % MATHJAX_URL in content)
assert ('<script type="text/x-mathjax-config">'
'MathJax.Hub.Config({"extensions": ["tex2jax.js"]})'
'</script>' in content)


@pytest.mark.sphinx('html', testroot='ext-math',
confoverrides={'extensions': ['sphinx.ext.mathjax'],
'mathjax_options': {'async': 'async'},
'mathjax3_config': {'extensions': ['tex2jax.js']}})
def test_mathjax_options_async_for_mathjax3(app, status, warning):
app.builder.build_all()

content = (app.outdir / 'index.html').read_text()
assert MATHJAX_URL in content
assert ('<script async="async" src="%s">' % MATHJAX_URL in content)


@pytest.mark.sphinx('html', testroot='ext-math',
confoverrides={'extensions': ['sphinx.ext.mathjax'],
'mathjax_options': {'defer': 'defer'},
'mathjax2_config': {'extensions': ['tex2jax.js']}})
def test_mathjax_options_defer_for_mathjax2(app, status, warning):
app.builder.build_all()

content = (app.outdir / 'index.html').read_text()
assert ('<script defer="defer" src="%s">' % MATHJAX_URL in content)


@pytest.mark.sphinx('html', testroot='ext-math',
confoverrides={'extensions': ['sphinx.ext.mathjax']})
def test_mathjax_is_installed_only_if_document_having_math(app, status, warning):
Expand Down

0 comments on commit e2c6146

Please sign in to comment.