| 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()
|
|---|
| 28 | path = drive + ':'
|
|---|
| 29 | components = comp[1].split('/')
|
|---|
| 30 | for comp in components:
|
|---|
| 31 | if comp:
|
|---|
| 32 | path = path + '\\' + urllib.unquote(comp)
|
|---|
| 33 | # Issue #11474: url like '/C|/' should convert into 'C:\\'
|
|---|
| 34 | if path.endswith(':') and url.endswith('/'):
|
|---|
| 35 | path += '\\'
|
|---|
| 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
|
|---|