summaryrefslogtreecommitdiff
path: root/sphinx/transforms/post_transforms/code.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/transforms/post_transforms/code.py')
-rw-r--r--sphinx/transforms/post_transforms/code.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/sphinx/transforms/post_transforms/code.py b/sphinx/transforms/post_transforms/code.py
index f0c1d0097..86143ffb4 100644
--- a/sphinx/transforms/post_transforms/code.py
+++ b/sphinx/transforms/post_transforms/code.py
@@ -13,9 +13,11 @@ import sys
from typing import NamedTuple
from docutils import nodes
+from pygments.lexers import PythonConsoleLexer, guess_lexer
from six import text_type
from sphinx import addnodes
+from sphinx.ext import doctest
from sphinx.transforms import SphinxTransform
if False:
@@ -95,9 +97,51 @@ class HighlightLanguageVisitor(nodes.NodeVisitor):
node['linenos'] = (lines >= setting.lineno_threshold - 1)
+class TrimDoctestFlagsTransform(SphinxTransform):
+ """
+ Trim doctest flags like ``# doctest: +FLAG`` from python code-blocks.
+
+ see :confval:`trim_doctest_flags` for more information.
+ """
+ default_priority = HighlightLanguageTransform.default_priority + 1
+
+ def apply(self):
+ if not self.config.trim_doctest_flags:
+ return
+
+ for node in self.document.traverse(nodes.literal_block):
+ if self.is_pyconsole(node):
+ source = node.rawsource
+ source = doctest.blankline_re.sub('', source)
+ source = doctest.doctestopt_re.sub('', source)
+ node.rawsource = source
+ node[:] = [nodes.Text(source)]
+
+ @staticmethod
+ def is_pyconsole(node):
+ # type: (nodes.literal_block) -> bool
+ if node.rawsource != node.astext():
+ return False # skip parsed-literal node
+
+ language = node.get('language')
+ if language in ('pycon', 'pycon3'):
+ return True
+ elif language in ('py', 'py3', 'python', 'python3', 'default'):
+ return node.rawsource.startswith('>>>')
+ elif language == 'guess':
+ try:
+ lexer = guess_lexer(node.rawsource)
+ return isinstance(lexer, PythonConsoleLexer)
+ except Exception:
+ pass
+
+ return False
+
+
def setup(app):
# type: (Sphinx) -> Dict[unicode, Any]
app.add_post_transform(HighlightLanguageTransform)
+ app.add_post_transform(TrimDoctestFlagsTransform)
return {
'version': 'builtin',