You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hunjianghu/江可飞/小程序开发/html-view/vendors/url.js

186 lines
5.0 KiB

(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['module', 'exports'], factory);
} else if (typeof exports !== "undefined") {
factory(module, exports);
} else {
var mod = {
exports: {}
};
factory(mod, mod.exports);
global.url = mod.exports;
}
})(this, function (module, exports) {
'use strict';
exports.__esModule = true;
function parseQuery(str) {
var query = {};
if (str.length) {
str.replace(/\+/g, ' ').split('&').forEach(function (s) {
var pair = s.split('=');
var key = decodeURIComponent(pair[0]);
var val = pair.length === 1 ? '' : decodeURIComponent(pair[1]);
if (query[key] == null) {
query[key] = val;
} else {
if (query[key].constructor !== Array) query[key] = [query[key]];
query[key].push(val);
}
});
}
return query;
}
function formatQuery(obj) {
var str = '';
var _loop = function _loop(p) {
var key = encodeURIComponent(p);
[].concat(obj[p]).forEach(function (val) {
if (val == null) return;
str += '&' + key;
if (val !== '') str += '=' + encodeURIComponent(val);
});
};
for (var p in obj) {
_loop(p);
}
return str.slice(1);
}
function parse(str) {
var m = /^(?:([^:/?#]+:))?(?:\/\/(?:(([^:@]*)(?::([^:@]*))?)?@)?(([^:/?#]*)(?::(\d*))?))?(((?:[^?#/]*\/)*[^?#]*)(?:(\?[^#]*))?)(?:(#.*))?/.exec(str);
var url = {};['href', 'protocol', 'auth', 'username', 'password', 'host', 'hostname', 'port', 'path', 'pathname', 'search', 'hash'].forEach(function (key, i) {
return url[key] = m[i] || '';
});
if (!url.path && !url.pathname) url.path = url.pathname = '/';
url.query = parseQuery(url.search.slice(1));
return url;
}
function format() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref$protocol = _ref.protocol,
protocol = _ref$protocol === undefined ? '' : _ref$protocol,
_ref$auth = _ref.auth,
auth = _ref$auth === undefined ? '' : _ref$auth,
_ref$username = _ref.username,
username = _ref$username === undefined ? '' : _ref$username,
_ref$password = _ref.password,
password = _ref$password === undefined ? '' : _ref$password,
_ref$host = _ref.host,
host = _ref$host === undefined ? '' : _ref$host,
_ref$hostname = _ref.hostname,
hostname = _ref$hostname === undefined ? '' : _ref$hostname,
_ref$port = _ref.port,
port = _ref$port === undefined ? '' : _ref$port,
_ref$path = _ref.path,
path = _ref$path === undefined ? '' : _ref$path,
_ref$pathname = _ref.pathname,
pathname = _ref$pathname === undefined ? '' : _ref$pathname,
_ref$search = _ref.search,
search = _ref$search === undefined ? '' : _ref$search,
_ref$query = _ref.query,
query = _ref$query === undefined ? null : _ref$query,
_ref$hash = _ref.hash,
hash = _ref$hash === undefined ? '' : _ref$hash;
var str = '';
if (protocol) {
str += protocol;
if (protocol.slice(-1) !== ':') str += ':';
}
if (protocol || host || hostname) str += '//';
if (host || hostname) {
if (auth) {
str += auth + '@';
} else if (username) {
str += username;
if (password) str += ':' + password;
str += '@';
}
if (host) {
str += host;
} else {
str += hostname;
if (port) str += ':' + port;
}
}
if (path) {
str += path;
} else {
str += pathname || '/';
if (search) {
str += search;
} else if (query) {
var q = formatQuery(query);
if (q) str += '?' + q;
}
}
str += hash;
return str;
}
function resolve(from, to) {
from = parse(from);
to = parse(to);
// 'to' is an absolute URL
if (to.protocol) return to.href;
// 'to' only need to complete the protocol
if (to.host) {
to.protocol = from.protocol;
return format(to);
}
// 'to' has aboslute path
if (to.path[0] === '/') {
from.path = to.path;
from.pathname = from.search = '';
from.query = null;
from.hash = to.hash;
return format(from);
}
if (to.pathname) {
(function () {
var dirFrom = from.pathname.split('/');
// pop the filename
dirFrom.pop();
to.pathname.split('/').forEach(function (d) {
switch (d) {
case '.':
return;
case '..':
return dirFrom.length > 1 ? dirFrom.pop() : null;
default:
dirFrom.push(d);
}
});
from.pathname = dirFrom.join('/');
})();
}
from.path = '';
from.search = to.search;
from.query = null;
from.hash = to.hash;
return format(from);
}
exports.default = { parse: parse, format: format, resolve: resolve, parseQuery: parseQuery, formatQuery: formatQuery };
module.exports = exports['default'];
});