summaryrefslogtreecommitdiff
path: root/sphinx/directives/code.py
diff options
context:
space:
mode:
authortk0miya <i.tkomiya@gmail.com>2014-08-20 10:05:58 +0900
committertk0miya <i.tkomiya@gmail.com>2014-08-20 10:05:58 +0900
commit3c8bc8f5fd003227d901e3b0acf48b25b5c61be0 (patch)
treebf1360a90acb50f516707f3c569e098aa91e845e /sphinx/directives/code.py
parent3e1667290b9e52c52d249abcc5f00eacfb42def4 (diff)
parentf14f77688a68656849f35d274e9dc7ff56e0f365 (diff)
downloadsphinx-git-3c8bc8f5fd003227d901e3b0acf48b25b5c61be0.tar.gz
Merge upstream changes
Diffstat (limited to 'sphinx/directives/code.py')
-rw-r--r--sphinx/directives/code.py61
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 \