mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Close #1851: Allow to omit an argument for code-block directive
This commit is contained in:
parent
6fd191d52e
commit
6ca669295c
2
CHANGES
2
CHANGES
@ -167,6 +167,8 @@ Features added
|
|||||||
* #1341 the HTML search considers words that contain a search term of length
|
* #1341 the HTML search considers words that contain a search term of length
|
||||||
three or longer a match.
|
three or longer a match.
|
||||||
* #4611: epub: Show warning for duplicated ToC entries
|
* #4611: epub: Show warning for duplicated ToC entries
|
||||||
|
* #1851: Allow to omit an argument for :rst:dir:`code-block` directive. If
|
||||||
|
omitted, it follows :rst:dir:`highlight` or :confval:`highlight_language`
|
||||||
|
|
||||||
Bugs fixed
|
Bugs fixed
|
||||||
----------
|
----------
|
||||||
|
@ -463,7 +463,7 @@ __ http://pygments.org/docs/lexers/
|
|||||||
|
|
||||||
This will produce line numbers for all code blocks longer than five lines.
|
This will produce line numbers for all code blocks longer than five lines.
|
||||||
|
|
||||||
.. rst:directive:: .. code-block:: language
|
.. rst:directive:: .. code-block:: [language]
|
||||||
|
|
||||||
Example::
|
Example::
|
||||||
|
|
||||||
@ -471,9 +471,11 @@ __ http://pygments.org/docs/lexers/
|
|||||||
|
|
||||||
Some Ruby code.
|
Some Ruby code.
|
||||||
|
|
||||||
The directive's alias name :rst:dir:`sourcecode` works as well. As with
|
The directive's alias name :rst:dir:`sourcecode` works as well. This
|
||||||
:rst:dir:`highlight`\ 's ``language`` option, ``language`` can be any lexer
|
directive takes a language name as an argument. It can be any lexer alias
|
||||||
alias supported by Pygments.
|
supported by Pygments. If it is not given, the setting of
|
||||||
|
:rst:dir:`highlight` directive will be used. If not set,
|
||||||
|
:confval:`highlight_language` will be used.
|
||||||
|
|
||||||
**Additional options**
|
**Additional options**
|
||||||
|
|
||||||
@ -533,6 +535,9 @@ __ http://pygments.org/docs/lexers/
|
|||||||
.. versionchanged:: 1.6.6
|
.. versionchanged:: 1.6.6
|
||||||
LaTeX supports the ``emphasize-lines`` option.
|
LaTeX supports the ``emphasize-lines`` option.
|
||||||
|
|
||||||
|
.. versionchanged:: 2.0
|
||||||
|
The ``language`` argument becomes optional.
|
||||||
|
|
||||||
.. rst:directive:: .. literalinclude:: filename
|
.. rst:directive:: .. literalinclude:: filename
|
||||||
|
|
||||||
Longer displays of verbatim text may be included by storing the example text
|
Longer displays of verbatim text may be included by storing the example text
|
||||||
|
@ -47,9 +47,11 @@ class Highlight(SphinxDirective):
|
|||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
# type: () -> List[nodes.Node]
|
# type: () -> List[nodes.Node]
|
||||||
|
language = self.arguments[0].strip()
|
||||||
linenothreshold = self.options.get('linenothreshold', sys.maxsize)
|
linenothreshold = self.options.get('linenothreshold', sys.maxsize)
|
||||||
return [addnodes.highlightlang(lang=self.arguments[0].strip(),
|
|
||||||
linenothreshold=linenothreshold)]
|
self.env.temp_data['highlight_language'] = language
|
||||||
|
return [addnodes.highlightlang(lang=language, linenothreshold=linenothreshold)]
|
||||||
|
|
||||||
|
|
||||||
class HighlightLang(Highlight):
|
class HighlightLang(Highlight):
|
||||||
@ -110,8 +112,8 @@ class CodeBlock(SphinxDirective):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
has_content = True
|
has_content = True
|
||||||
required_arguments = 1
|
required_arguments = 0
|
||||||
optional_arguments = 0
|
optional_arguments = 1
|
||||||
final_argument_whitespace = False
|
final_argument_whitespace = False
|
||||||
option_spec = {
|
option_spec = {
|
||||||
'linenos': directives.flag,
|
'linenos': directives.flag,
|
||||||
@ -152,10 +154,20 @@ class CodeBlock(SphinxDirective):
|
|||||||
code = '\n'.join(lines)
|
code = '\n'.join(lines)
|
||||||
|
|
||||||
literal = nodes.literal_block(code, code) # type: nodes.Element
|
literal = nodes.literal_block(code, code) # type: nodes.Element
|
||||||
literal['language'] = self.arguments[0]
|
|
||||||
literal['linenos'] = 'linenos' in self.options or \
|
literal['linenos'] = 'linenos' in self.options or \
|
||||||
'lineno-start' in self.options
|
'lineno-start' in self.options
|
||||||
literal['classes'] += self.options.get('class', [])
|
literal['classes'] += self.options.get('class', [])
|
||||||
|
if self.arguments:
|
||||||
|
# highlight language specified
|
||||||
|
literal['language'] = self.arguments[0]
|
||||||
|
literal['force_highlighting'] = True
|
||||||
|
else:
|
||||||
|
# no highlight language specified. Then this directive refers the current
|
||||||
|
# highlight setting via ``highlight`` directive or ``highlight_language``
|
||||||
|
# configuration.
|
||||||
|
literal['language'] = self.env.temp_data.get('highlight_language',
|
||||||
|
self.config.highlight_language)
|
||||||
|
literal['force_highlighting'] = False
|
||||||
extra_args = literal['highlight_args'] = {}
|
extra_args = literal['highlight_args'] = {}
|
||||||
if hl_lines is not None:
|
if hl_lines is not None:
|
||||||
extra_args['hl_lines'] = hl_lines
|
extra_args['hl_lines'] = hl_lines
|
||||||
|
@ -89,7 +89,7 @@ class HighlightLanguageVisitor(nodes.NodeVisitor):
|
|||||||
if 'language' not in node:
|
if 'language' not in node:
|
||||||
node['language'] = setting.language
|
node['language'] = setting.language
|
||||||
node['force_highlighting'] = False
|
node['force_highlighting'] = False
|
||||||
else:
|
elif 'force_highlighting' not in node:
|
||||||
node['force_highlighting'] = True
|
node['force_highlighting'] = True
|
||||||
if 'linenos' not in node:
|
if 'linenos' not in node:
|
||||||
lines = node.astext().count('\n')
|
lines = node.astext().count('\n')
|
||||||
|
20
tests/roots/test-directive-code/highlight.rst
Normal file
20
tests/roots/test-directive-code/highlight.rst
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
highlight
|
||||||
|
---------
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
"A code-block without no language"
|
||||||
|
|
||||||
|
.. code-block:: python2
|
||||||
|
|
||||||
|
"A code-block with language argument"
|
||||||
|
|
||||||
|
.. highlight:: python3
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
"A code-block without no language after highlight directive"
|
||||||
|
|
||||||
|
.. code-block:: python2
|
||||||
|
|
||||||
|
"A code-block without language argument after highlight directive"
|
@ -11,6 +11,7 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from docutils import nodes
|
||||||
|
|
||||||
from sphinx.config import Config
|
from sphinx.config import Config
|
||||||
from sphinx.directives.code import LiteralIncludeReader
|
from sphinx.directives.code import LiteralIncludeReader
|
||||||
@ -552,3 +553,15 @@ def test_literalinclude_pydecorators(app, status, warning):
|
|||||||
' pass\n'
|
' pass\n'
|
||||||
)
|
)
|
||||||
assert actual == expect
|
assert actual == expect
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.sphinx('dummy', testroot='directive-code')
|
||||||
|
def test_code_block_highlighted(app, status, warning):
|
||||||
|
app.builder.build(['highlight'])
|
||||||
|
doctree = app.env.get_doctree('highlight')
|
||||||
|
codeblocks = doctree.traverse(nodes.literal_block)
|
||||||
|
|
||||||
|
assert codeblocks[0]['language'] == 'default'
|
||||||
|
assert codeblocks[1]['language'] == 'python2'
|
||||||
|
assert codeblocks[2]['language'] == 'python3'
|
||||||
|
assert codeblocks[3]['language'] == 'python2'
|
||||||
|
Loading…
Reference in New Issue
Block a user