UNPKG

landers.base

Version:

landers.base

140 lines (130 loc) 5.51 kB
; (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);