]> granicus.if.org Git - python/commitdiff
Conversions between mac paths and URLs
authorGuido van Rossum <guido@python.org>
Tue, 28 May 1996 23:52:06 +0000 (23:52 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 28 May 1996 23:52:06 +0000 (23:52 +0000)
Lib/macurl2path.py [new file with mode: 0644]

diff --git a/Lib/macurl2path.py b/Lib/macurl2path.py
new file mode 100644 (file)
index 0000000..65afe69
--- /dev/null
@@ -0,0 +1,76 @@
+"""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()