diff options
Diffstat (limited to 'sphinx/directives/code.py')
| -rw-r--r-- | sphinx/directives/code.py | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/sphinx/directives/code.py b/sphinx/directives/code.py index 8cedab19..c45e1b36 100644 --- a/sphinx/directives/code.py +++ b/sphinx/directives/code.py @@ -15,6 +15,7 @@ from docutils.parsers.rst import Directive, directives from sphinx import addnodes from sphinx.util import parselinenos +from sphinx.util.nodes import set_source_info class Highlight(Directive): @@ -55,14 +56,29 @@ class CodeBlock(Directive): final_argument_whitespace = False option_spec = { 'linenos': directives.flag, + 'emphasize-lines': directives.unchanged_required, } def run(self): code = u'\n'.join(self.content) + + linespec = self.options.get('emphasize-lines') + if linespec: + try: + nlines = len(self.content) + hl_lines = [x+1 for x in parselinenos(linespec, nlines)] + except ValueError, err: + document = self.state.document + return [document.reporter.warning(str(err), line=self.lineno)] + else: + hl_lines = None + literal = nodes.literal_block(code, code) literal['language'] = self.arguments[0] literal['linenos'] = 'linenos' in self.options - literal.line = self.lineno + if hl_lines is not None: + literal['highlight_args'] = {'hl_lines': hl_lines} + set_source_info(self, literal) return [literal] @@ -88,6 +104,7 @@ class LiteralInclude(Directive): 'end-before': directives.unchanged_required, 'prepend': directives.unchanged_required, 'append': directives.unchanged_required, + 'emphasize-lines': directives.unchanged_required, } def run(self): @@ -146,6 +163,15 @@ class LiteralInclude(Directive): 'Line spec %r: no lines pulled from include file %r' % (linespec, filename), line=self.lineno)] + linespec = self.options.get('emphasize-lines') + if linespec: + try: + hl_lines = [x+1 for x in parselinenos(linespec, len(lines))] + except ValueError, err: + return [document.reporter.warning(str(err), line=self.lineno)] + else: + hl_lines = None + startafter = self.options.get('start-after') endbefore = self.options.get('end-before') prepend = self.options.get('prepend') @@ -172,12 +198,13 @@ class LiteralInclude(Directive): if self.options.get('tab-width'): text = text.expandtabs(self.options['tab-width']) retnode = nodes.literal_block(text, text, source=filename) - retnode.line = 1 - retnode.attributes['line_number'] = self.lineno + set_source_info(self, retnode) if self.options.get('language', ''): retnode['language'] = self.options['language'] if 'linenos' in self.options: retnode['linenos'] = True + if hl_lines is not None: + retnode['highlight_args'] = {'hl_lines': hl_lines} env.note_dependency(rel_filename) return [retnode] |
