Show More
@@ -104,7 +104,7 b' class Exporter(Configurable):' | |||||
104 | #constructor for this class. |
|
104 | #constructor for this class. | |
105 | preprocessors = [] |
|
105 | preprocessors = [] | |
106 |
|
106 | |||
107 |
def __init__(self, preprocessors= |
|
107 | def __init__(self, preprocessors=None, jinja_filters=None, config=None, export_format, **kw): | |
108 | """ Init a new converter. |
|
108 | """ Init a new converter. | |
109 |
|
109 | |||
110 | config: the Configurable config object to pass around. |
|
110 | config: the Configurable config object to pass around. | |
@@ -151,6 +151,7 b' class Exporter(Configurable):' | |||||
151 | self._init_environment() |
|
151 | self._init_environment() | |
152 |
|
152 | |||
153 |
#TODO: Implement reflection style methods to get user transformers. |
|
153 | #TODO: Implement reflection style methods to get user transformers. | |
|
154 | #if not preprocessors is None: | |||
154 | #for name in self.pre_transformer_order: |
|
155 | # for name in self.pre_transformer_order: | |
155 | # # get the user-defined transformer first |
|
156 | # # get the user-defined transformer first | |
156 | # transformer = preprocessors.get(name, getattr(trans, name, None)) |
|
157 | # transformer = preprocessors.get(name, getattr(trans, name, None)) | |
@@ -165,9 +166,10 b' class Exporter(Configurable):' | |||||
165 | self.preprocessors.append(transformers.csshtmlheader.CSSHtmlHeaderTransformer(config=config)) |
|
166 | self.preprocessors.append(transformers.csshtmlheader.CSSHtmlHeaderTransformer(config=config)) | |
166 |
|
167 | |||
167 | #Add filters to the Jinja2 environment |
|
168 | #Add filters to the Jinja2 environment | |
168 |
self._register_filters( |
|
169 | self._register_filters() | |
169 |
|
170 | |||
170 | #Load user filters. Overwrite existing filters if need be. |
|
171 | #Load user filters. Overwrite existing filters if need be. | |
|
172 | if not jinja_filters is None: | |||
171 | for key, user_filter in jinja_filters.iteritems(): |
|
173 | for key, user_filter in jinja_filters.iteritems(): | |
172 | if isinstance(user_filter, MetaHasTraits): |
|
174 | if isinstance(user_filter, MetaHasTraits): | |
173 | self.env.filters[key] = user_filter(config=config) |
|
175 | self.env.filters[key] = user_filter(config=config) | |
@@ -178,10 +180,10 b' class Exporter(Configurable):' | |||||
178 | self.template = self.env.get_template(self.template_file+self.ext) |
|
180 | self.template = self.env.get_template(self.template_file+self.ext) | |
179 |
|
181 | |||
180 |
|
182 | |||
181 |
def |
|
183 | def from_notebook_node(self, nb): | |
182 |
"""Export |
|
184 | """Export NotebookNode instance | |
183 |
|
185 | |||
184 |
nb: Notebook |
|
186 | nb: NotebookNode to export. | |
185 |
|
187 | |||
186 | Returns both the converted ipynb file and a dict containing the |
|
188 | Returns both the converted ipynb file and a dict containing the | |
187 | resources created along the way via the transformers and Jinja2 |
|
189 | resources created along the way via the transformers and Jinja2 | |
@@ -202,11 +204,11 b' class Exporter(Configurable):' | |||||
202 | processing. |
|
204 | processing. | |
203 | """ |
|
205 | """ | |
204 | with io.open(filename) as f: |
|
206 | with io.open(filename) as f: | |
205 |
return self. |
|
207 | return self.from_notebook_node(nbformat.read(f, 'json')) | |
206 |
|
208 | |||
207 |
|
209 | |||
208 | def from_file(self, file_stream): |
|
210 | def from_file(self, file_stream): | |
209 |
"""Read and export a notebook from a file |
|
211 | """Read and export a notebook from a file stream | |
210 |
|
212 | |||
211 | file_stream: File handle of file that contains notebook data. |
|
213 | file_stream: File handle of file that contains notebook data. | |
212 |
|
214 | |||
@@ -215,7 +217,33 b' class Exporter(Configurable):' | |||||
215 | processing. |
|
217 | processing. | |
216 | """ |
|
218 | """ | |
217 |
|
219 | |||
218 |
return self. |
|
220 | return self.from_notebook_node(nbformat.read(file_stream, 'json')) | |
|
221 | ||||
|
222 | ||||
|
223 | def register_filter(self, name, filter): | |||
|
224 | if MetaHasTraits(filter): | |||
|
225 | self.env.filters[name] = filter(config=self.config) | |||
|
226 | else: | |||
|
227 | self.env.filters[name] = filter | |||
|
228 | ||||
|
229 | ||||
|
230 | def _register_filters(self): | |||
|
231 | self.register_filter('indent', indent) | |||
|
232 | self.register_filter('markdown', markdown) | |||
|
233 | self.register_filter('ansi2html', filters.ansi.ansi2html) | |||
|
234 | self.register_filter('filter_data_type', filters.datatypefilter.DataTypeFilter) | |||
|
235 | self.register_filter('get_lines', filters.strings.get_lines) | |||
|
236 | self.register_filter('highlight', filters.pygments.highlight) | |||
|
237 | self.register_filter('highlight2html', filters.pygments.highlight) | |||
|
238 | self.register_filter('highlight2latex', filters.pygments.highlight2latex) | |||
|
239 | self.register_filter('markdown2latex', filters.markdown.markdown2latex) | |||
|
240 | self.register_filter('markdown2rst', filters.markdown.markdown2rst) | |||
|
241 | self.register_filter('pycomment', filters.strings.python_comment) | |||
|
242 | self.register_filter('rm_ansi', filters.ansi.remove_ansi) | |||
|
243 | self.register_filter('rm_dollars', filters.strings.strip_dollars) | |||
|
244 | self.register_filter('rm_fake', filters.strings.rm_fake) | |||
|
245 | self.register_filter('rm_math_space', filters.latex.rm_math_space) | |||
|
246 | self.register_filter('wrap', filters.strings.wrap) | |||
219 |
|
247 | |||
220 |
|
248 | |||
221 | def _init_environment(self): |
|
249 | def _init_environment(self): | |
@@ -228,26 +256,6 b' class Exporter(Configurable):' | |||||
228 | ) |
|
256 | ) | |
229 |
|
257 | |||
230 |
|
258 | |||
231 | def _register_filters(self, config): |
|
|||
232 | self.env.filters['indent'] = indent |
|
|||
233 | self.env.filters['markdown'] = markdown |
|
|||
234 |
|
||||
235 | self.env.filters['ansi2html'] = filters.ansi.ansi2html |
|
|||
236 | self.env.filters['filter_data_type'] = filters.datatypefilter.DataTypeFilter(config=config) |
|
|||
237 | self.env.filters['get_lines'] = filters.strings.get_lines |
|
|||
238 | self.env.filters['highlight'] = filters.pygments.highlight |
|
|||
239 | self.env.filters['highlight2html'] = filters.pygments.highlight |
|
|||
240 | self.env.filters['highlight2latex'] = filters.pygments.highlight2latex |
|
|||
241 | self.env.filters['markdown2latex'] = filters.markdown.markdown2latex |
|
|||
242 | self.env.filters['markdown2rst'] = filters.markdown.markdown2rst |
|
|||
243 | self.env.filters['pycomment'] = filters.strings.python_comment |
|
|||
244 | self.env.filters['rm_ansi'] = filters.ansi.remove_ansi |
|
|||
245 | self.env.filters['rm_dollars'] = filters.strings.strip_dollars |
|
|||
246 | self.env.filters['rm_fake'] = filters.strings.rm_fake |
|
|||
247 | self.env.filters['rm_math_space'] = filters.latex.rm_math_space |
|
|||
248 | self.env.filters['wrap'] = filters.strings.wrap |
|
|||
249 |
|
||||
250 |
|
||||
251 | def _preprocess(self, nb): |
|
259 | def _preprocess(self, nb): | |
252 | """ Preprocess the notebook using the transformers specific |
|
260 | """ Preprocess the notebook using the transformers specific | |
253 | for the current export format. |
|
261 | for the current export format. |
@@ -4,7 +4,7 b' This module defines Exporter, a highly configurable converter' | |||||
4 | that uses Jinja2 to export notebook files into different format. |
|
4 | that uses Jinja2 to export notebook files into different format. | |
5 |
|
5 | |||
6 | You can register both pre-transformers that will act on the notebook format |
|
6 | You can register both pre-transformers that will act on the notebook format | |
7 |
befor conversion and jinja filter that would then be avai |
|
7 | before conversion and jinja filter that would then be available in the templates | |
8 | """ |
|
8 | """ | |
9 |
|
9 | |||
10 | #----------------------------------------------------------------------------- |
|
10 | #----------------------------------------------------------------------------- | |
@@ -61,7 +61,7 b' class LatexExporter(Exporter):' | |||||
61 |
|
61 | |||
62 | config: the Configurable config object to pass around. |
|
62 | config: the Configurable config object to pass around. | |
63 |
|
63 | |||
64 |
preprocessors: dict of **avail |
|
64 | preprocessors: dict of **available** key/value function to run on | |
65 | ipynb json data before conversion to extract/inline file. |
|
65 | ipynb json data before conversion to extract/inline file. | |
66 | See `transformer.py` and `ConfigurableTransformers` |
|
66 | See `transformer.py` and `ConfigurableTransformers` | |
67 |
|
67 | |||
@@ -72,57 +72,15 b' class LatexExporter(Exporter):' | |||||
72 | default one. |
|
72 | default one. | |
73 |
|
73 | |||
74 | jinja_filters: dict of supplementary jinja filter that should be made |
|
74 | jinja_filters: dict of supplementary jinja filter that should be made | |
75 |
avail |
|
75 | available in template. If those are of Configurable Class type, | |
76 | they will be instanciated with the config object as argument. |
|
76 | they will be instanciated with the config object as argument. | |
77 |
|
77 | |||
78 |
user defined filter will overwrite the one avail |
|
78 | user defined filter will overwrite the one available by default. | |
79 | """ |
|
79 | """ | |
80 |
|
80 | |||
81 | #Merge default config options with user specific override options. |
|
|||
82 | default_config = self._get_default_options() |
|
|||
83 | if not config == None: |
|
|||
84 | default_config._merge(config) |
|
|||
85 | config = default_config |
|
|||
86 |
|
||||
87 | #Call the base class constructor |
|
81 | #Call the base class constructor | |
88 | super(Exporter, self).__init__(config=config, **kw) |
|
82 | super(Exporter, self).__init__(config=config, **kw) | |
89 |
|
83 | |||
90 | #Create a Latex environment if the user is exporting latex. |
|
|||
91 | if self.tex_environement: |
|
|||
92 | self.ext = LATEX_TEMPLATE_EXTENSION |
|
|||
93 | self.env = Environment( |
|
|||
94 | loader=FileSystemLoader([ |
|
|||
95 | os.path.dirname(os.path.realpath(__file__)) + LATEX_TEMPLATE_PATH, |
|
|||
96 | os.path.dirname(os.path.realpath(__file__)) + LATEX_TEMPLATE_SKELETON_PATH, |
|
|||
97 | ]), |
|
|||
98 | extensions=JINJA_EXTENSIONS |
|
|||
99 | ) |
|
|||
100 |
|
||||
101 | #Set special Jinja2 syntax that will not conflict with latex. |
|
|||
102 | self.env.block_start_string = LATEX_JINJA_LOGIC_BLOCK[0] |
|
|||
103 | self.env.block_end_string = LATEX_JINJA_LOGIC_BLOCK[1] |
|
|||
104 | self.env.variable_start_string = LATEX_JINJA_VARIABLE_BLOCK[0] |
|
|||
105 | self.env.variable_end_string = LATEX_JINJA_VARIABLE_BLOCK[1] |
|
|||
106 | self.env.comment_start_string = LATEX_JINJA_COMMENT_BLOCK[0] |
|
|||
107 | self.env.comment_end_string = LATEX_JINJA_COMMENT_BLOCK[1] |
|
|||
108 |
|
||||
109 | else: #Standard environment |
|
|||
110 | self.ext = TEMPLATE_EXTENSION |
|
|||
111 | self.env = Environment( |
|
|||
112 | loader=FileSystemLoader([ |
|
|||
113 | os.path.dirname(os.path.realpath(__file__)) + TEMPLATE_PATH, |
|
|||
114 | os.path.dirname(os.path.realpath(__file__)) + TEMPLATE_SKELETON_PATH, |
|
|||
115 | ]), |
|
|||
116 | extensions=JINJA_EXTENSIONS |
|
|||
117 | ) |
|
|||
118 |
|
||||
119 | for name in self.pre_transformer_order: |
|
|||
120 | # get the user-defined transformer first |
|
|||
121 | transformer = preprocessors.get(name, getattr(trans, name, None)) |
|
|||
122 | if isinstance(transformer, MetaHasTraits): |
|
|||
123 | transformer = transformer(config=config) |
|
|||
124 | self.preprocessors.append(transformer) |
|
|||
125 |
|
||||
126 | #For compatibility, TODO: remove later. |
|
84 | #For compatibility, TODO: remove later. | |
127 | self.preprocessors.append(trans.coalesce_streams) |
|
85 | self.preprocessors.append(trans.coalesce_streams) | |
128 | self.preprocessors.append(trans.ExtractFigureTransformer(config=config)) |
|
86 | self.preprocessors.append(trans.ExtractFigureTransformer(config=config)) | |
@@ -148,3 +106,22 b' class LatexExporter(Exporter):' | |||||
148 |
|
106 | |||
149 | #Load the template file. |
|
107 | #Load the template file. | |
150 | self.template = self.env.get_template(self.template_file+self.ext) |
|
108 | self.template = self.env.get_template(self.template_file+self.ext) | |
|
109 | ||||
|
110 | ||||
|
111 | def _init_environment(self): | |||
|
112 | self.ext = LATEX_TEMPLATE_EXTENSION | |||
|
113 | self.env = Environment( | |||
|
114 | loader=FileSystemLoader([ | |||
|
115 | os.path.dirname(os.path.realpath(__file__)) + LATEX_TEMPLATE_PATH, | |||
|
116 | os.path.dirname(os.path.realpath(__file__)) + LATEX_TEMPLATE_SKELETON_PATH, | |||
|
117 | ]), | |||
|
118 | extensions=JINJA_EXTENSIONS | |||
|
119 | ) | |||
|
120 | ||||
|
121 | #Set special Jinja2 syntax that will not conflict with latex. | |||
|
122 | self.env.block_start_string = LATEX_JINJA_LOGIC_BLOCK[0] | |||
|
123 | self.env.block_end_string = LATEX_JINJA_LOGIC_BLOCK[1] | |||
|
124 | self.env.variable_start_string = LATEX_JINJA_VARIABLE_BLOCK[0] | |||
|
125 | self.env.variable_end_string = LATEX_JINJA_VARIABLE_BLOCK[1] | |||
|
126 | self.env.comment_start_string = LATEX_JINJA_COMMENT_BLOCK[0] | |||
|
127 | self.env.comment_end_string = LATEX_JINJA_COMMENT_BLOCK[1] No newline at end of file |
General Comments 0
You need to be logged in to leave comments.
Login now