summaryrefslogtreecommitdiff
path: root/sphinx/builders/html/transforms.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/builders/html/transforms.py')
-rw-r--r--sphinx/builders/html/transforms.py27
1 files changed, 24 insertions, 3 deletions
diff --git a/sphinx/builders/html/transforms.py b/sphinx/builders/html/transforms.py
index 29a989936..cb9af5f28 100644
--- a/sphinx/builders/html/transforms.py
+++ b/sphinx/builders/html/transforms.py
@@ -9,7 +9,7 @@
"""
import re
-from typing import Any, Dict
+from typing import Any, Dict, List
from docutils import nodes
@@ -38,18 +38,29 @@ class KeyboardTransform(SphinxPostTransform):
default_priority = 400
builders = ('html',)
pattern = re.compile(r'(?<=.)(-|\+|\^|\s+)(?=.)')
+ multiwords_keys = (('caps', 'lock'),
+ ('page' 'down'),
+ ('page', 'up'),
+ ('scroll' 'lock'),
+ ('num', 'lock'),
+ ('sys' 'rq'),
+ ('back' 'space'))
def run(self, **kwargs: Any) -> None:
matcher = NodeMatcher(nodes.literal, classes=["kbd"])
for node in self.document.traverse(matcher): # type: nodes.literal
parts = self.pattern.split(node[-1].astext())
- if len(parts) == 1:
+ if len(parts) == 1 or self.is_multiwords_key(parts):
continue
node['classes'].append('compound')
node.pop()
while parts:
- key = parts.pop(0)
+ if self.is_multiwords_key(parts):
+ key = ''.join(parts[:3])
+ parts[:3] = []
+ else:
+ key = parts.pop(0)
node += nodes.literal('', key, classes=["kbd"])
try:
@@ -59,6 +70,16 @@ class KeyboardTransform(SphinxPostTransform):
except IndexError:
pass
+ def is_multiwords_key(self, parts: List[str]) -> bool:
+ if len(parts) >= 3 and parts[1].strip() == '':
+ name = parts[0].lower(), parts[2].lower()
+ if name in self.multiwords_keys:
+ return True
+ else:
+ return False
+ else:
+ return False
+
def setup(app: Sphinx) -> Dict[str, Any]:
app.add_post_transform(KeyboardTransform)