Skip to content

Commit c922189

Browse files
Merge pull request #9695 from jakobandersen/js_nodes
JS, use more desc_sig_* nodes
2 parents 37730d0 + 6321d14 commit c922189

File tree

6 files changed

+51
-21
lines changed

6 files changed

+51
-21
lines changed

CHANGES

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ Incompatible changes
1515
* #9672: the signature of
1616
:py:meth:`domains.py.PyObject.get_signature_prefix` has changed to
1717
return a list of nodes instead of a plain string.
18+
* #9695: ``domains.js.JSObject.display_prefix`` has been changed into a method
19+
``get_display_prefix`` which now returns a list of nodes
20+
instead of a plain string.
21+
* #9695: The rendering of Javascript domain declarations is implemented
22+
with more docutils nodes to allow better CSS styling.
23+
It may break existing styling.
24+
1825

1926
Deprecated
2027
----------
@@ -29,6 +36,7 @@ Features added
2936
for :rst:dir:`c:function` and :rst:dir:`c:macro`.
3037
* C++, added new info-field ``retval`` for :rst:dir:`cpp:function`.
3138
* #9672: More CSS classes on Python domain descriptions
39+
* #9695: More CSS classes on Javascript domain descriptions
3240

3341
Bugs fixed
3442
----------

doc/extdev/deprecated.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,11 @@ The following is a list of deprecated interfaces.
748748
- 4.0
749749
- ``sphinx.domains.std.StandardDomain.process_doc()``
750750

751+
* - ``sphinx.domains.js.JSObject.display_prefix``
752+
-
753+
- 4.3
754+
- ``sphinx.domains.js.JSObject.get_display_prefix()``
755+
751756
* - ``sphinx.environment.NoUri``
752757
- 2.1
753758
- 3.0

sphinx/domains/javascript.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,6 @@ class JSObject(ObjectDescription[Tuple[str, str]]):
4141
#: added
4242
has_arguments = False
4343

44-
#: what is displayed right before the documentation entry
45-
display_prefix: str = None
46-
4744
#: If ``allow_nesting`` is ``True``, the object prefixes will be accumulated
4845
#: based on directive nesting
4946
allow_nesting = False
@@ -53,6 +50,10 @@ class JSObject(ObjectDescription[Tuple[str, str]]):
5350
'noindexentry': directives.flag,
5451
}
5552

53+
def get_display_prefix(self) -> List[Node]:
54+
#: what is displayed right before the documentation entry
55+
return []
56+
5657
def handle_signature(self, sig: str, signode: desc_signature) -> Tuple[str, str]:
5758
"""Breaks down construct signatures
5859
@@ -71,6 +72,7 @@ def handle_signature(self, sig: str, signode: desc_signature) -> Tuple[str, str]
7172
# If construct is nested, prefix the current prefix
7273
prefix = self.env.ref_context.get('js:object', None)
7374
mod_name = self.env.ref_context.get('js:module')
75+
7476
name = member
7577
try:
7678
member_prefix, member_name = member.rsplit('.', 1)
@@ -91,14 +93,22 @@ def handle_signature(self, sig: str, signode: desc_signature) -> Tuple[str, str]
9193
signode['object'] = prefix
9294
signode['fullname'] = fullname
9395

94-
if self.display_prefix:
95-
signode += addnodes.desc_annotation(self.display_prefix,
96-
self.display_prefix)
96+
display_prefix = self.get_display_prefix()
97+
if display_prefix:
98+
signode += addnodes.desc_annotation('', '', *display_prefix)
99+
100+
actual_prefix = None
97101
if prefix:
98-
signode += addnodes.desc_addname(prefix + '.', prefix + '.')
102+
actual_prefix = prefix
99103
elif mod_name:
100-
signode += addnodes.desc_addname(mod_name + '.', mod_name + '.')
101-
signode += addnodes.desc_name(name, name)
104+
actual_prefix = mod_name
105+
if actual_prefix:
106+
addName = addnodes.desc_addname('', '')
107+
for p in actual_prefix.split('.'):
108+
addName += addnodes.desc_sig_name(p, p)
109+
addName += addnodes.desc_sig_punctuation('.', '.')
110+
signode += addName
111+
signode += addnodes.desc_name('', '', addnodes.desc_sig_name(name, name))
102112
if self.has_arguments:
103113
if not arglist:
104114
signode += addnodes.desc_parameterlist()
@@ -227,9 +237,13 @@ class JSCallable(JSObject):
227237

228238
class JSConstructor(JSCallable):
229239
"""Like a callable but with a different prefix."""
230-
display_prefix = 'class '
240+
231241
allow_nesting = True
232242

243+
def get_display_prefix(self) -> List[Node]:
244+
return [addnodes.desc_sig_keyword('class', 'class'),
245+
addnodes.desc_sig_space()]
246+
233247

234248
class JSModule(SphinxDirective):
235249
"""

