Skip to content

Commit 71c3af2

Browse files
committed
Merge branch 'master' of github.com:humitos/sphinx-hoverxref into humitos/micromodal
2 parents fc32ff3 + 9fb3c66 commit 71c3af2

File tree

13 files changed

+130
-48
lines changed

13 files changed

+130
-48
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ dist: xenial
33
python:
44
- 3.6
55
- 3.7
6+
- 3.8
67
install:
78
pip install tox-travis
89
script:

MANIFEST.in

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
prune common
22
include LICENSE
3+
34
include hoverxref/_static/js/hoverxref.js_t
5+
46
include hoverxref/_static/js/tooltipster.bundle.min.js
57
include hoverxref/_static/css/tooltipster.bundle.min.css
68
include hoverxref/_static/css/tooltipster-sideTip-shadow.min.css
79
include hoverxref/_static/css/tooltipster.custom.css
10+
include hoverxref/_static/css/tooltipster-sideTip-light.min.css
11+
include hoverxref/_static/css/tooltipster-sideTip-borderless.min.css
12+
include hoverxref/_static/css/tooltipster-sideTip-noir.min.css
13+
include hoverxref/_static/css/tooltipster-sideTip-punk.min.css
814

915
include hoverxref/_static/js/micromodal.min.js
1016
include hoverxref/_static/css/micromodal.css

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130
# Add any paths that contain custom static files (such as style sheets) here,
131131
# relative to this directory. They are copied after the builtin static files,
132132
# so a file named "default.css" will overwrite the builtin "default.css".
133-
html_static_path = ['_static']
133+
# html_static_path = ['_static']
134134

135135
# Custom sidebar templates, must be a dictionary that maps document names
136136
# to template names.

docs/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
sphinx==1.8.5 # pyup: ignore
2-
sphinx-autoapi==1.2.1
2+
sphinx-autoapi==1.3.0
33
sphinx-rtd-theme==0.4.3
44
sphinx-tabs==1.1.13
55
sphinx-prompt==1.1.0

docs/usage.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ An example using Python Domain would be like:
7171

7272
.. code-block:: rst
7373
74-
:py:class:`hoverxref.domains.HoverXRefStandardDomain`
74+
:py:class:`hoverxref.domains.HoverXRefStandardDomainMixin`
7575
7676
That will render to:
7777

78-
:py:class:`hoverxref.domains.HoverXRefStandardDomain`
78+
:py:class:`hoverxref.domains.HoverXRefStandardDomainMixin`
7979

8080

8181
To enable ``hoverxref`` on a domain, you need to use the config :confval:`hoverxref_domains`

