'Converting an absolute path to a relative path
Working in Node I need to convert my request path into a relative path so I can drop it into some templates that have a different folder structure.
For example, if I start with the path "/foo/bar" and want the relative path to "/foo", it would be "..", and for "/foo/bar/baz" it would be "../..".
I wrote a pair of functions to do this:
function splitPath(path) {
return path.split('/').map(dots).slice(2).join('/');
}
function dots() {
return '..';
}
Not sure if this is the best approach or if it's possible to do it with a regular expression in String.replace somehow?
edit
I should point out this is so I can render everything as static HTML, zip up the whole project, and send it to someone who doesn't have access to a web server. See my first comment.
Solution 1:[1]
If I understand you question correct you can use path.relative(from, to)
Example:
var path = require('path');
console.log(path.relative('/foo/bar/baz', '/foo'));
Solution 2:[2]
Node.js have native method for this purposes: path.relative(from, to).
Solution 3:[3]
This might need some tuning but it should work:
function getPathRelation(position, basePath, input) {
var basePathR = basePath.split("/");
var inputR = input.split("/");
var output = "";
for(c=0; c < inputR.length; c++) {
if(c < position) continue;
if(basePathR.length <= c) output = "../" + output;
if(inputR[c] == basePathR[c]) output += inputR[c] + "/";
}
return output;
}
var basePath ="/foo"
var position = 2;
var input = "/foo";
console.log(getPathRelation(position,basePath,input));
var input = "/foo/bar";
console.log(getPathRelation(position,basePath,input));
var input = "/foo/bar/baz";
console.log(getPathRelation(position,basePath,input));
Result:
(an empty string)
../
../../
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Mattias |
Solution 2 | Vadim Baryshev |
Solution 3 | Gung Foo |