Skip to content
This repository was archived by the owner on Apr 9, 2025. It is now read-only.
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 41 additions & 8 deletions hoverxref/extension.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import os
import inspect
import types
from docutils import nodes
from sphinx.roles import XRefRole
from sphinx.util.fileutil import copy_asset

from . import version
from .domains import HoverXRefPythonDomain, HoverXRefStandardDomain
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 @@ -83,6 +84,44 @@ 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():
# Read the Docs use ``readthedocs`` as the name of the build, so we
# need to replace this as well
if name not in ['html', 'readthedocs', 'readthedocsdirhtml']:
# Skip translator 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 @@ -109,13 +148,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