/ 闭门造轮子 / 解决jslib-builder中波浪号文件名排序问题

解决jslib-builder中波浪号文件名排序问题

2012-05-15 posted in [问题即经验]

jslib项目中我用到了包含波浪号的文件名,意图是区分命名空间中的实体对象和仅作为辅助执行过程的代码片段,所有以~开头的文件或文件夹都认为不是一个实体命名空间。在Windows资源管理器中以波浪线开头的文件排序是在字母之前的,但Linux或者程序下的默认排序是按字符ASCII码排的,而波浪线~的编码是126(0x7e)导致波浪线开头的文件都排在最后,而在jslib-builder打包器中有小部分虚体过程是无法设置依赖,但又需要优先于其他文件合并,这样波浪号开头的文件排序靠后就带来了问题,我必须在获取文件列表时将波浪号开头文件的顺序重排到字母之前。

解决的思路是通过自定义方法排序,在比较方法中将文件名中出现的~替换成一个比字母数字编码靠前的符号来计算,这样在获取文件列表时就可以得到波浪号在前的最终顺序了。

实施过程还算顺利,顺便记下几点PHP的Tips:

另外还顺便了解到波浪号的英文:tilde

剩下上代码吧,其实很简单:

/**
 * 调整波浪号的字符顺序,以排序到字母之前
 */
function fix_tilde_code ($str) {
	return str_replace('~', '/', $str);
}

/**
 * 加入波浪号修正顺序的字符串排序
 */
function fix_tilde_order (&$list) {
	usort($list, function ($a, $b) {
		return fix_tilde_code($a) <= fix_tilde_code($b) ? -1 : 1;
	});
}

-EOF-