"""Test the Pygments highlighting bridge.""" from __future__ import annotations from unittest import mock import pygments import pytest from pygments.formatters.html import HtmlFormatter from pygments.lexer import RegexLexer from pygments.token import Name, Text from sphinx.highlighting import PygmentsBridge if tuple(map(int, pygments.__version__.split('.')[:2]))[:2] < (2, 18): from pygments.formatter import Formatter Formatter.__class_getitem__ = classmethod(lambda cls, name: cls) # type: ignore[attr-defined] class MyLexer(RegexLexer): name = 'testlexer' tokens = { 'root': [ ('a', Name), ('b', Text), ], } class MyFormatter(HtmlFormatter[str]): def format(self, tokensource, outfile): for tok in tokensource: outfile.write(tok[1]) class ComplainOnUnhighlighted(PygmentsBridge): def unhighlighted(self, source): raise AssertionError('should highlight %r' % source) @pytest.mark.sphinx('html', testroot='root') def test_add_lexer(app): app.add_lexer('test', MyLexer) bridge = PygmentsBridge('html') ret = bridge.highlight_block('ab', 'test') assert 'ab' in ret def test_detect_interactive(): bridge = ComplainOnUnhighlighted('html') blocks = [ """ >>> testing() True """, ] for block in blocks: ret = bridge.highlight_block(block.lstrip(), 'python') assert ret.startswith('
print '
'"Hello sphinx world"\n
reST ``like`` text\n
print'
'('
'"Hello sphinx world"'
')\n
print'
'('
'"Hello sphinx world"'
')\n