MODULES Uize.Url
- Contents
- 1. Introduction
-
2. Static Methods
- 2.1. Uize.Url.from
- 2.2. Uize.Url.fromParams
- 2.3. Uize.Url.fromPiece
- 2.4. Uize.Url.getCacheDefeatStr
- 2.5. Uize.Url.resolve
- 2.6. Uize.Url.toAbsolute
- 2.7. Uize.Url.toParams
- 2.8. Uize.Url.toPiece
- 2.9. Uize.Url.toRelative
- 3. Static Properties
1. Introduction
The Uize.Url
module eases working with URLs, supporting query string parsing and serialization, resolving relative URLs to absolute URLs, and more.
DEVELOPERS: Chris van Rensburg
1.1. Examples
There are no dedicated showcase example pages for the Uize.Url
module.
SEARCH FOR EXAMPLES
Use the link below to search for example pages on the UIZE Web site that reference the Uize.Url
module...
SEARCH
1.2. Implementation Info
The Uize.Url
module defines the Uize.Url
package under the Uize
namespace.
1.2.1. Features Introduced in This Module
The features listed in this section have been introduced in this module.
STATIC METHODS
Uize.Url.from
| Uize.Url.fromParams
| Uize.Url.fromPiece
| Uize.Url.getCacheDefeatStr
| Uize.Url.resolve
| Uize.Url.toAbsolute
| Uize.Url.toParams
| Uize.Url.toPiece
| Uize.Url.toRelative
STATIC PROPERTIES
1.2.2. Features Overridden in This Module
No features have been overridden in this module.
1.2.3. Features Inherited From Other Modules
This module has no inherited features.
1.2.4. Modules Directly Under This Namespace
There are no modules directly under this namespace.
1.2.5. Unit Tests
The Uize.Url
module is unit tested by the Uize.Test.Uize.Url
test module.
2. Static Methods
2.1. Uize.Url.from
Returns an object, containing properties for the various logical segments of the specified URL string.
SYNTAX
urlSegmentsOBJ = Uize.Url.from (urlSTR);
This method provides a convenient way to get at very precise portions of a URL string, such as the file name without the extension, the file type without the "." (period) character, the query params string without the "?" (question mark) character, the anchor without the "#" (pound / hash) character, etc.
2.1.1. URL Segment Properties
The urlSegmentsOBJ
object returned by this method has the following structure...
URL SEGMENTS OBJECT
{ href : hrefSTR, // http://uize.com:80/reference/Uize.html?param=value#anchor fullDomain : fullDomainSTR, // http://uize.com:80 protocol : protocolSTR, // http: host : hostSTR, // uize.com:80 hostname : hostnameSTR, // uize.com port : portSTR, // 80 pathname : pathnameSTR, // /reference/Uize.html folderPath : folderPathSTR, // /reference/ file : fileSTR, // Uize.html fileName : fileNameSTR, // Uize extension : extensionSTR, // .html fileType : fileTypeSTR, // html search : searchSTR, // ?param=value query : querySTR, // param=value hash : hashSTR, // #anchor anchor : anchorSTR // hash }
The URL segment properties are described in more detail below...
2.1.1.1. href
A string, representing the entire URL string parsed by the Uize.Url.from
method.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<----------------------------------------------------->| VALUE : http://uize.com:80/reference/Uize.html?param=value#anchor
NOTES
this property is equivalent to the same named property of the window.location object (see Properties Consistent with window.location) |
2.1.1.2. fullDomain
A string, representing the portion of the URL comprised of the protocol
, "//" (two forward slashes), and the host
.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<-------------->| VALUE : http://uize.com:80
NOTES
for relative URLs that only specify a pathname and/or search and/or hash , the value of this property will be '' (an empty string) |
2.1.1.3. protocol
A string, representing the Internet protocol in use by the URL (e.g. http
, ftp
, irc
, ssh
, etc.)
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<->| VALUE : http:
NOTES
for relative URLs that only specify a pathname and/or search and/or hash , the value of this property will be '' (an empty string) |
|
this property is equivalent to the same named property of the window.location object (see Properties Consistent with window.location) |
2.1.1.4. host
A string, representing the portion of the URL comprised of the hostname
, followed by a ":" (colon) character and the port
if a port is present in the URL.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<------->| VALUE : uize.com:80
NOTES
for relative URLs that only specify a pathname and/or search and/or hash , the value of this property will be '' (an empty string) |
|
this property is equivalent to the same named property of the window.location object (see Properties Consistent with window.location) |
2.1.1.5. hostname
A string, representing the portion of the URL comprised of just the name of the host (i.e. domain name or IP address) and without the protocol
and port
portions.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<---->| VALUE : uize.com
NOTES
for relative URLs that only specify a pathname and/or search and/or hash , the value of this property will be '' (an empty string) |
|
this property is equivalent to the same named property of the window.location object (see Properties Consistent with window.location) |
2.1.1.6. port
A string, representing the portion of the URL that specifies the port on which to communicate with a server.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : ^^ VALUE : 80
Most URLs will not contain an explicit port, and the port will typically be defaulted by the server to 80 for communication via HTTP, and 443 for secure communication via HTTPS. For URLs that do not specify a port, the value of the port
property will be ''
(an empty string).
NOTES
for relative URLs that only specify a pathname and/or search and/or hash , the value of this property will be '' (an empty string) |
|
this property is equivalent to the same named property of the window.location object (see Properties Consistent with window.location) |
2.1.1.7. pathname
A string, representing the portion of the URL comprised of the folderPath
and file
, and excluding the fullDomain
, search
, and hash
.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<---------------->| VALUE : /reference/Uize.html
NOTES
this property is equivalent to the same named property of the window.location object (see Properties Consistent with window.location) |
2.1.1.8. folderPath
A string, representing the complete path to a folder (which may include multiple nested folder levels), and excluding the fullDomain
, file
, search
, and hash
.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<------->| VALUE : /reference/
2.1.1.9. file
A string, representing the portion of the URL comprised of just the fileName
and extension
, and excluding the fullDomain
, folderPath
, search
, and hash
.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<----->| VALUE : Uize.html
2.1.1.10. fileName
A string, representing the portion of the URL that specifies just the file name for a file, and excluding its extension
.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<>| VALUE : Uize
2.1.1.11. extension
A string, representing the portion of the URL that specifies just the file extension for a file, and excluding its fileName
.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<->| VALUE : .html
Unlike the fileType
property, the extension
property contains the conventional "." (period character) delimiter that separates the fileName
and fileType
.
2.1.1.12. fileType
A string, representing the portion of the URL that specifies just the file type for a file, and excluding the conventional "." (period character) delimiter that separates the fileName
and fileType
.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<>| VALUE : html
2.1.1.13. search
A string, representing the portion of the URL comprised of the "?" (question mark) character and query
, if present in the URL.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<-------->| VALUE : ?param=value
Unlike the query
property, the search
property contains the conventional "?" (question mark character) that delimits the query
from preceding portions of the URL.
NOTES
this property is equivalent to the same named property of the window.location object (see Properties Consistent with window.location) |
2.1.1.14. query
A string, representing the portion of the URL that specifies just the query parameters, and excluding the conventional "?" (question mark character) that delimits the query
from preceding portions of the URL.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<------->| VALUE : param=value
2.1.1.15. hash
A string, representing the portion of the URL comprised of the "#" (hash / pound) character and anchor
, if present in the URL.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<--->| VALUE : #anchor
Unlike the anchor
property, the hash
property contains the conventional "#" (hash / pound character) that delimits the anchor
from preceding portions of the URL.
NOTES
this property is equivalent to the same named property of the window.location object (see Properties Consistent with window.location) |
2.1.1.16. anchor
A string, representing the portion of the URL that specifies just the anchor name, and excluding the conventional "#" (hash / pound character) that delimits the anchor
from preceding portions of the URL.
ILLUSTRATION
URL : http://uize.com:80/reference/Uize.html?param=value#anchor PORTION : |<-->| VALUE : anchor
2.1.2. Properties Consistent with window.location
Of the properties in the urlSegmentsOBJ
object returned by the Uize.Url.from
method, the properties href
, protocol
, host
, hostname
, port
, pathname
, search
, and hash
are consistent with the properties of the built-in window.location
object.
2.1.3. URL Segments, as a Tree
The following diagram shows the properties of the urlSegmentsOBJ
object as a tree structure, illustrating the relationship between the properties...
URL SEGMENTS, AS A TREE
href |__ fullDomain | |__ protocol | |__ // | |__ host | |__ hostname | |__ : | |__ port | |__ pathname | |__ folderPath | |__ file | |__ fileName | |__ extension | |__ . | |__ fileType | |__ search | |__ ? | |__ query | |__ hash |__ # |__ anchor
2.1.4. Reconstructing a URL String
A URL string can be reconstructed from a urlSegmentsOBJ
type value in one of the following ways...
urlStr = urlSegments.fullDomain + urlSegments.pathname + urlSegments.search + urlSegments.hash ; urlStr = urlSegments.fullDomain + urlSegments.folderPath + urlSegments.file + urlSegments.search + urlSegments.hash ; urlStr = urlSegments.fullDomain + urlSegments.folderPath + urlSegments.fileName + urlSegments.extension + urlSegments.search + urlSegments.hash ;
If you wish to reconstruct a URL string using any of the more granular URL segment properties, such as protocol
, hostname
, port
, fileType
, query
, etc., then you will have to use logic to conditionally include the delimiters //
, :
, .
, ?
, and #
.
NOTES
see also the Uize.Url.fromParams and Uize.Url.fromPiece static methods |
IMPLEMENTATION INFO
this feature was introduced in this module |
2.2. Uize.Url.fromParams
A utility method that parses a query string and returns the query parameters as an object.
SYNTAX
paramsOBJ = Uize.Url.fromParams (queryParamsSTR);
This method assumes that the query string was serialized using "&" to separate parameters, and "=" to separate parameter name from parameter value in each name/value pair.
EXAMPLE
Uize.Url.fromParams ('category=holiday&type=all&results=20');
With the above query string, the Uize.Url.fromParams
method would produce the object...
{ category:'holiday', type:'all', results:'20' }
The value of the queryParamsSTR
parameter may contain a prepended query '?' character, and even a URL path. These will simply be ignored when parsing the query parameters, so this method can be applied to a complete URL without worrying about first having to remove the path. So, extending on the above example, the same result would be produced if the value of the queryParamsSTR
parameter was 'http://www.somedomain.com/search?category=holiday&type=all&results=20'
.
NOTES
when parsing the query string, all parameter values are treated as strings | |
see also the corresponding Uize.Url.toParams static method |
IMPLEMENTATION INFO
this feature was introduced in this module |
2.3. Uize.Url.fromPiece
Returns a string, representing the decoded form of the specified URL segment string.
SYNTAX
unencodedSTR = Uize.Url.fromPiece (encodedUrlPieceSTR);
EXAMPLE
unencoded = Uize.Url.fromPiece ('solar%2C%20wind%2C%20efficiency%20%26%20biofuels');
After executing the above statement, the variable unencoded
would have the value 'solar, wind, efficiency & biofuels'
.
NOTES
see also the corresponding Uize.Url.toPiece static method |
IMPLEMENTATION INFO
this feature was introduced in this module |
2.4. Uize.Url.getCacheDefeatStr
A utility method that returns a string value, generated using time and a random number, that can then be used as a uniquifying query parameter on request URLs in order to defeat client caching.
SYNTAX
cacheDefeatSTR = Uize.Url.getCacheDefeatStr ();
NOTES
this method takes no parameters |
IMPLEMENTATION INFO
this feature was introduced in this module |
2.5. Uize.Url.resolve
Returns a string, representing a URL that has been resolved from the specified URL path string and query params object.
SYNTAX
urlSTR = Uize.Url.resolve (urlPathSTR,urlParamsOBJ);
EXAMPLE
searchUrl = Uize.Url.resolve ( 'http://www.somedomain.com/search', { category:'holiday', type:'all', results:'20' } );
In the above example, the Uize.Url.resolve
method would produce the result 'http://www.somedomain.com/search?category=holiday&type=all&results=20'
.
2.5.1. An Existing Query Character
The value of the urlPathSTR
parameter may already contain a query '?' character at the end.
If this is the case, the Uize.Url.resolve
method will not add an additional query character. So, the following example would produce the same result as the first example...
EXAMPLE
searchUrl = Uize.Url.resolve ( 'http://www.somedomain.com/search?', { category:'holiday', type:'all', results:'20' } );
In the above example, the Uize.Url.resolve
method would produce the result 'http://www.somedomain.com/search?category=holiday&type=all&results=20'
.
2.5.2. Augmenting Existing Query Params
The value of the urlPathSTR
parameter may already contain query parameters.
If this is the case, the Uize.Url.resolve
method will concatenate the additional query parameters using the '&' query param delimiter.
EXAMPLE
searchUrl = Uize.Url.resolve ( 'http://www.somedomain.com/search?sort=recent', { category:'holiday', type:'all', results:'20' } );
In the above example, the Uize.Url.resolve
method would produce the result 'http://www.somedomain.com/search?sort=recent&category=holiday&type=all&results=20'
.
2.5.3. Modifying Existing Query Params
The value of the urlPathSTR
parameter may contain query parameters whose values you wish to modify.
Overwriting existing values for query params is handled automatically by the Uize.Url.resolve
method - all you have to do is specify the new values in the urlParamsOBJ
parameter.
EXAMPLE
searchUrl = Uize.Url.resolve ( 'http://www.somedomain.com/search?sort=recent&results=20', { sort:'popular', // overwrites existing sort param in URL category:'holiday', type:'all', results:'100' // overwrites existing results param in URL } );
In the above example, the Uize.Url.resolve
method would produce the result 'http://www.somedomain.com/search?sort=popular&results=100&category=holiday&type=all'
.
2.5.4. Removing Existing Query Params
The value of the urlPathSTR
parameter may contain query parameters that you wish to remove.
Removing existing query params from a URL can be accomplished by specifying the value null
for the params you wish to remove in the urlParamsOBJ
parameter. You can specify to remove params that don't exist in the URL, without any ill effects - those params will simply be ignored.
EXAMPLE
searchUrl = Uize.Url.resolve ( 'http://www.somedomain.com/search?sort=recent&results=20', { sort:null, // removes existing sort param in URL category:null, // would remove category param in URL, if it existed type:'all', results:null // removes existing results param in URL } );
In the above example, the Uize.Url.resolve
method would produce the result 'http://www.somedomain.com/search?type=all'
.
2.5.5. Variations
The Uize.Url.resolve
method is quite versatile in its signature, with several variations that can come in handy under different circumstances.
VARIATION 1
urlSTR = Uize.Url.resolve (urlPathSTR,urlParamsObjectsARRAY);
When a urlParamsObjectsARRAY
parameter is specified, multiple params objects can be specified in an array. This provides for an easy way to merge query param sets from multiple sources, or to blend fixed params with parameterized params (e.g. passed in a method call), or to override the values in param sets. The values from params objects later in the array override those from earlier params objects. None of the objects in the array will be modified by the operation.
EXAMPLE
var defaultSearchSettings = { sort:'recent', type:'all', results:'20' }; searchUrl = Uize.Url.resolve ( 'http://www.somedomain.com/search', [ defaultSearchSettings, { category:'holiday', sort:'popular' } ] );
In the above example, the values of the category
and sort
properties of the second params object in the urlParamsObjectsARRAY
value would be stitched in to the values provided by the defaultSearchSettings
query params object that appears first in the array, with the value of the sort
property of the second params object overriding the value contained in the defaultSearchSettings
object, and with the defaultSearchSettings
object not being modified in the process.
VARIATION 2
urlSTR = Uize.Url.resolve (urlPathAndParamsObjectsARRAY);
Another versatile variation allows a single urlPathAndParamsObjectsARRAY
parameter to be specified, where the array specified by this parameter contains the URL path string as its first element, and an arbitrary number of params objects in subsequent elements. Using this variation, the example shown for VARIATION 1 could be re-written as...
EXAMPLE
var defaultSearchSettings = { sort:'recent', type:'all', results:'20' }; searchUrl = Uize.Url.resolve ([ 'http://www.somedomain.com/search', defaultSearchSettings, { category:'holiday', sort:'popular' } ]);
This variation is powerful in that it allows us to write functions that can accept a single URL parameter, where that parameter's value may be a string, or an array containing a string path and params objects - and a single call to the Uize.Url.resolve
method will resolve it to a string for the benefit of your functions' implementation code.
VARIATION 3
urlSTR = Uize.Url.resolve (urlPathAndParamsObjectsARRAY,urlParamsOBJ);
When using the urlPathAndParamsObjectsARRAY
parameter, you can still specify the urlParamsOBJ
second parameter to stitch in further query params.
EXAMPLE
var defaultSearchSettings = { sort:'recent', type:'all', results:'20' }; searchUrl = Uize.Url.resolve ( ['http://www.somedomain.com/search',defaultSearchSettings], { category:'holiday', sort:'popular' } );
The above example would produce the same results as the previous example.
VARIATION 4
urlSTR = Uize.Url.resolve (urlPathAndParamsObjectsARRAY,urlParamsObjectsARRAY);
Finally, it is also possible to specify the urlParamsObjectsARRAY
second parameter, allowing ridiculous numbers of query params objects to be specified where desired and/or convenient.
EXAMPLE
var defaultSearchSettings = { sort:'recent', type:'all', results:'20' }; searchUrl = Uize.Url.resolve ( ['http://www.somedomain.com/search',{category:'holiday'}], [ defaultSearchSettings, {sort:'popular'} ] );
The above example would produce the same results as the previous example.
2.5.6. Conditional Params
If the value for a query params object is null
or undefined
, it will simply be treated as an empty params object, regardless of whether it's specified for the urlParamsOBJ
parameter or one of the elements in the urlPathAndParamsObjectsARRAY
or urlParamsObjectsARRAY
parameters. This is convenient when using conditional expressions to choose params that should or should not be present.
EXAMPLE
var defaultSearchSettings = { category:'any', sort:'recent', type:'all', results:'20' }; searchUrl = Uize.Url.resolve ([ 'http://www.somedomain.com/search', defaultSearchSettings, searchCategory ? {category:searchCategory} : null, useUserSearchSettings ? userSearchSettings : null, useCustomSort ? {sort:customSortValue} : null ]);
In the above example, conditional expressions that result in a null value will be treated as params objects containing no param values, so they will have no effect.
NOTES
see also the Uize.Url.toParams static method |
IMPLEMENTATION INFO
this feature was introduced in this module |
2.6. Uize.Url.toAbsolute
Returns a string, representing the specified relative URL resolved against the specified base URL.
SYNTAX
absoluteUrlSTR = Uize.Url.toAbsolute (baseUrlSTR,urlToAbsolutizeSTR);
EXAMPLE 1
Uize.Url.toAbsolute ( 'http://uize.com/reference/source-code/Uize.html', '../../download.html' );
The above statement would produce the value 'http://uize.com/download.html'
.
EXAMPLE 2
Uize.Url.toAbsolute ('http://uize.com/index.html','download.html');
The above statement would produce the value 'http://uize.com/download.html'
.
EXAMPLE 3
Uize.Url.toAbsolute ('http://uize.com/index.html','');
The above statement would produce the value 'http://uize.com'
.
NOTES
see the related Uize.Url.toAbsolute static method |
IMPLEMENTATION INFO
this feature was introduced in this module |
2.7. Uize.Url.toParams
A utility method that serializes the properties of the specified object to produce a URL query params string.
SYNTAX
queryParamsSTR = Uize.Url.toParams (paramsOBJ);
This method assumes that the params in paramsOBJ
should be serialized using "&" to separate parameters, and "=" to separate parameter name from parameter value in each name/value pair.
EXAMPLE
Uize.Url.toParams ({ category:'holiday', type:'all', results:'20' });
With the above paramsOBJ
value, the Uize.Url.toParams
method would produce the string...
'category=holiday&type=all&results=20'
VARIATION
queryParamsSTR = Uize.Url.toParams (urlParamsObjectsARRAY);
When a urlParamsObjectsARRAY
parameter is specified, multiple params objects can be specified in an array. This provides for an easy way to merge query param sets from multiple sources, or to blend fixed params with parameterized params (e.g. passed in a method call), or to override the values in param sets. The values from params objects later in the array override those from earlier params objects. None of the objects in the array will be modified by the operation.
EXAMPLE
var defaultSearchSettings = { sort:'recent', type:'all', results:'20' }; searchQueryParamsStr = Uize.Url.toParams ( [defaultSearchSettings,{category:'holiday',sort:'popular'}] );
In the above example, the values of the category
and sort
properties of the second params object in the urlParamsObjectsARRAY
value would be stitched in to the values provided by the defaultSearchSettings
query params object that appears first in the array, with the value of the sort
property of the second params object overriding the value contained in the defaultSearchSettings
object, and with the defaultSearchSettings
object not being modified in the process.
NOTES
this method does not prepend the query '?' character to the params string | |
see also the corresponding Uize.Url.fromParams static method |
IMPLEMENTATION INFO
this feature was introduced in this module |
2.8. Uize.Url.toPiece
Returns a string, representing the URL encoded form of the specified string.
SYNTAX
encodedUrlPieceSTR = Uize.Url.toPiece (unencodedSTR);
EXAMPLE
encodedUrlPiece = Uize.Url.toPiece ('solar, wind, efficiency & biofuels');
After executing the above statement, the variable encodedUrlPiece
would have the value 'solar%2C%20wind%2C%20efficiency%20%26%20biofuels'
.
NOTES
see also the corresponding Uize.Url.fromPiece static method |
IMPLEMENTATION INFO
this feature was introduced in this module |
2.9. Uize.Url.toRelative
Returns a string, representing a relative URL from the specified base URL to the specified destination URL.
SYNTAX
relativeUrlSTR = Uize.Url.toRelative (baseUrlSTR,urlToRelativizeSTR);
EXAMPLE
var relativeUrl = Uize.Url.toRelative ( 'http://www.somedomain.com/foo/bar/', 'http://www.somedomain.com/foo/baz/qux/file.html' );
RESULT
'../baz/qux/file.html'
2.9.1. When a Relative URL Can Be Created
The Uize.Url.toRelative
method can create a relative URL in any case where the URL it would create, when applied against the specified base URL, would produce the original URL to relativize.
Situations in which a relative URL can be created include...
when both URLs have the same back-relative prefix | |
when both URLs are root-relative | |
when both URLs are forward-relative | |
when both URLs have the same domain |
2.9.1.1. When Both URLs Have the Same Back-relative Prefix
When both the base URL and the URL to relativize start with exactly the same back-relative prefix (i.e. "/", "../", "../../", etc.), then a relative URL can be created.
Even though both URLs may be relative URLs, a relative URL can still be created between the base URL and the URL to relativize. This is because the URLs having the identical back-relative prefix means that they essentially share a common base, even though we don't know what it is.
EXAMPLE
var relativeUrl = Uize.Url.toRelative ( '../../foo/bar/', '../../foo/baz/qux/file.html' );
In the above example, both the base URL and the URL to relativize have a back-relative prefix that jumps back two folder levels.
RESULT
'../baz/qux/file.html'
2.9.1.2. When Both URLs are Root-relative
When both the base URL and the URL to relativize are root-relative (i.e. start with a "/"), then a relative URL can be created.
EXAMPLE
var relativeUrl = Uize.Url.toRelative ( '/foo/bar/', '/foo/baz/qux/file.html' );
RESULT
'../baz/qux/file.html'
2.9.1.3. When Both URLs are Forward-relative
When both the base URL and the URL to relativize are forward-relative, then a relative URL can be created.
EXAMPLE
var relativeUrl = Uize.Url.toRelative ( 'foo/bar/', 'foo/baz/qux/file.html' );
RESULT
'../baz/qux/file.html'
2.9.1.4. When Both URLs Have the Same Domain
When both the base URL and the URL to relativize have the same domain, then a relative URL can be created.
EXAMPLE
var relativeUrl = Uize.Url.toRelative ( 'http://www.somedomain.com/foo/bar/', 'http://www.somedomain.com/foo/baz/qux/file.html' );
RESULT
'../baz/qux/file.html'
2.9.2. When a Relative URL Cannot Be Created
In cases where it is impossible to create a relative URL (see When a Relative URL Can Be Created), the value null
will be returned, unless the URL to relativize is an absolute URL, in which case the URL to relativize will be returned.
Whenever the base URL and the URL to relativize do not have the same shared base, then a relative URL cannot be created. This can occur when...
the base URL is absolute (i.e. has a domain) and the URL to relativize is either root-relative, forward-relative, back-relative, or has a domain that doesn't match that of the base URL | |
the base URL is root-relative and the URL to relativize is either forward-relative, back-relative, or is absolute (i.e. has a domain) | |
the base URL is forward-relative and the URL to relativize is either root-relative, back-relative, or is absolute (i.e. has a domain) | |
the base URL is back-relative and the URL to relativize is either root-relative, forward-relative, or is absolute (i.e. has a domain), or is also back-relative but has a differing amount of back folder jumps than the base URL |
EXAMPLES
// base URL is absolute (i.e. has a domain) Uize.Url.toRelative ('http://www.foo.com/','/foo/bar/'); // null Uize.Url.toRelative ('http://www.foo.com/','foo/bar/'); // null Uize.Url.toRelative ('http://www.foo.com/','../foo/bar/'); // null Uize.Url.toRelative ('http://www.foo.com/','http://www.bar.com/'); // 'http://www.bar.com/' // base URL is root-relative Uize.Url.toRelative ('/foo/bar/','foo/bar/'); // null Uize.Url.toRelative ('/foo/bar/','../foo/bar/'); // null Uize.Url.toRelative ('/foo/bar/','http://www.bar.com/'); // 'http://www.bar.com/' // base URL is forward-relative Uize.Url.toRelative ('foo/bar/','/foo/bar/'); // null Uize.Url.toRelative ('foo/bar/','../foo/bar/'); // null Uize.Url.toRelative ('foo/bar/','http://www.bar.com/'); // 'http://www.bar.com/' // base URL is back-relative Uize.Url.toRelative ('../foo/bar/','/foo/bar/'); // null Uize.Url.toRelative ('../foo/bar/','foo/bar/'); // null Uize.Url.toRelative ('../foo/bar/','../../foo/bar/'); // null Uize.Url.toRelative ('../foo/bar/','http://www.bar.com/'); // 'http://www.bar.com/'
2.9.2.1. When the URL to Relativize is Absolute
When a relative URL cannot be created and the URL to relativize is absolute (i.e. has a domain), then the URL to relativize will be returned rather than the value null
.
The rationale behind this behavior is that an absolute URL, when resolved against another URL, will always produce that absolute URL. So, returning an absolute URL that can work against the base URL is better than returning null
.
2.9.3. When the Base URL Contains a File Part
When the base URL contains a file part, that file part will be ignored and discarded when creating the relative URL.
This is a convenient behavior if you are using this method in a Web page to create relative URLs from absolute URLs, and where the created URLs should be relative to the current document's URL. In such cases, the value of the window.location.href
property can simply be passed to the Uize.Url.toRelative
method as the value of the baseUrlSTR
parameter.
EXAMPLE
var relativeUrl = Uize.Url.toRelative ( 'http://www.somedomain.com/foo/bar/file.html', 'http://www.somedomain.com/foo/hello/world.html' );
RESULT
'../hello/world.html'
Because of this behavior, for any base URL that ends in a folder, the URL must also end with a "/" (slash) character, otherwise the last folder will be assumed to be a file part and will be discarded when creating the relative URL. The Uize.Url.toRelative
method cannot tell the difference between a folder name and a filename that has no file extension (filename's are not required to have an extension indicating file type, after all, even though they often may).
NOTES
see the related Uize.Url.toAbsolute static method |
IMPLEMENTATION INFO
this feature was introduced in this module |