| # QEMU Monitor Protocol Lexer Extension |
| # |
| # Copyright (C) 2019, Red Hat Inc. |
| # |
| # Authors: |
| # Eduardo Habkost <ehabkost@redhat.com> |
| # John Snow <jsnow@redhat.com> |
| # |
| # This work is licensed under the terms of the GNU GPLv2 or later. |
| # See the COPYING file in the top-level directory. |
| """qmp_lexer is a Sphinx extension that provides a QMP lexer for code blocks.""" |
| |
| from pygments.lexer import RegexLexer, DelegatingLexer |
| from pygments.lexers.data import JsonLexer |
| from pygments import token |
| from sphinx import errors |
| |
| class QMPExampleMarkersLexer(RegexLexer): |
| """ |
| QMPExampleMarkersLexer lexes QMP example annotations. |
| This lexer adds support for directionality flow and elision indicators. |
| """ |
| tokens = { |
| 'root': [ |
| (r'-> ', token.Generic.Prompt), |
| (r'<- ', token.Generic.Prompt), |
| (r' ?\.{3} ?', token.Generic.Prompt), |
| ] |
| } |
| |
| class QMPExampleLexer(DelegatingLexer): |
| """QMPExampleLexer lexes annotated QMP examples.""" |
| def __init__(self, **options): |
| super(QMPExampleLexer, self).__init__(JsonLexer, QMPExampleMarkersLexer, |
| token.Error, **options) |
| |
| def setup(sphinx): |
| """For use by the Sphinx extensions API.""" |
| try: |
| sphinx.require_sphinx('2.1') |
| sphinx.add_lexer('QMP', QMPExampleLexer) |
| except errors.VersionRequirementError: |
| sphinx.add_lexer('QMP', QMPExampleLexer()) |
| |
| return dict( |
| parallel_read_safe = True, |
| parallel_write_safe = True |
| ) |