##// END OF EJS Templates
Whoops! Removed sphinx references
Jonathan Frederic -
Show More
@@ -1,280 +1,279 b''
1 1 """This module defines Exporter, a highly configurable converter
2 2 that uses Jinja2 to export notebook files into different formats.
3 3 """
4 4
5 5 #-----------------------------------------------------------------------------
6 6 # Copyright (c) 2013, the IPython Development Team.
7 7 #
8 8 # Distributed under the terms of the Modified BSD License.
9 9 #
10 10 # The full license is in the file COPYING.txt, distributed with this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Imports
15 15 #-----------------------------------------------------------------------------
16 16
17 17 from __future__ import print_function, absolute_import
18 18
19 19 # Stdlib imports
20 20 import io
21 21 import os
22 22 import copy
23 23 import collections
24 24 import datetime
25 25
26 26
27 27 # IPython imports
28 28 from IPython.config.configurable import LoggingConfigurable
29 29 from IPython.config import Config
30 30 from IPython.nbformat import current as nbformat
31 31 from IPython.utils.traitlets import MetaHasTraits, Unicode, List
32 32 from IPython.utils.importstring import import_item
33 33 from IPython.utils import text, py3compat
34 34
35 35 from IPython.nbconvert import preprocessors as nbpreprocessors
36 36
37 37
38 38 #-----------------------------------------------------------------------------
39 39 # Class
40 40 #-----------------------------------------------------------------------------
41 41
42 42 class ResourcesDict(collections.defaultdict):
43 43 def __missing__(self, key):
44 44 return ''
45 45
46 46
47 47 class Exporter(LoggingConfigurable):
48 48 """
49 49 Class containing methods that sequentially run a list of preprocessors on a
50 50 NotebookNode object and then return the modified NotebookNode object and
51 51 accompanying resources dict.
52 52 """
53 53
54 54 file_extension = Unicode(
55 55 'txt', config=True,
56 56 help="Extension of the file that should be written to disk"
57 57 )
58 58
59 59 #Configurability, allows the user to easily add filters and preprocessors.
60 60 preprocessors = List(config=True,
61 61 help="""List of preprocessors, by name or namespace, to enable.""")
62 62
63 63 _preprocessors = None
64 64
65 65 default_preprocessors = List([nbpreprocessors.coalesce_streams,
66 66 nbpreprocessors.SVG2PDFPreprocessor,
67 67 nbpreprocessors.ExtractOutputPreprocessor,
68 68 nbpreprocessors.CSSHTMLHeaderPreprocessor,
69 69 nbpreprocessors.RevealHelpPreprocessor,
70 70 nbpreprocessors.LatexPreprocessor,
71 nbpreprocessors.SphinxPreprocessor,
72 71 nbpreprocessors.HighlightMagicsPreprocessor],
73 72 config=True,
74 73 help="""List of preprocessors available by default, by name, namespace,
75 74 instance, or type.""")
76 75
77 76
78 77 def __init__(self, config=None, **kw):
79 78 """
80 79 Public constructor
81 80
82 81 Parameters
83 82 ----------
84 83 config : config
85 84 User configuration instance.
86 85 """
87 86 if not config:
88 87 config = self.default_config
89 88
90 89 super(Exporter, self).__init__(config=config, **kw)
91 90
92 91 #Init
93 92 self._init_preprocessors()
94 93
95 94
96 95 @property
97 96 def default_config(self):
98 97 return Config()
99 98
100 99 def _config_changed(self, name, old, new):
101 100 """When setting config, make sure to start with our default_config"""
102 101 c = self.default_config
103 102 if new:
104 103 c.merge(new)
105 104 if c != old:
106 105 self.config = c
107 106 super(Exporter, self)._config_changed(name, old, c)
108 107
109 108
110 109 def from_notebook_node(self, nb, resources=None, **kw):
111 110 """
112 111 Convert a notebook from a notebook node instance.
113 112
114 113 Parameters
115 114 ----------
116 115 nb : Notebook node
117 116 resources : dict (**kw)
118 117 of additional resources that can be accessed read/write by
119 118 preprocessors.
120 119 """
121 120 nb_copy = copy.deepcopy(nb)
122 121 resources = self._init_resources(resources)
123 122
124 123 # Preprocess
125 124 nb_copy, resources = self._preprocess(nb_copy, resources)
126 125
127 126 return nb_copy, resources
128 127
129 128
130 129 def from_filename(self, filename, resources=None, **kw):
131 130 """
132 131 Convert a notebook from a notebook file.
133 132
134 133 Parameters
135 134 ----------
136 135 filename : str
137 136 Full filename of the notebook file to open and convert.
138 137 """
139 138
140 139 # Pull the metadata from the filesystem.
141 140 if resources is None:
142 141 resources = ResourcesDict()
143 142 if not 'metadata' in resources or resources['metadata'] == '':
144 143 resources['metadata'] = ResourcesDict()
145 144 basename = os.path.basename(filename)
146 145 notebook_name = basename[:basename.rfind('.')]
147 146 resources['metadata']['name'] = notebook_name
148 147
149 148 modified_date = datetime.datetime.fromtimestamp(os.path.getmtime(filename))
150 149 resources['metadata']['modified_date'] = modified_date.strftime(text.date_format)
151 150
152 151 with io.open(filename) as f:
153 152 return self.from_notebook_node(nbformat.read(f, 'json'), resources=resources, **kw)
154 153
155 154
156 155 def from_file(self, file_stream, resources=None, **kw):
157 156 """
158 157 Convert a notebook from a notebook file.
159 158
160 159 Parameters
161 160 ----------
162 161 file_stream : file-like object
163 162 Notebook file-like object to convert.
164 163 """
165 164 return self.from_notebook_node(nbformat.read(file_stream, 'json'), resources=resources, **kw)
166 165
167 166
168 167 def register_preprocessor(self, preprocessor, enabled=False):
169 168 """
170 169 Register a preprocessor.
171 170 Preprocessors are classes that act upon the notebook before it is
172 171 passed into the Jinja templating engine. preprocessors are also
173 172 capable of passing additional information to the Jinja
174 173 templating engine.
175 174
176 175 Parameters
177 176 ----------
178 177 preprocessor : preprocessor
179 178 """
180 179 if preprocessor is None:
181 180 raise TypeError('preprocessor')
182 181 isclass = isinstance(preprocessor, type)
183 182 constructed = not isclass
184 183
185 184 # Handle preprocessor's registration based on it's type
186 185 if constructed and isinstance(preprocessor, py3compat.string_types):
187 186 # Preprocessor is a string, import the namespace and recursively call
188 187 # this register_preprocessor method
189 188 preprocessor_cls = import_item(preprocessor)
190 189 return self.register_preprocessor(preprocessor_cls, enabled)
191 190
192 191 if constructed and hasattr(preprocessor, '__call__'):
193 192 # Preprocessor is a function, no need to construct it.
194 193 # Register and return the preprocessor.
195 194 if enabled:
196 195 preprocessor.enabled = True
197 196 self._preprocessors.append(preprocessor)
198 197 return preprocessor
199 198
200 199 elif isclass and isinstance(preprocessor, MetaHasTraits):
201 200 # Preprocessor is configurable. Make sure to pass in new default for
202 201 # the enabled flag if one was specified.
203 202 self.register_preprocessor(preprocessor(parent=self), enabled)
204 203
205 204 elif isclass:
206 205 # Preprocessor is not configurable, construct it
207 206 self.register_preprocessor(preprocessor(), enabled)
208 207
209 208 else:
210 209 # Preprocessor is an instance of something without a __call__
211 210 # attribute.
212 211 raise TypeError('preprocessor')
213 212
214 213
215 214 def _init_preprocessors(self):
216 215 """
217 216 Register all of the preprocessors needed for this exporter, disabled
218 217 unless specified explicitly.
219 218 """
220 219 if self._preprocessors is None:
221 220 self._preprocessors = []
222 221
223 222 #Load default preprocessors (not necessarly enabled by default).
224 223 if self.default_preprocessors:
225 224 for preprocessor in self.default_preprocessors:
226 225 self.register_preprocessor(preprocessor)
227 226
228 227 #Load user preprocessors. Enable by default.
229 228 if self.preprocessors:
230 229 for preprocessor in self.preprocessors:
231 230 self.register_preprocessor(preprocessor, enabled=True)
232 231
233 232
234 233 def _init_resources(self, resources):
235 234
236 235 #Make sure the resources dict is of ResourcesDict type.
237 236 if resources is None:
238 237 resources = ResourcesDict()
239 238 if not isinstance(resources, ResourcesDict):
240 239 new_resources = ResourcesDict()
241 240 new_resources.update(resources)
242 241 resources = new_resources
243 242
244 243 #Make sure the metadata extension exists in resources
245 244 if 'metadata' in resources:
246 245 if not isinstance(resources['metadata'], ResourcesDict):
247 246 resources['metadata'] = ResourcesDict(resources['metadata'])
248 247 else:
249 248 resources['metadata'] = ResourcesDict()
250 249 if not resources['metadata']['name']:
251 250 resources['metadata']['name'] = 'Notebook'
252 251
253 252 #Set the output extension
254 253 resources['output_extension'] = self.file_extension
255 254 return resources
256 255
257 256
258 257 def _preprocess(self, nb, resources):
259 258 """
260 259 Preprocess the notebook before passing it into the Jinja engine.
261 260 To preprocess the notebook is to apply all of the
262 261
263 262 Parameters
264 263 ----------
265 264 nb : notebook node
266 265 notebook that is being exported.
267 266 resources : a dict of additional resources that
268 267 can be accessed read/write by preprocessors
269 268 """
270 269
271 270 # Do a copy.deepcopy first,
272 271 # we are never safe enough with what the preprocessors could do.
273 272 nbc = copy.deepcopy(nb)
274 273 resc = copy.deepcopy(resources)
275 274
276 275 #Run each preprocessor on the notebook. Carry the output along
277 276 #to each preprocessor
278 277 for preprocessor in self._preprocessors:
279 278 nbc, resc = preprocessor(nbc, resc)
280 279 return nbc, resc
@@ -1,13 +1,12 b''
1 1 # Class base Preprocessors
2 2 from .base import Preprocessor
3 3 from .convertfigures import ConvertFiguresPreprocessor
4 4 from .svg2pdf import SVG2PDFPreprocessor
5 5 from .extractoutput import ExtractOutputPreprocessor
6 6 from .revealhelp import RevealHelpPreprocessor
7 7 from .latex import LatexPreprocessor
8 from .sphinx import SphinxPreprocessor
9 8 from .csshtmlheader import CSSHTMLHeaderPreprocessor
10 9 from .highlightmagics import HighlightMagicsPreprocessor
11 10
12 11 # decorated function Preprocessors
13 12 from .coalescestreams import coalesce_streams
General Comments 0
You need to be logged in to leave comments. Login now