'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)

Documentation

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