##// END OF EJS Templates
Set name and allow base to determine default config name
Jonathan Frederic -
Show More
@@ -1,198 +1,197 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 """NBConvert is a utility for conversion of IPYNB files.
2 """NBConvert is a utility for conversion of IPYNB files.
3
3
4 Commandline interface for the NBConvert conversion utility. Read the
4 Commandline interface for the NBConvert conversion utility. Read the
5 readme.rst for usage information
5 readme.rst for usage information
6 """
6 """
7 #-----------------------------------------------------------------------------
7 #-----------------------------------------------------------------------------
8 #Copyright (c) 2013, the IPython Development Team.
8 #Copyright (c) 2013, the IPython Development Team.
9 #
9 #
10 #Distributed under the terms of the Modified BSD License.
10 #Distributed under the terms of the Modified BSD License.
11 #
11 #
12 #The full license is in the file COPYING.txt, distributed with this software.
12 #The full license is in the file COPYING.txt, distributed with this software.
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
14
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16 #Imports
16 #Imports
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18
18
19 #Stdlib imports
19 #Stdlib imports
20 from __future__ import print_function
20 from __future__ import print_function
21 import sys
21 import sys
22 import os
22 import os
23 import glob
23 import glob
24
24
25 #From IPython
25 #From IPython
26 from IPython.core.application import BaseIPythonApplication
26 from IPython.core.application import BaseIPythonApplication
27 from IPython.config.application import catch_config_error
27 from IPython.config.application import catch_config_error
28 from IPython.utils.traitlets import Unicode, List, Instance, DottedObjectName, Type
28 from IPython.utils.traitlets import Unicode, List, Instance, DottedObjectName, Type
29 from IPython.utils.importstring import import_item
29 from IPython.utils.importstring import import_item
30
30
31 from .exporters.export import export_by_name, get_export_names, ExporterNameError
31 from .exporters.export import export_by_name, get_export_names, ExporterNameError
32 from .exporters.exporter import Exporter
32 from .exporters.exporter import Exporter
33 from .writers.base import WriterBase
33 from .writers.base import WriterBase
34 from .utils.config import GlobalConfigurable
34 from .utils.config import GlobalConfigurable
35
35
36 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
37 #Classes and functions
37 #Classes and functions
38 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
39
39
40 class NbConvertApp(BaseIPythonApplication):
40 class NbConvertApp(BaseIPythonApplication):
41 """Application used to convert to and from notebook file type (*.ipynb)"""
41 """Application used to convert to and from notebook file type (*.ipynb)"""
42
42
43 name = 'ipython-nbconvert'
43
44
44 description = Unicode(
45 description = Unicode(
45 u"""This application is used to convert notebook files (*.ipynb).
46 u"""This application is used to convert notebook files (*.ipynb).
46 An ipython config file can be used to batch convert notebooks in the
47 An ipython config file can be used to batch convert notebooks in the
47 current directory.""")
48 current directory.""")
48
49
49 examples = Unicode(u"""
50 examples = Unicode(u"""
50 Running `ipython nbconvert` will read the directory config file and then
51 Running `ipython nbconvert` will read the directory config file and then
51 apply it to one or more notebooks.
52 apply it to one or more notebooks.
52
53
53 Multiple notebooks can be given at the command line in a couple of
54 Multiple notebooks can be given at the command line in a couple of
54 different ways:
55 different ways:
55
56
56 > ipython nbconvert notebook*.ipynb
57 > ipython nbconvert notebook*.ipynb
57 > ipython nbconvert notebook1.ipynb notebook2.ipynb
58 > ipython nbconvert notebook1.ipynb notebook2.ipynb
58 > ipython nbconvert # this will use the config file to fill in the notebooks
59 > ipython nbconvert # this will use the config file to fill in the notebooks
59 """)
60 """)
60
61
61 config_file_name = Unicode(u'ipython_nbconvert_config.py')
62
63 #Writer specific variables
62 #Writer specific variables
64 writer = Instance('IPython.nbconvert.writers.base.WriterBase',
63 writer = Instance('IPython.nbconvert.writers.base.WriterBase',
65 help="""Instance of the writer class used to write the
64 help="""Instance of the writer class used to write the
66 results of the conversion.""")
65 results of the conversion.""")
67 writer_class = DottedObjectName('FilesWriter', config=True,
66 writer_class = DottedObjectName('FilesWriter', config=True,
68 help="""Writer class used to write the
67 help="""Writer class used to write the
69 results of the conversion""")
68 results of the conversion""")
70 writer_aliases = {'FilesWriter': 'IPython.nbconvert.writers.files.FilesWriter',
69 writer_aliases = {'FilesWriter': 'IPython.nbconvert.writers.files.FilesWriter',
71 'DebugWriter': 'IPython.nbconvert.writers.debug.DebugWriter',
70 'DebugWriter': 'IPython.nbconvert.writers.debug.DebugWriter',
72 'StdoutWriter': 'IPython.nbconvert.writers.stdout.StdoutWriter'}
71 'StdoutWriter': 'IPython.nbconvert.writers.stdout.StdoutWriter'}
73 writer_factory = Type()
72 writer_factory = Type()
74
73
75 def _writer_class_changed(self, name, old, new):
74 def _writer_class_changed(self, name, old, new):
76 if new in self.writer_aliases:
75 if new in self.writer_aliases:
77 new = self.writer_aliases[new]
76 new = self.writer_aliases[new]
78 self.writer_factory = import_item(new)
77 self.writer_factory = import_item(new)
79
78
80
79
81 #Other configurable variables
80 #Other configurable variables
82 export_format = Unicode(
81 export_format = Unicode(
83 "", config=True,
82 "", config=True,
84 help="""If specified, nbconvert will convert the document(s) specified
83 help="""If specified, nbconvert will convert the document(s) specified
85 using this format.""")
84 using this format.""")
86
85
87 notebooks = List([], config=True, help="""List of notebooks to convert.
86 notebooks = List([], config=True, help="""List of notebooks to convert.
88 Search patterns are supported.""")
87 Search patterns are supported.""")
89
88
90 nbconvert_aliases = {'format':'NbConvertApp.export_format',
89 nbconvert_aliases = {'format':'NbConvertApp.export_format',
91 'notebooks':'NbConvertApp.notebooks',
90 'notebooks':'NbConvertApp.notebooks',
92 'writer':'NbConvertApp.writer_class'}
91 'writer':'NbConvertApp.writer_class'}
93
92
94
93
95 @catch_config_error
94 @catch_config_error
96 def initialize(self, argv=None):
95 def initialize(self, argv=None):
97 self.aliases.update(self.nbconvert_aliases)
96 self.aliases.update(self.nbconvert_aliases)
98
97
99 super(NbConvertApp, self).initialize(argv)
98 super(NbConvertApp, self).initialize(argv)
100
99
101 #Register class here to have help with help all
100 #Register class here to have help with help all
102 self.classes.insert(0, Exporter)
101 self.classes.insert(0, Exporter)
103 self.classes.insert(0, WriterBase)
102 self.classes.insert(0, WriterBase)
104 self.classes.insert(0, GlobalConfigurable)
103 self.classes.insert(0, GlobalConfigurable)
105
104
106 #Init
105 #Init
107 self.init_config(self.extra_args)
106 self.init_config(self.extra_args)
108 self.init_writer()
107 self.init_writer()
109
108
110
109
111 def init_config(self, extra_args):
110 def init_config(self, extra_args):
112 """
111 """
113 Add notebooks to the config if needed. Glob each notebook to replace
112 Add notebooks to the config if needed. Glob each notebook to replace
114 notebook patterns with filenames.
113 notebook patterns with filenames.
115 """
114 """
116
115
117 #Get any additional notebook patterns from the commandline
116 #Get any additional notebook patterns from the commandline
118 if len(extra_args) > 0:
117 if len(extra_args) > 0:
119 for pattern in extra_args:
118 for pattern in extra_args:
120 self.notebooks.append(pattern)
119 self.notebooks.append(pattern)
121
120
122 #Use glob to replace all the notebook patterns with filenames.
121 #Use glob to replace all the notebook patterns with filenames.
123 filenames = []
122 filenames = []
124 for pattern in self.notebooks:
123 for pattern in self.notebooks:
125 for filename in glob.glob(pattern):
124 for filename in glob.glob(pattern):
126 if not filename in filenames:
125 if not filename in filenames:
127 filenames.append(filename)
126 filenames.append(filename)
128 self.notebooks = filenames
127 self.notebooks = filenames
129
128
130
129
131 def init_writer(self):
130 def init_writer(self):
132 """
131 """
133 Initialize the writer (which is stateless)
132 Initialize the writer (which is stateless)
134 """
133 """
135 self._writer_class_changed(None, self.writer_class, self.writer_class)
134 self._writer_class_changed(None, self.writer_class, self.writer_class)
136 self.writer = self.writer_factory(parent=self)
135 self.writer = self.writer_factory(parent=self)
137
136
138
137
139 def start(self, argv=None):
138 def start(self, argv=None):
140 """
139 """
141 Ran after initiialization completed
140 Ran after initiialization completed
142 """
141 """
143 super(NbConvertApp, self).start()
142 super(NbConvertApp, self).start()
144 self.convert_notebooks()
143 self.convert_notebooks()
145
144
146
145
147 def convert_notebooks(self):
146 def convert_notebooks(self):
148 """
147 """
149 Convert the notebooks in the self.notebook traitlet
148 Convert the notebooks in the self.notebook traitlet
150 """
149 """
151 #Export each notebook
150 #Export each notebook
152 conversion_success = 0
151 conversion_success = 0
153 for notebook_filename in self.notebooks:
152 for notebook_filename in self.notebooks:
154
153
155 #Get a unique key for the notebook and set it in the resources object.
154 #Get a unique key for the notebook and set it in the resources object.
156 basename = os.path.basename(notebook_filename)
155 basename = os.path.basename(notebook_filename)
157 notebook_name = basename[:basename.rfind('.')]
156 notebook_name = basename[:basename.rfind('.')]
158 resources = {}
157 resources = {}
159 resources['unique_key'] = notebook_name
158 resources['unique_key'] = notebook_name
160
159
161 #Try to export
160 #Try to export
162 try:
161 try:
163 output, resources = export_by_name(self.export_format,
162 output, resources = export_by_name(self.export_format,
164 notebook_filename,
163 notebook_filename,
165 resources=resources,
164 resources=resources,
166 config=self.config)
165 config=self.config)
167 except ExporterNameError as e:
166 except ExporterNameError as e:
168 print("Error: '%s' exporter not found." % self.export_format,
167 print("Error: '%s' exporter not found." % self.export_format,
169 file=sys.stderr)
168 file=sys.stderr)
170 print("Known exporters are:",
169 print("Known exporters are:",
171 "\n\t" + "\n\t".join(get_export_names()),
170 "\n\t" + "\n\t".join(get_export_names()),
172 file=sys.stderr)
171 file=sys.stderr)
173 sys.exit(-1)
172 sys.exit(-1)
174 #except Exception as e:
173 #except Exception as e:
175 #print("Error: could not export '%s'" % notebook_filename, file=sys.stderr)
174 #print("Error: could not export '%s'" % notebook_filename, file=sys.stderr)
176 #print(e, file=sys.stderr)
175 #print(e, file=sys.stderr)
177 else:
176 else:
178 self.writer.write(output, resources, notebook_name=notebook_name)
177 self.writer.write(output, resources, notebook_name=notebook_name)
179 conversion_success += 1
178 conversion_success += 1
180
179
181 #If nothing was converted successfully, help the user.
180 #If nothing was converted successfully, help the user.
182 if conversion_success == 0:
181 if conversion_success == 0:
183
182
184 #No notebooks were specified, show help.
183 #No notebooks were specified, show help.
185 if len(self.notebooks) == 0:
184 if len(self.notebooks) == 0:
186 self.print_help()
185 self.print_help()
187
186
188 #Notebooks were specified, but not converted successfully. Show how
187 #Notebooks were specified, but not converted successfully. Show how
189 #to access help.
188 #to access help.
190 else:
189 else:
191 print('For help, use "ipython nbconvert --help"')
190 print('For help, use "ipython nbconvert --help"')
192
191
193
192
194 #-----------------------------------------------------------------------------
193 #-----------------------------------------------------------------------------
195 # Main entry point
194 # Main entry point
196 #-----------------------------------------------------------------------------
195 #-----------------------------------------------------------------------------
197
196
198 launch_new_instance = NbConvertApp.launch_instance
197 launch_new_instance = NbConvertApp.launch_instance
General Comments 0
You need to be logged in to leave comments. Login now