##// END OF EJS Templates
flavor=template
Jonathan Frederic -
Show More
@@ -92,12 +92,15 b' class Exporter(Configurable):'
92 __doc__ = __doc__.format(filters = '- '+'\n - '.join(default_filters.keys()))
92 __doc__ = __doc__.format(filters = '- '+'\n - '.join(default_filters.keys()))
93
93
94
94
95 flavor = Unicode(config=True, help="""Flavor of the data format to use.
95 template_file = Unicode(u'default',
96 I.E. 'full' or 'basic'""")
97
98 template_file = Unicode(
99 config=True,
96 config=True,
100 help="Name of the template file to use")
97 help="Name of the template file to use")
98 def _template_file_changed(self, name, old, new):
99 if new=='default':
100 self.template_file = self.default_template
101 else:
102 self.template_file = new
103 default_template = Unicode(u'')
101
104
102 file_extension = Unicode(
105 file_extension = Unicode(
103 'txt', config=True,
106 'txt', config=True,
@@ -156,9 +159,8 b' class Exporter(Configurable):'
156 extra_loaders : list[of Jinja Loaders]
159 extra_loaders : list[of Jinja Loaders]
157 ordered list of Jinja loder to find templates. Will be tried in order
160 ordered list of Jinja loder to find templates. Will be tried in order
158 before the default FileSysteme ones.
161 before the default FileSysteme ones.
159 flavor : str
162 template : str (optional, kw arg)
160 Flavor to use when exporting. This determines what template to use
163 Template to use when exporting.
161 if one hasn't been specifically provided.
162 """
164 """
163
165
164 #Call the base class constructor
166 #Call the base class constructor
@@ -194,12 +196,29 b' class Exporter(Configurable):'
194 nb_copy = copy.deepcopy(nb)
196 nb_copy = copy.deepcopy(nb)
195 resources = self._init_resources(resources)
197 resources = self._init_resources(resources)
196
198
197 #Preprocess
199 # Preprocess
198 nb_copy, resources = self._transform(nb_copy, resources)
200 nb_copy, resources = self._transform(nb_copy, resources)
199
201
200 #Convert
202 # Try different template names during conversion. First try to load the
201 self.template = self.environment.get_template(self.template_file + self.template_extension)
203 # template by name with extension added, then try loading the template
202 output = self.template.render(nb=nb_copy, resources=resources)
204 # as if the name is explicitly specified, then try the name as a
205 # 'flavor', and lastly just try to load the template by module name.
206 module_name = self.__module__.split('.')[-1]
207 try_names = [self.template_file + self.template_extension,
208 self.template_file,
209 module_name + '_' + self.template_file + self.template_extension,
210 module_name + self.template_extension]
211 for try_name in try_names:
212 try:
213 self.template = self.environment.get_template(try_name)
214 break
215 except:
216 pass
217
218 if hasattr(self, 'template'):
219 output = self.template.render(nb=nb_copy, resources=resources)
220 else:
221 raise IOError('template file "%s" could not be found' % self.template_file)
203 return output, resources
222 return output, resources
204
223
205
224
@@ -339,19 +358,9 b' class Exporter(Configurable):'
339 Make sure a template name is specified. If one isn't specified, try to
358 Make sure a template name is specified. If one isn't specified, try to
340 build one from the information we know.
359 build one from the information we know.
341 """
360 """
342
361 self._template_file_changed('template_file', self.template_file, self.template_file)
343 # Set the template_file if it has not been set explicitly.
362 if 'template' in kw:
344 if not self.template_file:
363 self.template_file = kw['template']
345
346 # Build the template file name from the name of the exporter and the
347 # flavor (if available). The flavor can be set on the traitlet
348 # or passed in as a kw arg. The flavor specified in kw overrides
349 # what is set in the flavor traitlet.
350 module_name = self.__module__.split('.')[-1]
351 if self.flavor or 'flavor' in kw:
352 self.template_file = module_name + '_' + kw.get('flavor', self.flavor)
353 else:
354 self.template_file = module_name
355
364
356
365
357 def _init_environment(self, extra_loaders=None):
366 def _init_environment(self, extra_loaders=None):
@@ -38,18 +38,15 b' class HTMLExporter(Exporter):'
38 help="Extension of the file that should be written to disk"
38 help="Extension of the file that should be written to disk"
39 )
39 )
40
40
41 flavor = Unicode('full', config=True, help="""Flavor of the data format to
41 default_template = Unicode('full', config=True, help="""Flavor of the data
42 use. I.E. 'full' or 'basic'""")
42 format to use. I.E. 'full' or 'basic'""")
43
43
44 @property
44 @property
45 def default_config(self):
45 def default_config(self):
46 c = Config({
46 c = Config({
47 'CSSHTMLHeaderTransformer':{
47 'CSSHTMLHeaderTransformer':{
48 'enabled':True
48 'enabled':True
49 },
49 }
50 'RevealHelpTransformer':{
51 'enabled':True,
52 },
53 })
50 })
54 c.merge(super(HTMLExporter,self).default_config)
51 c.merge(super(HTMLExporter,self).default_config)
55 return c
52 return c
@@ -44,8 +44,8 b' class LatexExporter(Exporter):'
44 'tex', config=True,
44 'tex', config=True,
45 help="Extension of the file that should be written to disk")
45 help="Extension of the file that should be written to disk")
46
46
47 flavor = Unicode('article', config=True, help="""Flavor of the data format to
47 default_template = Unicode('article', config=True, help="""Template of the
48 use. I.E. 'full' or 'basic'""")
48 data format to use. I.E. 'full' or 'basic'""")
49
49
50 #Latex constants
50 #Latex constants
51 default_template_path = Unicode(
51 default_template_path = Unicode(
@@ -35,8 +35,8 b' class SlidesExporter(Exporter):'
35 help="Extension of the file that should be written to disk"
35 help="Extension of the file that should be written to disk"
36 )
36 )
37
37
38 flavor = Unicode('reveal', config=True, help="""Flavor of the data format to
38 default_template = Unicode('reveal', config=True, help="""Template of the
39 use. I.E. 'reveal'""")
39 data format to use. I.E. 'reveal'""")
40
40
41 @property
41 @property
42 def default_config(self):
42 def default_config(self):
@@ -42,15 +42,15 b' class TestHTMLExporter(ExportersTestsBase):'
42
42
43 def test_export_basic(self):
43 def test_export_basic(self):
44 """
44 """
45 Can a HTMLExporter export using the 'basic' flavor?
45 Can a HTMLExporter export using the 'basic' template?
46 """
46 """
47 (output, resources) = HTMLExporter(flavor='basic').from_filename(self._get_notebook())
47 (output, resources) = HTMLExporter(template='basic').from_filename(self._get_notebook())
48 assert len(output) > 0
48 assert len(output) > 0
49
49
50
50
51 def test_export_full(self):
51 def test_export_full(self):
52 """
52 """
53 Can a HTMLExporter export using the 'full' flavor?
53 Can a HTMLExporter export using the 'full' template?
54 """
54 """
55 (output, resources) = HTMLExporter(flavor='full').from_filename(self._get_notebook())
55 (output, resources) = HTMLExporter(template='full').from_filename(self._get_notebook())
56 assert len(output) > 0
56 assert len(output) > 0
@@ -43,23 +43,23 b' class TestLatexExporter(ExportersTestsBase):'
43
43
44 def test_export_book(self):
44 def test_export_book(self):
45 """
45 """
46 Can a LatexExporter export using 'book' flavor?
46 Can a LatexExporter export using 'book' template?
47 """
47 """
48 (output, resources) = LatexExporter(flavor='book').from_filename(self._get_notebook())
48 (output, resources) = LatexExporter(template='book').from_filename(self._get_notebook())
49 assert len(output) > 0
49 assert len(output) > 0
50
50
51
51
52 def test_export_basic(self):
52 def test_export_basic(self):
53 """
53 """
54 Can a LatexExporter export using 'basic' flavor?
54 Can a LatexExporter export using 'basic' template?
55 """
55 """
56 (output, resources) = LatexExporter(flavor='basic').from_filename(self._get_notebook())
56 (output, resources) = LatexExporter(template='basic').from_filename(self._get_notebook())
57 assert len(output) > 0
57 assert len(output) > 0
58
58
59
59
60 def test_export_article(self):
60 def test_export_article(self):
61 """
61 """
62 Can a LatexExporter export using 'article' flavor?
62 Can a LatexExporter export using 'article' template?
63 """
63 """
64 (output, resources) = LatexExporter(flavor='article').from_filename(self._get_notebook())
64 (output, resources) = LatexExporter(template='article').from_filename(self._get_notebook())
65 assert len(output) > 0 No newline at end of file
65 assert len(output) > 0
@@ -41,7 +41,7 b' class TestSlidesExporter(ExportersTestsBase):'
41
41
42 def test_export_reveal(self):
42 def test_export_reveal(self):
43 """
43 """
44 Can a SlidesExporter export using the 'reveal' flavor?
44 Can a SlidesExporter export using the 'reveal' template?
45 """
45 """
46 (output, resources) = SlidesExporter(flavor='reveal').from_filename(self._get_notebook())
46 (output, resources) = SlidesExporter(template='reveal').from_filename(self._get_notebook())
47 assert len(output) > 0
47 assert len(output) > 0
@@ -42,7 +42,6 b' nbconvert_aliases = {}'
42 nbconvert_aliases.update(base_aliases)
42 nbconvert_aliases.update(base_aliases)
43 nbconvert_aliases.update({
43 nbconvert_aliases.update({
44 'to' : 'NbConvertApp.export_format',
44 'to' : 'NbConvertApp.export_format',
45 'flavor' : 'Exporter.flavor',
46 'template' : 'Exporter.template_file',
45 'template' : 'Exporter.template_file',
47 'notebooks' : 'NbConvertApp.notebooks',
46 'notebooks' : 'NbConvertApp.notebooks',
48 'writer' : 'NbConvertApp.writer_class',
47 'writer' : 'NbConvertApp.writer_class',
@@ -58,7 +57,7 b' nbconvert_flags.update({'
58
57
59 'pdf' : (
58 'pdf' : (
60 {'NbConvertApp' : {'writer_class' : "PDFWriter"}},
59 {'NbConvertApp' : {'writer_class' : "PDFWriter"}},
61 "Compile notebook output to a PDF."
60 "Compile notebook output to a PDF (requires `--to latex`)."
62 )
61 )
63 })
62 })
64
63
@@ -95,11 +94,11 b' class NbConvertApp(BaseIPythonApplication):'
95
94
96 > ipython nbconvert --to latex mynotebook.ipnynb
95 > ipython nbconvert --to latex mynotebook.ipnynb
97
96
98 Both HTML and LaTeX support multiple flavors of output. LaTeX includes
97 Both HTML and LaTeX support multiple output templates. LaTeX includes
99 'basic', 'book', and 'article'. HTML includes 'basic' and 'full'. You
98 'basic', 'book', and 'article'. HTML includes 'basic' and 'full'. You
100 can specify the flavor of the format used.
99 can specify the flavor of the format used.
101
100
102 > ipython nbconvert --to html --flavor reveal mynotebook.ipnynb
101 > ipython nbconvert --to html --template reveal mynotebook.ipnynb
103
102
104 You can also pipe the output to stdout, rather than a file
103 You can also pipe the output to stdout, rather than a file
105
104
@@ -107,7 +106,7 b' class NbConvertApp(BaseIPythonApplication):'
107
106
108 or to a PDF
107 or to a PDF
109
108
110 > ipython nbconvert mynotebook.ipynb --pdf
109 > ipython nbconvert mynotebook.ipynb --to latex --pdf
111
110
112 Multiple notebooks can be given at the command line in a couple of
111 Multiple notebooks can be given at the command line in a couple of
113 different ways:
112 different ways:
@@ -80,13 +80,13 b' class TestNbConvertApp(TestsBase):'
80 assert os.path.isfile('notebook2.py')
80 assert os.path.isfile('notebook2.py')
81
81
82
82
83 def test_flavor(self):
83 def test_template(self):
84 """
84 """
85 Do export flavors work?
85 Do export templates work?
86 """
86 """
87 with self.create_temp_cwd(['notebook*.ipynb']):
87 with self.create_temp_cwd(['notebook*.ipynb']):
88 assert not 'error' in self.call([IPYTHON, 'nbconvert', '--to="slides"',
88 assert not 'error' in self.call([IPYTHON, 'nbconvert', '--to="slides"',
89 '--notebooks=["notebook2.ipynb"]', '--flavor="reveal"']).lower()
89 '--notebooks=["notebook2.ipynb"]', '--template="reveal"']).lower()
90 assert os.path.isfile('notebook2.html')
90 assert os.path.isfile('notebook2.html')
91 with open('notebook2.html') as f:
91 with open('notebook2.html') as f:
92 assert '/reveal.css' in f.read()
92 assert '/reveal.css' in f.read()
@@ -17,7 +17,7 b' Contains writer for writing nbconvert output to PDF.'
17 import subprocess
17 import subprocess
18 import os
18 import os
19
19
20 from IPython.utils.traitlets import Integer
20 from IPython.utils.traitlets import Integer, Unicode
21
21
22 from .files import FilesWriter
22 from .files import FilesWriter
23
23
@@ -31,12 +31,17 b' class PDFWriter(FilesWriter):'
31 How many times pdflatex will be called.
31 How many times pdflatex will be called.
32 """)
32 """)
33
33
34 compiler = Unicode(u'pdflatex {0}', config=True, help="""
35 Shell command used to compile PDF.""")
36
34 def write(self, output, resources, notebook_name=None, **kw):
37 def write(self, output, resources, notebook_name=None, **kw):
35 """
38 """
36 Consume and write Jinja output a PDF.
39 Consume and write Jinja output a PDF.
37 See files.py for more...
40 See files.py for more...
38 """
41 """
39 dest = super(PDFWriter, self).write(output, resources, notebook_name=notebook_name, **kw)
42 dest = super(PDFWriter, self).write(output, resources,
40 command = 'pdflatex ' + dest
43 notebook_name=notebook_name, **kw)
44 command = self.compiler.format(dest)
45
41 for index in range(self.iteration_count):
46 for index in range(self.iteration_count):
42 subprocess.Popen(command, shell=True, stdout=open(os.devnull, 'wb'))
47 subprocess.Popen(command, shell=True, stdout=open(os.devnull, 'wb'))
General Comments 0
You need to be logged in to leave comments. Login now