##// END OF EJS Templates
tabulation adjustment
Eugene Van den Bulke -
Show More
@@ -1,354 +1,354 b''
1 """Various display related classes.
1 """Various display related classes.
2
2
3 Authors : MinRK, gregcaporaso, dannystaple
3 Authors : MinRK, gregcaporaso, dannystaple
4 """
4 """
5 from os.path import exists, isfile, splitext, abspath, join, isdir
5 from os.path import exists, isfile, splitext, abspath, join, isdir
6 from os import walk, sep
6 from os import walk, sep
7
7
8
8
9 class IFrame(object):
9 class IFrame(object):
10 """
10 """
11 Generic class to embed an iframe in an IPython notebook
11 Generic class to embed an iframe in an IPython notebook
12 """
12 """
13
13
14 def __init__(self, id, width=400, height=300, **kwargs):
14 def __init__(self, id, width=400, height=300, **kwargs):
15 self.id = id
15 self.id = id
16 self.width = width
16 self.width = width
17 self.height = height
17 self.height = height
18 self.params = kwargs
18 self.params = kwargs
19
19
20 def _repr_html_(self):
20 def _repr_html_(self):
21 """return the embed iframe for this video id"""
21 """return the embed iframe for this video id"""
22 if self.params:
22 if self.params:
23 from urllib import urlencode
23 from urllib import urlencode
24 params = "?" + urlencode(self.params)
24 params = "?" + urlencode(self.params)
25 else:
25 else:
26 params = ""
26 params = ""
27 return self.iframe.format(width=self.width,
27 return self.iframe.format(width=self.width,
28 height=self.height,
28 height=self.height,
29 id=self.id,
29 id=self.id,
30 params=params)
30 params=params)
31
31
32 class YouTubeVideo(IFrame):
32 class YouTubeVideo(IFrame):
33 """Class for embedding a YouTube Video in an IPython session, based on its video id.
33 """Class for embedding a YouTube Video in an IPython session, based on its video id.
34
34
35 e.g. to embed the video on this page:
35 e.g. to embed the video on this page:
36
36
37 http://www.youtube.com/watch?v=foo
37 http://www.youtube.com/watch?v=foo
38
38
39 you would do:
39 you would do:
40
40
41 vid = YouTubeVideo("foo")
41 vid = YouTubeVideo("foo")
42 display(vid)
42 display(vid)
43
43
44 To start from 30 seconds:
44 To start from 30 seconds:
45
45
46 vid = YouTubeVideo("abc", start=30)
46 vid = YouTubeVideo("abc", start=30)
47 display(vid)
47 display(vid)
48
48
49 To calculate seconds from time as hours, minutes, seconds use:
49 To calculate seconds from time as hours, minutes, seconds use:
50 start=int(timedelta(hours=1, minutes=46, seconds=40).total_seconds())
50 start=int(timedelta(hours=1, minutes=46, seconds=40).total_seconds())
51
51
52 Other parameters can be provided as documented at
52 Other parameters can be provided as documented at
53 https://developers.google.com/youtube/player_parameters#parameter-subheader
53 https://developers.google.com/youtube/player_parameters#parameter-subheader
54 """
54 """
55
55
56 iframe = """
56 iframe = """
57 <iframe
57 <iframe
58 width="{width}"
58 width="{width}"
59 height={height}"
59 height={height}"
60 src="http://www.youtube.com/embed/{id}{params}"
60 src="http://www.youtube.com/embed/{id}{params}"
61 frameborder="0"
61 frameborder="0"
62 allowfullscreen
62 allowfullscreen
63 ></iframe>
63 ></iframe>
64 """
64 """
65
65
66 class VimeoVideo(VideoIFrame):
66 class VimeoVideo(IFrame):
67 """
67 """
68 Class for embedding a Vimeo video in an IPython session, based on its video id.
68 Class for embedding a Vimeo video in an IPython session, based on its video id.
69 """
69 """
70
70
71 iframe = """
71 iframe = """
72 <iframe
72 <iframe
73 width = "{width}"
73 width = "{width}"
74 height = "{height}"
74 height = "{height}"
75 src="http://player.vimeo.com/video/{id}{params}"
75 src="http://player.vimeo.com/video/{id}{params}"
76 frameborder="0"
76 frameborder="0"
77 webkitAllowFullScreen
77 webkitAllowFullScreen
78 mozallowfullscreen
78 mozallowfullscreen
79 allowFullScreen
79 allowFullScreen
80 ></iframe>
80 ></iframe>
81 """
81 """
82
82
83 class ScribdDocument(IFrame):
83 class ScribdDocument(IFrame):
84 """
84 """
85 Class for embedding a Scribd document in an IPython session
85 Class for embedding a Scribd document in an IPython session
86
86
87 Use the start_page params to specify a starting point in the document
87 Use the start_page params to specify a starting point in the document
88 Use the view_mode params to specify display type one off scroll | slideshow | book
88 Use the view_mode params to specify display type one off scroll | slideshow | book
89
89
90 e.g to Display Wes' foundational paper about PANDAS in book mode from page 3
90 e.g to Display Wes' foundational paper about PANDAS in book mode from page 3
91
91
92 ScribdDocument(71048089, width=800, height=400, start_page=3, view_mode="book")
92 ScribdDocument(71048089, width=800, height=400, start_page=3, view_mode="book")
93 """
93 """
94
94
95 iframe = """
95 iframe = """
96 <iframe
96 <iframe
97 width = "{width}"
97 width = "{width}"
98 height = "{height}"
98 height = "{height}"
99 src="http://www.scribd.com/embeds/{id}/content{params}"
99 src="http://www.scribd.com/embeds/{id}/content{params}"
100 data-auto-height="false"
100 data-auto-height="false"
101 scrolling="no"
101 scrolling="no"
102 frameborder="0">
102 frameborder="0">
103 </iframe>
103 </iframe>
104 """
104 """
105
105
106 class FileLink(object):
106 class FileLink(object):
107 """Class for embedding a local file link in an IPython session, based on path
107 """Class for embedding a local file link in an IPython session, based on path
108
108
109 e.g. to embed a link that was generated in the IPython notebook as my/data.txt
109 e.g. to embed a link that was generated in the IPython notebook as my/data.txt
110
110
111 you would do::
111 you would do::
112
112
113 local_file = FileLink("my/data.txt")
113 local_file = FileLink("my/data.txt")
114 display(local_file)
114 display(local_file)
115
115
116 or in the HTML notebook, just::
116 or in the HTML notebook, just::
117
117
118 FileLink("my/data.txt")
118 FileLink("my/data.txt")
119 """
119 """
120
120
121 html_link_str = "<a href='%s' target='_blank'>%s</a>"
121 html_link_str = "<a href='%s' target='_blank'>%s</a>"
122
122
123 def __init__(self,
123 def __init__(self,
124 path,
124 path,
125 url_prefix='files/',
125 url_prefix='files/',
126 result_html_prefix='',
126 result_html_prefix='',
127 result_html_suffix='<br>'):
127 result_html_suffix='<br>'):
128 """
128 """
129 Parameters
129 Parameters
130 ----------
130 ----------
131 path : str
131 path : str
132 path to the file or directory that should be formatted
132 path to the file or directory that should be formatted
133 directory_prefix : str
133 directory_prefix : str
134 prefix to be prepended to all files to form a working link [default:
134 prefix to be prepended to all files to form a working link [default:
135 'files']
135 'files']
136 result_html_prefix : str
136 result_html_prefix : str
137 text to append to beginning to link [default: none]
137 text to append to beginning to link [default: none]
138 result_html_suffix : str
138 result_html_suffix : str
139 text to append at the end of link [default: '<br>']
139 text to append at the end of link [default: '<br>']
140 """
140 """
141 if isdir(path):
141 if isdir(path):
142 raise ValueError,\
142 raise ValueError,\
143 ("Cannot display a directory using FileLink. "
143 ("Cannot display a directory using FileLink. "
144 "Use FileLinks to display '%s'." % path)
144 "Use FileLinks to display '%s'." % path)
145 self.path = path
145 self.path = path
146 self.url_prefix = url_prefix
146 self.url_prefix = url_prefix
147 self.result_html_prefix = result_html_prefix
147 self.result_html_prefix = result_html_prefix
148 self.result_html_suffix = result_html_suffix
148 self.result_html_suffix = result_html_suffix
149
149
150 def _format_path(self):
150 def _format_path(self):
151 fp = ''.join([self.url_prefix,self.path])
151 fp = ''.join([self.url_prefix,self.path])
152 return ''.join([self.result_html_prefix,
152 return ''.join([self.result_html_prefix,
153 self.html_link_str % (fp, self.path),
153 self.html_link_str % (fp, self.path),
154 self.result_html_suffix])
154 self.result_html_suffix])
155
155
156 def _repr_html_(self):
156 def _repr_html_(self):
157 """return html link to file
157 """return html link to file
158 """
158 """
159 if not exists(self.path):
159 if not exists(self.path):
160 return ("Path (<tt>%s</tt>) doesn't exist. "
160 return ("Path (<tt>%s</tt>) doesn't exist. "
161 "It may still be in the process of "
161 "It may still be in the process of "
162 "being generated, or you may have the "
162 "being generated, or you may have the "
163 "incorrect path." % self.path)
163 "incorrect path." % self.path)
164
164
165 return self._format_path()
165 return self._format_path()
166
166
167 def __repr__(self):
167 def __repr__(self):
168 """return absolute path to file
168 """return absolute path to file
169 """
169 """
170 return abspath(self.path)
170 return abspath(self.path)
171
171
172 class FileLinks(FileLink):
172 class FileLinks(FileLink):
173 """Class for embedding local file links in an IPython session, based on path
173 """Class for embedding local file links in an IPython session, based on path
174
174
175 e.g. to embed links to files that were generated in the IPython notebook under my/data
175 e.g. to embed links to files that were generated in the IPython notebook under my/data
176
176
177 you would do:
177 you would do:
178
178
179 local_files = FileLinks("my/data")
179 local_files = FileLinks("my/data")
180 display(local_files)
180 display(local_files)
181
181
182 or in the HTML notebook, just
182 or in the HTML notebook, just
183
183
184 FileLinks("my/data")
184 FileLinks("my/data")
185
185
186 """
186 """
187 def __init__(self,
187 def __init__(self,
188 path,
188 path,
189 url_prefix='files/',
189 url_prefix='files/',
190 included_suffixes=None,
190 included_suffixes=None,
191 result_html_prefix='',
191 result_html_prefix='',
192 result_html_suffix='<br>',
192 result_html_suffix='<br>',
193 notebook_display_formatter=None,
193 notebook_display_formatter=None,
194 terminal_display_formatter=None):
194 terminal_display_formatter=None):
195 """
195 """
196 included_suffixes : list of filename suffixes to include when
196 included_suffixes : list of filename suffixes to include when
197 formatting output [default: include all files]
197 formatting output [default: include all files]
198
198
199 See the FileLink (baseclass of LocalDirectory) docstring for
199 See the FileLink (baseclass of LocalDirectory) docstring for
200 information on additional parameters.
200 information on additional parameters.
201
201
202 notebook_display_formatter : func used to format links for display
202 notebook_display_formatter : func used to format links for display
203 in the notebook. See discussion of formatter function below.
203 in the notebook. See discussion of formatter function below.
204
204
205 terminal_display_formatter : func used to format links for display
205 terminal_display_formatter : func used to format links for display
206 in the terminal. See discussion of formatter function below.
206 in the terminal. See discussion of formatter function below.
207
207
208
208
209 Passing custom formatter functions
209 Passing custom formatter functions
210 ----------------------------------
210 ----------------------------------
211 Formatter functions must be of the form:
211 Formatter functions must be of the form:
212 f(dirname, fnames, included_suffixes)
212 f(dirname, fnames, included_suffixes)
213 dirname : the name of a directory (a string),
213 dirname : the name of a directory (a string),
214 fnames : a list of the files in that directory
214 fnames : a list of the files in that directory
215 included_suffixes : a list of the file suffixes that should be
215 included_suffixes : a list of the file suffixes that should be
216 included in the output (passing None means
216 included in the output (passing None means
217 to include all suffixes in the output in
217 to include all suffixes in the output in
218 the built-in formatters)
218 the built-in formatters)
219
219
220 returns a list of lines that should will be print in the
220 returns a list of lines that should will be print in the
221 notebook (if passing notebook_display_formatter) or the terminal
221 notebook (if passing notebook_display_formatter) or the terminal
222 (if passing terminal_display_formatter). This function is iterated
222 (if passing terminal_display_formatter). This function is iterated
223 over for each directory in self.path. Default formatters are in
223 over for each directory in self.path. Default formatters are in
224 place, can be passed here to support alternative formatting.
224 place, can be passed here to support alternative formatting.
225
225
226 """
226 """
227 if isfile(path):
227 if isfile(path):
228 raise ValueError,\
228 raise ValueError,\
229 ("Cannot display a file using FileLinks. "
229 ("Cannot display a file using FileLinks. "
230 "Use FileLink to display '%s'." % path)
230 "Use FileLink to display '%s'." % path)
231 self.included_suffixes = included_suffixes
231 self.included_suffixes = included_suffixes
232 # remove trailing slashs for more consistent output formatting
232 # remove trailing slashs for more consistent output formatting
233 path = path.rstrip('/')
233 path = path.rstrip('/')
234
234
235 self.path = path
235 self.path = path
236 self.url_prefix = url_prefix
236 self.url_prefix = url_prefix
237 self.result_html_prefix = result_html_prefix
237 self.result_html_prefix = result_html_prefix
238 self.result_html_suffix = result_html_suffix
238 self.result_html_suffix = result_html_suffix
239
239
240 self.notebook_display_formatter = \
240 self.notebook_display_formatter = \
241 notebook_display_formatter or self._get_notebook_display_formatter()
241 notebook_display_formatter or self._get_notebook_display_formatter()
242 self.terminal_display_formatter = \
242 self.terminal_display_formatter = \
243 terminal_display_formatter or self._get_terminal_display_formatter()
243 terminal_display_formatter or self._get_terminal_display_formatter()
244
244
245 def _get_display_formatter(self,
245 def _get_display_formatter(self,
246 dirname_output_format,
246 dirname_output_format,
247 fname_output_format,
247 fname_output_format,
248 fp_format,
248 fp_format,
249 fp_cleaner=None):
249 fp_cleaner=None):
250 """ generate built-in formatter function
250 """ generate built-in formatter function
251
251
252 this is used to define both the notebook and terminal built-in
252 this is used to define both the notebook and terminal built-in
253 formatters as they only differ by some wrapper text for each entry
253 formatters as they only differ by some wrapper text for each entry
254
254
255 dirname_output_format: string to use for formatting directory
255 dirname_output_format: string to use for formatting directory
256 names, dirname will be substituted for a single "%s" which
256 names, dirname will be substituted for a single "%s" which
257 must appear in this string
257 must appear in this string
258 fname_output_format: string to use for formatting file names,
258 fname_output_format: string to use for formatting file names,
259 if a single "%s" appears in the string, fname will be substituted
259 if a single "%s" appears in the string, fname will be substituted
260 if two "%s" appear in the string, the path to fname will be
260 if two "%s" appear in the string, the path to fname will be
261 substituted for the first and fname will be substituted for the
261 substituted for the first and fname will be substituted for the
262 second
262 second
263 fp_format: string to use for formatting filepaths, must contain
263 fp_format: string to use for formatting filepaths, must contain
264 exactly two "%s" and the dirname will be subsituted for the first
264 exactly two "%s" and the dirname will be subsituted for the first
265 and fname will be substituted for the second
265 and fname will be substituted for the second
266 """
266 """
267 def f(dirname, fnames, included_suffixes=None):
267 def f(dirname, fnames, included_suffixes=None):
268 result = []
268 result = []
269 # begin by figuring out which filenames, if any,
269 # begin by figuring out which filenames, if any,
270 # are going to be displayed
270 # are going to be displayed
271 display_fnames = []
271 display_fnames = []
272 for fname in fnames:
272 for fname in fnames:
273 if (isfile(join(dirname,fname)) and
273 if (isfile(join(dirname,fname)) and
274 (included_suffixes == None or
274 (included_suffixes == None or
275 splitext(fname)[1] in included_suffixes)):
275 splitext(fname)[1] in included_suffixes)):
276 display_fnames.append(fname)
276 display_fnames.append(fname)
277
277
278 if len(display_fnames) == 0:
278 if len(display_fnames) == 0:
279 # if there are no filenames to display, don't print anything
279 # if there are no filenames to display, don't print anything
280 # (not even the directory name)
280 # (not even the directory name)
281 pass
281 pass
282 else:
282 else:
283 # otherwise print the formatted directory name followed by
283 # otherwise print the formatted directory name followed by
284 # the formatted filenames
284 # the formatted filenames
285 dirname_output_line = dirname_output_format % dirname
285 dirname_output_line = dirname_output_format % dirname
286 result.append(dirname_output_line)
286 result.append(dirname_output_line)
287 for fname in display_fnames:
287 for fname in display_fnames:
288 fp = fp_format % (dirname,fname)
288 fp = fp_format % (dirname,fname)
289 if fp_cleaner is not None:
289 if fp_cleaner is not None:
290 fp = fp_cleaner(fp)
290 fp = fp_cleaner(fp)
291 try:
291 try:
292 # output can include both a filepath and a filename...
292 # output can include both a filepath and a filename...
293 fname_output_line = fname_output_format % (fp, fname)
293 fname_output_line = fname_output_format % (fp, fname)
294 except TypeError:
294 except TypeError:
295 # ... or just a single filepath
295 # ... or just a single filepath
296 fname_output_line = fname_output_format % fname
296 fname_output_line = fname_output_format % fname
297 result.append(fname_output_line)
297 result.append(fname_output_line)
298 return result
298 return result
299 return f
299 return f
300
300
301 def _get_notebook_display_formatter(self,
301 def _get_notebook_display_formatter(self,
302 spacer="&nbsp;&nbsp;"):
302 spacer="&nbsp;&nbsp;"):
303 """ generate function to use for notebook formatting
303 """ generate function to use for notebook formatting
304 """
304 """
305 dirname_output_format = \
305 dirname_output_format = \
306 self.result_html_prefix + "%s/" + self.result_html_suffix
306 self.result_html_prefix + "%s/" + self.result_html_suffix
307 fname_output_format = \
307 fname_output_format = \
308 self.result_html_prefix + spacer + self.html_link_str + self.result_html_suffix
308 self.result_html_prefix + spacer + self.html_link_str + self.result_html_suffix
309 fp_format = self.url_prefix + '%s/%s'
309 fp_format = self.url_prefix + '%s/%s'
310 if sep == "\\":
310 if sep == "\\":
311 # Working on a platform where the path separator is "\", so
311 # Working on a platform where the path separator is "\", so
312 # must convert these to "/" for generating a URI
312 # must convert these to "/" for generating a URI
313 def fp_cleaner(fp):
313 def fp_cleaner(fp):
314 # Replace all occurences of backslash ("\") with a forward
314 # Replace all occurences of backslash ("\") with a forward
315 # slash ("/") - this is necessary on windows when a path is
315 # slash ("/") - this is necessary on windows when a path is
316 # provided as input, but we must link to a URI
316 # provided as input, but we must link to a URI
317 return fp.replace('\\','/')
317 return fp.replace('\\','/')
318 else:
318 else:
319 fp_cleaner = None
319 fp_cleaner = None
320
320
321 return self._get_display_formatter(dirname_output_format,
321 return self._get_display_formatter(dirname_output_format,
322 fname_output_format,
322 fname_output_format,
323 fp_format,
323 fp_format,
324 fp_cleaner)
324 fp_cleaner)
325
325
326 def _get_terminal_display_formatter(self,
326 def _get_terminal_display_formatter(self,
327 spacer=" "):
327 spacer=" "):
328 """ generate function to use for terminal formatting
328 """ generate function to use for terminal formatting
329 """
329 """
330 dirname_output_format = "%s/"
330 dirname_output_format = "%s/"
331 fname_output_format = spacer + "%s"
331 fname_output_format = spacer + "%s"
332 fp_format = '%s/%s'
332 fp_format = '%s/%s'
333
333
334 return self._get_display_formatter(dirname_output_format,
334 return self._get_display_formatter(dirname_output_format,
335 fname_output_format,
335 fname_output_format,
336 fp_format)
336 fp_format)
337
337
338 def _format_path(self):
338 def _format_path(self):
339 result_lines = []
339 result_lines = []
340 walked_dir = list(walk(self.path))
340 walked_dir = list(walk(self.path))
341 walked_dir.sort()
341 walked_dir.sort()
342 for dirname, subdirs, fnames in walked_dir:
342 for dirname, subdirs, fnames in walked_dir:
343 result_lines += self.notebook_display_formatter(dirname, fnames, self.included_suffixes)
343 result_lines += self.notebook_display_formatter(dirname, fnames, self.included_suffixes)
344 return '\n'.join(result_lines)
344 return '\n'.join(result_lines)
345
345
346 def __repr__(self):
346 def __repr__(self):
347 """return newline-separated absolute paths
347 """return newline-separated absolute paths
348 """
348 """
349 result_lines = []
349 result_lines = []
350 walked_dir = list(walk(self.path))
350 walked_dir = list(walk(self.path))
351 walked_dir.sort()
351 walked_dir.sort()
352 for dirname, subdirs, fnames in walked_dir:
352 for dirname, subdirs, fnames in walked_dir:
353 result_lines += self.terminal_display_formatter(dirname, fnames, self.included_suffixes)
353 result_lines += self.terminal_display_formatter(dirname, fnames, self.included_suffixes)
354 return '\n'.join(result_lines)
354 return '\n'.join(result_lines)
General Comments 0
You need to be logged in to leave comments. Login now