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