highlight: Enable raiseonerror only if force=False

This commit is contained in:
Takeshi KOMIYA 2019-05-29 01:26:18 +09:00
parent 1769280348
commit e9c5e3656f

View File

@ -10,6 +10,7 @@
import html
import warnings
from functools import partial
from pygments import highlight
from pygments.filters import ErrorToken
@ -37,17 +38,16 @@ if False:
logger = logging.getLogger(__name__)
lexers = {
'none': TextLexer(stripnl=False),
'python': PythonLexer(stripnl=False),
'python3': Python3Lexer(stripnl=False),
'pycon': PythonConsoleLexer(stripnl=False),
'pycon3': PythonConsoleLexer(python3=True, stripnl=False),
'rest': RstLexer(stripnl=False),
'c': CLexer(stripnl=False),
lexers = {} # type: Dict[str, Lexer]
lexer_classes = {
'none': TextLexer,
'python': PythonLexer,
'python3': Python3Lexer,
'pycon': PythonConsoleLexer,
'pycon3': partial(PythonConsoleLexer, python3=True),
'rest': RstLexer,
'c': CLexer,
} # type: Dict[str, Lexer]
for _lexer in lexers.values():
_lexer.add_filter('raiseonerror')
escape_hl_chars = {ord('\\'): '\\PYGZbs{}',
@ -115,46 +115,55 @@ class PygmentsBridge:
return '\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n' + \
source + '\\end{Verbatim}\n'
def get_lexer(self, source, lang, opts=None, location=None):
# type: (str, str, Any, Any) -> Lexer
def get_lexer(self, source, lang, opts=None, force=False, location=None):
# type: (str, str, Dict, bool, Any) -> Lexer
lexer_options = {'strip': True}
lexer_options.update(opts)
# find out which lexer to use
if lang in ('py', 'python'):
if source.startswith('>>>'):
# interactive session
lexer = lexers['pycon']
lang = 'pycon'
else:
lexer = lexers['python']
lang = 'python'
elif lang in ('py3', 'python3', 'default'):
if source.startswith('>>>'):
lexer = lexers['pycon3']
lang = 'pycon3'
else:
lexer = lexers['python3']
lang = 'python3'
elif lang == 'guess':
try:
lexer = guess_lexer(source)
except Exception:
lexer = lexers['none']
if lang in lexers:
lexer = lexers[lang]
elif lang in lexer_classes:
lexer = lexer_classes[lang](**lexer_options)
else:
if lang in lexers:
lexer = lexers[lang]
else:
try:
lexer = lexers[lang] = get_lexer_by_name(lang, **(opts or {}))
except ClassNotFound:
logger.warning(__('Pygments lexer name %r is not known'), lang,
location=location)
lexer = lexers['none']
try:
if lang == 'guess':
lexer = guess_lexer(lang, **lexer_options)
else:
lexer.add_filter('raiseonerror')
lexer = get_lexer_by_name(lang, **lexer_options)
except ClassNotFound:
logger.warning(__('Pygments lexer name %r is not known'), lang,
location=location)
lexer = lexer_classes['none'](**lexer_options)
if not force:
lexer.add_filter('raiseonerror')
return lexer
def highlight_block(self, source, lang, opts=None, location=None, force=False, **kwargs):
# type: (str, str, Any, Any, bool, Any) -> str
def highlight_block(self, source, lang, opts=None, force=False, location=None, **kwargs):
# type: (str, str, Dict, bool, Any, Any) -> str
if not isinstance(source, str):
source = source.decode()
lexer = self.get_lexer(source, lang, opts, location)
lexer = self.get_lexer(source, lang, opts, force, location)
# trim doctest options if wanted
if isinstance(lexer, PythonConsoleLexer) and self.trim_doctest_flags: