[2] | 1 | """Convert a NT pathname to a file URL and vice versa."""
|
---|
| 2 |
|
---|
| 3 | def url2pathname(url):
|
---|
| 4 | """OS-specific conversion from a relative URL of the 'file' scheme
|
---|
| 5 | to a file system path; not recommended for general use."""
|
---|
| 6 | # e.g.
|
---|
| 7 | # ///C|/foo/bar/spam.foo
|
---|
| 8 | # becomes
|
---|
| 9 | # C:\foo\bar\spam.foo
|
---|
| 10 | import string, urllib
|
---|
| 11 | # Windows itself uses ":" even in URLs.
|
---|
| 12 | url = url.replace(':', '|')
|
---|
| 13 | if not '|' in url:
|
---|
| 14 | # No drive specifier, just convert slashes
|
---|
| 15 | if url[:4] == '////':
|
---|
| 16 | # path is something like ////host/path/on/remote/host
|
---|
| 17 | # convert this to \\host\path\on\remote\host
|
---|
| 18 | # (notice halving of slashes at the start of the path)
|
---|
| 19 | url = url[2:]
|
---|
| 20 | components = url.split('/')
|
---|
| 21 | # make sure not to convert quoted slashes :-)
|
---|
| 22 | return urllib.unquote('\\'.join(components))
|
---|
| 23 | comp = url.split('|')
|
---|
| 24 | if len(comp) != 2 or comp[0][-1] not in string.ascii_letters:
|
---|
| 25 | error = 'Bad URL: ' + url
|
---|
| 26 | raise IOError, error
|
---|
| 27 | drive = comp[0][-1].upper()
|
---|
[391] | 28 | path = drive + ':'
|
---|
[2] | 29 | components = comp[1].split('/')
|
---|
[391] | 30 | for comp in components:
|
---|
[2] | 31 | if comp:
|
---|
| 32 | path = path + '\\' + urllib.unquote(comp)
|
---|
[391] | 33 | # Issue #11474: url like '/C|/' should convert into 'C:\\'
|
---|
| 34 | if path.endswith(':') and url.endswith('/'):
|
---|
| 35 | path += '\\'
|
---|
[2] | 36 | return path
|
---|
| 37 |
|
---|
| 38 | def pathname2url(p):
|
---|
| 39 | """OS-specific conversion from a file system path to a relative URL
|
---|
| 40 | of the 'file' scheme; not recommended for general use."""
|
---|
| 41 | # e.g.
|
---|
| 42 | # C:\foo\bar\spam.foo
|
---|
| 43 | # becomes
|
---|
| 44 | # ///C|/foo/bar/spam.foo
|
---|
| 45 | import urllib
|
---|
| 46 | if not ':' in p:
|
---|
| 47 | # No drive specifier, just convert slashes and quote the name
|
---|
| 48 | if p[:2] == '\\\\':
|
---|
| 49 | # path is something like \\host\path\on\remote\host
|
---|
| 50 | # convert this to ////host/path/on/remote/host
|
---|
| 51 | # (notice doubling of slashes at the start of the path)
|
---|
| 52 | p = '\\\\' + p
|
---|
| 53 | components = p.split('\\')
|
---|
| 54 | return urllib.quote('/'.join(components))
|
---|
| 55 | comp = p.split(':')
|
---|
| 56 | if len(comp) != 2 or len(comp[0]) > 1:
|
---|
| 57 | error = 'Bad path: ' + p
|
---|
| 58 | raise IOError, error
|
---|
| 59 |
|
---|
| 60 | drive = urllib.quote(comp[0].upper())
|
---|
| 61 | components = comp[1].split('\\')
|
---|
| 62 | path = '///' + drive + ':'
|
---|
| 63 | for comp in components:
|
---|
| 64 | if comp:
|
---|
| 65 | path = path + '/' + urllib.quote(comp)
|
---|
| 66 | return path
|
---|