mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Fix annotaions for extensions
This commit is contained in:
parent
83e4107a30
commit
337a5c484a
@ -9,6 +9,8 @@
|
|||||||
:license: BSD, see LICENSE for details.
|
:license: BSD, see LICENSE for details.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from typing import cast
|
||||||
|
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
|
|
||||||
from sphinx.locale import __
|
from sphinx.locale import __
|
||||||
@ -37,7 +39,8 @@ def register_sections_as_label(app, document):
|
|||||||
for node in document.traverse(nodes.section):
|
for node in document.traverse(nodes.section):
|
||||||
labelid = node['ids'][0]
|
labelid = node['ids'][0]
|
||||||
docname = app.env.docname
|
docname = app.env.docname
|
||||||
ref_name = getattr(node[0], 'rawsource', node[0].astext())
|
title = cast(nodes.title, node[0])
|
||||||
|
ref_name = getattr(node[0], 'rawsource', title.astext())
|
||||||
if app.config.autosectionlabel_prefix_document:
|
if app.config.autosectionlabel_prefix_document:
|
||||||
name = nodes.fully_normalize_name(docname + ':' + ref_name)
|
name = nodes.fully_normalize_name(docname + ':' + ref_name)
|
||||||
else:
|
else:
|
||||||
|
@ -36,7 +36,7 @@ from sphinx.util.osutil import relpath
|
|||||||
|
|
||||||
if False:
|
if False:
|
||||||
# For type annotation
|
# For type annotation
|
||||||
from typing import Any, Callable, Dict, IO, Iterable, List, Optional, Sequence, Set, Tuple # NOQA
|
from typing import Any, Callable, Dict, IO, Iterable, List, Optional, Sequence, Set, Tuple, Type # NOQA
|
||||||
from sphinx.application import Sphinx # NOQA
|
from sphinx.application import Sphinx # NOQA
|
||||||
from sphinx.util.typing import unicode # NOQA
|
from sphinx.util.typing import unicode # NOQA
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ class TestDirective(SphinxDirective):
|
|||||||
if not test:
|
if not test:
|
||||||
test = code
|
test = code
|
||||||
code = doctestopt_re.sub('', code)
|
code = doctestopt_re.sub('', code)
|
||||||
nodetype = nodes.literal_block
|
nodetype = nodes.literal_block # type: Type[nodes.TextElement]
|
||||||
if self.name in ('testsetup', 'testcleanup') or 'hide' in self.options:
|
if self.name in ('testsetup', 'testcleanup') or 'hide' in self.options:
|
||||||
nodetype = nodes.comment
|
nodetype = nodes.comment
|
||||||
if self.arguments:
|
if self.arguments:
|
||||||
|
@ -33,9 +33,14 @@ from sphinx.util.osutil import ensuredir, ENOENT, EPIPE, EINVAL
|
|||||||
if False:
|
if False:
|
||||||
# For type annotation
|
# For type annotation
|
||||||
from docutils.parsers.rst import Directive # NOQA
|
from docutils.parsers.rst import Directive # NOQA
|
||||||
from typing import Any, Dict, List, Tuple # NOQA
|
from typing import Any, Dict, List, Tuple, Union # NOQA
|
||||||
from sphinx.application import Sphinx # NOQA
|
from sphinx.application import Sphinx # NOQA
|
||||||
from sphinx.util.typing import unicode # NOQA
|
from sphinx.util.typing import unicode # NOQA
|
||||||
|
from sphinx.writers.html import HTMLTranslator # NOQA
|
||||||
|
from sphinx.writers.latex import LaTeXTranslator # NOQA
|
||||||
|
from sphinx.writers.manpage import ManualPageTranslator # NOQA
|
||||||
|
from sphinx.writers.texinfo import TexinfoTranslator # NOQA
|
||||||
|
from sphinx.writers.text import TextTranslator # NOQA
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -93,7 +98,7 @@ class graphviz(nodes.General, nodes.Inline, nodes.Element):
|
|||||||
|
|
||||||
|
|
||||||
def figure_wrapper(directive, node, caption):
|
def figure_wrapper(directive, node, caption):
|
||||||
# type: (Directive, nodes.Node, unicode) -> nodes.figure
|
# type: (Directive, graphviz, unicode) -> nodes.figure
|
||||||
figure_node = nodes.figure('', node)
|
figure_node = nodes.figure('', node)
|
||||||
if 'align' in node:
|
if 'align' in node:
|
||||||
figure_node['align'] = node.attributes.pop('align')
|
figure_node['align'] = node.attributes.pop('align')
|
||||||
@ -101,8 +106,7 @@ def figure_wrapper(directive, node, caption):
|
|||||||
parsed = nodes.Element()
|
parsed = nodes.Element()
|
||||||
directive.state.nested_parse(ViewList([caption], source=''),
|
directive.state.nested_parse(ViewList([caption], source=''),
|
||||||
directive.content_offset, parsed)
|
directive.content_offset, parsed)
|
||||||
caption_node = nodes.caption(parsed[0].rawsource, '',
|
caption_node = nodes.caption(parsed[0].rawsource, '', *parsed[0].children)
|
||||||
*parsed[0].children)
|
|
||||||
caption_node.source = parsed[0].source
|
caption_node.source = parsed[0].source
|
||||||
caption_node.line = parsed[0].line
|
caption_node.line = parsed[0].line
|
||||||
figure_node += caption_node
|
figure_node += caption_node
|
||||||
@ -110,7 +114,7 @@ def figure_wrapper(directive, node, caption):
|
|||||||
|
|
||||||
|
|
||||||
def align_spec(argument):
|
def align_spec(argument):
|
||||||
# type: (Any) -> bool
|
# type: (Any) -> str
|
||||||
return directives.choice(argument, ('left', 'center', 'right'))
|
return directives.choice(argument, ('left', 'center', 'right'))
|
||||||
|
|
||||||
|
|
||||||
@ -213,7 +217,7 @@ class GraphvizSimple(SphinxDirective):
|
|||||||
|
|
||||||
|
|
||||||
def render_dot(self, code, options, format, prefix='graphviz'):
|
def render_dot(self, code, options, format, prefix='graphviz'):
|
||||||
# type: (nodes.NodeVisitor, unicode, Dict, unicode, unicode) -> Tuple[unicode, unicode]
|
# type: (Union[HTMLTranslator, LaTeXTranslator, TexinfoTranslator], unicode, Dict, unicode, unicode) -> Tuple[unicode, unicode] # NOQA
|
||||||
"""Render graphviz code into a PNG or PDF output file."""
|
"""Render graphviz code into a PNG or PDF output file."""
|
||||||
graphviz_dot = options.get('graphviz_dot', self.builder.config.graphviz_dot)
|
graphviz_dot = options.get('graphviz_dot', self.builder.config.graphviz_dot)
|
||||||
hashkey = (code + str(options) + str(graphviz_dot) +
|
hashkey = (code + str(options) + str(graphviz_dot) +
|
||||||
@ -227,7 +231,7 @@ def render_dot(self, code, options, format, prefix='graphviz'):
|
|||||||
return relfn, outfn
|
return relfn, outfn
|
||||||
|
|
||||||
if (hasattr(self.builder, '_graphviz_warned_dot') and
|
if (hasattr(self.builder, '_graphviz_warned_dot') and
|
||||||
self.builder._graphviz_warned_dot.get(graphviz_dot)):
|
self.builder._graphviz_warned_dot.get(graphviz_dot)): # type: ignore # NOQA
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
ensuredir(path.dirname(outfn))
|
ensuredir(path.dirname(outfn))
|
||||||
@ -253,8 +257,8 @@ def render_dot(self, code, options, format, prefix='graphviz'):
|
|||||||
logger.warning(__('dot command %r cannot be run (needed for graphviz '
|
logger.warning(__('dot command %r cannot be run (needed for graphviz '
|
||||||
'output), check the graphviz_dot setting'), graphviz_dot)
|
'output), check the graphviz_dot setting'), graphviz_dot)
|
||||||
if not hasattr(self.builder, '_graphviz_warned_dot'):
|
if not hasattr(self.builder, '_graphviz_warned_dot'):
|
||||||
self.builder._graphviz_warned_dot = {}
|
self.builder._graphviz_warned_dot = {} # type: ignore
|
||||||
self.builder._graphviz_warned_dot[graphviz_dot] = True
|
self.builder._graphviz_warned_dot[graphviz_dot] = True # type: ignore
|
||||||
return None, None
|
return None, None
|
||||||
try:
|
try:
|
||||||
# Graphviz may close standard input when an error occurs,
|
# Graphviz may close standard input when an error occurs,
|
||||||
@ -278,7 +282,7 @@ def render_dot(self, code, options, format, prefix='graphviz'):
|
|||||||
|
|
||||||
def render_dot_html(self, node, code, options, prefix='graphviz',
|
def render_dot_html(self, node, code, options, prefix='graphviz',
|
||||||
imgcls=None, alt=None):
|
imgcls=None, alt=None):
|
||||||
# type: (nodes.NodeVisitor, graphviz, unicode, Dict, unicode, unicode, unicode) -> Tuple[unicode, unicode] # NOQA
|
# type: (HTMLTranslator, graphviz, unicode, Dict, unicode, unicode, unicode) -> Tuple[unicode, unicode] # NOQA
|
||||||
format = self.builder.config.graphviz_output_format
|
format = self.builder.config.graphviz_output_format
|
||||||
try:
|
try:
|
||||||
if format not in ('png', 'svg'):
|
if format not in ('png', 'svg'):
|
||||||
@ -331,12 +335,12 @@ def render_dot_html(self, node, code, options, prefix='graphviz',
|
|||||||
|
|
||||||
|
|
||||||
def html_visit_graphviz(self, node):
|
def html_visit_graphviz(self, node):
|
||||||
# type: (nodes.NodeVisitor, graphviz) -> None
|
# type: (HTMLTranslator, graphviz) -> None
|
||||||
render_dot_html(self, node, node['code'], node['options'])
|
render_dot_html(self, node, node['code'], node['options'])
|
||||||
|
|
||||||
|
|
||||||
def render_dot_latex(self, node, code, options, prefix='graphviz'):
|
def render_dot_latex(self, node, code, options, prefix='graphviz'):
|
||||||
# type: (nodes.NodeVisitor, graphviz, unicode, Dict, unicode) -> None
|
# type: (LaTeXTranslator, graphviz, unicode, Dict, unicode) -> None
|
||||||
try:
|
try:
|
||||||
fname, outfn = render_dot(self, code, options, 'pdf', prefix)
|
fname, outfn = render_dot(self, code, options, 'pdf', prefix)
|
||||||
except GraphvizError as exc:
|
except GraphvizError as exc:
|
||||||
@ -369,12 +373,12 @@ def render_dot_latex(self, node, code, options, prefix='graphviz'):
|
|||||||
|
|
||||||
|
|
||||||
def latex_visit_graphviz(self, node):
|
def latex_visit_graphviz(self, node):
|
||||||
# type: (nodes.NodeVisitor, graphviz) -> None
|
# type: (LaTeXTranslator, graphviz) -> None
|
||||||
render_dot_latex(self, node, node['code'], node['options'])
|
render_dot_latex(self, node, node['code'], node['options'])
|
||||||
|
|
||||||
|
|
||||||
def render_dot_texinfo(self, node, code, options, prefix='graphviz'):
|
def render_dot_texinfo(self, node, code, options, prefix='graphviz'):
|
||||||
# type: (nodes.NodeVisitor, graphviz, unicode, Dict, unicode) -> None
|
# type: (TexinfoTranslator, graphviz, unicode, Dict, unicode) -> None
|
||||||
try:
|
try:
|
||||||
fname, outfn = render_dot(self, code, options, 'png', prefix)
|
fname, outfn = render_dot(self, code, options, 'png', prefix)
|
||||||
except GraphvizError as exc:
|
except GraphvizError as exc:
|
||||||
@ -391,7 +395,7 @@ def texinfo_visit_graphviz(self, node):
|
|||||||
|
|
||||||
|
|
||||||
def text_visit_graphviz(self, node):
|
def text_visit_graphviz(self, node):
|
||||||
# type: (nodes.NodeVisitor, graphviz) -> None
|
# type: (TextTranslator, graphviz) -> None
|
||||||
if 'alt' in node.attributes:
|
if 'alt' in node.attributes:
|
||||||
self.add_text(_('[graph: %s]') % node['alt'])
|
self.add_text(_('[graph: %s]') % node['alt'])
|
||||||
else:
|
else:
|
||||||
@ -400,7 +404,7 @@ def text_visit_graphviz(self, node):
|
|||||||
|
|
||||||
|
|
||||||
def man_visit_graphviz(self, node):
|
def man_visit_graphviz(self, node):
|
||||||
# type: (nodes.NodeVisitor, graphviz) -> None
|
# type: (ManualPageTranslator, graphviz) -> None
|
||||||
if 'alt' in node.attributes:
|
if 'alt' in node.attributes:
|
||||||
self.body.append(_('[graph: %s]') % node['alt'])
|
self.body.append(_('[graph: %s]') % node['alt'])
|
||||||
else:
|
else:
|
||||||
|
@ -57,7 +57,7 @@ class IfConfig(SphinxDirective):
|
|||||||
|
|
||||||
|
|
||||||
def process_ifconfig_nodes(app, doctree, docname):
|
def process_ifconfig_nodes(app, doctree, docname):
|
||||||
# type: (Sphinx, nodes.Node, unicode) -> None
|
# type: (Sphinx, nodes.document, unicode) -> None
|
||||||
ns = dict((confval.name, confval.value) for confval in app.config)
|
ns = dict((confval.name, confval.value) for confval in app.config)
|
||||||
ns.update(app.config.__dict__.copy())
|
ns.update(app.config.__dict__.copy())
|
||||||
ns['builder'] = app.builder.name
|
ns['builder'] = app.builder.name
|
||||||
|
@ -31,12 +31,13 @@ from sphinx.util.pycompat import sys_encoding
|
|||||||
|
|
||||||
if False:
|
if False:
|
||||||
# For type annotation
|
# For type annotation
|
||||||
from typing import Any, Dict, List, Tuple # NOQA
|
from typing import Any, Dict, List, Tuple, Union # NOQA
|
||||||
from sphinx.addnodes import displaymath # NOQA
|
from sphinx.addnodes import displaymath # NOQA
|
||||||
from sphinx.application import Sphinx # NOQA
|
from sphinx.application import Sphinx # NOQA
|
||||||
from sphinx.builders import Builder # NOQA
|
from sphinx.builders import Builder # NOQA
|
||||||
from sphinx.config import Config # NOQA
|
from sphinx.config import Config # NOQA
|
||||||
from sphinx.util.typing import unicode # NOQA
|
from sphinx.util.typing import unicode # NOQA
|
||||||
|
from sphinx.writers.html import HTMLTranslator # NOQA
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -215,7 +216,7 @@ def convert_dvi_to_svg(dvipath, builder):
|
|||||||
|
|
||||||
|
|
||||||
def render_math(self, math):
|
def render_math(self, math):
|
||||||
# type: (nodes.NodeVisitor, unicode) -> Tuple[unicode, int]
|
# type: (HTMLTranslator, unicode) -> Tuple[unicode, int]
|
||||||
"""Render the LaTeX math expression *math* using latex and dvipng or
|
"""Render the LaTeX math expression *math* using latex and dvipng or
|
||||||
dvisvgm.
|
dvisvgm.
|
||||||
|
|
||||||
@ -251,7 +252,7 @@ def render_math(self, math):
|
|||||||
try:
|
try:
|
||||||
dvipath = compile_math(latex, self.builder)
|
dvipath = compile_math(latex, self.builder)
|
||||||
except InvokeError:
|
except InvokeError:
|
||||||
self.builder._imgmath_warned_latex = True
|
self.builder._imgmath_warned_latex = True # type: ignore
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
# .dvi -> .png/.svg
|
# .dvi -> .png/.svg
|
||||||
@ -261,7 +262,7 @@ def render_math(self, math):
|
|||||||
elif image_format == 'svg':
|
elif image_format == 'svg':
|
||||||
imgpath, depth = convert_dvi_to_svg(dvipath, self.builder)
|
imgpath, depth = convert_dvi_to_svg(dvipath, self.builder)
|
||||||
except InvokeError:
|
except InvokeError:
|
||||||
self.builder._imgmath_warned_image_translator = True
|
self.builder._imgmath_warned_image_translator = True # type: ignore
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
# Move generated image on tempdir to build dir
|
# Move generated image on tempdir to build dir
|
||||||
@ -284,14 +285,14 @@ def cleanup_tempdir(app, exc):
|
|||||||
|
|
||||||
|
|
||||||
def get_tooltip(self, node):
|
def get_tooltip(self, node):
|
||||||
# type: (nodes.NodeVisitor, nodes.math) -> unicode
|
# type: (HTMLTranslator, Union[nodes.math, nodes.math_block]) -> unicode
|
||||||
if self.builder.config.imgmath_add_tooltips:
|
if self.builder.config.imgmath_add_tooltips:
|
||||||
return ' alt="%s"' % self.encode(node.astext()).strip()
|
return ' alt="%s"' % self.encode(node.astext()).strip()
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
|
||||||
def html_visit_math(self, node):
|
def html_visit_math(self, node):
|
||||||
# type: (nodes.NodeVisitor, nodes.math) -> None
|
# type: (HTMLTranslator, nodes.math) -> None
|
||||||
try:
|
try:
|
||||||
fname, depth = render_math(self, '$' + node.astext() + '$')
|
fname, depth = render_math(self, '$' + node.astext() + '$')
|
||||||
except MathExtError as exc:
|
except MathExtError as exc:
|
||||||
@ -314,7 +315,7 @@ def html_visit_math(self, node):
|
|||||||
|
|
||||||
|
|
||||||
def html_visit_displaymath(self, node):
|
def html_visit_displaymath(self, node):
|
||||||
# type: (nodes.NodeVisitor, nodes.math_block) -> None
|
# type: (HTMLTranslator, nodes.math_block) -> None
|
||||||
if node['nowrap']:
|
if node['nowrap']:
|
||||||
latex = node.astext()
|
latex = node.astext()
|
||||||
else:
|
else:
|
||||||
|
@ -56,6 +56,9 @@ if False:
|
|||||||
from sphinx.application import Sphinx # NOQA
|
from sphinx.application import Sphinx # NOQA
|
||||||
from sphinx.environment import BuildEnvironment # NOQA
|
from sphinx.environment import BuildEnvironment # NOQA
|
||||||
from sphinx.util.typing import unicode # NOQA
|
from sphinx.util.typing import unicode # NOQA
|
||||||
|
from sphinx.writers.html import HTMLTranslator # NOQA
|
||||||
|
from sphinx.writers.latex import LaTeXTranslator # NOQA
|
||||||
|
from sphinx.writers.texinfo import TexinfoTranslator # NOQA
|
||||||
|
|
||||||
|
|
||||||
module_sig_re = re.compile(r'''^(?:([\w.]*)\.)? # module names
|
module_sig_re = re.compile(r'''^(?:([\w.]*)\.)? # module names
|
||||||
@ -386,7 +389,7 @@ def get_graph_hash(node):
|
|||||||
|
|
||||||
|
|
||||||
def html_visit_inheritance_diagram(self, node):
|
def html_visit_inheritance_diagram(self, node):
|
||||||
# type: (nodes.NodeVisitor, inheritance_diagram) -> None
|
# type: (HTMLTranslator, inheritance_diagram) -> None
|
||||||
"""
|
"""
|
||||||
Output the graph for HTML. This will insert a PNG with clickable
|
Output the graph for HTML. This will insert a PNG with clickable
|
||||||
image map.
|
image map.
|
||||||
@ -419,7 +422,7 @@ def html_visit_inheritance_diagram(self, node):
|
|||||||
|
|
||||||
|
|
||||||
def latex_visit_inheritance_diagram(self, node):
|
def latex_visit_inheritance_diagram(self, node):
|
||||||
# type: (nodes.NodeVisitor, inheritance_diagram) -> None
|
# type: (LaTeXTranslator, inheritance_diagram) -> None
|
||||||
"""
|
"""
|
||||||
Output the graph for LaTeX. This will insert a PDF.
|
Output the graph for LaTeX. This will insert a PDF.
|
||||||
"""
|
"""
|
||||||
@ -435,7 +438,7 @@ def latex_visit_inheritance_diagram(self, node):
|
|||||||
|
|
||||||
|
|
||||||
def texinfo_visit_inheritance_diagram(self, node):
|
def texinfo_visit_inheritance_diagram(self, node):
|
||||||
# type: (nodes.NodeVisitor, inheritance_diagram) -> None
|
# type: (TexinfoTranslator, inheritance_diagram) -> None
|
||||||
"""
|
"""
|
||||||
Output the graph for Texinfo. This will insert a PNG.
|
Output the graph for Texinfo. This will insert a PNG.
|
||||||
"""
|
"""
|
||||||
|
@ -287,7 +287,7 @@ def load_mappings(app):
|
|||||||
|
|
||||||
|
|
||||||
def missing_reference(app, env, node, contnode):
|
def missing_reference(app, env, node, contnode):
|
||||||
# type: (Sphinx, BuildEnvironment, nodes.Node, nodes.Node) -> None
|
# type: (Sphinx, BuildEnvironment, nodes.Element, nodes.TextElement) -> None
|
||||||
"""Attempt to resolve a missing reference via intersphinx references."""
|
"""Attempt to resolve a missing reference via intersphinx references."""
|
||||||
target = node['reftarget']
|
target = node['reftarget']
|
||||||
inventories = InventoryAdapter(env)
|
inventories = InventoryAdapter(env)
|
||||||
|
@ -10,9 +10,13 @@
|
|||||||
:license: BSD, see LICENSE for details.
|
:license: BSD, see LICENSE for details.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from typing import cast
|
||||||
|
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
|
|
||||||
import sphinx
|
import sphinx
|
||||||
|
from sphinx.builders.html import StandaloneHTMLBuilder
|
||||||
|
from sphinx.domains.math import MathDomain
|
||||||
from sphinx.errors import ExtensionError
|
from sphinx.errors import ExtensionError
|
||||||
from sphinx.locale import _
|
from sphinx.locale import _
|
||||||
from sphinx.util.math import get_node_equation_number
|
from sphinx.util.math import get_node_equation_number
|
||||||
@ -27,14 +31,14 @@ if False:
|
|||||||
|
|
||||||
|
|
||||||
def html_visit_math(self, node):
|
def html_visit_math(self, node):
|
||||||
# type: (nodes.NodeVisitor, nodes.Node) -> None
|
# type: (HTMLTranslator, nodes.math) -> None
|
||||||
self.body.append(self.starttag(node, 'span', '', CLASS='math notranslate nohighlight'))
|
self.body.append(self.starttag(node, 'span', '', CLASS='math notranslate nohighlight'))
|
||||||
self.body.append(self.encode(node.astext()) + '</span>')
|
self.body.append(self.encode(node.astext()) + '</span>')
|
||||||
raise nodes.SkipNode
|
raise nodes.SkipNode
|
||||||
|
|
||||||
|
|
||||||
def html_visit_displaymath(self, node):
|
def html_visit_displaymath(self, node):
|
||||||
# type: (HTMLTranslator, nodes.Node) -> None
|
# type: (HTMLTranslator, nodes.math_block) -> None
|
||||||
if node['nowrap']:
|
if node['nowrap']:
|
||||||
self.body.append(self.starttag(node, 'div', CLASS='math notranslate nohighlight'))
|
self.body.append(self.starttag(node, 'div', CLASS='math notranslate nohighlight'))
|
||||||
self.body.append(self.encode(node.astext()))
|
self.body.append(self.encode(node.astext()))
|
||||||
@ -69,9 +73,11 @@ def install_jsmath(app, env):
|
|||||||
raise ExtensionError('jsmath_path config value must be set for the '
|
raise ExtensionError('jsmath_path config value must be set for the '
|
||||||
'jsmath extension to work')
|
'jsmath extension to work')
|
||||||
|
|
||||||
if env.get_domain('math').has_equations(): # type: ignore
|
builder = cast(StandaloneHTMLBuilder, app.builder)
|
||||||
|
domain = cast(MathDomain, env.get_domain('math'))
|
||||||
|
if domain.has_equations():
|
||||||
# Enable jsmath only if equations exists
|
# Enable jsmath only if equations exists
|
||||||
app.builder.add_js_file(app.config.jsmath_path) # type: ignore
|
builder.add_js_file(app.config.jsmath_path)
|
||||||
|
|
||||||
|
|
||||||
def setup(app):
|
def setup(app):
|
||||||
|
@ -12,10 +12,13 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
from typing import cast
|
||||||
|
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
|
|
||||||
import sphinx
|
import sphinx
|
||||||
|
from sphinx.builders.html import StandaloneHTMLBuilder
|
||||||
|
from sphinx.domains.math import MathDomain
|
||||||
from sphinx.errors import ExtensionError
|
from sphinx.errors import ExtensionError
|
||||||
from sphinx.locale import _
|
from sphinx.locale import _
|
||||||
from sphinx.util.math import get_node_equation_number
|
from sphinx.util.math import get_node_equation_number
|
||||||
@ -30,7 +33,7 @@ if False:
|
|||||||
|
|
||||||
|
|
||||||
def html_visit_math(self, node):
|
def html_visit_math(self, node):
|
||||||
# type: (nodes.NodeVisitor, nodes.Node) -> None
|
# type: (HTMLTranslator, nodes.math) -> None
|
||||||
self.body.append(self.starttag(node, 'span', '', CLASS='math notranslate nohighlight'))
|
self.body.append(self.starttag(node, 'span', '', CLASS='math notranslate nohighlight'))
|
||||||
self.body.append(self.builder.config.mathjax_inline[0] +
|
self.body.append(self.builder.config.mathjax_inline[0] +
|
||||||
self.encode(node.astext()) +
|
self.encode(node.astext()) +
|
||||||
@ -39,7 +42,7 @@ def html_visit_math(self, node):
|
|||||||
|
|
||||||
|
|
||||||
def html_visit_displaymath(self, node):
|
def html_visit_displaymath(self, node):
|
||||||
# type: (HTMLTranslator, nodes.Node) -> None
|
# type: (HTMLTranslator, nodes.math_block) -> None
|
||||||
self.body.append(self.starttag(node, 'div', CLASS='math notranslate nohighlight'))
|
self.body.append(self.starttag(node, 'div', CLASS='math notranslate nohighlight'))
|
||||||
if node['nowrap']:
|
if node['nowrap']:
|
||||||
self.body.append(self.encode(node.astext()))
|
self.body.append(self.encode(node.astext()))
|
||||||
@ -79,16 +82,18 @@ def install_mathjax(app, env):
|
|||||||
raise ExtensionError('mathjax_path config value must be set for the '
|
raise ExtensionError('mathjax_path config value must be set for the '
|
||||||
'mathjax extension to work')
|
'mathjax extension to work')
|
||||||
|
|
||||||
if env.get_domain('math').has_equations(): # type: ignore
|
builder = cast(StandaloneHTMLBuilder, app.builder)
|
||||||
|
domain = cast(MathDomain, env.get_domain('math'))
|
||||||
|
if domain.has_equations():
|
||||||
# Enable mathjax only if equations exists
|
# Enable mathjax only if equations exists
|
||||||
options = {'async': 'async'}
|
options = {'async': 'async'}
|
||||||
if app.config.mathjax_options:
|
if app.config.mathjax_options:
|
||||||
options.update(app.config.mathjax_options)
|
options.update(app.config.mathjax_options)
|
||||||
app.builder.add_js_file(app.config.mathjax_path, **options) # type: ignore
|
builder.add_js_file(app.config.mathjax_path, **options)
|
||||||
|
|
||||||
if app.config.mathjax_config:
|
if app.config.mathjax_config:
|
||||||
body = "MathJax.Hub.Config(%s)" % json.dumps(app.config.mathjax_config)
|
body = "MathJax.Hub.Config(%s)" % json.dumps(app.config.mathjax_config)
|
||||||
app.builder.add_js_file(None, type="text/x-mathjax-config", body=body) # type: ignore # NOQA
|
builder.add_js_file(None, type="text/x-mathjax-config", body=body)
|
||||||
|
|
||||||
|
|
||||||
def setup(app):
|
def setup(app):
|
||||||
|
@ -12,6 +12,8 @@
|
|||||||
:license: BSD, see LICENSE for details.
|
:license: BSD, see LICENSE for details.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from typing import cast
|
||||||
|
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
from docutils.parsers.rst import directives
|
from docutils.parsers.rst import directives
|
||||||
from docutils.parsers.rst.directives.admonitions import BaseAdmonition
|
from docutils.parsers.rst.directives.admonitions import BaseAdmonition
|
||||||
@ -30,6 +32,8 @@ if False:
|
|||||||
from sphinx.application import Sphinx # NOQA
|
from sphinx.application import Sphinx # NOQA
|
||||||
from sphinx.environment import BuildEnvironment # NOQA
|
from sphinx.environment import BuildEnvironment # NOQA
|
||||||
from sphinx.util.typing import unicode # NOQA
|
from sphinx.util.typing import unicode # NOQA
|
||||||
|
from sphinx.writers.html import HTMLTranslator # NOQA
|
||||||
|
from sphinx.writers.latex import LaTeXTranslator # NOQA
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -64,19 +68,21 @@ class Todo(BaseAdmonition, SphinxDirective):
|
|||||||
(todo,) = super(Todo, self).run()
|
(todo,) = super(Todo, self).run()
|
||||||
if isinstance(todo, nodes.system_message):
|
if isinstance(todo, nodes.system_message):
|
||||||
return [todo]
|
return [todo]
|
||||||
|
elif isinstance(todo, todo_node):
|
||||||
|
todo.insert(0, nodes.title(text=_('Todo')))
|
||||||
|
set_source_info(self, todo)
|
||||||
|
|
||||||
todo.insert(0, nodes.title(text=_('Todo')))
|
targetid = 'index-%s' % self.env.new_serialno('index')
|
||||||
set_source_info(self, todo)
|
# Stash the target to be retrieved later in latex_visit_todo_node.
|
||||||
|
todo['targetref'] = '%s:%s' % (self.env.docname, targetid)
|
||||||
targetid = 'index-%s' % self.env.new_serialno('index')
|
targetnode = nodes.target('', '', ids=[targetid])
|
||||||
# Stash the target to be retrieved later in latex_visit_todo_node.
|
return [targetnode, todo]
|
||||||
todo['targetref'] = '%s:%s' % (self.env.docname, targetid)
|
else:
|
||||||
targetnode = nodes.target('', '', ids=[targetid])
|
raise RuntimeError # never reached here
|
||||||
return [targetnode, todo]
|
|
||||||
|
|
||||||
|
|
||||||
def process_todos(app, doctree):
|
def process_todos(app, doctree):
|
||||||
# type: (Sphinx, nodes.Node) -> None
|
# type: (Sphinx, nodes.document) -> None
|
||||||
# collect all todos in the environment
|
# collect all todos in the environment
|
||||||
# this is not done in the directive itself because it some transformations
|
# this is not done in the directive itself because it some transformations
|
||||||
# must have already been run, e.g. substitutions
|
# must have already been run, e.g. substitutions
|
||||||
@ -103,7 +109,8 @@ def process_todos(app, doctree):
|
|||||||
})
|
})
|
||||||
|
|
||||||
if env.config.todo_emit_warnings:
|
if env.config.todo_emit_warnings:
|
||||||
logger.warning(__("TODO entry found: %s"), node[1].astext(),
|
label = cast(nodes.Element, node[1])
|
||||||
|
logger.warning(__("TODO entry found: %s"), label.astext(),
|
||||||
location=node)
|
location=node)
|
||||||
|
|
||||||
|
|
||||||
@ -126,7 +133,8 @@ class TodoList(SphinxDirective):
|
|||||||
|
|
||||||
|
|
||||||
def process_todo_nodes(app, doctree, fromdocname):
|
def process_todo_nodes(app, doctree, fromdocname):
|
||||||
# type: (Sphinx, nodes.Node, unicode) -> None
|
# type: (Sphinx, nodes.document, unicode) -> None
|
||||||
|
node = None # type: nodes.Element
|
||||||
if not app.config['todo_include_todos']:
|
if not app.config['todo_include_todos']:
|
||||||
for node in doctree.traverse(todo_node):
|
for node in doctree.traverse(todo_node):
|
||||||
node.parent.remove(node)
|
node.parent.remove(node)
|
||||||
@ -140,7 +148,7 @@ def process_todo_nodes(app, doctree, fromdocname):
|
|||||||
|
|
||||||
for node in doctree.traverse(todolist):
|
for node in doctree.traverse(todolist):
|
||||||
if node.get('ids'):
|
if node.get('ids'):
|
||||||
content = [nodes.target()]
|
content = [nodes.target()] # type: List[nodes.Element]
|
||||||
else:
|
else:
|
||||||
content = []
|
content = []
|
||||||
|
|
||||||
@ -212,16 +220,15 @@ def merge_info(app, env, docnames, other):
|
|||||||
def visit_todo_node(self, node):
|
def visit_todo_node(self, node):
|
||||||
# type: (nodes.NodeVisitor, todo_node) -> None
|
# type: (nodes.NodeVisitor, todo_node) -> None
|
||||||
self.visit_admonition(node)
|
self.visit_admonition(node)
|
||||||
# self.visit_admonition(node, 'todo')
|
|
||||||
|
|
||||||
|
|
||||||
def depart_todo_node(self, node):
|
def depart_todo_node(self, node):
|
||||||
# type: (nodes.NodeVisitor, todo_node) -> None
|
# type: (HTMLTranslator, todo_node) -> None
|
||||||
self.depart_admonition(node)
|
self.depart_admonition(node)
|
||||||
|
|
||||||
|
|
||||||
def latex_visit_todo_node(self, node):
|
def latex_visit_todo_node(self, node):
|
||||||
# type: (nodes.NodeVisitor, todo_node) -> None
|
# type: (LaTeXTranslator, todo_node) -> None
|
||||||
title = node.pop(0).astext().translate(tex_escape_map)
|
title = node.pop(0).astext().translate(tex_escape_map)
|
||||||
self.body.append(u'\n\\begin{sphinxadmonition}{note}{')
|
self.body.append(u'\n\\begin{sphinxadmonition}{note}{')
|
||||||
# If this is the original todo node, emit a label that will be referenced by
|
# If this is the original todo node, emit a label that will be referenced by
|
||||||
@ -233,7 +240,7 @@ def latex_visit_todo_node(self, node):
|
|||||||
|
|
||||||
|
|
||||||
def latex_depart_todo_node(self, node):
|
def latex_depart_todo_node(self, node):
|
||||||
# type: (nodes.NodeVisitor, todo_node) -> None
|
# type: (LaTeXTranslator, todo_node) -> None
|
||||||
self.body.append('\\end{sphinxadmonition}\n')
|
self.body.append('\\end{sphinxadmonition}\n')
|
||||||
|
|
||||||
|
|
||||||
|
@ -143,12 +143,14 @@ def env_merge_info(app, env, docnames, other):
|
|||||||
|
|
||||||
|
|
||||||
def missing_reference(app, env, node, contnode):
|
def missing_reference(app, env, node, contnode):
|
||||||
# type: (Sphinx, BuildEnvironment, nodes.Node, nodes.Node) -> nodes.Node
|
# type: (Sphinx, BuildEnvironment, nodes.Element, nodes.Node) -> nodes.Node
|
||||||
# resolve our "viewcode" reference nodes -- they need special treatment
|
# resolve our "viewcode" reference nodes -- they need special treatment
|
||||||
if node['reftype'] == 'viewcode':
|
if node['reftype'] == 'viewcode':
|
||||||
return make_refnode(app.builder, node['refdoc'], node['reftarget'],
|
return make_refnode(app.builder, node['refdoc'], node['reftarget'],
|
||||||
node['refid'], contnode)
|
node['refid'], contnode)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def collect_pages(app):
|
def collect_pages(app):
|
||||||
# type: (Sphinx) -> Iterator[Tuple[unicode, Dict[unicode, Any], unicode]]
|
# type: (Sphinx) -> Iterator[Tuple[unicode, Dict[unicode, Any], unicode]]
|
||||||
|
Loading…
Reference in New Issue
Block a user