Skip to content
Open
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
2 changes: 2 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ Features added
Patch by Adam Turner.
* #13805: LaTeX: add support for ``fontawesome7`` package.
Patch by Jean-François B.
* #13876: Group nodes generated by :kbd: role and add class to separators
Patch by Brecht Machiels.

Bugs fixed
----------
Expand Down
11 changes: 4 additions & 7 deletions sphinx/roles.py
Original file line number Diff line number Diff line change
Expand Up @@ -491,27 +491,24 @@ def run(self) -> tuple[list[Node], list[system_message]]:
if 'classes' in self.options:
classes.extend(self.options['classes'])

compound = nodes.inline(self.rawtext, classes=['kbdcompound'])
parts = self._pattern.split(self.text)
if len(parts) == 1 or self._is_multi_word_key(parts):
return [nodes.literal(self.rawtext, self.text, classes=classes)], []

compound: list[Node] = []
while parts:
if self._is_multi_word_key(parts):
key = ''.join(parts[:3])
parts[:3] = []
else:
key = parts.pop(0)
compound.append(nodes.literal(key, key, classes=classes))
compound += nodes.literal(key, key, classes=['kbd'])

try:
sep = parts.pop(0) # key separator ('-', '+', '^', etc)
except IndexError:
break
else:
compound.append(nodes.Text(sep))
compound += nodes.inline(sep, sep, classes=['kbdsep'])

return compound, []
return [compound], []

