mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Mac specific module for conversion between pathnames and URLs.
 | 
						|
Do not import directly, use urllib instead."""
 | 
						|
 | 
						|
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, ':')
 | 
						|
    # Remove empty first and/or last component
 | 
						|
    if components[0] == '':
 | 
						|
    	del components[0]
 | 
						|
    if components[-1] == '':
 | 
						|
    	del components[-1]
 | 
						|
    # Replace empty string ('::') by .. (will result in '/../' later)
 | 
						|
    for i in range(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()
 |