From 0d24081254569df21d9d3018a9cc1a34b493575e 2013-01-15 02:53:07
From: Greg Caporaso <gregcaporaso@gmail.com>
Date: 2013-01-15 02:53:07
Subject: [PATCH] this should address the failure in #2732

i am still very concerned that I can't test this on windows - I'm not used to developing for windows, so not sure that these links will work even if the test passes on windows.

is there a good AWS AMI to use for windows testing? i can run this in my own AWS account.

---

diff --git a/IPython/lib/display.py b/IPython/lib/display.py
index c315c50..98102ef 100644
--- a/IPython/lib/display.py
+++ b/IPython/lib/display.py
@@ -5,7 +5,7 @@ Authors : MinRK, gregcaporaso, dannystaple
 import urllib
 
 from os.path import exists, isfile, splitext, abspath, join, isdir
-from os import walk
+from os import walk, sep
 
 
 class YouTubeVideo(object):
@@ -192,7 +192,8 @@ class FileLinks(FileLink):
     def _get_display_formatter(self,
                                dirname_output_format,
                                fname_output_format,
-                               fp_format):
+                               fp_format,
+                               fp_cleaner=None):
         """ generate built-in formatter function
            
            this is used to define both the notebook and terminal built-in 
@@ -232,6 +233,8 @@ class FileLinks(FileLink):
                 result.append(dirname_output_line)
                 for fname in display_fnames:
                     fp = fp_format % (dirname,fname)
+                    if fp_cleaner != None:
+                        fp = fp_cleaner(fp)
                     try:
                         # output can include both a filepath and a filename...
                         fname_output_line = fname_output_format % (fp, fname)
@@ -251,10 +254,21 @@ class FileLinks(FileLink):
         fname_output_format = \
          self.result_html_prefix + spacer + self.html_link_str + self.result_html_suffix
         fp_format = self.url_prefix + '%s/%s'
+        if sep == "\\":
+            # Working on a platform where the path separator is "\", so 
+            # must convert these to "/" for generating a URI
+            def fp_cleaner(fp):
+                # Replace all occurences of backslash ("\") with a forward
+                # slash ("/") - this is necessary on windows when a path is
+                # provided as input, but we must link to a URI
+                return fp.replace('\\','/')
+        else:
+            fp_cleaner = None
         
         return self._get_display_formatter(dirname_output_format,
                                            fname_output_format,
-                                           fp_format)
+                                           fp_format,
+                                           fp_cleaner)
 
     def _get_terminal_display_formatter(self,
                                         spacer="  "):
diff --git a/IPython/lib/tests/test_display.py b/IPython/lib/tests/test_display.py
index 0e89afb..dee073b 100644
--- a/IPython/lib/tests/test_display.py
+++ b/IPython/lib/tests/test_display.py
@@ -15,6 +15,7 @@
 from __future__ import print_function
 from tempfile import NamedTemporaryFile, mkdtemp
 from os.path import split
+from os import sep
 
 # Third-party imports
 import nose.tools as nt
@@ -89,9 +90,13 @@ def test_existing_path_FileLinks():
     actual = fl._repr_html_()
     actual = actual.split('\n')
     actual.sort()
+    # the links should always have forward slashes, even on windows, so replace
+    # backslashes with forward slashes here
     expected = ["%s/<br>" % td,
-                "&nbsp;&nbsp;<a href='files/%s' target='_blank'>%s</a><br>" % (tf2.name,split(tf2.name)[1]),
-                "&nbsp;&nbsp;<a href='files/%s' target='_blank'>%s</a><br>" % (tf1.name,split(tf1.name)[1])]
+                "&nbsp;&nbsp;<a href='files/%s' target='_blank'>%s</a><br>" %\
+                 (tf2.name.replace("\\","/"),split(tf2.name)[1]),
+                "&nbsp;&nbsp;<a href='files/%s' target='_blank'>%s</a><br>" %\
+                 (tf1.name.replace("\\","/"),split(tf1.name)[1])]
     expected.sort()
     # We compare the sorted list of links here as that's more reliable
     nt.assert_equal(actual,expected)