`
bellstar
  • 浏览: 150698 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JavaScript path merge

阅读更多

从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")

 

分享到:
评论
2 楼 bellstar 2009-01-15  
jindw 写道

一目十行,不知所云,呵呵可以解释一下什么意思吗?没搞过ruby,呵呵,不知道它完成了那些功能?

这是javascript,功能就是参照一个绝对地址求另一个相对地址的绝对地址,
merge_path(绝对地址,相对地址)
1 楼 jindw 2009-01-15  
一目十行,不知所云,呵呵

可以解释一下什么意思吗?
没搞过ruby,呵呵,不知道它完成了那些功能?

相关推荐

    前端开源库-grunt-geojson-merge

    src: ['path/to/geojson/files/*.geojson'], dest: 'output/merged.geojson' } } }); grunt.loadNpmTasks('grunt-geojson-merge'); grunt.registerTask('default', ['geojsonmerge']); }; ``` 这里,`src`...

    npm-merge-driver:git merge驱动程序,用于解决与npm相关的文件中的冲突

    merge-driver(1)-用于自动合并锁文件的git merge驱动程序自动设置(推荐): 要立即开始使用它: $ npx npm-merge-driver install --global或按项目在本地安装: $ cd /path/to/git/repository$ npx npm-merge-...

    json-files-merge-loader:用于Webpack的JSON文件合并加载器

    // path to all files to load/merge together ] } files数组中列出的每个文件都必须是JSON文件。 每个文件的路径必须是从应用程序模块的根开始的相对路径(例如src / filesToMerge / file1.json)。 安装 npm ...

    Ramda一个JavaScript程序员的实用函数库

    7. **函数工具**:Ramda提供了大量实用的工具函数,如`assoc`用于添加属性到对象,`path`用于访问嵌套对象属性,`merge`用于合并对象,以及`thunkify`用于转换异步函数等。 8. **部分应用(Partial Application)**:...

    MySQL and JSON A Practical Programming Guide 2018

    Practical instruction on using JavaScript Object Notation (JSON) with MySQL This hands-on guide teaches, step by step, how to use JavaScript Object Notation (JSON) with MySQL. Written by a MySQL ...

    matlab声线图源代码-atomic:我建议的Atom设置。根据需要更新

    language-javascript-jsx linter linter-eslint linter-flow mac-fix-path merge-conflicts minimap minimap-autohide minimap-bookmarks minimap-find-and-replace minimap-git-diff minimap-hide minimap-...

    doc-merge:解析文档的东西......一切都很疯狂和破碎,你现在应该忽略它

    文档合并 用于将 Polymer 元素文档合并在一起的工具。 示例用法 查看demo.js文件 ...var generate = require('doc-merge'); generate(FIXTURES, OUTPUT, {config: 'test/fixtures/config.json' });

    JS、CSS合并压缩工具说明

    JS、CSS 合并压缩工具是用于优化前端资源加载效率的重要工具,它们能够将多个 JavaScript 和 CSS 文件合并为一个文件,并进行压缩,减少网络请求次数,从而提高网页加载速度。本篇将详细介绍名为 TomsTools 的一套 ...

    一个链接API,用来生成和简化Webpack配置的修改.zip

    `webpack-chain` 也很好地与 `webpack-merge` 集成,允许你在多个配置文件之间合并差异。 通过以上介绍,我们可以看到 `webpack-chain` 为 Webpack 配置带来了极大的灵活性和可维护性。尽管它增加了学习曲线,但...

    fis-postprocessor-jswrapper:Fis的后处理器插件,用于使用闭包或amd定义包装JavaScript

    fis-postprocessor-jswrapper Fis的后处理器插件,用于使用闭包或amd定义包装JavaScript。设定$ vi path/to/project/fis-conf.jsfis . config . merge ( { settings : { postprocessor : { jswrapper : { //wrap ...

    webpack4 从零学习常用配置(小结)

    Webpack 4 是一款强大的前端模块打包工具,它能够解析、转换和优化JavaScript、CSS、图片等各类资源,形成可供浏览器使用的静态资源。本篇文章主要针对Webpack 4的基础配置进行总结,帮助开发者快速理解和掌握其核心...

    nodejs 解析html根据标签提取需要合并的js、css,并且更新html

    "output_path": "D:\\projects\\github_project\\merge_js_css\\examples\\output", //输出合并后js、css的目录 "tmp_js_json_dir": "D:\\projects\\github_project\\merge_js_css\\examples\\json\\js", //js合并...

    Webpack简易教程

    这只是Webpack基础入门的冰山一角,实际项目中还需要配置解决模块路径(resolve)、优化(optimization)、多环境支持(webpack-merge)、热更新(Hot Module Replacement)等更多高级特性。继续深入学习,你将能够...

    Algorithms:Python,Java和Javascript中的一些算法

    其中,排序算法如快速排序(Quick Sort)、归并排序(Merge Sort)和堆排序(Heap Sort)是常见的数据结构操作。搜索算法如二分查找(Binary Search)和广度优先搜索(BFS)也是Python开发者需要熟练掌握的。此外,...

    PureJS (6.6):配置 Spket 智能感知

    3. **添加库文件路径**:在新建的库配置中,点击“File Path”文本框,浏览并选择刚才导入的PureJS库文件。这告诉Spket在哪里查找PureJS的定义。 4. **定义库成员**:为了让Spket知道PureJS中的所有函数和对象,你...

    前端开源库-dot-object

    - **merge**: 使用 `dot.merge(obj1, obj2)` 合并两个对象,其中 `obj2` 的属性会覆盖 `obj1` 的同名属性。 - **transform**: 使用 `dot.transform(obj, rules)` 可以根据预定义的规则(规则由点表示法指定)转换...

    webrtc depot_tools 工具(windows)

    解压后,你需要将`depot_tools`的路径添加到系统的PATH环境变量中,这样在命令行中就可以直接调用这些工具了。 `depot_tools`包含了一些关键工具,如: 1. **gclient**:这是一个Python脚本,用于管理依赖关系。在...

    vue3-ts 编辑svg 合并svg

    TypeScript是一种强类型的JavaScript超集,它提供了静态类型检查,可以提升代码质量和可维护性。 在编辑SVG时,我们可以使用一些前端库,如`svg.js`或`Snap.svg`,它们提供了丰富的API来操作SVG元素。Vue3可以通过`...

    0226NodeJS文件合并packagejson配置Demo

    1. 工具库:在实际开发中,可以创建一个名为`merge-package-json`的Node.js工具库,提供命令行接口,方便开发者合并多模块的`package.json`配置。 2. CI/CD集成:结合GitLab CI/CD或者GitHub Actions,自动化执行...

    git代码操作

    cd path/to/local/repository git pull ``` **3. 创建与切换分支**: - 创建新分支: ```bash git branch ``` - 切换到指定分支: ```bash git checkout ``` **4. 提交更改**: - 添加文件到暂存区: ...

Global site tag (gtag.js) - Google Analytics