1"""riscos specific module for conversion between pathnames and URLs. 2Based on macurl2path. 3Do not import directly, use urllib instead.""" 4 5import string 6import urllib 7 8__all__ = ["url2pathname","pathname2url"] 9 10__slash_dot = string.maketrans("/.", "./") 11 12def url2pathname(url): 13 """OS-specific conversion from a relative URL of the 'file' scheme 14 to a file system path; not recommended for general use.""" 15 tp = urllib.splittype(url)[0] 16 if tp and tp <> 'file': 17 raise RuntimeError, 'Cannot convert non-local URL to pathname' 18 # Turn starting /// into /, an empty hostname means current host 19 if url[:3] == '///': 20 url = url[2:] 21 elif url[:2] == '//': 22 raise RuntimeError, 'Cannot convert non-local URL to pathname' 23 components = string.split(url, '/') 24 if not components[0]: 25 if '$' in components: 26 del components[0] 27 else: 28 components[0] = '$' 29 # Remove . and embedded .. 30 i = 0 31 while i < len(components): 32 if components[i] == '.': 33 del components[i] 34 elif components[i] == '..' and i > 0 and \ 35 components[i-1] not in ('', '..'): 36 del components[i-1:i+1] 37 i -= 1 38 elif components[i] == '..': 39 components[i] = '^' 40 i += 1 41 elif components[i] == '' and i > 0 and components[i-1] <> '': 42 del components[i] 43 else: 44 i += 1 45 components = map(lambda x: urllib.unquote(x).translate(__slash_dot), components) 46 return '.'.join(components) 47 48def pathname2url(pathname): 49 """OS-specific conversion from a file system path to a relative URL 50 of the 'file' scheme; not recommended for general use.""" 51 return urllib.quote('///' + pathname.translate(__slash_dot), "/$:") 52 53def test(): 54 for url in ["index.html", 55 "/SCSI::SCSI4/$/Anwendung/Comm/Apps/!Fresco/Welcome", 56 "/SCSI::SCSI4/$/Anwendung/Comm/Apps/../!Fresco/Welcome", 57 "../index.html", 58 "bar/index.html", 59 "/foo/bar/index.html", 60 "/foo/bar/", 61 "/"]: 62 print '%r -> %r' % (url, url2pathname(url)) 63 print "*******************************************************" 64 for path in ["SCSI::SCSI4.$.Anwendung", 65 "PythonApp:Lib", 66 "PythonApp:Lib.rourl2path/py"]: 67 print '%r -> %r' % (path, pathname2url(path)) 68 69if __name__ == '__main__': 70 test() 71