2013-05-03 03:19:21 +08:00
|
|
|
"""Notebook related utilities
|
|
|
|
|
|
|
|
Authors:
|
|
|
|
|
|
|
|
* Brian Granger
|
|
|
|
"""
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
# Copyright (C) 2011 The IPython Development Team
|
|
|
|
#
|
|
|
|
# Distributed under the terms of the BSD License. The full license is in
|
|
|
|
# the file COPYING, distributed as part of this software.
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
2013-08-25 18:08:18 +08:00
|
|
|
import os
|
2013-10-26 02:07:09 +08:00
|
|
|
try:
|
|
|
|
from urllib.parse import quote, unquote
|
|
|
|
except ImportError:
|
|
|
|
from urllib import quote, unquote
|
2013-08-25 18:08:18 +08:00
|
|
|
|
2013-10-18 12:08:28 +08:00
|
|
|
from IPython.utils import py3compat
|
|
|
|
|
2013-05-03 03:19:21 +08:00
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
# Imports
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
def url_path_join(*pieces):
|
|
|
|
"""Join components of url into a relative url
|
|
|
|
|
|
|
|
Use to prevent double slash when joining subpath. This will leave the
|
|
|
|
initial and final / in place
|
|
|
|
"""
|
|
|
|
initial = pieces[0].startswith('/')
|
|
|
|
final = pieces[-1].endswith('/')
|
2013-08-25 18:08:18 +08:00
|
|
|
stripped = [s.strip('/') for s in pieces]
|
|
|
|
result = '/'.join(s for s in stripped if s)
|
2013-05-03 03:19:21 +08:00
|
|
|
if initial: result = '/' + result
|
|
|
|
if final: result = result + '/'
|
2013-05-03 04:43:10 +08:00
|
|
|
if result == '//': result = '/'
|
2013-05-03 03:19:21 +08:00
|
|
|
return result
|
2013-08-25 18:08:18 +08:00
|
|
|
|
|
|
|
def path2url(path):
|
|
|
|
"""Convert a local file path to a URL"""
|
2013-10-23 08:36:34 +08:00
|
|
|
pieces = [ quote(p) for p in path.split(os.sep) ]
|
2013-08-25 18:08:18 +08:00
|
|
|
# preserve trailing /
|
|
|
|
if pieces[-1] == '':
|
|
|
|
pieces[-1] = '/'
|
|
|
|
url = url_path_join(*pieces)
|
|
|
|
return url
|
|
|
|
|
|
|
|
def url2path(url):
|
|
|
|
"""Convert a URL to a local file path"""
|
|
|
|
pieces = [ unquote(p) for p in url.split('/') ]
|
|
|
|
path = os.path.join(*pieces)
|
|
|
|
return path
|
|
|
|
|
2013-10-08 03:28:16 +08:00
|
|
|
def url_escape(path):
|
|
|
|
"""Escape special characters in a URL path
|
|
|
|
|
|
|
|
Turns '/foo bar/' into '/foo%20bar/'
|
|
|
|
"""
|
2013-10-18 12:08:28 +08:00
|
|
|
parts = py3compat.unicode_to_str(path).split('/')
|
|
|
|
return u'/'.join([quote(p) for p in parts])
|
2013-10-08 03:28:16 +08:00
|
|
|
|
|
|
|
def url_unescape(path):
|
|
|
|
"""Unescape special characters in a URL path
|
|
|
|
|
|
|
|
Turns '/foo%20bar/' into '/foo bar/'
|
|
|
|
"""
|
2013-10-18 12:08:28 +08:00
|
|
|
return u'/'.join([
|
|
|
|
py3compat.str_to_unicode(unquote(p))
|
|
|
|
for p in py3compat.unicode_to_str(path).split('/')
|
|
|
|
])
|
2013-10-08 03:28:16 +08:00
|
|
|
|