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
|
---|