1919
2020# list from https://pygments.org/docs/lexers/#pygments.lexers.python.PythonLexer
2121BUILTIN_BLOCKS = {
22+ "default" : None ,
2223 "python" : None ,
2324 "python3" : None ,
2425 "py" : None ,
@@ -104,7 +105,7 @@ def clean_ipython(source: str) -> tuple[str, str]:
104105
105106
106107class CodeBlockAnalyser (nodes .SparseNodeVisitor ):
107- """Transform literal blocks of Python with links to reference documentation."""
108+ """Transform blocks of Python with links to reference documentation."""
108109
109110 def __init__ (
110111 self ,
@@ -113,6 +114,8 @@ def __init__(
113114 global_preface : list [str ],
114115 custom_blocks : dict [str , Callable [[str ], str ]],
115116 concat_default : bool ,
117+ default_highlight_lang : str | None ,
118+ warn_default_parse_fail : bool ,
116119 ** kwargs ,
117120 ) -> None :
118121 super ().__init__ (* args , ** kwargs )
@@ -130,6 +133,8 @@ def __init__(
130133 self .concat_section = False
131134 self .concat_sources = []
132135 self .skip = None
136+ self .highlight_lang = default_highlight_lang
137+ self .warn_default_parse_fail = warn_default_parse_fail
133138
134139 def unknown_visit (self , node ) -> None :
135140 """Handle and delete custom directives, ignore others."""
@@ -162,6 +167,10 @@ def unknown_visit(self, node) -> None:
162167 def unknown_departure (self , node ) -> None :
163168 """Ignore unknown nodes."""
164169
170+ def visit_highlightlang (self , node ) -> None :
171+ """Set expected highlight language."""
172+ self .highlight_lang = node ["lang" ]
173+
165174 def visit_title (self , node ) -> None :
166175 """Track section names and break concatenation and skipping."""
167176 self .title_stack .append (node .astext ())
@@ -185,7 +194,7 @@ def visit_doctest_block(self, node):
185194
186195 def visit_literal_block (self , node : nodes .literal_block ):
187196 """Visit a generic literal block."""
188- return self .parse_source (node , node .get ("language" , None ))
197+ return self .parse_source (node , node .get ("language" , self . highlight_lang ))
189198
190199 def parse_source (
191200 self , node : nodes .literal_block | nodes .doctest_block , language : str | None
@@ -231,6 +240,9 @@ def parse_source(
231240 try :
232241 names = parse_names (modified_source , node )
233242 except SyntaxError as e :
243+ if language == "default" and not self .warn_default_parse_fail :
244+ return
245+
234246 show_source = self ._format_source_for_error (
235247 self .global_preface , self .concat_sources , prefaces , source
236248 )
0 commit comments