hoverxref/_static/js/hoverxref.js_t

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,15 @@ $(document).ready(function() {
7272
var project = $origin.data('project');
7373
var version = $origin.data('version');
7474
var doc = $origin.data('doc');
75+
var docpath = $origin.data('docpath');
7576
var section = $origin.data('section');
7677

77-
console.debug('Data: project=' + project + ' version=' + version + ' doc=' + doc + ' section=' + section);
78+
console.debug('Data: project=' + project + ' version=' + version + ' doc=' + doc + ' path=' + docpath + ' section=' + section);
7879

7980
// we set a variable so the data is only loaded once via Ajax, not every time the tooltip opens
8081
if ($origin.data('loaded') !== true) {
8182
// TODO: improve URL handling here
82-
var url = '{{ hoverxref_api_host }}' + '/api/v2/embed/?' + 'project=' + project + '&version=' + version + '&doc=' + doc + '&section=' + section;
83+
var url = '{{ hoverxref_api_host }}' + '/api/v2/embed/?' + 'project=' + project + '&version=' + version + '&doc=' + doc + '&path=' + docpath + '&section=' + section;
8384
$.get(url, function(data) {
8485
// call the 'content' method to update the content of our tooltip with the returned data.
8586
// note: this content update will trigger an update animation (see the updateAnimation option)

hoverxref/domains.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from sphinx.domains.python import PythonDomain
2-
from sphinx.domains.std import StandardDomain
31
from sphinx.util import logging
42
from .utils import get_ref_xref_data, get_ref_obj_data
53

@@ -13,7 +11,7 @@ def _is_hoverxref_configured(self, env):
1311
version = env.config.hoverxref_version
1412
return project and version
1513

16-
def _inject_hoverxref_data(self, env, refnode, docname, labelid):
14+
def _inject_hoverxref_data(self, env, refnode, docname, docpath, labelid):
1715
refnode.replace_attr('classes', ['hoverxref'])
1816

1917
project = env.config.hoverxref_project
@@ -22,11 +20,17 @@ def _inject_hoverxref_data(self, env, refnode, docname, labelid):
2220
'data-project': project,
2321
'data-version': version,
2422
'data-doc': docname,
23+
'data-docpath': docpath,
2524
'data-section': labelid,
2625
}
2726

27+
def _get_docpath(self, builder, docname):
28+
docpath = builder.get_outfilename(docname)
29+
docpath = docpath.replace(builder.outdir, '')
30+
return docpath
2831

29-
class HoverXRefPythonDomain(HoverXRefBaseDomain, PythonDomain):
32+
33+
class HoverXRefPythonDomainMixin(HoverXRefBaseDomain):
3034

3135
def resolve_xref(self, env, fromdocname, builder, type, target, node, contnode):
3236
refnode = super().resolve_xref(env, fromdocname, builder, type, target, node, contnode)
@@ -42,7 +46,9 @@ def resolve_xref(self, env, fromdocname, builder, type, target, node, contnode):
4246

4347
if self._is_hoverxref_configured(env):
4448
docname, labelid = obj[0], name
45-
self._inject_hoverxref_data(env, refnode, docname, labelid)
49+
docpath = self._get_docpath(builder, docname)
50+
51+
self._inject_hoverxref_data(env, refnode, docname, docpath, labelid)
4652
logger.info(
4753
':ref: _hoverxref injected: fromdocname=%s %s',
4854
fromdocname,
@@ -51,9 +57,9 @@ def resolve_xref(self, env, fromdocname, builder, type, target, node, contnode):
5157
return refnode
5258

5359

54-
class HoverXRefStandardDomain(HoverXRefBaseDomain, StandardDomain):
60+
class HoverXRefStandardDomainMixin(HoverXRefBaseDomain):
5561
"""
56-
Override ``StandardDomain`` to save the values after the xref resolution.
62+
Mixin for ``StandardDomain`` to save the values after the xref resolution.
5763
5864
``:ref:`` are treating as a different node in Sphinx
5965
(``sphinx.addnodes.pending_xref``). These nodes are translated to regular
@@ -83,7 +89,9 @@ def _resolve_ref_xref(self, env, fromdocname, builder, typ, target, node, contno
8389

8490
if self._is_hoverxref_configured(env) and (env.config.hoverxref_auto_ref or typ == 'hoverxref'):
8591
docname, labelid, _ = get_ref_xref_data(self, node, target)
86-
self._inject_hoverxref_data(env, refnode, docname, labelid)
92+
docpath = self._get_docpath(builder, docname)
93+
94+
self._inject_hoverxref_data(env, refnode, docname, docpath, labelid)
8795
logger.info(
8896
':ref: _hoverxref injected: fromdocname=%s %s',
8997
fromdocname,
@@ -99,7 +107,9 @@ def _resolve_obj_xref(self, env, fromdocname, builder, typ, target, node, contno
99107
if typ in env.config.hoverxref_roles:
100108
docname, labelid = get_ref_obj_data(self, node, typ, target)
101109
if self._is_hoverxref_configured(env):
102-
self._inject_hoverxref_data(env, refnode, docname, labelid)
110+
docpath = self._get_docpath(builder, docname)
111+
112+
self._inject_hoverxref_data(env, refnode, docname, docpath, labelid)
103113
logger.info(
104114
':%s: _hoverxref injected: fromdocname=%s %s',
105115
typ,

hoverxref/extension.py

Lines changed: 75 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import os
22
import inspect
3+
import types
34
from docutils import nodes
5+
import sphinx
46
from sphinx.roles import XRefRole
57
from sphinx.util.fileutil import copy_asset
68
from sphinx.util import logging
79

810
from . import version
9-
from .domains import HoverXRefPythonDomain, HoverXRefStandardDomain
10-
from .translators import HoverXRefHTMLTranslator
11+
from .domains import HoverXRefPythonDomainMixin, HoverXRefStandardDomainMixin
12+
from .translators import HoverXRefHTMLTranslatorMixin
1113

1214
logger = logging.getLogger(__name__)
1315

@@ -72,6 +74,13 @@ def copy_asset_files(app, exception):
7274

7375

7476
def setup_domains(app, config):
77+
"""
78+
Override domains respecting the one defined (if any).
79+
80+
We create a new class by inheriting the Sphinx Domain already defined
81+
and our own ``HoverXRef...DomainMixin`` that includes the logic for
82+
``_hoverxref`` attributes.
83+
"""
7584
# Add ``hoverxref`` role replicating the behavior of ``ref``
7685
app.add_role_to_domain(
7786
'std',
@@ -82,10 +91,27 @@ def setup_domains(app, config):
8291
warn_dangling=True,
8392
),
8493
)
85-
app.add_domain(HoverXRefStandardDomain, override=True)
8694

87-
if 'py' in config.hoverxref_domains:
88-
app.add_domain(HoverXRefPythonDomain, override=True)
95+
domain = types.new_class(
96+
'HoverXRefStandardDomain',
97+
(
98+
HoverXRefStandardDomainMixin,
99+
app.registry.domains.get('std'),
100+
),
101+
{}
102+
)
103+
app.add_domain(domain, override=True)
104+
105+
if 'py' in app.config.hoverxref_domains:
106+
domain = types.new_class(
107+
'HoverXRefPythonDomain',
108+
(
109+
HoverXRefPythonDomainMixin,
110+
app.registry.domains.get('py'),
111+
),
112+
{}
113+
)
114+
app.add_domain(domain, override=True)
89115

90116

91117
def setup_sphinx_tabs(app, config):
@@ -95,13 +121,54 @@ def setup_sphinx_tabs(app, config):
95121
Sphinx Tabs removes the CSS/JS from pages that does not use the directive.
96122
Although, we need them to use inside the tooltip.
97123
"""
98-
listeners = list(app.events.listeners.get('html-page-context').items())
124+
if sphinx.version_info < (3, 0, 0):
125+
listeners = list(app.events.listeners.get('html-page-context').items())
126+
else:
127+
listeners = [
128+
(listener.id, listener.handler)
129+
for listener in app.events.listeners.get('html-page-context')
130+
]
99131
for listener_id, function in listeners:
100132
module_name = inspect.getmodule(function).__name__
101133
if module_name == 'sphinx_tabs.tabs':
102134
app.disconnect(listener_id)
103135

104136

137+
def setup_translators(app):
138+
"""
139+
Override translators respecting the one defined (if any).
140+
141+
We create a new class by inheriting the Sphinx Translator already defined
142+
and our own ``HoverXRefHTMLTranslatorMixin`` that includes the logic to
143+
``_hoverxref`` attributes.
144+
"""
145+
if not app.registry.translators.items():
146+
translator = types.new_class(
147+
'HoverXRefHTMLTranslator',
148+
(
149+
HoverXRefHTMLTranslatorMixin,
150+
app.builder.default_translator_class,
151+
),
152+
{},
153+
)
154+
app.set_translator(app.builder.name, translator, override=True)
155+
else:
156+
for name, klass in app.registry.translators.items():
157+
if app.builder.format != 'html':
158+
# Skip translators that are not HTML
159+
continue
160+
161+
translator = types.new_class(
162+
'HoverXRefHTMLTranslator',
163+
(
164+
HoverXRefHTMLTranslatorMixin,
165+
klass,
166+
),
167+
{},
168+
)
169+
app.set_translator(name, translator, override=True)
170+
171+
105172
def setup_theme(app, exception):
106173
"""
107174
Auto-configure default settings for known themes.
@@ -145,6 +212,7 @@ def deprecated_configs_warning(app, exception):
145212
app.config.hoverxref_api_host = app.config.hoverxref_tooltip_api_host
146213

147214

215+
148216
def setup(app):
149217
"""Setup ``hoverxref`` Sphinx extension."""
150218

@@ -188,12 +256,7 @@ def setup(app):
188256
app.add_config_value('hoverxref_modal_default_title', 'Note', 'env')
189257
app.add_config_value('hoverxref_modal_prefix_title', '📝 ', 'env')
190258

191-
app.set_translator('html', HoverXRefHTMLTranslator, override=True)
192-
193-
# Read the Docs use ``readthedocs`` as the name of the build, so we need to
194-
# replace this as well
195-
app.set_translator('readthedocs', HoverXRefHTMLTranslator, override=True)
196-
app.set_translator('readthedocsdirhtml', HoverXRefHTMLTranslator, override=True)
259+
app.connect('builder-inited', setup_translators)
197260

198261
app.connect('config-inited', deprecated_configs_warning)
199262

hoverxref/translators.py

Lines changed: 2 additions & 3 deletions
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.

tests/examples/python-domain/api.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
API
44
===
55

6-
.. autoclass:: hoverxref.extension.HoverXRefStandardDomain
6+
.. autoclass:: hoverxref.extension.HoverXRefStandardDomainMixin
77

88

99
.. automodule:: hoverxref.extension

0 commit comments

Comments
 (0)