Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #9864: mathjax: Failed to render equations via MathJax v2 #9867

Merged
merged 4 commits into from Nov 23, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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)
tk0miya marked this conversation as resolved.
Show resolved Hide resolved
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