Skip to content
This repository was archived by the owner on Apr 9, 2025. It is now read-only.

Setup our own translator without override the existing one #42

Merged
merged 3 commits into from
Apr 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 38 additions & 8 deletions hoverxref/extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from . import version
from .domains import HoverXRefPythonDomainMixin, HoverXRefStandardDomainMixin
from .translators import HoverXRefHTMLTranslator
from .translators import HoverXRefHTMLTranslatorMixin

ASSETS_FILES = [
'js/hoverxref.js_t', # ``_t`` tells Sphinx this is a template
Expand Down Expand Up @@ -108,6 +108,42 @@ def setup_sphinx_tabs(app, config):
app.disconnect(listener_id)


def setup_translators(app):
"""
Override translators respecting the one defined (if any).

We create a new class by inheriting the Sphinx Translator already defined
and our own ``HoverXRefHTMLTranslatorMixin`` that includes the logic to
``_hoverxref`` attributes.
"""
if not app.registry.translators.items():
translator = types.new_class(
'HoverXRefHTMLTranslator',
(
HoverXRefHTMLTranslatorMixin,
app.builder.default_translator_class,
),
{},
)
app.set_translator(app.builder.name, translator, override=True)
else:
for name, klass in app.registry.translators.items():
if app.builder.format != 'html':
# Skip translators that are not HTML
continue

translator = types.new_class(
'HoverXRefHTMLTranslator',
(
HoverXRefHTMLTranslatorMixin,
klass,
),
{},
)
app.set_translator(name, translator, override=True)



def setup(app):
"""Setup ``hoverxref`` Sphinx extension."""

Expand All @@ -134,13 +170,7 @@ def setup(app):
app.add_config_value('hoverxref_tooltip_content', 'Loading...', 'env')
app.add_config_value('hoverxref_tooltip_class', 'rst-content', 'env')

app.set_translator('html', HoverXRefHTMLTranslator, override=True)

# Read the Docs use ``readthedocs`` as the name of the build, so we need to
# replace this as well
app.set_translator('readthedocs', HoverXRefHTMLTranslator, override=True)
app.set_translator('readthedocsdirhtml', HoverXRefHTMLTranslator, override=True)

app.connect('builder-inited', setup_translators)
app.connect('config-inited', setup_domains)
app.connect('config-inited', setup_sphinx_tabs)
app.connect('build-finished', copy_asset_files)
Expand Down
5 changes: 2 additions & 3 deletions hoverxref/translators.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
from sphinx.writers.html import HTMLTranslator
from sphinx.util import logging

logger = logging.getLogger(__name__)


class HoverXRefHTMLTranslator(HTMLTranslator):
class HoverXRefHTMLTranslatorMixin:

"""
Override ``HTMLTranslator`` to render extra data saved in reference nodes.
Mixin ``HTMLTranslator`` to render extra data saved in reference nodes.

It adds all the values saved under ``_hoverxref`` as attributes of the HTML
reference tag.
Expand Down