summaryrefslogtreecommitdiff
blob: 1f997a3c3a32256e8b624da03a6d9c7b6b6cf524 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
diff --git a/nbconvert/preprocessors/svg2pdf.py b/nbconvert/preprocessors/svg2pdf.py
index aff14d9f..de51f3b8 100644
--- a/nbconvert/preprocessors/svg2pdf.py
+++ b/nbconvert/preprocessors/svg2pdf.py
@@ -1,4 +1,4 @@
-"""Module containing a preprocessor that converts outputs in the notebook from 
+"""Module containing a preprocessor that converts outputs in the notebook from
 one format to another.
 """
 
@@ -17,11 +17,7 @@ from traitlets import Unicode, default
 
 from .convertfigures import ConvertFiguresPreprocessor
 
-if sys.version_info >= (3,3):
-    from shutil import which
-    get_inkscape_path = which('inkscape')
-else:
-    get_inkscape_path = None
+from shutil import which
 
 
 INKSCAPE_APP = '/Applications/Inkscape.app/Contents/Resources/bin/inkscape'
@@ -46,26 +42,49 @@ class SVG2PDFPreprocessor(ConvertFiguresPreprocessor):
     def _to_format_default(self):
         return 'application/pdf'
 
+    inkscape_version = Unicode(
+        help="""The version of inkscpae being used.
+
+        This affects how the conversion command is run.
+        """
+    ).tag(config=True)
+
+    @default('inkscape_version')
+    def _inkscape_version_default(self):
+        p = subprocess.Popen([self.inkscape, '--version'],
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE)
+        output, _ = p.communicate()
+        if p.returncode != 0:
+            raise RuntimeError("Unable to find inkscape executable --version")
+        return output.decode('utf-8').split(' ')[1]
+
     command = Unicode(
         help="""The command to use for converting SVG to PDF
-        
+
         This string is a template, which will be formatted with the keys
         to_filename and from_filename.
-        
+
         The conversion call must read the SVG from {from_filename},
         and write a PDF to {to_filename}.
         """).tag(config=True)
 
     @default('command')
     def _command_default(self):
-        return self.inkscape + \
-               ' --without-gui --export-pdf="{to_filename}" "{from_filename}"'
-    
+        major_verison = self.inkscape_version.split('.')[0]
+        export_option = ' --export-filename' if int(major_verison) > 0 else ' --export-pdf'
+        gui_option = '' if int(major_verison) > 0 else ' --without-gui'
+
+        return '{inkscape}{gui_option}{export_option}='.format(
+            inkscape=self.inkscape, export_option=export_option, gui_option=gui_option
+        ) + '"{to_filename}" "{from_filename}"'
+
     inkscape = Unicode(help="The path to Inkscape, if necessary").tag(config=True)
     @default('inkscape')
     def _inkscape_default(self):
-        if get_inkscape_path is not None:
-            return get_inkscape_path 
+        inkscape_path = which('inkscape')
+        if inkscape_path is not None:
+            return inkscape_path
         if sys.platform == "darwin":
             if os.path.isfile(INKSCAPE_APP):
                 return INKSCAPE_APP
@@ -85,22 +104,22 @@ class SVG2PDFPreprocessor(ConvertFiguresPreprocessor):
         Convert a single SVG figure to PDF.  Returns converted data.
         """
 
-        #Work in a temporary directory
+        # Work in a temporary directory
         with TemporaryDirectory() as tmpdir:
-            
-            #Write fig to temp file
+
+            # Write fig to temp file
             input_filename = os.path.join(tmpdir, 'figure.svg')
             # SVG data is unicode text
             with io.open(input_filename, 'w', encoding='utf8') as f:
                 f.write(cast_unicode_py2(data))
 
-            #Call conversion application
+            # Call conversion application
             output_filename = os.path.join(tmpdir, 'figure.pdf')
-            shell = self.command.format(from_filename=input_filename, 
+            shell = self.command.format(from_filename=input_filename,
                                    to_filename=output_filename)
-            subprocess.call(shell, shell=True) #Shell=True okay since input is trusted.
+            subprocess.call(shell, shell=True) # Shell=True okay since input is trusted.
 
-            #Read output from drive
+            # Read output from drive
             # return value expects a filename
             if os.path.isfile(output_filename):
                 with open(output_filename, 'rb') as f:
diff --git a/nbconvert/preprocessors/tests/test_svg2pdf.py b/nbconvert/preprocessors/tests/test_svg2pdf.py
index c42222c7..d9ccec8c 100644
--- a/nbconvert/preprocessors/tests/test_svg2pdf.py
+++ b/nbconvert/preprocessors/tests/test_svg2pdf.py
@@ -4,6 +4,7 @@
 # Distributed under the terms of the Modified BSD License.
 
 from nbformat import v4 as nbformat
+from unittest.mock import patch, Mock
 
 from .base import PreprocessorTestsBase
 from ..svg2pdf import SVG2PDFPreprocessor
@@ -51,9 +52,9 @@ class Testsvg2pdf(PreprocessorTestsBase):
         return nbformat.new_notebook(cells=cells)
 
 
-    def build_preprocessor(self):
+    def build_preprocessor(self, **kwargs):
         """Make an instance of a preprocessor"""
-        preprocessor = SVG2PDFPreprocessor()
+        preprocessor = SVG2PDFPreprocessor(**kwargs)
         preprocessor.enabled = True
         return preprocessor
 
@@ -71,4 +72,23 @@ class Testsvg2pdf(PreprocessorTestsBase):
         preprocessor = self.build_preprocessor()
         nb, res = preprocessor(nb, res)
         self.assertIn('application/pdf', nb.cells[0].outputs[0].data)
-        
+
+    @patch('subprocess.Popen')
+    def test_inkscape_version_default(self, mock_popen):
+        mock_popen().communicate.return_value = (b'Inkscape 0.92.3 (2405546, 2018-03-11)', b'')
+        mock_popen().returncode = 0
+
+        preprocessor = self.build_preprocessor()
+        self.assertEquals(preprocessor.inkscape_version, '0.92.3')
+
+    def test_inkscape_pre_v1_command(self):
+        preprocessor = self.build_preprocessor(inkscape_version='0.92.3')
+        self.assertEquals(preprocessor.command, '0.92.3')
+
+    def test_inkscape_pre_v1_command(self):
+        preprocessor = self.build_preprocessor(inkscape='fake-inkscape', inkscape_version='0.92.3')
+        self.assertEquals(preprocessor.command, 'fake-inkscape --without-gui --export-pdf="{to_filename}" "{from_filename}"')
+
+    def test_inkscape_v1_command(self):
+        preprocessor = self.build_preprocessor(inkscape='fake-inkscape', inkscape_version='1.0beta2')
+        self.assertEquals(preprocessor.command, 'fake-inkscape --export-filename="{to_filename}" "{from_filename}"')