@staticmethod
def _is_multi_word_key(parts: list[str]) -> bool:
Expand Down
2 changes: 1 addition & 1 deletion tests/test_builders/test_build_html_5_output.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ def checker(nodes: Iterable[Element]) -> Literal[True]:
('markup.html', './/li/p/strong', r'^command\\n$'),
('markup.html', './/li/p/strong', r'^program\\n$'),
('markup.html', './/li/p/em', r'^dfn\\n$'),
('markup.html', './/li/p/kbd', r'^kbd\\n$'),
('markup.html', './/li/p/span/kbd', r'^kbd\\n$'),
('markup.html', './/li/p/span', 'File \N{TRIANGULAR BULLET} Close'),
('markup.html', ".//li/p/code/span[@class='pre']", '^a/$'),
('markup.html', ".//li/p/code/em/span[@class='pre']", '^varpart$'),
Expand Down
104 changes: 82 additions & 22 deletions tests/test_markup/test_markup.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,25 +332,40 @@ def get_verifier(verify, verify_re):
# kbd role
'verify',
':kbd:`space`',
'<p><kbd class="kbd docutils literal notranslate">space</kbd></p>',
'\\sphinxAtStartPar\n\\sphinxkeyboard{\\sphinxupquote{space}}',
(
'<p>'
'<span class="kbdcompound">'
'<kbd class="kbd docutils literal notranslate">space</kbd>'
'</span>'
'</p>'
),
(
'\\sphinxAtStartPar\n'
'\\DUrole{kbdcompound}{'
'\\sphinxkeyboard{\\sphinxupquote{space}}'
'}'
),
),
(
# kbd role
'verify',
':kbd:`Control+X`',
(
'<p>'
'<span class="kbdcompound">'
'<kbd class="kbd docutils literal notranslate">Control</kbd>'
'+'
'<span class="kbdsep">+</span>'
'<kbd class="kbd docutils literal notranslate">X</kbd>'
'</span>'
'</p>'
),
(
'\\sphinxAtStartPar\n'
'\\DUrole{kbdcompound}{'
'\\sphinxkeyboard{\\sphinxupquote{Control}}'
'+'
'\\DUrole{kbdsep}{+}'
'\\sphinxkeyboard{\\sphinxupquote{X}}'
'}'
),
),
(
Expand All @@ -359,16 +374,20 @@ def get_verifier(verify, verify_re):
':kbd:`Alt+^`',
(
'<p>'
'<span class="kbdcompound">'
'<kbd class="kbd docutils literal notranslate">Alt</kbd>'
'+'
'<span class="kbdsep">+</span>'
'<kbd class="kbd docutils literal notranslate">^</kbd>'
'</span>'
'</p>'
),
(
'\\sphinxAtStartPar\n'
'\\DUrole{kbdcompound}{'
'\\sphinxkeyboard{\\sphinxupquote{Alt}}'
'+'
'\\DUrole{kbdsep}{+}'
'\\sphinxkeyboard{\\sphinxupquote{\\textasciicircum{}}}'
'}'
),
),
(
Expand All @@ -377,67 +396,108 @@ def get_verifier(verify, verify_re):
':kbd:`M-x M-s`',
(
'<p>'
'<span class="kbdcompound">'
'<kbd class="kbd docutils literal notranslate">M</kbd>'
'-'
'<span class="kbdsep">-</span>'
'<kbd class="kbd docutils literal notranslate">x</kbd>'
' '
'<span class="kbdsep"> </span>'
'<kbd class="kbd docutils literal notranslate">M</kbd>'
'-'
'<span class="kbdsep">-</span>'
'<kbd class="kbd docutils literal notranslate">s</kbd>'
'</span>'
'</p>'
),
(
'\\sphinxAtStartPar\n'
'\\DUrole{kbdcompound}{'
'\\sphinxkeyboard{\\sphinxupquote{M}}'
'\\sphinxhyphen{}'
'\\DUrole{kbdsep}{\\sphinxhyphen{}}'
'\\sphinxkeyboard{\\sphinxupquote{x}}'
' '
'\\DUrole{kbdsep}{ }'
'\\sphinxkeyboard{\\sphinxupquote{M}}'
'\\sphinxhyphen{}'
'\\DUrole{kbdsep}{\\sphinxhyphen{}}'
'\\sphinxkeyboard{\\sphinxupquote{s}}'
'}'
),
),
(
# kbd role
'verify',
':kbd:`-`',
'<p><kbd class="kbd docutils literal notranslate">-</kbd></p>',
'\\sphinxAtStartPar\n\\sphinxkeyboard{\\sphinxupquote{\\sphinxhyphen{}}}',
(
'<p>'
'<span class="kbdcompound">'
'<kbd class="kbd docutils literal notranslate">-</kbd>'
'</span>'
'</p>'
),
(
'\\sphinxAtStartPar\n'
'\\DUrole{kbdcompound}{'
'\\sphinxkeyboard{\\sphinxupquote{\\sphinxhyphen{}}}'
'}'
),
),
(
# kbd role
'verify',
':kbd:`Caps Lock`',
'<p><kbd class="kbd docutils literal notranslate">Caps Lock</kbd></p>',
'\\sphinxAtStartPar\n\\sphinxkeyboard{\\sphinxupquote{Caps Lock}}',
(
'<p>'
'<span class="kbdcompound">'
'<kbd class="kbd docutils literal notranslate">Caps Lock</kbd>'
'</span>'
'</p>'
),
(
'\\sphinxAtStartPar\n'
'\\DUrole{kbdcompound}{'
'\\sphinxkeyboard{\\sphinxupquote{Caps Lock}}'
'}'
),
),
(
# kbd role
'verify',
':kbd:`sys rq`',
'<p><kbd class="kbd docutils literal notranslate">sys rq</kbd></p>',
'\\sphinxAtStartPar\n\\sphinxkeyboard{\\sphinxupquote{sys rq}}',
(
'<p>'
'<span class="kbdcompound">'
'<kbd class="kbd docutils literal notranslate">sys rq</kbd>'
'</span>'
'</p>'
),
(
'\\sphinxAtStartPar\n'
'\\DUrole{kbdcompound}{'
'\\sphinxkeyboard{\\sphinxupquote{sys rq}}'
'}'
),
),
(
# kbd role
'verify',
':kbd:`⌘+⇧+M`',
(
'<p>'
'<span class="kbdcompound">'
'<kbd class="kbd docutils literal notranslate">⌘</kbd>'
'+'
'<span class="kbdsep">+</span>'
'<kbd class="kbd docutils literal notranslate">⇧</kbd>'
'+'
'<span class="kbdsep">+</span>'
'<kbd class="kbd docutils literal notranslate">M</kbd>'
'</span>'
'</p>'
),
(
'\\sphinxAtStartPar\n'
'\\DUrole{kbdcompound}{'
'\\sphinxkeyboard{\\sphinxupquote{⌘}}'
'+'
'\\DUrole{kbdsep}{+}'
'\\sphinxkeyboard{\\sphinxupquote{⇧}}'
'+'
'\\DUrole{kbdsep}{+}'
'\\sphinxkeyboard{\\sphinxupquote{M}}'
'}'
),
),
(
Expand Down
Loading