| 
									
										
										
										
											2000-02-04 15:39:30 +00:00
										 |  |  | """Macintosh-specific module for conversion between pathnames and URLs.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Do not import directly; use urllib instead."""
 | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import urllib | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-24 06:27:27 +00:00
										 |  |  | __all__ = ["url2pathname","pathname2url"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  | def url2pathname(pathname): | 
					
						
							|  |  |  |     "Convert /-delimited pathname to mac pathname" | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # XXXX The .. handling should be fixed... | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     tp = urllib.splittype(pathname)[0] | 
					
						
							| 
									
										
										
										
											2000-12-12 23:20:45 +00:00
										 |  |  |     if tp and tp != 'file': | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         raise RuntimeError, 'Cannot convert non-local URL to pathname' | 
					
						
							| 
									
										
										
										
											1999-06-01 14:36:56 +00:00
										 |  |  |     # Turn starting /// into /, an empty hostname means current host | 
					
						
							|  |  |  |     if pathname[:3] == '///': | 
					
						
							| 
									
										
										
										
											2001-01-14 23:47:14 +00:00
										 |  |  |         pathname = pathname[2:] | 
					
						
							| 
									
										
										
										
											1999-06-01 14:36:56 +00:00
										 |  |  |     elif pathname[:2] == '//': | 
					
						
							|  |  |  |         raise RuntimeError, 'Cannot convert non-local URL to pathname' | 
					
						
							| 
									
										
										
										
											2001-02-09 09:48:45 +00:00
										 |  |  |     components = pathname.split('/') | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  |     # Remove . and embedded .. | 
					
						
							|  |  |  |     i = 0 | 
					
						
							|  |  |  |     while i < len(components): | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2000-12-12 23:20:45 +00:00
										 |  |  |         elif components[i] == '' and i > 0 and components[i-1] != '': | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |             del components[i] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             i = i+1 | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  |     if not components[0]: | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         # Absolute unix path, don't start with colon | 
					
						
							| 
									
										
										
										
											2001-02-09 09:48:45 +00:00
										 |  |  |         rv = ':'.join(components[1:]) | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         # 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 | 
					
						
							| 
									
										
										
										
											2001-02-09 09:48:45 +00:00
										 |  |  |         rv = ':' + ':'.join(components) | 
					
						
							| 
									
										
										
										
											1998-08-06 13:37:21 +00:00
										 |  |  |     # and finally unquote slashes and other funny characters | 
					
						
							|  |  |  |     return urllib.unquote(rv) | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def pathname2url(pathname): | 
					
						
							|  |  |  |     "convert mac pathname to /-delimited pathname" | 
					
						
							|  |  |  |     if '/' in pathname: | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         raise RuntimeError, "Cannot convert pathname containing slashes" | 
					
						
							| 
									
										
										
										
											2001-02-09 09:48:45 +00:00
										 |  |  |     components = pathname.split(':') | 
					
						
							| 
									
										
										
										
											1997-05-20 16:00:07 +00:00
										 |  |  |     # Remove empty first and/or last component | 
					
						
							|  |  |  |     if components[0] == '': | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         del components[0] | 
					
						
							| 
									
										
										
										
											1997-05-20 16:00:07 +00:00
										 |  |  |     if components[-1] == '': | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         del components[-1] | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  |     # Replace empty string ('::') by .. (will result in '/../' later) | 
					
						
							| 
									
										
										
										
											1997-05-20 16:00:07 +00:00
										 |  |  |     for i in range(len(components)): | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |         if components[i] == '': | 
					
						
							|  |  |  |             components[i] = '..' | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  |     # Truncate names longer than 31 bytes | 
					
						
							| 
									
										
										
										
											1998-08-06 13:37:21 +00:00
										 |  |  |     components = map(_pncomp2url, components) | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if os.path.isabs(pathname): | 
					
						
							| 
									
										
										
										
											2001-02-09 09:48:45 +00:00
										 |  |  |         return '/' + '/'.join(components) | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2001-02-09 09:48:45 +00:00
										 |  |  |         return '/'.join(components) | 
					
						
							| 
									
										
										
										
											2001-01-14 23:47:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-08-06 13:37:21 +00:00
										 |  |  | def _pncomp2url(component): | 
					
						
							| 
									
										
										
										
											2001-01-14 23:47:14 +00:00
										 |  |  |     component = urllib.quote(component[:31], safe='')  # We want to quote slashes | 
					
						
							|  |  |  |     return component | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  | def test(): | 
					
						
							|  |  |  |     for url in ["index.html", | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |                 "bar/index.html", | 
					
						
							|  |  |  |                 "/foo/bar/index.html", | 
					
						
							|  |  |  |                 "/foo/bar/", | 
					
						
							|  |  |  |                 "/"]: | 
					
						
							| 
									
										
										
										
											2004-02-12 17:35:32 +00:00
										 |  |  |         print '%r -> %r' % (url, url2pathname(url)) | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  |     for path in ["drive:", | 
					
						
							| 
									
										
										
										
											1998-03-26 21:13:24 +00:00
										 |  |  |                  "drive:dir:", | 
					
						
							|  |  |  |                  "drive:dir:file", | 
					
						
							|  |  |  |                  "drive:file", | 
					
						
							|  |  |  |                  "file", | 
					
						
							|  |  |  |                  ":file", | 
					
						
							|  |  |  |                  ":dir:", | 
					
						
							|  |  |  |                  ":dir:file"]: | 
					
						
							| 
									
										
										
										
											2004-02-12 17:35:32 +00:00
										 |  |  |         print '%r -> %r' % (path, pathname2url(path)) | 
					
						
							| 
									
										
										
										
											1996-05-28 23:52:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     test() |