从Ruby源代码翻译过来的
function split_path(path){
return path.split(/\/+/);
}
function merge_path(base,rel){
// RFC2396, Section 5.2, 5)
if (rel[0] == '#'){
// RFC2396, Section 5.2, 5)
return rel;
}
// RFC2396, Section 5.2, 6)
var base_path = split_path(base);
var rel_path = split_path(rel);
// RFC2396, Section 5.2, 6), a)
if(base_path[base_path.length-1] == '..'){
base_path.push('');
}
var i;
while ((i = base_path.indexOf('..'))+1){
base_path = base_path.slice(i - 1, 2);
}
if (base_path.length == 0){
base_path = ['']; // keep '/' for root directory
}else{
base_path.pop();
}
// RFC2396, Section 5.2, 6), c)
// RFC2396, Section 5.2, 6), d)
if (rel_path[rel_path.length-1] == '.' || rel_path[rel_path.length-1] == '..'){
rel_path.push('');
}
var old_rel_path = rel_path;
rel_path = [];
for(var i=0,l=old_rel_path.length;i<l;i++){
if(old_rel_path[i]!='.'){
rel_path.push(old_rel_path[i]);
}
}
// RFC2396, Section 5.2, 6), e)
var tmp = []
for(var i=0,l=rel_path.length;i<l;i++){
var x = rel_path[i];
if ( x == '..' && !(tmp.length == 0 || tmp[tmp.length-1]=='..')){
tmp.pop();
}else{
tmp.push(x);
}
}
var add_trailer_slash = true;
var x;
while (x = tmp.shift()){
if (x == '..' && base_path.length > 1){
// RFC2396, Section 4
// a .. or . in an absolute path has no special meaning
base_path.pop();
}else{
base_path.push(x);
for(var i=0,l=tmp.length;i<l;i++){
var t=tmp[i];
base_path.push(t);
}
add_trailer_slash = false;
break;
}
}
if (add_trailer_slash){
base_path.push('') ;
}
return base_path.join('/')
}
//merge_path("/abc/def/gy","./dde")
本文提供了一个基于RFC2396标准的路径合并算法实现,详细解释了如何通过解析相对路径和基准路径来生成新的绝对路径。该算法适用于Web开发中解决URL路径合并的问题。

796

被折叠的 条评论
为什么被折叠?



