mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Add highlight_options configuration value
This changeset adds the `highlight_options` configuration value, which specifies a dict of key-value pairs to pass to the Pygments highlighter specified with `highlight_language`. For example, specifying `highlight_options = {'funcnamehighlighting' : False}` for the 'php' lexer will disable function name highlighting. Both the HTML and LaTeX writers have been updated to include the options when calling `highlight_block()`, as long as the currently selected language matches what was set with `highlight_language`, i.e. not when modified by `highlight::` or `code-block::` directives.
This commit is contained in:
parent
649e2cd41b
commit
a63e4945ea
2
CHANGES
2
CHANGES
@ -9,6 +9,8 @@ Incompatible changes
|
|||||||
Features added
|
Features added
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
|
* Added ``highlight_options`` configuration value.
|
||||||
|
|
||||||
Bugs fixed
|
Bugs fixed
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
@ -303,9 +303,17 @@ Project information
|
|||||||
|
|
||||||
.. versionadded:: 0.5
|
.. versionadded:: 0.5
|
||||||
|
|
||||||
|
.. confval:: highlight_options
|
||||||
|
|
||||||
|
A dictionary of options that modify the behavior of the lexer for the
|
||||||
|
selected language. These are lexer-specific. For the options understood by
|
||||||
|
each, see the `Pygments documentation <http://pygments.org/docs/lexers/>`_.
|
||||||
|
|
||||||
|
.. versionadded:: 1.3
|
||||||
|
|
||||||
.. confval:: pygments_style
|
.. confval:: pygments_style
|
||||||
|
|
||||||
The style name to use for Pygments highlighting of source code. The default
|
The style name to use for Pygments highlighting of source code. The given
|
||||||
style is selected by the theme for HTML output, and ``'sphinx'`` otherwise.
|
style is selected by the theme for HTML output, and ``'sphinx'`` otherwise.
|
||||||
|
|
||||||
.. versionchanged:: 0.3
|
.. versionchanged:: 0.3
|
||||||
|
@ -61,6 +61,7 @@ class Config(object):
|
|||||||
show_authors = (False, 'env'),
|
show_authors = (False, 'env'),
|
||||||
pygments_style = (None, 'html'),
|
pygments_style = (None, 'html'),
|
||||||
highlight_language = ('python', 'env'),
|
highlight_language = ('python', 'env'),
|
||||||
|
highlight_options = ({}, 'env'),
|
||||||
templates_path = ([], 'html'),
|
templates_path = ([], 'html'),
|
||||||
template_bridge = (None, 'html'),
|
template_bridge = (None, 'html'),
|
||||||
keep_warnings = (False, 'env'),
|
keep_warnings = (False, 'env'),
|
||||||
|
@ -134,7 +134,7 @@ class PygmentsBridge(object):
|
|||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def highlight_block(self, source, lang, warn=None, force=False, **kwargs):
|
def highlight_block(self, source, lang, opts=None, warn=None, force=False, **kwargs):
|
||||||
if not isinstance(source, text_type):
|
if not isinstance(source, text_type):
|
||||||
source = source.decode()
|
source = source.decode()
|
||||||
|
|
||||||
@ -164,7 +164,7 @@ class PygmentsBridge(object):
|
|||||||
lexer = lexers[lang]
|
lexer = lexers[lang]
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
lexer = lexers[lang] = get_lexer_by_name(lang)
|
lexer = lexers[lang] = get_lexer_by_name(lang, **opts)
|
||||||
except ClassNotFound:
|
except ClassNotFound:
|
||||||
if warn:
|
if warn:
|
||||||
warn('Pygments lexer name %r is not known' % lang)
|
warn('Pygments lexer name %r is not known' % lang)
|
||||||
|
@ -70,7 +70,9 @@ class HTMLTranslator(BaseTranslator):
|
|||||||
self.highlighter = builder.highlighter
|
self.highlighter = builder.highlighter
|
||||||
self.no_smarty = 0
|
self.no_smarty = 0
|
||||||
self.builder = builder
|
self.builder = builder
|
||||||
self.highlightlang = builder.config.highlight_language
|
self.highlightlang = self.highlightlang_base = \
|
||||||
|
builder.config.highlight_language
|
||||||
|
self.highlightopts = builder.config.highlight_options
|
||||||
self.highlightlinenothreshold = sys.maxsize
|
self.highlightlinenothreshold = sys.maxsize
|
||||||
self.protect_literal_text = 0
|
self.protect_literal_text = 0
|
||||||
self.permalink_text = builder.config.html_add_permalinks
|
self.permalink_text = builder.config.html_add_permalinks
|
||||||
@ -301,10 +303,15 @@ class HTMLTranslator(BaseTranslator):
|
|||||||
highlight_args['force'] = True
|
highlight_args['force'] = True
|
||||||
if 'linenos' in node:
|
if 'linenos' in node:
|
||||||
linenos = node['linenos']
|
linenos = node['linenos']
|
||||||
|
if lang is self.highlightlang_base:
|
||||||
|
# only pass highlighter options for original language
|
||||||
|
opts = self.highlightopts
|
||||||
|
else:
|
||||||
|
opts = {}
|
||||||
def warner(msg):
|
def warner(msg):
|
||||||
self.builder.warn(msg, (self.builder.current_docname, node.line))
|
self.builder.warn(msg, (self.builder.current_docname, node.line))
|
||||||
highlighted = self.highlighter.highlight_block(
|
highlighted = self.highlighter.highlight_block(
|
||||||
node.rawsource, lang, warn=warner, linenos=linenos,
|
node.rawsource, lang, opts=opts, warn=warner, linenos=linenos,
|
||||||
**highlight_args)
|
**highlight_args)
|
||||||
starttag = self.starttag(node, 'div', suffix='',
|
starttag = self.starttag(node, 'div', suffix='',
|
||||||
CLASS='highlight-%s' % lang)
|
CLASS='highlight-%s' % lang)
|
||||||
|
@ -1378,10 +1378,15 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
|||||||
highlight_args['force'] = True
|
highlight_args['force'] = True
|
||||||
if 'linenos' in node:
|
if 'linenos' in node:
|
||||||
linenos = node['linenos']
|
linenos = node['linenos']
|
||||||
|
if lang is self.hlsettingstack[0][0]:
|
||||||
|
# only pass highlighter options for original language
|
||||||
|
opts = self.builder.config.highlight_options
|
||||||
|
else:
|
||||||
|
opts = {}
|
||||||
def warner(msg):
|
def warner(msg):
|
||||||
self.builder.warn(msg, (self.curfilestack[-1], node.line))
|
self.builder.warn(msg, (self.curfilestack[-1], node.line))
|
||||||
hlcode = self.highlighter.highlight_block(code, lang, warn=warner,
|
hlcode = self.highlighter.highlight_block(code, lang, opts=opts,
|
||||||
linenos=linenos, **highlight_args)
|
warn=warner, linenos=linenos, **highlight_args)
|
||||||
# workaround for Unicode issue
|
# workaround for Unicode issue
|
||||||
hlcode = hlcode.replace(u'€', u'@texteuro[]')
|
hlcode = hlcode.replace(u'€', u'@texteuro[]')
|
||||||
# must use original Verbatim environment and "tabular" environment
|
# must use original Verbatim environment and "tabular" environment
|
||||||
|
@ -62,6 +62,12 @@ def test_detect_interactive():
|
|||||||
assert ret.startswith("<div class=\"highlight\">")
|
assert ret.startswith("<div class=\"highlight\">")
|
||||||
|
|
||||||
|
|
||||||
|
def test_lexer_options():
|
||||||
|
bridge = PygmentsBridge('html')
|
||||||
|
ret = bridge.highlight_block('//comment', 'php', opts={'startinline' : True})
|
||||||
|
assert '<span class="c1">//comment</span>' in ret
|
||||||
|
|
||||||
|
|
||||||
def test_set_formatter():
|
def test_set_formatter():
|
||||||
PygmentsBridge.html_formatter = MyFormatter
|
PygmentsBridge.html_formatter = MyFormatter
|
||||||
try:
|
try:
|
||||||
|
Loading…
Reference in New Issue
Block a user