landers.base
Version:
landers.base
140 lines (130 loc) • 5.51 kB
JavaScript
; (function (window, $, Landers) {
Landers = Landers || {};
Landers.url = {
real: function(url){
var s1 = '../', s2 = '/';
while(url.indexOf(s1) > -1) {
var arr = url.split(s1);
var left = arr[0] || '';
var right = arr.slice(1).join(s1);
if (left) {
left = left.split(s2);
if (!left[left.length-1]) left.pop();
left.pop();
left = left.join(s2);
}
url = left + s2 + right;
}
return url;
},
build:function(protocol, host, path, port){
var ret = protocol + host;
if (port && port!=80) ret += ':' + port;
path = path || '';
var _ = path.indexOf('/')===0 ? '' : '/';
ret += _ + path; return ret;
},
qs:{
parse:function(str){
if (typeof str !== 'string') {
return {};
}
str = str.trim().replace(/^(\?|#)/, '');
if (!str) {
return {};
}
return str.trim().split('&').reduce(function (ret, param) {
var parts = param.replace(/\+/g, ' ').split('=');
var key = parts[0];
var val = parts[1];
key = decodeURIComponent(key);
// missing `=` should be `null`:
// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
val = val === undefined ? null : decodeURIComponent(val);
if (!ret.hasOwnProperty(key)) {
ret[key] = val;
} else if (Array.isArray(ret[key])) {
ret[key].push(val);
} else {
ret[key] = [ret[key], val];
}
return ret;
}, {});
},
stringify:function(obj){
return obj ? Object.keys(obj).map(function (key) {
var val = obj[key];
if (Array.isArray(val)) {
return val.map(function (val2) {
return encodeURIComponent(key) + '=' + encodeURIComponent(val2);
}).join('&');
}
return encodeURIComponent(key) + '=' + encodeURIComponent(val);
}).join('&') : '';
},
get:function(key, url) {
url = url || document.location.href;
var ret = null, submatch;
if (submatch = url.match(/\?([^#]*)#?/)){
var s = '&' + submatch[1];
var ret = this.parse(s);
if (ret) delete ret[''];
return key ? ret[key] : ret;
} else {
return '';
}
},
set:function(url, params){
url = url || document.location.href;
var parse = Landers.url.parse(url);
var anchor = parse.anchor ? ('#' + parse.anchor) : '';
if ( anchor ) url = url.replace(anchor, '');
for ( var key in params ){
var val = params[key];
val = encodeURI(val);
var reg = new RegExp('(\\?|&)'+ key +'=([^&]*)(&|$)','gi');
var pst = url.match(reg);
if (!Landers.utils.is_defined(pst)|| Landers.utils.is_null(pst)){
url += ((url.indexOf('?')==-1)?'?':'&') + key + '=' + val;
continue;
}
var t = pst[0];
var retxt = t.substring(0,t.indexOf('=')+1) + val;
if (t.charAt(t.length-1)=='&') retxt += '&';
url = url.replace(reg,retxt);
}
url += anchor;
return url;
}
},
parse:function(url, field){
var ret = {},
ports = {
http:80, https:443, ftp:21
},
f = {
3:'protocol', 5:'user', 6:'pwd',
7:'host', 8:'port', 9:'path',
10:'query', 11:'anchor'
};
// var reg = /^((\w+):\/\/)?((\w+):?(\w+)?@)?([^\/\?:]+):?(\d+)?(\/?[^\?#]+)?\??([^#]+)?#?(\w*)/;
// var reg = /^(((\w+):)?\/\/)?((\w+):?(\w+)?@)?([^\/\?:]+):?(\d+)?(\/?[^\?#]+)?\??([^#]+)?#?(\w*)/;
var reg = /^(((\w+):)?\/\/)?((\w+):?(\w+)?@)?([^\/\?:]+)?:?(\d+)?(\/?[^\?#]+)?\??([^#]+)?#?(.*)/;
var r = reg.exec(url);
if (!r) return ;
for (var k in r) {if (f[k]===undefined) continue; ret[f[k]] = r[k]}
reg = /(.*)\/((.*)\.(.*))$/;
r = reg.exec(ret.path);
if (r) {
ret.dirname = r[1]; ret.filename = r[2];
ret.basename = r[3]; ret.extname = r[4];
};
if ( !ret.port && ret.protocol) ret.port = ports[ret.protocol];
if ( ret.host ){
var a = ret.host.split('.');
ret['domain'] = a[a.length-2] + '.' + a[a.length-1];
}
return field ? ret[field] : ret;
}
};
})(this, jQuery, Landers);