示例#1
0
文件: index.js 项目: at3158/nodetest2
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;
};