function parseUrl(url, options) { if (options.defaultPorts != null) { url = urlobj.parse(url, {defaultPorts:options.defaultPorts}); } else { // Avoid overriding the default value of `defaultPorts` with null/undefined url = urlobj.parse(url); } if (options.normalizeUrls === true) { urlobj.normalize(url); } if (options.stripUrlHashes===true && url.hash!=null) { url.hash = null; url.href = stringifyUrl(url); } return url; }
linkObj.resolve = function(link, base, options) { // If already resolved if (link.resolved === true) return; // Parity with core `url.resolve()` var parseOptions = { slashesDenoteHost:true }; // TODO :: we're constantly re-parsing base and html base -- find way to cache them var base_parsed = base==null ? "" : base; base_parsed = urlobj.normalize( urlobj.parse(base_parsed, parseOptions) ); var htmlBase_parsed = link.html.base==null ? "" : link.html.base; htmlBase_parsed = urlobj.normalize( urlobj.parse(htmlBase_parsed, parseOptions) ); // TODO :: options.normalize=false // TODO :: options.clone=true ? var resolvedBase_parsed = urlobj.resolve(base_parsed, htmlBase_parsed); if (resolvedBase_parsed.hash !== null) { // Hashes are useless in a base resolvedBase_parsed.hash = null; resolvedBase_parsed.href = urllib.format(resolvedBase_parsed); // TODO :: use urlobj.format() when available } // TODO :: is this necessary if `link.base.parsed` is cleaned? if (base_parsed.hash !== null) { // Hashes are useless in a base base_parsed.hash = null; base_parsed.href = urllib.format(base_parsed); // TODO :: use urlobj.format() when available } // `link.url.original` should only ever not have a value within internal tests var linkOrg_parsed = link.url.original==null ? "" : link.url.original; linkOrg_parsed = urlobj.parse(linkOrg_parsed, parseOptions); urlobj.normalize(linkOrg_parsed); // `linkOrg_parsed` is cloned to avoid it being mutated // TODO :: options.clone=true var resolvedUrl_parsed = urlobj.resolve( resolvedBase_parsed, cloneObject(linkOrg_parsed) ); if (base !== undefined) { link.base.original = base; } // TODO :: use url types (>UNKNOWN && !=EMPTY ... not simple enough) if (resolvedBase_parsed.href !== "") { link.base.resolved = parity(resolvedBase_parsed.href); } link.base.parsed = base_parsed; // If resolved link has accepted scheme if (options.acceptedSchemes[ resolvedUrl_parsed.extra.protocolTruncated ] === true) { link.url.resolved = parity(resolvedUrl_parsed.href); link.url.parsed = resolvedUrl_parsed; // TODO :: move relation stuff out of this function -- separation of concerns? linkObj.relation(link); } // Else could not be properly resolved else { link.url.parsed = linkOrg_parsed; // If at least resolved to absolute if (resolvedUrl_parsed.extra.type === urlobj.type.ABSOLUTE) { // If base is accepted scheme if (options.acceptedSchemes[ base_parsed.extra.protocolTruncated ] === true) { link.internal = false; link.samePage = false; } } } // Avoid future resolving link.resolved = true; return link; };