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