##// END OF EJS Templates
Transformers in traitlet lists now, new _init_ methods,...
Jonathan Frederic -
Show More
@@ -14,7 +14,7 b' Exporter that exports Basic HTML.'
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 from IPython.utils.traitlets import Unicode
17 from IPython.utils.traitlets import Unicode, List
18
18
19 from ..transformers.csshtmlheader import CSSHTMLHeaderTransformer
19 from ..transformers.csshtmlheader import CSSHTMLHeaderTransformer
20
20
@@ -41,15 +41,10 b' class BasicHTMLExporter(Exporter):'
41 'basichtml', config=True,
41 'basichtml', config=True,
42 help="Name of the template file to use")
42 help="Name of the template file to use")
43
43
44
44 default_transformers = List([transformers.coalesce_streams,
45 def _register_transformers(self):
45 transformers.ExtractFigureTransformer,
46 """
46 transformers.CSSHTMLHeaderTransformer],
47 Register all of the transformers needed for this exporter.
47 config=True,
48 """
48 help="""List of transformers available by default, by name, namespace,
49
49 instance, or type.""")
50 #Register the transformers of the base class.
50 No newline at end of file
51 super(BasicHTMLExporter, self)._register_transformers()
52
53 #Register CSSHTMLHeaderTransformer transformer
54 self.register_transformer(CSSHTMLHeaderTransformer)
55
@@ -21,7 +21,9 b' import io'
21 import os
21 import os
22 import inspect
22 import inspect
23 import types
23 import types
24 from copy import deepcopy
24 import copy
25 import collections
26 import datetime
25
27
26 # other libs/dependencies
28 # other libs/dependencies
27 from jinja2 import Environment, FileSystemLoader, ChoiceLoader
29 from jinja2 import Environment, FileSystemLoader, ChoiceLoader
@@ -34,8 +36,8 b' from IPython.utils.traitlets import MetaHasTraits, DottedObjectName, Unicode, Li'
34 from IPython.utils.importstring import import_item
36 from IPython.utils.importstring import import_item
35 from IPython.utils.text import indent
37 from IPython.utils.text import indent
36
38
39 from IPython.nbconvert import transformers as nbtransformers
37 from IPython.nbconvert import filters
40 from IPython.nbconvert import filters
38 from IPython.nbconvert import transformers
39
41
40 #-----------------------------------------------------------------------------
42 #-----------------------------------------------------------------------------
41 # Globals and constants
43 # Globals and constants
@@ -115,9 +117,16 b' class Exporter(Configurable):'
115 #Configurability, allows the user to easily add filters and transformers.
117 #Configurability, allows the user to easily add filters and transformers.
116 transformers = List(config=True,
118 transformers = List(config=True,
117 help="""List of transformers, by name or namespace, to enable.""")
119 help="""List of transformers, by name or namespace, to enable.""")
120
118 filters = Dict(config=True,
121 filters = Dict(config=True,
119 help="""Dictionary of filters, by name and namespace, to add to the Jinja
122 help="""Dictionary of filters, by name and namespace, to add to the Jinja
120 environment.""")
123 environment.""")
124
125 default_transformers = List([nbtransformers.coalesce_streams,
126 nbtransformers.ExtractFigureTransformer],
127 config=True,
128 help="""List of transformers available by default, by name, namespace,
129 instance, or type.""")
121
130
122 def __init__(self, config=None, extra_loaders=None, **kw):
131 def __init__(self, config=None, extra_loaders=None, **kw):
123 """
132 """
@@ -139,25 +148,10 b' class Exporter(Configurable):'
139
148
140 super(Exporter, self).__init__(config=c, **kw)
149 super(Exporter, self).__init__(config=c, **kw)
141
150
142 #Standard environment
151 #Init
143 self._init_environment(extra_loaders=extra_loaders)
152 self._init_environment(extra_loaders=extra_loaders)
144
153 self._init_transformers()
145 #Add transformers
154 self._init_filters()
146 self._transformers = []
147 self._register_transformers()
148
149 #Add filters to the Jinja2 environment
150 self._register_filters()
151
152 #Load user transformers. Enabled by default.
153 if self.transformers:
154 for transformer in self.transformers:
155 self.register_transformer(transformer, enabled=True)
156
157 #Load user filters. Overwrite existing filters if need be.
158 if self.filters:
159 for key, user_filter in self.filters.iteritems():
160 self.register_filter(key, user_filter)
161
155
162
156
163 @property
157 @property
@@ -176,11 +170,8 b' class Exporter(Configurable):'
176 of additional resources that can be accessed read/write by
170 of additional resources that can be accessed read/write by
177 transformers and filters.
171 transformers and filters.
178 """
172 """
179 nb_copy = deepcopy(nb)
173 nb_copy = copy.deepcopy(nb)
180
174 resources = self._init_resources(resources)
181 #Set output extension in resources dict
182 #TODO: init_resources
183 resources['output_extension'] = self.file_extension
184
175
185 #Preprocess
176 #Preprocess
186 nb_copy, resources = self._transform(nb_copy, resources)
177 nb_copy, resources = self._transform(nb_copy, resources)
@@ -200,6 +191,16 b' class Exporter(Configurable):'
200 filename : str
191 filename : str
201 Full filename of the notebook file to open and convert.
192 Full filename of the notebook file to open and convert.
202 """
193 """
194
195 #Pull the metadata from the filesystem.
196 if not 'metadata' in resources:
197 resources['metadata'] = ResourcesDict()
198 basename = os.path.basename(filename)
199 notebook_name = basename[:basename.rfind('.')]
200 resources['metadata']['name'] = notebook_name
201
202 modified_date = datetime.datetime.fromtimestamp(os.path.getmtime(filename))
203 resources['metadata']['modified_date'] = modified_date.strftime("%B %-d, %Y")
203
204
204 with io.open(filename) as f:
205 with io.open(filename) as f:
205 return self.from_notebook_node(nbformat.read(f, 'json'), resources=resources,**kw)
206 return self.from_notebook_node(nbformat.read(f, 'json'), resources=resources,**kw)
@@ -281,24 +282,6 b' class Exporter(Configurable):'
281 self.environment.filters[name] = filter()
282 self.environment.filters[name] = filter()
282 return self.environment.filters[name]
283 return self.environment.filters[name]
283
284
284
285 def _register_transformers(self):
286 """
287 Register all of the transformers needed for this exporter, disabled
288 unless specified explicitly.
289 """
290
291 self.register_transformer(transformers.coalesce_streams)
292 self.register_transformer(transformers.ExtractFigureTransformer)
293
294
295 def _register_filters(self):
296 """
297 Register all of the filters required for the exporter.
298 """
299 for key, value in default_filters.iteritems():
300 self.register_filter(key, value)
301
302
285
303 def _init_environment(self, extra_loaders=None):
286 def _init_environment(self, extra_loaders=None):
304 """
287 """
@@ -333,6 +316,63 b' class Exporter(Configurable):'
333 if self.jinja_comment_block_end:
316 if self.jinja_comment_block_end:
334 self.environment.comment_end_string = self.jinja_comment_block_end
317 self.environment.comment_end_string = self.jinja_comment_block_end
335
318
319
320 def _init_transformers(self):
321 """
322 Register all of the transformers needed for this exporter, disabled
323 unless specified explicitly.
324 """
325 self._transformers = []
326
327 #Load default transformers (not necessarly enabled by default).
328 if self.default_transformers:
329 for transformer in self.default_transformers:
330 self.register_transformer(transformer)
331
332 #Load user transformers. Enable by default.
333 if self.transformers:
334 for transformer in self.transformers:
335 self.register_transformer(transformer, enabled=True)
336
337
338 def _init_filters(self):
339 """
340 Register all of the filters required for the exporter.
341 """
342
343 #Add default filters to the Jinja2 environment
344 for key, value in default_filters.iteritems():
345 self.register_filter(key, value)
346
347 #Load user filters. Overwrite existing filters if need be.
348 if self.filters:
349 for key, user_filter in self.filters.iteritems():
350 self.register_filter(key, user_filter)
351
352
353 def _init_resources(self, resources):
354
355 #Make sure the resources dict is of ResourcesDict type.
356 if resources is None:
357 resources = ResourcesDict()
358 if not isinstance(resources, ResourcesDict):
359 new_resources = ResourcesDict()
360 new_resources.update(resources)
361 resources = new_resources
362
363 #Make sure the metadata extension exists in resources
364 if 'metadata' in resources:
365 if not isinstance(resources['metadata'], ResourcesDict):
366 resources['metadata'] = ResourcesDict(resources['metadata'])
367 else:
368 resources['metadata'] = ResourcesDict()
369 resources['metadata']['name'] = 'Notebook'
370 resources['metadata']['modified_date'] = ''
371
372 #Set the output extension
373 resources['output_extension'] = self.file_extension
374 return resources
375
336
376
337 def _transform(self, nb, resources):
377 def _transform(self, nb, resources):
338 """
378 """
@@ -20,7 +20,7 b' tags to circumvent Jinja/Latex syntax conflicts.'
20 import os
20 import os
21
21
22 # IPython imports
22 # IPython imports
23 from IPython.utils.traitlets import Unicode
23 from IPython.utils.traitlets import Unicode, List
24 from IPython.config import Config
24 from IPython.config import Config
25
25
26 from IPython.nbconvert import filters, transformers
26 from IPython.nbconvert import filters, transformers
@@ -68,44 +68,43 b' class LatexExporter(Exporter):'
68 #Extension that the template files use.
68 #Extension that the template files use.
69 template_extension = Unicode(".tplx", config=True)
69 template_extension = Unicode(".tplx", config=True)
70
70
71 def _register_filters(self):
71 default_transformers = List([transformers.ExtractFigureTransformer,
72 transformers.CSSHTMLHeaderTransformer,
73 transformers.LatexTransformer,
74 transformers.Svg2PdfTransformer],
75 config=True,
76 help="""List of transformers available by default, by name, namespace,
77 instance, or type.""")
78
79
80 def _init_filters(self):
72 """
81 """
73 Register all of the filters required for the exporter.
82 Register all of the filters required for the exporter.
74 """
83 """
75
84
76 #Register the filters of the base class.
85 #Register the filters of the base class.
77 super(LatexExporter, self)._register_filters()
86 super(LatexExporter, self)._init_filters()
78
87
79 #Add latex filters to the Jinja2 environment
88 #Add latex filters to the Jinja2 environment
80 self.register_filter('escape_tex', filters.escape_latex)
89 self.register_filter('escape_tex', filters.escape_latex)
81 self.register_filter('highlight', filters.highlight2latex)
90 self.register_filter('highlight', filters.highlight2latex)
82
91
83
84 def _register_transformers(self):
85 """
86 Register all of the transformers needed for this exporter.
87 """
88
89 #Register ConvertSvgTransformer before any other transformers!
90 #Important because it allows the conversion of svg->png BEFORE the
91 #extract figure transformer acts on the data.
92 self.register_transformer(transformers.ConvertSvgTransformer, True)
93
94 #Register transformers
95 super(LatexExporter, self)._register_transformers()
96 self.register_transformer(transformers.LatexTransformer, True)
97
92
98 @property
93 @property
99 def default_config(self):
94 def default_config(self):
100 c = Config({
95 c = Config({
101 'GlobalConfigurable': {
96 'GlobalConfigurable': {
102 'display_data_priority' : ['latex', 'png', 'jpg', 'pdf', 'jpeg', 'text']
97 'display_data_priority' : ['latex', 'png', 'jpg', 'svg', 'jpeg', 'text']
103 },
98 },
104 'ExtractFigureTransformer': {
99 'ExtractFigureTransformer': {
105 'enabled':True
100 'enabled':True
101 },
102 'Svg2PdfTransformer': {
103 'enabled':True
104 },
105 'LatexTransformer': {
106 'enabled':True
106 }
107 }
107
108 })
108 })
109 c.merge(super(LatexExporter,self).default_config)
109 c.merge(super(LatexExporter,self).default_config)
110 return c
110 return c
111
@@ -13,7 +13,7 b' Reveal slide show exporter.'
13 # Imports
13 # Imports
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15
15
16 from IPython.utils.traitlets import Unicode
16 from IPython.utils.traitlets import Unicode, List
17 from IPython.config import Config
17 from IPython.config import Config
18
18
19 from .basichtml import BasicHTMLExporter
19 from .basichtml import BasicHTMLExporter
@@ -35,17 +35,15 b' class RevealExporter(BasicHTMLExporter):'
35 template_file = Unicode(
35 template_file = Unicode(
36 'reveal', config=True,
36 'reveal', config=True,
37 help="Name of the template file to use")
37 help="Name of the template file to use")
38
39 default_transformers = List([transformers.coalesce_streams,
40 transformers.ExtractFigureTransformer,
41 transformers.CSSHTMLHeaderTransformer,
42 transformers.RevealHelpTransformer],
43 config=True,
44 help="""List of transformers available by default, by name, namespace,
45 instance, or type.""")
38
46
39 def _register_transformers(self):
40 """
41 Register all of the transformers needed for this exporter.
42 """
43
44 #Register the transformers of the base class.
45 super(RevealExporter, self)._register_transformers()
46
47 #Register reveal help transformer
48 self.register_transformer(transformers.RevealHelpTransformer, enabled=True)
49
47
50 @property
48 @property
51 def default_config(self):
49 def default_config(self):
@@ -14,7 +14,7 b' formatted for use with PDFLatex.'
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 from IPython.utils.traitlets import Unicode
17 from IPython.utils.traitlets import Unicode, List
18 from IPython.config import Config
18 from IPython.config import Config
19
19
20 # local import
20 # local import
@@ -36,10 +36,18 b' class SphinxHowtoExporter(LatexExporter):'
36 'sphinx_howto', config=True,
36 'sphinx_howto', config=True,
37 help="Name of the template file to use")
37 help="Name of the template file to use")
38
38
39 def _register_transformers(self):
39 default_transformers = List([transformers.Svg2PdfTransformer,
40
40 transformers.ExtractFigureTransformer,
41 #Register the transformers of the base class.
41 transformers.CSSHTMLHeaderTransformer,
42 super(SphinxHowtoExporter, self)._register_transformers()
42 transformers.LatexTransformer,
43
43 transformers.SphinxTransformer],
44 #Register sphinx latex transformer
44 config=True,
45 self.register_transformer(transformers.SphinxTransformer, enabled=True)
45 help="""List of transformers available by default, by name, namespace,
46 instance, or type.""")
47
48
49 @property
50 def default_config(self):
51 c = Config({'SphinxTransformer': {'enabled':True}})
52 c.merge(super(SphinxHowtoExporter,self).default_config)
53 return c
@@ -145,11 +145,11 b' Note: For best display, use latex syntax highlighting. =))'
145 \sloppy
145 \sloppy
146
146
147 % Document level variables
147 % Document level variables
148 \title{((( nb.metadata.name | escape_tex )))}
148 \title{((( resources.metadata.name | escape_tex )))}
149 \date{((( nb.metadata._draft.date | escape_tex )))}
149 \date{((( resources.sphinx.date | escape_tex )))}
150 \release{((( nb.metadata._draft.version | escape_tex )))}
150 \release{((( resources.sphinx.version | escape_tex )))}
151 \author{((( nb.metadata._draft.author | escape_tex )))}
151 \author{((( resources.sphinx.author | escape_tex )))}
152 \renewcommand{\releasename}{((( nb.metadata._draft.release | escape_tex )))}
152 \renewcommand{\releasename}{((( resources.sphinx.release | escape_tex )))}
153
153
154 % TODO: Add option for the user to specify a logo for his/her export.
154 % TODO: Add option for the user to specify a logo for his/her export.
155 \newcommand{\sphinxlogo}{}
155 \newcommand{\sphinxlogo}{}
@@ -127,9 +127,6 b' class SphinxTransformer(ActivatableTransformer):'
127 # TODO: Add versatile method of additional notebook metadata. Include
127 # TODO: Add versatile method of additional notebook metadata. Include
128 # handling of multiple files. For now use a temporay namespace,
128 # handling of multiple files. For now use a temporay namespace,
129 # '_draft' to signify that this needs to change.
129 # '_draft' to signify that this needs to change.
130 if not "_draft" in nb.metadata:
131 nb.metadata._draft = {}
132 #TODO: Remove draft, and nb
133 if not "sphinx" in resources:
130 if not "sphinx" in resources:
134 resources["sphinx"] = {}
131 resources["sphinx"] = {}
135
132
@@ -137,10 +134,10 b' class SphinxTransformer(ActivatableTransformer):'
137
134
138 # Prompt the user for additional meta data that doesn't exist currently
135 # Prompt the user for additional meta data that doesn't exist currently
139 # but would be usefull for Sphinx.
136 # but would be usefull for Sphinx.
140 nb.metadata._draft["author"] = self._prompt_author()
137 resources["sphinx"]["author"] = self._prompt_author()
141 nb.metadata._draft["version"] = self._prompt_version()
138 resources["sphinx"]["version"] = self._prompt_version()
142 nb.metadata._draft["release"] = self._prompt_release()
139 resources["sphinx"]["release"] = self._prompt_release()
143 nb.metadata._draft["date"] = self._prompt_date()
140 resources["sphinx"]["date"] = self._prompt_date()
144
141
145 # Prompt the user for the document style.
142 # Prompt the user for the document style.
146 resources["sphinx"]["chapterstyle"] = self._prompt_chapter_title_style()
143 resources["sphinx"]["chapterstyle"] = self._prompt_chapter_title_style()
@@ -152,15 +149,17 b' class SphinxTransformer(ActivatableTransformer):'
152 else:
149 else:
153
150
154 # Try to use the traitlets.
151 # Try to use the traitlets.
155 nb.metadata._draft["author"] = self.author
152 resources["sphinx"]["author"] = self.author
156 nb.metadata._draft["version"] = self.version
153 resources["sphinx"]["version"] = self.version
157 nb.metadata._draft["release"] = self.release
154 resources["sphinx"]["release"] = self.release
158
155
159 # Use todays date if none is provided.
156 # Use todays date if none is provided.
160 if len(self.publish_date.strip()) == 0:
157 if self.publish_date:
161 nb.metadata._draft["date"] = date.today().strftime("%B %d, %Y")
158 resources["sphinx"]["date"] = self.publish_date
159 elif len(resources['metadata']['modified_date'].strip()) == 0:
160 resources["sphinx"]["date"] = date.today().strftime("%B %-d, %Y")
162 else:
161 else:
163 nb.metadata._draft["date"] = self.publish_date
162 resources["sphinx"]["date"] = resources['metadata']['modified_date']
164
163
165 # Sphinx traitlets.
164 # Sphinx traitlets.
166 resources["sphinx"]["chapterstyle"] = self.chapter_style
165 resources["sphinx"]["chapterstyle"] = self.chapter_style
@@ -175,7 +174,7 b' class SphinxTransformer(ActivatableTransformer):'
175 resources["sphinx"]["pygment_definitions"] = self._generate_pygments_latex_def()
174 resources["sphinx"]["pygment_definitions"] = self._generate_pygments_latex_def()
176
175
177 if not (self.overridetitle == None or len(self.overridetitle.strip()) == 0):
176 if not (self.overridetitle == None or len(self.overridetitle.strip()) == 0):
178 nb.metadata.name = self.overridetitle
177 resources['metadata']['name'] = self.overridetitle
179
178
180 # End
179 # End
181 return nb, resources
180 return nb, resources
@@ -212,12 +211,16 b' class SphinxTransformer(ActivatableTransformer):'
212 return console.input("Release Name (ie ""Rough draft""): ")
211 return console.input("Release Name (ie ""Rough draft""): ")
213
212
214
213
215 def _prompt_date(self):
214 def _prompt_date(self, resources):
216 """
215 """
217 Prompt the user to enter a date
216 Prompt the user to enter a date
218 """
217 """
219
218
220 default_date = date.today().strftime("%B %d, %Y")
219 if resources['metadata']['modified_date']:
220 default_date = resources['metadata']['modified_date']
221 else:
222 default_date = date.today().strftime("%B %-d, %Y")
223
221 user_date = console.input("Date (deafults to \"" + default_date + "\"): ")
224 user_date = console.input("Date (deafults to \"" + default_date + "\"): ")
222 if len(user_date.strip()) == 0:
225 if len(user_date.strip()) == 0:
223 user_date = default_date
226 user_date = default_date
General Comments 0
You need to be logged in to leave comments. Login now