sphinx/domains/python.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,8 @@ def _pseudo_parse_arglist(signode: desc_signature, arglist: str) -> None:
285285
ends_open += 1
286286
argument = argument[:-1].strip()
287287
if argument:
288-
stack[-1] += addnodes.desc_parameter(argument, argument)
288+
stack[-1] += addnodes.desc_parameter(
289+
'', '', addnodes.desc_sig_name(argument, argument))
289290
while ends_open:
290291
stack.append(addnodes.desc_optional())
291292
stack[-2] += stack[-1]

tests/test_domain_js.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515

1616
from sphinx import addnodes
1717
from sphinx.addnodes import (desc, desc_annotation, desc_content, desc_name, desc_parameter,
18-
desc_parameterlist, desc_signature)
18+
desc_parameterlist, desc_sig_keyword, desc_sig_name,
19+
desc_sig_space, desc_signature)
1920
from sphinx.domains.javascript import JavaScriptDomain
2021
from sphinx.testing import restructuredtext
2122
from sphinx.testing.util import assert_node
@@ -184,11 +185,11 @@ def test_js_function(app):
184185
text = ".. js:function:: sum(a, b)"
185186
doctree = restructuredtext.parse(app, text)
186187
assert_node(doctree, (addnodes.index,
187-
[desc, ([desc_signature, ([desc_name, "sum"],
188+
[desc, ([desc_signature, ([desc_name, ([desc_sig_name, "sum"])],
188189
desc_parameterlist)],
189190
[desc_content, ()])]))
190-
assert_node(doctree[1][0][1], [desc_parameterlist, ([desc_parameter, "a"],
191-
[desc_parameter, "b"])])
191+
assert_node(doctree[1][0][1], [desc_parameterlist, ([desc_parameter, ([desc_sig_name, "a"])],
192+
[desc_parameter, ([desc_sig_name, "b"])])])
192193
assert_node(doctree[0], addnodes.index,
193194
entries=[("single", "sum() (built-in function)", "sum", "", None)])
194195
assert_node(doctree[1], addnodes.desc, domain="js", objtype="function", noindex=False)
@@ -198,8 +199,9 @@ def test_js_class(app):
198199
text = ".. js:class:: Application"
199200
doctree = restructuredtext.parse(app, text)
200201
assert_node(doctree, (addnodes.index,
201-
[desc, ([desc_signature, ([desc_annotation, "class "],
202-
[desc_name, "Application"],
202+
[desc, ([desc_signature, ([desc_annotation, ([desc_sig_keyword, 'class'],
203+
desc_sig_space)],
204+
[desc_name, ([desc_sig_name, "Application"])],
203205
[desc_parameterlist, ()])],
204206
[desc_content, ()])]))
205207
assert_node(doctree[0], addnodes.index,
@@ -211,7 +213,7 @@ def test_js_data(app):
211213
text = ".. js:data:: name"
212214
doctree = restructuredtext.parse(app, text)
213215
assert_node(doctree, (addnodes.index,
214-
[desc, ([desc_signature, desc_name, "name"],
216+
[desc, ([desc_signature, ([desc_name, ([desc_sig_name, "name"])])],
215217
[desc_content, ()])]))
216218
assert_node(doctree[0], addnodes.index,
217219
entries=[("single", "name (global variable or constant)", "name", "", None)])

tests/test_domain_py.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -512,9 +512,9 @@ def test_optional_pyfunction_signature(app):
512512
assert_node(doctree[1], addnodes.desc, desctype="function",
513513
domain="py", objtype="function", noindex=False)
514514
assert_node(doctree[1][0][1],
515-
([desc_parameter, "source"],
516-
[desc_optional, ([desc_parameter, "filename"],
517-
[desc_optional, desc_parameter, "symbol"])]))
515+
([desc_parameter, ([desc_sig_name, "source"])],
516+
[desc_optional, ([desc_parameter, ([desc_sig_name, "filename"])],
517+
[desc_optional, desc_parameter, ([desc_sig_name, "symbol"])])]))
518518

519519

520520
def test_pyexception_signature(app):

0 commit comments

Comments
 (0)