31 lines
994 B
JavaScript
31 lines
994 B
JavaScript
'use strict'
|
|
|
|
module.exports = function parseURI (str, opts) {
|
|
opts = opts || {}
|
|
|
|
var o = {
|
|
key: ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'],
|
|
q: {
|
|
name: 'queryKey',
|
|
parser: /(?:^|&)([^&=]*)=?([^&]*)/g
|
|
},
|
|
parser: {
|
|
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
|
|
loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
|
|
}
|
|
}
|
|
|
|
var m = o.parser[opts.strictMode ? 'strict' : 'loose'].exec(str)
|
|
var uri = {}
|
|
var i = 14
|
|
|
|
while (i--) uri[o.key[i]] = m[i] || ''
|
|
|
|
uri[o.q.name] = {}
|
|
uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
|
|
if ($1) uri[o.q.name][$1] = $2
|
|
})
|
|
|
|
return uri
|
|
}
|