'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
var Class = require('./Class');
var extend = require('./extend');
var trim = require('./trim');
var query = require('./query');
var isEmpty = require('./isEmpty');
var each = require('./each');
var isArr = require('./isArr');
var toArr = require('./toArr');
var isBrowser = require('./isBrowser');
var isObj = require('./isObj');
var toStr = require('./toStr');
exports = Class(
    {
        className: 'Url',
        initialize: function(url) {
            if (!url && isBrowser) url = window.location.href;
            extend(this, exports.parse(url || ''));
        },
        setQuery: function(name, val) {
            var query = this.query;
            if (isObj(name)) {
                each(name, function(val, key) {
                    query[key] = toStr(val);
                });
            } else {
                query[name] = toStr(val);
            }
            return this;
        },
        rmQuery: function(name) {
            var query = this.query;
            if (!isArr(name)) name = toArr(name);
            each(name, function(key) {
                delete query[key];
            });
            return this;
        },
        toString: function() {
            return exports.stringify(this);
        }
    },
    {
        parse: function(url) {
            var ret = {
                protocol: '',
                auth: '',
                hostname: '',
                hash: '',
                query: {},
                port: '',
                pathname: '',
                slashes: false
            };
            var rest = trim(url);
            var slashes = false;
            var proto = rest.match(regProto);
            if (proto) {
                proto = proto[0];
                ret.protocol = proto.toLowerCase();
                rest = rest.substr(proto.length);
            }
            if (proto) {
                slashes = rest.substr(0, 2) === '//';
                if (slashes) {
                    rest = rest.slice(2);
                    ret.slashes = true;
                }
            }
            if (slashes) {
                var host = rest;
                var hostEnd = -1;
                for (var i = 0, len = hostEndingChars.length; i < len; i++) {
                    var pos = rest.indexOf(hostEndingChars[i]);
                    if (pos !== -1 && (hostEnd === -1 || pos < hostEnd))
                        hostEnd = pos;
                }
                if (hostEnd > -1) {
                    host = rest.slice(0, hostEnd);
                    rest = rest.slice(hostEnd);
                }
                var atSign = host.lastIndexOf('@');
                if (atSign !== -1) {
                    ret.auth = decodeURIComponent(host.slice(0, atSign));
                    host = host.slice(atSign + 1);
                }
                ret.hostname = host;
                var port = host.match(regPort);
                if (port) {
                    port = port[0];
                    if (port !== ':') ret.port = port.substr(1);
                    ret.hostname = host.substr(0, host.length - port.length);
                }
            }
            var hash = rest.indexOf('#');
            if (hash !== -1) {
                ret.hash = rest.substr(hash);
                rest = rest.slice(0, hash);
            }
            var queryMark = rest.indexOf('?');
            if (queryMark !== -1) {
                ret.query = query.parse(rest.substr(queryMark + 1));
                rest = rest.slice(0, queryMark);
            }
            ret.pathname = rest || '/';
            return ret;
        },
        stringify: function(obj) {
            var ret =
                obj.protocol +
                (obj.slashes ? '//' : '') +
                (obj.auth ? encodeURIComponent(obj.auth) + '@' : '') +
                obj.hostname +
                (obj.port ? ':' + obj.port : '') +
                obj.pathname;
            if (!isEmpty(obj.query)) ret += '?' + query.stringify(obj.query);
            if (obj.hash) ret += obj.hash;
            return ret;
        }
    }
);
var regProto = /^([a-z0-9.+-]+:)/i;
var regPort = /:[0-9]*$/;
var hostEndingChars = ['/', '?', '#'];
 
module.exports = exports;