nturl2path.py 1.99 KB
Newer Older
1
"""Convert a NT pathname to a file URL and vice versa."""
Guido van Rossum's avatar
Guido van Rossum committed
2 3

def url2pathname(url):
Tim Peters's avatar
Tim Peters committed
4
    r"""Convert a URL to a DOS path.
5

Tim Peters's avatar
Tim Peters committed
6
            ///C|/foo/bar/spam.foo
Guido van Rossum's avatar
Guido van Rossum committed
7

Tim Peters's avatar
Tim Peters committed
8
                    becomes
Guido van Rossum's avatar
Guido van Rossum committed
9

Tim Peters's avatar
Tim Peters committed
10 11 12 13 14 15 16 17 18 19
            C:\foo\bar\spam.foo
    """
    import string, urllib
    if not '|' in url:
        # No drive specifier, just convert slashes
        if url[:4] == '////':
            # path is something like ////host/path/on/remote/host
            # convert this to \\host\path\on\remote\host
            # (notice halving of slashes at the start of the path)
            url = url[2:]
20
        components = url.split('/')
Tim Peters's avatar
Tim Peters committed
21
        # make sure not to convert quoted slashes :-)
22 23
        return urllib.unquote('\\'.join(components))
    comp = url.split('|')
Tim Peters's avatar
Tim Peters committed
24 25 26
    if len(comp) != 2 or comp[0][-1] not in string.letters:
        error = 'Bad URL: ' + url
        raise IOError, error
27 28
    drive = comp[0][-1].upper()
    components = comp[1].split('/')
Tim Peters's avatar
Tim Peters committed
29 30 31 32 33
    path = drive + ':'
    for  comp in components:
        if comp:
            path = path + '\\' + urllib.unquote(comp)
    return path
Guido van Rossum's avatar
Guido van Rossum committed
34 35

def pathname2url(p):
Tim Peters's avatar
Tim Peters committed
36
    r"""Convert a DOS path name to a file url.
37

Tim Peters's avatar
Tim Peters committed
38
            C:\foo\bar\spam.foo
Guido van Rossum's avatar
Guido van Rossum committed
39

Tim Peters's avatar
Tim Peters committed
40
                    becomes
Guido van Rossum's avatar
Guido van Rossum committed
41

Tim Peters's avatar
Tim Peters committed
42 43
            ///C|/foo/bar/spam.foo
    """
Guido van Rossum's avatar
Guido van Rossum committed
44

Tim Peters's avatar
Tim Peters committed
45 46 47 48 49 50 51 52
    import string, urllib
    if not ':' in p:
        # No drive specifier, just convert slashes and quote the name
        if p[:2] == '\\\\':
        # path is something like \\host\path\on\remote\host
        # convert this to ////host/path/on/remote/host
        # (notice doubling of slashes at the start of the path)
            p = '\\\\' + p
53 54 55
        components = p.split('\\')
        return urllib.quote('/'.join(components))
    comp = p.split(':')
Tim Peters's avatar
Tim Peters committed
56 57 58
    if len(comp) != 2 or len(comp[0]) > 1:
        error = 'Bad path: ' + p
        raise IOError, error
Guido van Rossum's avatar
Guido van Rossum committed
59

60 61
    drive = urllib.quote(comp[0].upper())
    components = comp[1].split('\\')
Tim Peters's avatar
Tim Peters committed
62 63 64 65 66
    path = '///' + drive + '|'
    for comp in components:
        if comp:
            path = path + '/' + urllib.quote(comp)
    return path