"""Mac specific module for conversion between pathnames and URLs.""" import string import urllib import os def url2pathname(pathname): "Convert /-delimited pathname to mac pathname" # # XXXX The .. handling should be fixed... # tp = urllib.splittype(pathname)[0] if tp and tp <> 'file': raise RuntimeError, 'Cannot convert non-local URL to pathname' components = string.split(pathname, '/') # Remove . and embedded .. i = 0 while i < len(components): if components[i] == '.': del components[i] elif components[i] == '..' and i > 0 and \ components[i-1] not in ('', '..'): del components[i-1:i+1] i = i-1 elif components[i] == '' and i > 0 and components[i-1] <> '': del components[i] else: i = i+1 if not components[0]: # Absolute unix path, don't start with colon return string.join(components[1:], ':') else: # relative unix path, start with colon. First replace # leading .. by empty strings (giving ::file) i = 0 while i < len(components) and components[i] == '..': components[i] = '' i = i + 1 return ':' + string.join(components, ':') def pathname2url(pathname): "convert mac pathname to /-delimited pathname" if '/' in pathname: raise RuntimeError, "Cannot convert pathname containing slashes" components = string.split(pathname, ':') # Replace empty string ('::') by .. (will result in '/../' later) for i in range(1, len(components)): if components[i] == '': components[i] = '..' # Truncate names longer than 31 bytes components = map(lambda x: x[:31], components) if os.path.isabs(pathname): return '/' + string.join(components, '/') else: return string.join(components, '/') def test(): for url in ["index.html", "bar/index.html", "/foo/bar/index.html", "/foo/bar/", "/"]: print `url`, '->', `url2pathname(url)` for path in ["drive:", "drive:dir:", "drive:dir:file", "drive:file", "file", ":file", ":dir:", ":dir:file"]: print `path`, '->', `pathname2url(path)` if __name__ == '__main__': test()