diff options
author | tk0miya <i.tkomiya@gmail.com> | 2014-08-20 10:05:58 +0900 |
---|---|---|
committer | tk0miya <i.tkomiya@gmail.com> | 2014-08-20 10:05:58 +0900 |
commit | 3c8bc8f5fd003227d901e3b0acf48b25b5c61be0 (patch) | |
tree | bf1360a90acb50f516707f3c569e098aa91e845e /sphinx/directives/code.py | |
parent | 3e1667290b9e52c52d249abcc5f00eacfb42def4 (diff) | |
parent | f14f77688a68656849f35d274e9dc7ff56e0f365 (diff) | |
download | sphinx-git-3c8bc8f5fd003227d901e3b0acf48b25b5c61be0.tar.gz |
Merge upstream changes
Diffstat (limited to 'sphinx/directives/code.py')
-rw-r--r-- | sphinx/directives/code.py | 61 |
1 files changed, 45 insertions, 16 deletions
diff --git a/sphinx/directives/code.py b/sphinx/directives/code.py index c0b27dff2..6ea525b0f 100644 --- a/sphinx/directives/code.py +++ b/sphinx/directives/code.py @@ -9,10 +9,13 @@ import sys import codecs +from difflib import unified_diff from docutils import nodes from docutils.parsers.rst import Directive, directives +from six import string_types + from sphinx import addnodes from sphinx.util import parselinenos from sphinx.util.nodes import set_source_info @@ -138,29 +141,17 @@ class LiteralInclude(Directive): 'append': directives.unchanged_required, 'emphasize-lines': directives.unchanged_required, 'caption': directives.unchanged, + 'diff': directives.unchanged_required, } - def run(self): - document = self.state.document - if not document.settings.file_insertion_enabled: - return [document.reporter.warning('File insertion disabled', - line=self.lineno)] - env = document.settings.env - rel_filename, filename = env.relfn2path(self.arguments[0]) - - if 'pyobject' in self.options and 'lines' in self.options: - return [document.reporter.warning( - 'Cannot use both "pyobject" and "lines" options', - line=self.lineno)] - - encoding = self.options.get('encoding', env.config.source_encoding) - codec_info = codecs.lookup(encoding) + def read_with_encoding(self, filename, document, codec_info, encoding): f = None try: f = codecs.StreamReaderWriter(open(filename, 'rb'), - codec_info[2], codec_info[3], 'strict') + codec_info[2], codec_info[3], 'strict') lines = f.readlines() lines = dedent_lines(lines, self.options.get('dedent')) + return lines except (IOError, OSError): return [document.reporter.warning( 'Include file %r not found or reading it failed' % filename, @@ -174,6 +165,42 @@ class LiteralInclude(Directive): if f is not None: f.close() + def run(self): + document = self.state.document + if not document.settings.file_insertion_enabled: + return [document.reporter.warning('File insertion disabled', + line=self.lineno)] + env = document.settings.env + rel_filename, filename = env.relfn2path(self.arguments[0]) + + if 'pyobject' in self.options and 'lines' in self.options: + return [document.reporter.warning( + 'Cannot use both "pyobject" and "lines" options', + line=self.lineno)] + + encoding = self.options.get('encoding', env.config.source_encoding) + codec_info = codecs.lookup(encoding) + + lines = self.read_with_encoding(filename, document, + codec_info, encoding) + if not isinstance(lines[0], string_types): + return lines + + diffsource = self.options.get('diff') + if diffsource is not None: + tmp, fulldiffsource = env.relfn2path(diffsource) + + difflines = self.read_with_encoding(fulldiffsource, document, + codec_info, encoding) + if not isinstance(difflines[0], string_types): + return difflines + diff = unified_diff( + difflines, + lines, + diffsource, + self.arguments[0]) + lines = list(diff) + objectname = self.options.get('pyobject') if objectname is not None: from sphinx.pycode import ModuleAnalyzer @@ -236,6 +263,8 @@ class LiteralInclude(Directive): text = text.expandtabs(self.options['tab-width']) retnode = nodes.literal_block(text, text, source=filename) set_source_info(self, retnode) + if diffsource is not None: # if diff is set, set udiff + retnode['language'] = 'udiff' if self.options.get('language', ''): retnode['language'] = self.options['language'] retnode['linenos'] = 'linenos' in self.options or \ |