relateurl
Advanced tools
Comparing version 0.1.0 to 0.2.0
@@ -7,6 +7,3 @@ module.exports = | ||
ROOT_RELATIVE: "rootRelative", | ||
SHORTEST: "shortest", | ||
// Remove Empty Queries | ||
WHEN_RELATIVE: "whenRelative" | ||
SHORTEST: "shortest" | ||
}; |
var constants = require("./constants"); | ||
var relationUtils = require("./util/relation"); | ||
var resourceUtils = require("./util/resource"); | ||
@@ -9,3 +7,3 @@ | ||
{ | ||
if (urlObj.auth && !options.removeAuth && (relationUtils.max(urlObj.extra.relation,"host") || options.output==constants.ABSOLUTE)) | ||
if (urlObj.auth && !options.removeAuth && (urlObj.extra.relation.maximumHost || options.output==constants.ABSOLUTE)) | ||
{ | ||
@@ -34,4 +32,3 @@ return urlObj.auth + "@"; | ||
{ | ||
// TODO :: do we need to check if host.full exists? | ||
if (urlObj.host.full && (relationUtils.max(urlObj.extra.relation,"auth") || options.output==constants.ABSOLUTE)) | ||
if (urlObj.host.full && (urlObj.extra.relation.maximumAuth || options.output==constants.ABSOLUTE)) | ||
{ | ||
@@ -55,3 +52,3 @@ return urlObj.host.full; | ||
if (relationUtils.max(urlObj.extra.relation,"port") || options.output==constants.ABSOLUTE || options.output==constants.ROOT_RELATIVE) | ||
if (urlObj.extra.relation.maximumHost || options.output==constants.ABSOLUTE || options.output==constants.ROOT_RELATIVE) | ||
{ | ||
@@ -77,3 +74,3 @@ str += absolutePath; | ||
{ | ||
if (urlObj.port && !urlObj.extra.portIsDefault && relationUtils.max(urlObj.extra.relation,"host")) | ||
if (urlObj.port && !urlObj.extra.portIsDefault && urlObj.extra.relation.maximumHost) | ||
{ | ||
@@ -90,3 +87,5 @@ return ":" + urlObj.port; | ||
{ | ||
return urlObj.query.string[ options.removeEmptyQueries ? "stripped" : "full" ]; | ||
var stripQuery = options.removeEmptyQueries && urlObj.extra.relation.minimumPort; | ||
return urlObj.query.string[ stripQuery ? "stripped" : "full" ]; | ||
} | ||
@@ -102,3 +101,3 @@ | ||
{ | ||
if ( options.removeDirectoryIndexes && resourceUtils.isDefaultIndex(resource,options) ) | ||
if ( options.removeDirectoryIndexes && urlObj.extra.resourceIsIndex ) | ||
{ | ||
@@ -120,5 +119,5 @@ resource = ""; | ||
if (relationUtils.max(urlObj.extra.relation,"host") || options.output==constants.ABSOLUTE) | ||
if (urlObj.extra.relation.maximumHost || options.output==constants.ABSOLUTE) | ||
{ | ||
if (!urlObj.extra.relation || !options.schemeRelative || options.output==constants.ABSOLUTE) | ||
if (!urlObj.extra.relation.minimumScheme || !options.schemeRelative || options.output==constants.ABSOLUTE) | ||
{ | ||
@@ -125,0 +124,0 @@ str += urlObj.scheme + "://"; |
var constants = require("./constants"); | ||
var formatUrl = require("./format"); | ||
var getOptions = require("./options"); | ||
var objUtils = require("./util/object"); | ||
var parseUrl = require("./parse"); | ||
var relateUrl = require("./relate"); | ||
var util = require("./util"); | ||
@@ -26,3 +26,3 @@ | ||
this.from = from ? parseUrl(from,this.instanceOptions) : null; | ||
this.from = parseUrl.from(from, this.instanceOptions, null); | ||
} | ||
@@ -38,3 +38,3 @@ | ||
// relate(to,options) | ||
if ( util.object.isObject(to) ) | ||
if ( objUtils.isObject(to) ) | ||
{ | ||
@@ -53,3 +53,3 @@ options = to; | ||
options = getOptions(options, this.instanceOptions); | ||
from = from ? parseUrl(from,options) : this.from; | ||
from = parseUrl.from(from, options, this.from); | ||
@@ -65,11 +65,7 @@ if (!from || !from.href) | ||
from.path.absolute.array = util.path.resolveDotSegments(from.path.absolute.array); | ||
from.path.absolute.string = "/" + util.path.join(from.path.absolute.array); | ||
util.port.findDefault(from, options); | ||
to = parseUrl.to(to, options); | ||
to = parseUrl(to, options); | ||
if (to.valid===false) return to.href; | ||
to = relateUrl(from, to, options);//util.devlog(from);util.devlog(to); | ||
to = relateUrl(from, to, options); | ||
to = formatUrl(to, options); | ||
@@ -97,3 +93,6 @@ | ||
{ | ||
RelateUrl[i] = constants[i]; | ||
if ( constants.hasOwnProperty(i) ) | ||
{ | ||
RelateUrl[i] = constants[i]; | ||
} | ||
} | ||
@@ -100,0 +99,0 @@ |
@@ -1,2 +0,2 @@ | ||
var util = require("./util/object"); | ||
var objUtils = require("./util/object"); | ||
@@ -7,3 +7,3 @@ | ||
{ | ||
if ( util.isObject(options) ) | ||
if ( objUtils.isObject(options) ) | ||
{ | ||
@@ -14,10 +14,13 @@ var newOptions = {}; | ||
{ | ||
if (options[i] != undefined) | ||
if ( defaults.hasOwnProperty(i) ) | ||
{ | ||
newOptions[i] = mergeOption(defaults[i], options[i]); | ||
if (options[i] != undefined) | ||
{ | ||
newOptions[i] = mergeOption(defaults[i], options[i]); | ||
} | ||
else | ||
{ | ||
newOptions[i] = defaults[i]; | ||
} | ||
} | ||
else | ||
{ | ||
newOptions[i] = defaults[i]; | ||
} | ||
} | ||
@@ -45,5 +48,5 @@ | ||
{ | ||
defaultValues = util.clone(defaultValues); | ||
defaultValues = objUtils.clone(defaultValues); | ||
return util.shallowMerge(defaultValues, newValues); | ||
return objUtils.shallowMerge(defaultValues, newValues); | ||
} | ||
@@ -50,0 +53,0 @@ } |
@@ -1,44 +0,31 @@ | ||
var parsePath = require("./path"); | ||
var hrefInfo = require("./hrefInfo"); | ||
var parseHost = require("./host"); | ||
var parsePath = require("./path"); | ||
var parsePort = require("./port"); | ||
var parseQuery = require("./query"); | ||
var parseUrlString = require("./urlstring"); | ||
var pathUtils = require("../util/path"); | ||
function findMinimums(urlObj) | ||
function parseFromUrl(url, options, fallback) | ||
{ | ||
var minimumPathOnly = (!urlObj.scheme && !urlObj.auth && !urlObj.host.full && !urlObj.port); | ||
var minimumResourceOnly = (minimumPathOnly && !urlObj.path.absolute.string); | ||
var minimumQueryOnly = (minimumResourceOnly && !urlObj.resource); | ||
var minimumHashOnly = (minimumQueryOnly && !urlObj.query.string.full.length); | ||
urlObj.extra.hrefInfo.minimumPathOnly = minimumPathOnly; | ||
urlObj.extra.hrefInfo.minimumResourceOnly = minimumResourceOnly; | ||
urlObj.extra.hrefInfo.minimumQueryOnly = minimumQueryOnly; | ||
urlObj.extra.hrefInfo.minimumHashOnly = minimumHashOnly; | ||
return urlObj; | ||
} | ||
function parseHost(urlObj, options) | ||
{ | ||
//if (options.ignore_www) | ||
//{ | ||
var host = urlObj.host.full; | ||
if (url) | ||
{ | ||
var urlObj = parseUrl(url, options); | ||
if (host) | ||
{ | ||
var stripped = host; | ||
if (host.indexOf("www.") == 0) | ||
{ | ||
stripped = host.substr(4); | ||
} | ||
urlObj.host.stripped = stripped; | ||
} | ||
//} | ||
return urlObj; | ||
// Because the following occurs in the relate stage for "to" URLs, | ||
// such had to be mostly duplicated here | ||
var pathArray = pathUtils.resolveDotSegments(urlObj.path.absolute.array); | ||
urlObj.path.absolute.array = pathArray; | ||
urlObj.path.absolute.string = "/" + pathUtils.join(pathArray); | ||
return urlObj; | ||
} | ||
else | ||
{ | ||
return fallback; | ||
} | ||
} | ||
@@ -54,6 +41,7 @@ | ||
urlObj = parseHost(urlObj, options); | ||
urlObj = parsePath(urlObj, options); | ||
urlObj = parseQuery(urlObj, options); | ||
urlObj = findMinimums(urlObj); | ||
parseHost(urlObj, options); | ||
parsePort(urlObj, options); | ||
parsePath(urlObj, options); | ||
parseQuery(urlObj, options); | ||
hrefInfo(urlObj); | ||
@@ -65,2 +53,6 @@ return urlObj; | ||
module.exports = parseUrl; | ||
module.exports = | ||
{ | ||
from: parseFromUrl, | ||
to: parseUrl | ||
}; |
@@ -1,3 +0,23 @@ | ||
function parsePath(urlObj) | ||
function isDirectoryIndex(resource, options) | ||
{ | ||
var verdict = false; | ||
options.directoryIndexes.every( function(index) | ||
{ | ||
if (index == resource) | ||
{ | ||
verdict = true; | ||
return false; | ||
} | ||
return true; | ||
}); | ||
return verdict; | ||
} | ||
function parsePath(urlObj, options) | ||
{ | ||
var path = urlObj.path.absolute.string; | ||
@@ -15,2 +35,4 @@ | ||
urlObj.extra.resourceIsIndex = isDirectoryIndex(urlObj.resource, options); | ||
urlObj.path.absolute.string = path.substr(0, lastSlash); | ||
@@ -29,4 +51,2 @@ } | ||
// Else: no path means hash- or query-only | ||
return urlObj; | ||
} | ||
@@ -33,0 +53,0 @@ |
@@ -9,4 +9,2 @@ function parseQuery(urlObj, options) | ||
//} | ||
return urlObj; | ||
} | ||
@@ -23,3 +21,3 @@ | ||
{ | ||
if (i != "") | ||
if ( i!="" && queryObj.hasOwnProperty(i) ) | ||
{ | ||
@@ -26,0 +24,0 @@ var value = queryObj[i]; |
@@ -0,1 +1,2 @@ | ||
// For client-side support, can switch to https://github.com/kevincox/url.js | ||
var _parseUrl = require("url").parse; | ||
@@ -9,3 +10,3 @@ | ||
* required customizations for later | ||
* necessary data for later | ||
* urlObj.host is useless | ||
@@ -71,3 +72,23 @@ * urlObj.hostname is too long | ||
portIsDefault: null, | ||
relation: 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 | ||
}, | ||
resourceIsIndex: null, | ||
slashes: urlObj.slashes | ||
@@ -74,0 +95,0 @@ }; |
@@ -1,4 +0,4 @@ | ||
var objUtils = require("../util/object"); | ||
var pathUtils = require("../util/path"); | ||
//var relationUtils = require("../util/relation"); | ||
var findRelation = require("./findRelation"); | ||
var objUtils = require("../util/object"); | ||
var pathUtils = require("../util/path"); | ||
@@ -9,13 +9,18 @@ | ||
{ | ||
copyPath(urlObj, siteUrlObj); | ||
findRelation.upToPath(urlObj, siteUrlObj, options); | ||
// Fill in relative URLs | ||
switch (urlObj.extra.relation) | ||
{ | ||
case "path": | ||
case "port": urlObj.port = siteUrlObj.port; | ||
case "host": urlObj.host = objUtils.clone(siteUrlObj.host); | ||
case "auth": urlObj.auth = siteUrlObj.auth; | ||
case "scheme": urlObj.scheme = siteUrlObj.scheme; break; | ||
} | ||
if (urlObj.extra.relation.minimumScheme) urlObj.scheme = siteUrlObj.scheme; | ||
if (urlObj.extra.relation.minimumAuth) urlObj.auth = siteUrlObj.auth; | ||
if (urlObj.extra.relation.minimumHost) urlObj.host = objUtils.clone(siteUrlObj.host); | ||
if (urlObj.extra.relation.minimumPort) copyPort(urlObj, siteUrlObj); | ||
if (urlObj.extra.relation.minimumScheme) copyPath(urlObj, siteUrlObj); | ||
// Check remaining relativeness now that path has been copied and/or resolved | ||
findRelation.pathOn(urlObj, siteUrlObj, options); | ||
// Fill in relative URLs | ||
if (urlObj.extra.relation.minimumResource) copyResource(urlObj, siteUrlObj); | ||
if (urlObj.extra.relation.minimumQuery) urlObj.query = objUtils.clone(siteUrlObj.query); | ||
if (urlObj.extra.relation.minimumHash) urlObj.hash = siteUrlObj.hash; | ||
} | ||
@@ -26,7 +31,8 @@ | ||
/* | ||
Get an absolute path relative to site url. | ||
Get an absolute path that's relative to site url. | ||
*/ | ||
function copyPath(urlObj, siteUrlObj) | ||
{ | ||
if (urlObj.extra.relation && urlObj.extra.relation!="port" /*&& relationUtils.max(urlObj.extra.relation, "path")*/ ) | ||
// TODO :: remove the minimumResourceOnly part if possible | ||
if (urlObj.extra.relation.maximumHost || !urlObj.extra.hrefInfo.minimumResourceOnly) | ||
{ | ||
@@ -66,2 +72,20 @@ var pathArray = urlObj.path.absolute.array; | ||
function copyPort(urlObj, siteUrlObj) | ||
{ | ||
urlObj.port = siteUrlObj.port; | ||
urlObj.extra.portIsDefault = siteUrlObj.extra.portIsDefault; | ||
} | ||
function copyResource(urlObj, siteUrlObj) | ||
{ | ||
urlObj.resource = siteUrlObj.resource; | ||
urlObj.extra.resourceIsIndex = siteUrlObj.extra.resourceIsIndex; | ||
} | ||
module.exports = absolutize; |
@@ -1,9 +0,3 @@ | ||
var resourceUtils = require("../util/resource"); | ||
function findRelation_upToPath(urlObj, siteUrlObj, options) | ||
{ | ||
var verdict = false; | ||
// Path- or root-relative URL | ||
@@ -13,33 +7,26 @@ var pathOnly = urlObj.extra.hrefInfo.minimumPathOnly; | ||
// Matching scheme, scheme-relative or path-only | ||
if (urlObj.scheme && urlObj.scheme==siteUrlObj.scheme || !urlObj.scheme) | ||
{ | ||
verdict = "scheme"; | ||
// Matching auth, ignoring auth or path-only | ||
if (urlObj.auth==siteUrlObj.auth || options.removeAuth || pathOnly) | ||
{ | ||
verdict = "auth"; | ||
var www = options.ignore_www ? "stripped" : "full"; | ||
// Matching host or path-only | ||
if (urlObj.host[www]==siteUrlObj.host[www] || pathOnly) | ||
{ | ||
verdict = "host"; | ||
// Matching port or path-only | ||
if (urlObj.port==siteUrlObj.port || pathOnly) | ||
{ | ||
verdict = "port"; | ||
if (!urlObj.extra.hrefInfo.minimumResourceOnly) | ||
{ | ||
verdict = "path"; // is at least root-relative | ||
} | ||
} | ||
} | ||
} | ||
} | ||
var sameScheme = (urlObj.scheme==siteUrlObj.scheme || !urlObj.scheme); | ||
return verdict; | ||
// Matching auth, ignoring auth or path-only | ||
var sameAuth = sameScheme && (urlObj.auth==siteUrlObj.auth || options.removeAuth || pathOnly); | ||
// Matching host or path-only | ||
var www = options.ignore_www ? "stripped" : "full"; | ||
var sameHost = sameAuth && (urlObj.host[www]==siteUrlObj.host[www] || pathOnly); | ||
// Matching port or path-only | ||
var samePort = sameHost && (urlObj.port==siteUrlObj.port || pathOnly); | ||
//var atLeastRootRelative = samePort && !urlObj.extra.hrefInfo.minimumResourceOnly; | ||
urlObj.extra.relation.minimumScheme = sameScheme; | ||
urlObj.extra.relation.minimumAuth = sameAuth; | ||
urlObj.extra.relation.minimumHost = sameHost; | ||
urlObj.extra.relation.minimumPort = samePort; | ||
//urlObj.extra.relation.minimumPath = samePort && atLeastRootRelative; // gets changed in _pathOn() ... TEMP, i hope | ||
urlObj.extra.relation.maximumScheme = !sameScheme || sameScheme && !sameAuth; | ||
urlObj.extra.relation.maximumAuth = !sameScheme || sameScheme && !sameHost; | ||
urlObj.extra.relation.maximumHost = !sameScheme || sameScheme && !samePort; | ||
//urlObj.extra.relation.maximumPort = !sameScheme || sameScheme && !atLeastRootRelative; // gets changed in _pathOn() ... TEMP, i hope | ||
} | ||
@@ -51,25 +38,30 @@ | ||
{ | ||
var verdict = urlObj.extra.relation; | ||
var queryOnly = urlObj.extra.hrefInfo.minimumQueryOnly; | ||
var hashOnly = urlObj.extra.hrefInfo.minimumHashOnly; | ||
if (verdict=="port" || verdict=="path") | ||
{ | ||
if (urlObj.path.absolute.string == siteUrlObj.path.absolute.string) | ||
{ | ||
verdict = "path"; | ||
if ( urlObj.resource==siteUrlObj.resource || (options.removeDirectoryIndexes && resourceUtils.isDefaultIndex(urlObj.resource,options)) ) | ||
{ | ||
verdict = "resource"; | ||
var query = options.removeEmptyQueries ? "stripepd" : "full"; | ||
if ( urlObj.query.string[query] && urlObj.query.string[query]==siteUrlObj.query.string[query] ) | ||
{ | ||
verdict = "query"; | ||
} | ||
} | ||
} | ||
} | ||
// From upToPath() | ||
var sameScheme = urlObj.extra.relation.minimumScheme; | ||
return verdict; | ||
// Matching port and path | ||
var samePath = urlObj.extra.relation.minimumPort && urlObj.path.absolute.string==siteUrlObj.path.absolute.string; | ||
// Matching resource or removing default indexes or query/hash-only | ||
var sameResource = samePath && (urlObj.resource==siteUrlObj.resource || (options.removeDirectoryIndexes && urlObj.extra.resourceIsIndex) || queryOnly || hashOnly); | ||
// Matching query or hash-only | ||
var query = options.removeEmptyQueries ? "stripepd" : "full"; | ||
var sameQuery = sameResource && urlObj.query.string[query] && urlObj.query.string[query]==siteUrlObj.query.string[query] || hashOnly; | ||
var sameHash = sameQuery && urlObj.hash==siteUrlObj.hash; | ||
urlObj.extra.relation.minimumPath = samePath; | ||
urlObj.extra.relation.minimumResource = sameResource; | ||
urlObj.extra.relation.minimumQuery = sameQuery; | ||
urlObj.extra.relation.minimumHash = sameHash; | ||
urlObj.extra.relation.maximumPort = !sameScheme || sameScheme && !samePath; | ||
urlObj.extra.relation.maximumPath = !sameScheme || sameScheme && !sameResource; | ||
urlObj.extra.relation.maximumResource = !sameScheme || sameScheme && !sameQuery; | ||
urlObj.extra.relation.maximumQuery = !sameScheme || sameScheme && !sameHash; | ||
urlObj.extra.relation.maximumHash = !sameScheme || sameScheme && sameHash; | ||
} | ||
@@ -76,0 +68,0 @@ |
@@ -1,6 +0,3 @@ | ||
var absolutize = require("./absolutize"); | ||
var constants = require("../constants"); | ||
var findRelation = require("./findRelation"); | ||
var portUtils = require("../util/port"); | ||
var relativize = require("./relativize"); | ||
var absolutize = require("./absolutize"); | ||
var relativize = require("./relativize"); | ||
@@ -11,18 +8,5 @@ | ||
{ | ||
portUtils.findDefault(urlObj, options); | ||
absolutize(urlObj, siteUrlObj, options); | ||
relativize(urlObj, siteUrlObj, options); | ||
urlObj.extra.relation = findRelation.upToPath(urlObj, siteUrlObj, options); | ||
if (urlObj.extra.relation) | ||
{ | ||
absolutize(urlObj, siteUrlObj, options); | ||
// Port may have changed | ||
portUtils.findDefault(urlObj, options); | ||
urlObj.extra.relation = findRelation.pathOn(urlObj, siteUrlObj, options); | ||
relativize(urlObj, siteUrlObj, options); | ||
} | ||
return urlObj; | ||
@@ -29,0 +13,0 @@ } |
@@ -56,12 +56,15 @@ var pathUtils = require("../util/path"); | ||
{ | ||
var pathArray = relatePath(urlObj.path.absolute.array, siteUrlObj.path.absolute.array); | ||
var pathString = pathUtils.join(pathArray); | ||
/*if (pathString.indexOf("../") != 0) | ||
if (urlObj.extra.relation.minimumScheme) | ||
{ | ||
pathString = "./" + pathString; | ||
}*/ | ||
urlObj.path.relative.array = pathArray; | ||
urlObj.path.relative.string = pathString; | ||
var pathArray = relatePath(urlObj.path.absolute.array, siteUrlObj.path.absolute.array); | ||
var pathString = pathUtils.join(pathArray); | ||
/*if (pathString.indexOf("../") != 0) | ||
{ | ||
pathString = "./" + pathString; | ||
}*/ | ||
urlObj.path.relative.array = pathArray; | ||
urlObj.path.relative.string = pathString; | ||
} | ||
} | ||
@@ -68,0 +71,0 @@ |
{ | ||
"name": "relateurl", | ||
"description": "Shorten URLs by converting them from absolute to relative.", | ||
"version": "0.1.0", | ||
"version": "0.2.0", | ||
"homepage": "https://github.com/stevenvachon/relateurl", | ||
@@ -30,2 +30,3 @@ "author": { | ||
"relative", | ||
"minify", | ||
"shorten", | ||
@@ -32,0 +33,0 @@ "url" |
@@ -115,12 +115,12 @@ # relateurl [![NPM Version](http://badge.fury.io/js/relateurl.png)](http://badge.fury.io/js/relateurl) [![Build Status](https://secure.travis-ci.org/stevenvachon/relateurl.png)](http://travis-ci.org/stevenvachon/relateurl) | ||
## Release History | ||
* 0.2.0 code cleanup, `options.removeEmptyQueries=true` only applied to unrelated URLs | ||
* 0.1.0 initial release | ||
## Roadmap | ||
* 0.1.x code cleanup | ||
* 0.1.x make `options.removeEmptyQueries=true` only apply to unrelated URLs | ||
* 0.2.0 decipher and return invalid input (special cases) to complete test suite | ||
* 0.3.0 test `options.slashesDenoteHost=false` | ||
* 0.2.1 try to shorten query-relative URLs, test variations list with other site URLs | ||
* 0.2.2 decipher and return invalid input (special cases) to complete test suite | ||
* 0.3.0 test `options.slashesDenoteHost=false`, add something like `options.externalDirectoryIndexes=[]` for external sites | ||
--- | ||
[![Analytics](https://ga-beacon.appspot.com/UA-3614308-10/stevenvachon/smil2css)](https://github.com/igrigorik/ga-beacon "Google Analytics") [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/stevenvachon/smil2css/trend.png)](https://bitdeli.com/free "Bitdeli Badge") | ||
[![Analytics](https://ga-beacon.appspot.com/UA-3614308-13/stevenvachon/relateurl)](https://github.com/igrigorik/ga-beacon "Google Analytics") [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/stevenvachon/relateurl/trend.png)](https://bitdeli.com/free "Bitdeli Badge") |
27103
839