diff --git a/lib/path.awk b/lib/path.awk index 5f58998..774a730 100755 --- a/lib/path.awk +++ b/lib/path.awk @@ -2,14 +2,12 @@ function getDirname(path, pathComponents, dirname) { dirname = "" pathComponents[1] = "" - sub(/\/+$/, "", path) + path = resolvePath(path) split(path, pathComponents, "/") if (length(pathComponents) < 2) return "." - pathComponents[length(pathComponents)] = "" - - for (i = 1; i < length(pathComponents); i++) + for (i = 1; i <= length(pathComponents) - 1; i++) dirname = dirname pathComponents[i] "/" return dirname @@ -22,36 +20,42 @@ function resolvePath(path, resolvedPath, pathComponents) { sub(/\/+$/, "", path) split(path, pathComponents, "/") - for (i in pathComponents) - if (pathComponents[i] == "." || pathComponents[i+1] == ".." || pathComponents[i] == "") + for (i = 1; i <= length(pathComponents); i++) + if (pathComponents[i] == "." || pathComponents[i] == "") continue - else + else if (pathComponents[i+1] == "..") { + i++ + continue + } else resolvedPath = resolvedPath pathComponents[i] "/" - return resolvedPath -} - -function getRelativePath(base, path, resolvedPath, baseComponents, pathComponents, commonPrefix) { - path = resolvePath(path) - base = resolvePath(base) - pathComponents[1] = "" - baseComponents[1] = "" - isCommonPrefixUnfinished = 1 - - sub(/\/+$/, "", base) - sub(/\/+$/, "", path) - - split(path, pathComponents, "/") - split(base, baseComponents, "/") - - for (i in pathComponents) - if (baseComponents[i] == pathComponents[i] && isCommonPrefixUnfinished) - resolvedPath = resolvedPath "../" - else { - isCommonPrefixUnfinished = 0 - resolvedPath = resolvedPath pathComponents[i] "/" - } - + sub(/\/+$/, "", resolvedPath) + + return resolvedPath +} + +function getRelativePath(base, path, resolvedPath, baseComponents, pathComponents, commonPrefix) { + pathComponents[1] = "" + baseComponents[1] = "" + commonPrefixEndPosition = 1 + resolvedPath = "" + + base = resolvePath(base) + path = resolvePath(path) + + split(path, pathComponents, "/") + split(base, baseComponents, "/") + + while (pathComponents[commonPrefixEndPosition] == baseComponents[commonPrefixEndPosition]) + commonPrefixEndPosition++ + + for (i = commonPrefixEndPosition; i <= length(baseComponents); i++) + if (baseComponents[i] == "") break + else resolvedPath = resolvedPath "../" + + for (i = commonPrefixEndPosition; i <= length(pathComponents); i++) + resolvedPath = resolvedPath pathComponents[i] "/" + sub(/\/+$/, "", resolvedPath) return resolvedPath diff --git a/scripts/test.awk b/scripts/test.awk index 4e3f99b..033e90f 100644 --- a/scripts/test.awk +++ b/scripts/test.awk @@ -16,9 +16,18 @@ END { print "=> resolvePath('./path/to/irrelevant_directory/../file.txt')" assert("path/to/file.txt", resolvePath("./path/to/irrelevant_directory/../file.txt")) + print "=> resolvePath('path/to/file.txt/')" + assert("path/to/file.txt", resolvePath("path/to/file.txt/")) + + print "=> resolvePath('path/to/file.txt')" + assert("path/to/file.txt", resolvePath("path/to/file.txt")) + print "=> getRelativePath('parent/directory/', 'parent/path/to/file.txt')" assert("../path/to/file.txt", getRelativePath("parent/directory", "parent/path/to/file.txt")) print "=> getRelativePath('parent/directory/', 'parent/directory/path/to/file.txt')" assert("path/to/file.txt", getRelativePath("parent/directory", "parent/directory/path/to/file.txt")) + + print "=> getRelativePath('', 'path/to/file.txt')" + assert("path/to/file.txt", getRelativePath("", "path/to/file.txt")) } \ No newline at end of file diff --git a/testing/output/functionOutputs.txt b/testing/output/functionOutputs.txt index d60937b..8beb26c 100644 --- a/testing/output/functionOutputs.txt +++ b/testing/output/functionOutputs.txt @@ -3,8 +3,14 @@ => getDirname('a_single_directory') . == . => resolvePath('./path/to/irrelevant_directory/../file.txt') -path/to/file.txt != path/to/../ +path/to/file.txt == path/to/file.txt +=> resolvePath('path/to/file.txt/') +path/to/file.txt == path/to/file.txt +=> resolvePath('path/to/file.txt') +path/to/file.txt == path/to/file.txt => getRelativePath('parent/directory/', 'parent/path/to/file.txt') -../path/to/file.txt != to/path/parent +../path/to/file.txt == ../path/to/file.txt => getRelativePath('parent/directory/', 'parent/directory/path/to/file.txt') -path/to/file.txt != path/directory/parent/to +path/to/file.txt == path/to/file.txt +=> getRelativePath('', 'path/to/file.txt') +path/to/file.txt == path/to/file.txt diff --git a/testing/output/index.html b/testing/output/index.html index 48f9a7d..0ae2824 100644 --- a/testing/output/index.html +++ b/testing/output/index.html @@ -6,16 +6,16 @@ - +