EVOLUTION-MANAGER
Edit File: compat.py
# -*- coding: utf-8 -*- """ sphinx.transforms.post_transforms.compat ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Post transforms for compatibility :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ import warnings from docutils import nodes from docutils.writers.docutils_xml import XMLTranslator from sphinx.addnodes import math_block, displaymath from sphinx.deprecation import RemovedInSphinx30Warning from sphinx.transforms import SphinxTransform from sphinx.util import logging if False: # For type annotation from typing import Any, Callable, Dict, Iterable, List, Tuple # NOQA from docutils.parsers.rst.states import Inliner # NOQA from docutils.writers.html4css1 import Writer # NOQA from sphinx.application import Sphinx # NOQA from sphinx.builders import Builder # NOQA from sphinx.environment import BuildEnvironment # NOQA logger = logging.getLogger(__name__) class MathNodeMigrator(SphinxTransform): """Migrate a math node to docutils'. For a long time, Sphinx uses an original node for math. Since 1.8, Sphinx starts to use a math node of docutils'. This transform converts old and new nodes to keep compatibility. """ default_priority = 999 def apply(self): # type: () -> None for node in self.document.traverse(nodes.math): # case: old styled ``math`` node generated by old extensions if len(node) == 0: warnings.warn("math node for Sphinx was replaced by docutils'. " "Please use ``docutils.nodes.math`` instead.", RemovedInSphinx30Warning) equation = node['latex'] node += nodes.Text(equation, equation) translator = self.app.builder.get_translator_class() if hasattr(translator, 'visit_displaymath') and translator != XMLTranslator: # case: old translators which does not support ``math_block`` node warnings.warn("Translator for %s does not support math_block node'. " "Please update your extension." % translator, RemovedInSphinx30Warning) for node in self.document.traverse(math_block): alt = displaymath(latex=node.astext(), number=node.get('number'), label=node.get('label'), nowrap=node.get('nowrap'), docname=node.get('docname')) node.replace(alt) elif getattr(self.app.builder, 'math_renderer_name', None) == 'unknown': # case: math extension provides old styled math renderer for node in self.document.traverse(nodes.math_block): node['latex'] = node.astext() # case: old styled ``displaymath`` node generated by old extensions for node in self.document.traverse(math_block): if len(node) == 0: warnings.warn("math node for Sphinx was replaced by docutils'. " "Please use ``docutils.nodes.math_block`` instead.", RemovedInSphinx30Warning) if isinstance(node, displaymath): newnode = nodes.math_block('', node['latex'], **node.attributes) node.replace_self(newnode) else: latex = node['latex'] node += nodes.Text(latex, latex) def setup(app): # type: (Sphinx) -> Dict[unicode, Any] app.add_post_transform(MathNodeMigrator) return { 'version': 'builtin', 'parallel_read_safe': True, 'parallel_write_safe': True, }