| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | "use strict";var _parseUrl = require("url").parse;/*	Customize the URL object that Node generates	because:		* necessary data for later	* urlObj.host is useless	* urlObj.hostname is too long	* urlObj.path is useless	* urlObj.pathname is too long	* urlObj.protocol is inaccurate; should be called "scheme"	* urlObj.search is mostly useless*/function clean(urlObj){	var scheme = urlObj.protocol;		if (scheme)	{		// Remove ":" suffix		if (scheme.indexOf(":") === scheme.length-1)		{			scheme = scheme.substr(0, scheme.length-1);		}	}		urlObj.host =	{		// TODO :: unescape(encodeURIComponent(s)) ? ... http://ecmanaut.blogspot.ca/2006/07/encoding-decoding-utf8-in-javascript.html		full: urlObj.hostname,		stripped: null	};		urlObj.path =	{		absolute:		{			array: null,			string: urlObj.pathname		},		relative:		{			array: null,			string: null		}	};		urlObj.query =	{		object: urlObj.query,		string:		{			full: null,			stripped: null		}	};		urlObj.extra =	{		hrefInfo:		{			minimumPathOnly: null,			minimumResourceOnly: null,			minimumQueryOnly: null,			minimumHashOnly: null,			empty: null,						separatorOnlyQuery: urlObj.search==="?"		},		portIsDefault: null,		relation:		{			maximumScheme: null,			maximumAuth: null,			maximumHost: null,			maximumPort: null,			maximumPath: null,			maximumResource: null,			maximumQuery: null,			maximumHash: null,						minimumScheme: null,			minimumAuth: null,			minimumHost: null,			minimumPort: null,			minimumPath: null,			minimumResource: null,			minimumQuery: null,			minimumHash: null,						overridesQuery: null		},		resourceIsIndex: null,		slashes: urlObj.slashes	};		urlObj.resource = null;	urlObj.scheme = scheme;	delete urlObj.hostname;	delete urlObj.pathname;	delete urlObj.protocol;	delete urlObj.search;	delete urlObj.slashes;		return urlObj;}function validScheme(url, options){	var valid = true;		options.rejectedSchemes.every( function(rejectedScheme)	{		valid = !(url.indexOf(rejectedScheme+":") === 0);				// Break loop		return valid;	});		return valid;}function parseUrlString(url, options){	if ( validScheme(url,options) )	{		return clean( _parseUrl(url, true, options.slashesDenoteHost) );	}	else	{		return {href:url, valid:false};	}}module.exports = parseUrlString;
 |