diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-04-30 21:48:53 +0900 |
---|---|---|
committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2020-05-02 22:48:57 +0900 |
commit | a148a8e7cb7ff3bd4b350f491b48fda3cb25df56 (patch) | |
tree | 836064c56e6df8f5378caf9a87d897de8d1dd7bd /sphinx/builders/html/transforms.py | |
parent | 911a3b9809259aeb1b301bc2e534c57807baece1 (diff) | |
download | sphinx-git-a148a8e7cb7ff3bd4b350f491b48fda3cb25df56.tar.gz |
Close #7530: html: Support nested <kbd> elements
Diffstat (limited to 'sphinx/builders/html/transforms.py')
-rw-r--r-- | sphinx/builders/html/transforms.py | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/sphinx/builders/html/transforms.py b/sphinx/builders/html/transforms.py new file mode 100644 index 000000000..c91da57e9 --- /dev/null +++ b/sphinx/builders/html/transforms.py @@ -0,0 +1,69 @@ +""" + sphinx.builders.html.transforms + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Transforms for HTML builder. + + :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import re +from typing import Any, Dict + +from docutils import nodes + +from sphinx.application import Sphinx +from sphinx.transforms.post_transforms import SphinxPostTransform +from sphinx.util.nodes import NodeMatcher + + +class KeyboardTransform(SphinxPostTransform): + """Transform :kbd: role to more detailed form. + + Before:: + + <literal class="kbd"> + Control-x + + After:: + + <literal class="kbd"> + <literal class="kbd"> + Control + - + <literal class="kbd"> + x + """ + default_priority = 400 + builders = ('html',) + pattern = re.compile(r'(-|\+|\^|\s+)') + + 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: + continue + + node.pop() + while parts: + key = parts.pop(0) + node += nodes.literal('', key, classes=["kbd"]) + + try: + # key separator (ex. -, +, ^) + sep = parts.pop(0) + node += nodes.Text(sep) + except IndexError: + pass + + +def setup(app: Sphinx) -> Dict[str, Any]: + app.add_post_transform(KeyboardTransform) + + return { + 'version': 'builtin', + 'parallel_read_safe': True, + 'parallel_write_safe': True, + } |