require('../platform/CCSys');
/* 扩展名 */
var EXTNAME_RE = /(\.[^\.\/\?\\]*)(\?.*)?$/;
/* 路径名 */
var DIRNAME_RE = /((.*)(\/|\\|\\\\))?(.*?\..*$)?/;
var NORMALIZE_RE = /[^\.\/]+\/\.\.\//;
/*
[^\.\/]解释:
除了. 和 /的元素
\/\.\.\/ 解释 /../
*/
/**
* !#en The module provides utilities for working with file and directory paths
* !#zh 用于处理文件与目录的路径的模块
* @class path
* @static
*/
cc.path = /** @lends cc.path# */{
/**
* !#en Join strings to be a path.
* !#zh 拼接字符串为 Path
* @method join
* @example {@link cocos2d/core/utils/CCPath/join.js}
* @returns {String}
*/
/* 注意下面的replace表达的是,参数以斜杠 和反斜杠结尾的 ,替换为空串 */
join: function () {
var l = arguments.length;
var result = "";
for (var i = 0; i < l; i++) {
result = (result + (result === "" ? "" : "/") + arguments[i]).replace(/(\/|\\\\)$/, "");
}
return result;
},
/* 在字符串中,两个反斜杠被解释为一个反斜杠,然后在作为正则表达式, \\ 则被正则表达式引擎解释为 \,所以在正则表达式中需要使用四个反斜杠。
也就是说,前两个反斜杠在字符串中被解释为一个反斜杠,后两个也被解释为一个反斜杠,这时解释完毕后变成两个反斜杠,再由正则表达式解释两个反斜杠,就又解释成了一个反斜杠,所以,在正则表达式中要匹配一个反斜杠时,需要四个反斜杠。
同理,要匹配点号时,需要在点号之前加上两个反斜杠,否则将被正则表达式当作一个点号,一个点号在正则表达式中表示匹配任意字符了。
*/
/**
* !#en Get the ext name of a path including '.', like '.png'.
* !#zh 返回 Path 的扩展名,包括 '.',例如 '.png'。
* @method extname
* @example {@link cocos2d/core/utils/CCPath/extname.js}
* @param {String} pathStr
* @returns {*}
*/
extname: function (pathStr) {
var temp = EXTNAME_RE.exec(pathStr);
return temp ? temp[1] : '';
},
/**
* !#en Get the main name of a file name
* !#zh 获取文件名的主名称
* @method mainFileName
* @param {String} fileName
* @returns {String}
* @deprecated
*/
mainFileName: function (fileName) {
if (fileName) {
var idx = fileName.lastIndexOf(".");
if (idx !== -1)
return fileName.substring(0, idx);//获取从头到最后一个点的所有name名称
}
return fileName;
},
/**
* !#en Get the file name of a file path.
* !#zh 获取文件路径的文件名。
* @method basename
* @example {@link cocos2d/core/utils/CCPath/basename.js}
* @param {String} pathStr
* @param {String} [extname]
* @returns {*}
*/
basename: function (pathStr, extname) {
//假如路径下有问号,则截取0到index
var index = pathStr.indexOf("?");
if (index > 0) pathStr = pathStr.substring(0, index);
var reg = /(\/|\\)([^\/\\]+)$/g;
/* 把斜杠和反斜杠结尾,替换为空 */
var result = reg.exec(pathStr.replace(/(\/|\\)$/, ""));
if (!result) return pathStr;
var baseName = result[2];
if (extname && pathStr.substring(pathStr.length - extname.length).toLowerCase() === extname.toLowerCase())
return baseName.substring(0, baseName.length - extname.length);
return baseName;
},
/**
* !#en Get dirname of a file path.
* !#zh 获取文件路径的目录名。
* @method dirname
* @example {@link cocos2d/core/utils/CCPath/dirname.js}
* @param {String} pathStr
* @returns {*}
*/
dirname: function (pathStr) {
var temp = DIRNAME_RE.exec(pathStr);
return temp ? temp[2] : '';
},
/**
* !#en Change extname of a file path.
* !#zh 更改文件路径的扩展名。
* @method changeExtname
* @example {@link cocos2d/core/utils/CCPath/changeExtname.js}
* @param {String} pathStr
* @param {String} [extname]
* @returns {String}
*/
changeExtname: function (pathStr, extname) {
extname = extname || "";
var index = pathStr.indexOf("?");
var tempStr = "";
if (index > 0) {
tempStr = pathStr.substring(index);//问号后面的东西,最后还要给加上
pathStr = pathStr.substring(0, index);//问号前的所有string
}
index = pathStr.lastIndexOf(".");//假如没有点。直接添加计划修改的扩展名和 问号后面的内容
if (index < 0) return pathStr + extname + tempStr;
return pathStr.substring(0, index) + extname + tempStr;
},
/**
* !#en Change file name of a file path.
* !#zh 更改文件路径的文件名。
* @example {@link cocos2d/core/utils/CCPath/changeBasename.js}
* @param {String} pathStr
* @param {String} basename
* @param {Boolean} [isSameExt]
* @returns {String}
*/
changeBasename: function (pathStr, basename, isSameExt) {
/* 假如basename有点,替换pathStr的扩展名为 basename */
if (basename.indexOf(".") === 0) return this.changeExtname(pathStr, basename);
/* 路径有问号 */
var index = pathStr.indexOf("?");
var tempStr = "";
var ext = isSameExt ? this.extname(pathStr) : "";
if (index > 0) {
tempStr = pathStr.substring(index);//问号后面的内容
pathStr = pathStr.substring(0, index);//问号前面的内容
}
index = pathStr.lastIndexOf("/");//最后一个路径标识位置
index = index <= 0 ? 0 : index + 1;
return pathStr.substring(0, index) + basename + ext + tempStr;
},
//todo make public after verification
//待核实后公开
_normalize: function (url) {
var oldUrl = url = String(url);
//removing all ../
do {
oldUrl = url;
url = url.replace(NORMALIZE_RE, "");
} while (oldUrl.length !== url.length);
return url;
},
// The platform-specific file separator. '\\' or '/'.
// 特定于平台的文件分隔符。 '\\' 或者 '/'。
sep: (cc.sys.os === cc.sys.OS_WINDOWS ? '\\' : '/'),
// @param {string} path
/* 假如结尾是斜线或者反斜线,替换为空串 */
stripSep(path) {
return path.replace(/[\/\\]$/, '');
}
};
module.exports = cc.path;
cocosCreator源码详解52
cocos49
游戏49
源码50
cocosCreator51
cocosCreator源码详解 · 目录
上一篇cocoscreator3.7.3构建打包apk环境配置下一篇CocosCreator 源码cocos2d/core/utils/profiler/CCProfiler.js详解