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 | components = comp[1].split('/')
|
---|
29 | path = drive + ':'
|
---|
30 | for comp in components:
|
---|
31 | if comp:
|
---|
32 | path = path + '\\' + urllib.unquote(comp)
|
---|
33 | return path
|
---|
34 |
|
---|
35 | def pathname2url(p):
|
---|
36 | """OS-specific conversion from a file system path to a relative URL
|
---|
37 | of the 'file' scheme; not recommended for general use."""
|
---|
38 | # e.g.
|
---|
39 | # C:\foo\bar\spam.foo
|
---|
40 | # becomes
|
---|
41 | # ///C|/foo/bar/spam.foo
|
---|
42 | import urllib
|
---|
43 | if not ':' in p:
|
---|
44 | # No drive specifier, just convert slashes and quote the name
|
---|
45 | if p[:2] == '\\\\':
|
---|
46 | # path is something like \\host\path\on\remote\host
|
---|
47 | # convert this to ////host/path/on/remote/host
|
---|
48 | # (notice doubling of slashes at the start of the path)
|
---|
49 | p = '\\\\' + p
|
---|
50 | components = p.split('\\')
|
---|
51 | return urllib.quote('/'.join(components))
|
---|
52 | comp = p.split(':')
|
---|
53 | if len(comp) != 2 or len(comp[0]) > 1:
|
---|
54 | error = 'Bad path: ' + p
|
---|
55 | raise IOError, error
|
---|
56 |
|
---|
57 | drive = urllib.quote(comp[0].upper())
|
---|
58 | components = comp[1].split('\\')
|
---|
59 | path = '///' + drive + ':'
|
---|
60 | for comp in components:
|
---|
61 | if comp:
|
---|
62 | path = path + '/' + urllib.quote(comp)
|
---|
63 | return path
|
---|