cpython/Lib/dos-8x3/macurl2p.py

89 lines
2.8 KiB
Python
Raw Normal View History

1996-10-21 18:10:19 +00:00
"""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':
1998-03-26 22:14:20 +00:00
raise RuntimeError, 'Cannot convert non-local URL to pathname'
components = string.split(pathname, '/')
# Remove . and embedded ..
i = 0
while i < len(components):
1998-03-26 22:14:20 +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
elif components[i] == '' and i > 0 and components[i-1] <> '':
del components[i]
else:
i = i+1
if not components[0]:
1998-03-26 22:14:20 +00:00
# Absolute unix path, don't start with colon
1998-08-12 02:38:11 +00:00
rv = string.join(components[1:], ':')
else:
1998-03-26 22:14:20 +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
1998-08-12 02:38:11 +00:00
rv = ':' + string.join(components, ':')
# and finally unquote slashes and other funny characters
return urllib.unquote(rv)
def pathname2url(pathname):
"convert mac pathname to /-delimited pathname"
if '/' in pathname:
1998-03-26 22:14:20 +00:00
raise RuntimeError, "Cannot convert pathname containing slashes"
components = string.split(pathname, ':')
1997-05-22 20:48:03 +00:00
# Remove empty first and/or last component
if components[0] == '':
1998-03-26 22:14:20 +00:00
del components[0]
1997-05-22 20:48:03 +00:00
if components[-1] == '':
1998-03-26 22:14:20 +00:00
del components[-1]
# Replace empty string ('::') by .. (will result in '/../' later)
1997-05-22 20:48:03 +00:00
for i in range(len(components)):
1998-03-26 22:14:20 +00:00
if components[i] == '':
components[i] = '..'
# Truncate names longer than 31 bytes
1998-08-12 02:38:11 +00:00
components = map(_pncomp2url, components)
if os.path.isabs(pathname):
1998-03-26 22:14:20 +00:00
return '/' + string.join(components, '/')
else:
1998-03-26 22:14:20 +00:00
return string.join(components, '/')
1998-08-12 02:38:11 +00:00
def _pncomp2url(component):
component = urllib.quote(component[:31], safe='') # We want to quote slashes
return component
def test():
for url in ["index.html",
1998-03-26 22:14:20 +00:00
"bar/index.html",
"/foo/bar/index.html",
"/foo/bar/",
"/"]:
print `url`, '->', `url2pathname(url)`
for path in ["drive:",
1998-03-26 22:14:20 +00:00
"drive:dir:",
"drive:dir:file",
"drive:file",
"file",
":file",
":dir:",
":dir:file"]:
print `path`, '->', `pathname2url(path)`
if __name__ == '__main__':
test()