-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathurl-canon.js
52 lines (46 loc) · 1.17 KB
/
url-canon.js
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
module.exports = function urlCanon(rawUrl) {
return compose(
replaceSearch(sortQuery),
removeTrailing,
normalizeEscaped,
parse
)(rawUrl);
};
function parse(href) {
var parser = document.createElement('a');
parser.href = href;
return parser.href;
}
function normalizeEscaped(href) {
return href.replace(/(%[0-9a-f]{2})+/ig, function (match) {
return encodeURIComponent(decodeURIComponent(match));
});
}
function removeTrailing(href) {
return href
.replace(/^([^#]*)#$/, function (match, p1) { return p1; })
.replace(/^([^?#]*)\?$/, function (match, p1) { return p1; })
.replace(/^([^?]*)\?#/, function (match, p1) { return p1 + '#'; });
}
function replaceSearch(fn) {
return function (href) {
return href.replace(/\?([^?#]*)/, function (match, search) {
return '?' + fn(search);
});
};
}
function sortQuery(query) {
return query.split('&').sort().join('&');
}
function compose() {
var args = arguments;
var start = args.length - 1;
return function () {
var i = start;
var result = args[start].apply(this, arguments);
while (i--) {
result = args[i].call(this, result);
}
return result;
};
}