display.py
287 lines
| 10.9 KiB
| text/x-python
|
PythonLexer
Brian E. Granger
|
r4408 | """Various display related classes. | ||
Greg Caporaso
|
r8798 | Authors : MinRK, gregcaporaso, dannystaple | ||
Brian E. Granger
|
r4408 | """ | ||
Danny Staple
|
r8645 | import urllib | ||
Brian E. Granger
|
r4408 | |||
Greg Caporaso
|
r8800 | from os.path import exists, isfile, splitext, abspath, join, isdir | ||
from os import walk | ||||
Greg Caporaso
|
r8272 | |||
Brian E. Granger
|
r4408 | class YouTubeVideo(object): | ||
"""Class for embedding a YouTube Video in an IPython session, based on its video id. | ||||
Bernardo B. Marques
|
r4872 | |||
Brian E. Granger
|
r4408 | e.g. to embed the video on this page: | ||
Bernardo B. Marques
|
r4872 | |||
Brian E. Granger
|
r4408 | http://www.youtube.com/watch?v=foo | ||
Bernardo B. Marques
|
r4872 | |||
Brian E. Granger
|
r4408 | you would do: | ||
Bernardo B. Marques
|
r4872 | |||
Brian E. Granger
|
r4408 | vid = YouTubeVideo("foo") | ||
display(vid) | ||||
Danny Staple
|
r8639 | |||
Danny Staple
|
r8645 | To start from 30 seconds: | ||
Danny Staple
|
r8639 | |||
Danny Staple
|
r8645 | vid = YouTubeVideo("abc", start=30) | ||
Danny Staple
|
r8639 | display(vid) | ||
Danny Staple
|
r8645 | |||
Danny Staple
|
r8666 | To calculate seconds from time as hours, minutes, seconds use: | ||
start=int(timedelta(hours=1, minutes=46, seconds=40).total_seconds()) | ||||
Danny Staple
|
r8651 | |||
Danny Staple
|
r8645 | Other parameters can be provided as documented at | ||
https://developers.google.com/youtube/player_parameters#parameter-subheader | ||||
Brian E. Granger
|
r4408 | """ | ||
Bernardo B. Marques
|
r4872 | |||
Danny Staple
|
r8645 | def __init__(self, id, width=400, height=300, **kwargs): | ||
Brian E. Granger
|
r4408 | self.id = id | ||
self.width = width | ||||
self.height = height | ||||
Danny Staple
|
r8651 | self.params = kwargs | ||
Bernardo B. Marques
|
r4872 | |||
Brian E. Granger
|
r4408 | def _repr_html_(self): | ||
"""return YouTube embed iframe for this video id""" | ||||
Danny Staple
|
r8645 | if self.params: | ||
params = "?" + urllib.urlencode(self.params) | ||||
else: | ||||
params = "" | ||||
Brian E. Granger
|
r4408 | return """ | ||
Bernardo B. Marques
|
r4872 | <iframe | ||
width="%i" | ||||
height="%i" | ||||
Danny Staple
|
r8645 | src="http://www.youtube.com/embed/%s%s" | ||
Bernardo B. Marques
|
r4872 | frameborder="0" | ||
Brian E. Granger
|
r4408 | allowfullscreen | ||
></iframe> | ||||
Danny Staple
|
r8680 | """ % (self.width, self.height, self.id, params) | ||
Brian E. Granger
|
r4408 | |||
Greg Caporaso
|
r8365 | class FileLink(object): | ||
Greg Caporaso
|
r8272 | """Class for embedding a local file link in an IPython session, based on path | ||
e.g. to embed a link that was generated in the IPython notebook as my/data.txt | ||||
you would do: | ||||
Greg Caporaso
|
r8365 | local_file = FileLink("my/data.txt") | ||
Greg Caporaso
|
r8272 | display(local_file) | ||
Greg Caporaso
|
r8276 | |||
or in the HTML notebook, just | ||||
Greg Caporaso
|
r8365 | FileLink("my/data.txt") | ||
Greg Caporaso
|
r8272 | """ | ||
Greg Caporaso
|
r8442 | html_link_str = "<a href='%s' target='_blank'>%s</a>" | ||
Greg Caporaso
|
r8438 | |||
Greg Caporaso
|
r8272 | def __init__(self, | ||
path, | ||||
Greg Caporaso
|
r8446 | url_prefix='files/', | ||
Greg Caporaso
|
r8439 | result_html_prefix='', | ||
result_html_suffix='<br>'): | ||||
Greg Caporaso
|
r8272 | """ | ||
path : path to the file or directory that should be formatted | ||||
directory_prefix : prefix to be prepended to all files to form a | ||||
working link [default: 'files'] | ||||
result_html_prefix : text to append to beginning to link | ||||
[default: none] | ||||
result_html_suffix : text to append at the end of link | ||||
[default: '<br>'] | ||||
""" | ||||
Greg Caporaso
|
r8835 | if isdir(path): | ||
raise ValueError,\ | ||||
Greg Caporaso
|
r8836 | ("Cannot display a directory using FileLink. " | ||
Greg Caporaso
|
r8835 | "Use FileLinks to display '%s'." % path) | ||
Greg Caporaso
|
r8272 | self.path = path | ||
Greg Caporaso
|
r8437 | self.url_prefix = url_prefix | ||
Greg Caporaso
|
r8439 | self.result_html_prefix = result_html_prefix | ||
self.result_html_suffix = result_html_suffix | ||||
Greg Caporaso
|
r8272 | |||
def _format_path(self): | ||||
Greg Caporaso
|
r8446 | fp = ''.join([self.url_prefix,self.path]) | ||
Greg Caporaso
|
r8439 | return ''.join([self.result_html_prefix, | ||
Greg Caporaso
|
r8442 | self.html_link_str % (fp, self.path), | ||
Greg Caporaso
|
r8439 | self.result_html_suffix]) | ||
Greg Caporaso
|
r8272 | |||
def _repr_html_(self): | ||||
Greg Caporaso
|
r8442 | """return html link to file | ||
Greg Caporaso
|
r8272 | """ | ||
if not exists(self.path): | ||||
return ("Path (<tt>%s</tt>) doesn't exist. " | ||||
"It may still be in the process of " | ||||
"being generated, or you may have the " | ||||
"incorrect path." % self.path) | ||||
return self._format_path() | ||||
Greg Caporaso
|
r8442 | |||
def __repr__(self): | ||||
Greg Caporaso
|
r8443 | """return absolute path to file | ||
Greg Caporaso
|
r8442 | """ | ||
return abspath(self.path) | ||||
Greg Caporaso
|
r8272 | |||
Greg Caporaso
|
r8365 | class FileLinks(FileLink): | ||
Greg Caporaso
|
r8272 | """Class for embedding local file links in an IPython session, based on path | ||
e.g. to embed links to files that were generated in the IPython notebook under my/data | ||||
you would do: | ||||
Greg Caporaso
|
r8365 | local_files = FileLinks("my/data") | ||
Greg Caporaso
|
r8272 | display(local_files) | ||
Greg Caporaso
|
r8276 | |||
or in the HTML notebook, just | ||||
Greg Caporaso
|
r8365 | FileLinks("my/data") | ||
Greg Caporaso
|
r8276 | |||
Greg Caporaso
|
r8272 | """ | ||
def __init__(self, | ||||
path, | ||||
Greg Caporaso
|
r8446 | url_prefix='files/', | ||
Greg Caporaso
|
r8439 | included_suffixes=None, | ||
result_html_prefix='', | ||||
Greg Caporaso
|
r8619 | result_html_suffix='<br>', | ||
notebook_display_formatter=None, | ||||
terminal_display_formatter=None): | ||||
Greg Caporaso
|
r8272 | """ | ||
included_suffixes : list of filename suffixes to include when | ||||
formatting output [default: include all files] | ||||
Greg Caporaso
|
r8365 | See the FileLink (baseclass of LocalDirectory) docstring for | ||
Greg Caporaso
|
r8272 | information on additional parameters. | ||
Greg Caporaso
|
r8631 | |||
Greg Caporaso
|
r8803 | notebook_display_formatter : func used to format links for display | ||
in the notebook. See discussion of formatter function below. | ||||
Greg Caporaso
|
r8631 | |||
Greg Caporaso
|
r8803 | terminal_display_formatter : func used to format links for display | ||
in the terminal. See discussion of formatter function below. | ||||
Passing custom formatter functions | ||||
---------------------------------- | ||||
Formatter functions must be of the form: | ||||
f(dirname, fnames, included_suffixes) | ||||
dirname : the name of a directory (a string), | ||||
fnames : a list of the files in that directory | ||||
included_suffixes : a list of the file suffixes that should be | ||||
included in the output (passing None means | ||||
to include all suffixes in the output in | ||||
the built-in formatters) | ||||
returns a list of lines that should will be print in the | ||||
notebook (if passing notebook_display_formatter) or the terminal | ||||
(if passing terminal_display_formatter). This function is iterated | ||||
over for each directory in self.path. Default formatters are in | ||||
place, can be passed here to support alternative formatting. | ||||
Greg Caporaso
|
r8626 | |||
Greg Caporaso
|
r8272 | """ | ||
Greg Caporaso
|
r8836 | if isfile(path): | ||
raise ValueError,\ | ||||
("Cannot display a file using FileLinks. " | ||||
"Use FileLink to display '%s'." % path) | ||||
Greg Caporaso
|
r8439 | self.included_suffixes = included_suffixes | ||
Greg Caporaso
|
r8631 | # remove trailing slashs for more consistent output formatting | ||
path = path.rstrip('/') | ||||
Greg Caporaso
|
r8835 | |||
self.path = path | ||||
self.url_prefix = url_prefix | ||||
self.result_html_prefix = result_html_prefix | ||||
self.result_html_suffix = result_html_suffix | ||||
Greg Caporaso
|
r8624 | |||
self.notebook_display_formatter = \ | ||||
Greg Caporaso
|
r8626 | notebook_display_formatter or self._get_notebook_display_formatter() | ||
Greg Caporaso
|
r8624 | self.terminal_display_formatter = \ | ||
Greg Caporaso
|
r8626 | terminal_display_formatter or self._get_terminal_display_formatter() | ||
Greg Caporaso
|
r8272 | |||
Greg Caporaso
|
r8624 | def _get_display_formatter(self, | ||
dirname_output_format, | ||||
fname_output_format, | ||||
fp_format): | ||||
Greg Caporaso
|
r8803 | """ generate built-in formatter function | ||
this is used to define both the notebook and terminal built-in | ||||
formatters as they only differ by some wrapper text for each entry | ||||
Greg Caporaso
|
r8631 | |||
dirname_output_format: string to use for formatting directory | ||||
names, dirname will be substituted for a single "%s" which | ||||
must appear in this string | ||||
fname_output_format: string to use for formatting file names, | ||||
if a single "%s" appears in the string, fname will be substituted | ||||
if two "%s" appear in the string, the path to fname will be | ||||
substituted for the first and fname will be substituted for the | ||||
second | ||||
fp_format: string to use for formatting filepaths, must contain | ||||
exactly two "%s" and the dirname will be subsituted for the first | ||||
and fname will be substituted for the second | ||||
""" | ||||
Greg Caporaso
|
r8802 | def f(dirname, fnames, included_suffixes=None): | ||
Greg Caporaso
|
r8801 | result = [] | ||
Greg Caporaso
|
r8619 | # begin by figuring out which filenames, if any, | ||
# are going to be displayed | ||||
display_fnames = [] | ||||
for fname in fnames: | ||||
if (isfile(join(dirname,fname)) and | ||||
(included_suffixes == None or | ||||
splitext(fname)[1] in included_suffixes)): | ||||
display_fnames.append(fname) | ||||
Greg Caporaso
|
r8624 | |||
Greg Caporaso
|
r8619 | if len(display_fnames) == 0: | ||
Greg Caporaso
|
r8631 | # if there are no filenames to display, don't print anything | ||
# (not even the directory name) | ||||
Greg Caporaso
|
r8619 | pass | ||
else: | ||||
Greg Caporaso
|
r8631 | # otherwise print the formatted directory name followed by | ||
# the formatted filenames | ||||
Greg Caporaso
|
r8624 | dirname_output_line = dirname_output_format % dirname | ||
Greg Caporaso
|
r8801 | result.append(dirname_output_line) | ||
Greg Caporaso
|
r8619 | for fname in display_fnames: | ||
Greg Caporaso
|
r8624 | fp = fp_format % (dirname,fname) | ||
try: | ||||
# output can include both a filepath and a filename... | ||||
fname_output_line = fname_output_format % (fp, fname) | ||||
except TypeError: | ||||
# ... or just a single filepath | ||||
fname_output_line = fname_output_format % fname | ||||
Greg Caporaso
|
r8801 | result.append(fname_output_line) | ||
return result | ||||
Greg Caporaso
|
r8619 | return f | ||
Greg Caporaso
|
r8624 | def _get_notebook_display_formatter(self, | ||
spacer=" "): | ||||
Greg Caporaso
|
r8802 | """ generate function to use for notebook formatting | ||
Greg Caporaso
|
r8631 | """ | ||
Greg Caporaso
|
r8624 | dirname_output_format = \ | ||
Greg Caporaso
|
r8631 | self.result_html_prefix + "%s/" + self.result_html_suffix | ||
Greg Caporaso
|
r8624 | fname_output_format = \ | ||
self.result_html_prefix + spacer + self.html_link_str + self.result_html_suffix | ||||
fp_format = self.url_prefix + '%s/%s' | ||||
return self._get_display_formatter(dirname_output_format, | ||||
fname_output_format, | ||||
fp_format) | ||||
Greg Caporaso
|
r8619 | |||
Greg Caporaso
|
r8624 | def _get_terminal_display_formatter(self, | ||
spacer=" "): | ||||
Greg Caporaso
|
r8802 | """ generate function to use for terminal formatting | ||
Greg Caporaso
|
r8631 | """ | ||
dirname_output_format = "%s/" | ||||
Greg Caporaso
|
r8624 | fname_output_format = spacer + "%s" | ||
fp_format = '%s/%s' | ||||
return self._get_display_formatter(dirname_output_format, | ||||
fname_output_format, | ||||
fp_format) | ||||
Greg Caporaso
|
r8619 | |||
def _format_path(self): | ||||
result_lines = [] | ||||
Greg Caporaso
|
r8800 | walked_dir = list(walk(self.path)) | ||
walked_dir.sort() | ||||
for dirname, subdirs, fnames in walked_dir: | ||||
Greg Caporaso
|
r8802 | result_lines += self.notebook_display_formatter(dirname, fnames, self.included_suffixes) | ||
Greg Caporaso
|
r8619 | return '\n'.join(result_lines) | ||
Greg Caporaso
|
r8443 | |||
def __repr__(self): | ||||
"""return newline-separated absolute paths | ||||
""" | ||||
Greg Caporaso
|
r8619 | result_lines = [] | ||
Greg Caporaso
|
r8800 | walked_dir = list(walk(self.path)) | ||
walked_dir.sort() | ||||
for dirname, subdirs, fnames in walked_dir: | ||||
Greg Caporaso
|
r8802 | result_lines += self.terminal_display_formatter(dirname, fnames, self.included_suffixes) | ||
Greg Caporaso
|
r8798 | return '\n'.join(result_lines) | ||