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

Commit 586893f

Browse files
authored
Merge pull request #42 from readthedocs/humitos/setup-translators
Setup our own translator without override the existing one
2 parents c882d19 + 3fc8de1 commit 586893f

File tree

2 files changed

+40
-11
lines changed

2 files changed

+40
-11
lines changed

hoverxref/extension.py

+38-8
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from . import version
99
from .domains import HoverXRefPythonDomainMixin, HoverXRefStandardDomainMixin
10-
from .translators import HoverXRefHTMLTranslator
10+
from .translators import HoverXRefHTMLTranslatorMixin
1111

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

110110

111+
def setup_translators(app):
112+
"""
113+
Override translators respecting the one defined (if any).
114+
115+
We create a new class by inheriting the Sphinx Translator already defined
116+
and our own ``HoverXRefHTMLTranslatorMixin`` that includes the logic to
117+
``_hoverxref`` attributes.
118+
"""
119+
if not app.registry.translators.items():
120+
translator = types.new_class(
121+
'HoverXRefHTMLTranslator',
122+
(
123+
HoverXRefHTMLTranslatorMixin,
124+
app.builder.default_translator_class,
125+
),
126+
{},
127+
)
128+
app.set_translator(app.builder.name, translator, override=True)
129+
else:
130+
for name, klass in app.registry.translators.items():
131+
if app.builder.format != 'html':
132+
# Skip translators that are not HTML
133+
continue
134+
135+
translator = types.new_class(
136+
'HoverXRefHTMLTranslator',
137+
(
138+
HoverXRefHTMLTranslatorMixin,
139+
klass,
140+
),
141+
{},
142+
)
143+
app.set_translator(name, translator, override=True)
144+
145+
146+
111147
def setup(app):
112148
"""Setup ``hoverxref`` Sphinx extension."""
113149

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

137-
app.set_translator('html', HoverXRefHTMLTranslator, override=True)
138-
139-
# Read the Docs use ``readthedocs`` as the name of the build, so we need to
140-
# replace this as well
141-
app.set_translator('readthedocs', HoverXRefHTMLTranslator, override=True)
142-
app.set_translator('readthedocsdirhtml', HoverXRefHTMLTranslator, override=True)
143-
173+
app.connect('builder-inited', setup_translators)
144174
app.connect('config-inited', setup_domains)
145175
app.connect('config-inited', setup_sphinx_tabs)
146176
app.connect('build-finished', copy_asset_files)

hoverxref/translators.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
from sphinx.writers.html import HTMLTranslator
21
from sphinx.util import logging
32

43
logger = logging.getLogger(__name__)
54

65

7-
class HoverXRefHTMLTranslator(HTMLTranslator):
6+
class HoverXRefHTMLTranslatorMixin:
87

98
"""
10-
Override ``HTMLTranslator`` to render extra data saved in reference nodes.
9+
Mixin ``HTMLTranslator`` to render extra data saved in reference nodes.
1110
1211
It adds all the values saved under ``_hoverxref`` as attributes of the HTML
1312
reference tag.

0 commit comments

Comments
 (0)