diff --git a/IPython/lib/display.py b/IPython/lib/display.py index b25ef56..cfabea2 100644 --- a/IPython/lib/display.py +++ b/IPython/lib/display.py @@ -1,8 +1,13 @@ """Various display related classes. -Authors : MinRK +Authors : MinRK, gregcaporaso """ +from IPython.display import display, HTML +from os import walk +from os.path import join, exists, isfile, splitext + + class YouTubeVideo(object): """Class for embedding a YouTube Video in an IPython session, based on its video id. @@ -33,3 +38,100 @@ class YouTubeVideo(object): > """%(self.width, self.height, self.id) +class LocalFile(object): + """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: + + local_file = LocalFile("my/data.txt") + display(local_file) + """ + + def __init__(self, + path, + _directory_prefix='files', + _result_html_prefix='', + _result_html_suffix='
'): + """ + 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: '
'] + """ + self.path = path + self._directory_prefix = _directory_prefix + self._link_str = "%s" + self._result_html_prefix = _result_html_prefix + self._result_html_suffix = _result_html_suffix + + def _format_path(self): + link = join(self._directory_prefix,self.path) + return ''.join([self._result_html_prefix, + link, + self._result_html_suffix]) + + def _repr_html_(self): + """return link to local file + """ + if not exists(self.path): + return ("Path (%s) 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() + +# Create an alias for formatting a single directory name as a link. +# Right now this is the same as a formatting for a single file, but +# we'll encorage users to reference these with a different class in +# case we want to change this in the future. +LocalDirectory = LocalFile + +class LocalFiles(LocalFile): + """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: + + local_files = LocalFiles("my/data") + display(local_files) + """ + def __init__(self, + path, + _directory_prefix='files', + _included_suffixes=None, + _result_html_prefix='', + _result_html_suffix='
'): + """ + included_suffixes : list of filename suffixes to include when + formatting output [default: include all files] + + See the LocalFile (baseclass of LocalDirectory) docstring for + information on additional parameters. + """ + self._included_suffixes = _included_suffixes + LocalFile.__init__(self, + path, + _directory_prefix, + _result_html_prefix, + _result_html_suffix) + + def _format_path(self): + result_entries = [] + for root, dirs, files in walk(self.path): + for fn in files: + fp = join(self._directory_prefix,root,fn) + # if all files are being included, or fp has a suffix + # that is in included_suffix, create a link to fp + if self._included_suffixes == None or \ + splitext(fn)[1] in self._included_suffixes: + result_entries.append(''.join([self._result_html_prefix, + self._link_str % (fp,fn), + self._result_html_suffix])) + return '\n'.join(result_entries)