99 lines
3.6 KiB
JavaScript
99 lines
3.6 KiB
JavaScript
'use strict';
|
|
|
|
function findRelation_upToPath(urlObj, siteUrlObj, options) {
|
|
// Path- or root-relative URL
|
|
var pathOnly = urlObj.extra.hrefInfo.minimumPathOnly;
|
|
|
|
// Matching scheme, scheme-relative or path-only
|
|
var minimumScheme = urlObj.scheme === siteUrlObj.scheme || !urlObj.scheme;
|
|
|
|
// Matching auth, ignoring auth or path-only
|
|
var minimumAuth =
|
|
minimumScheme &&
|
|
(urlObj.auth === siteUrlObj.auth || options.removeAuth || pathOnly);
|
|
|
|
// Matching host or path-only
|
|
var www = options.ignore_www ? 'stripped' : 'full';
|
|
var minimumHost =
|
|
minimumAuth && (urlObj.host[www] === siteUrlObj.host[www] || pathOnly);
|
|
|
|
// Matching port or path-only
|
|
var minimumPort =
|
|
minimumHost && (urlObj.port === siteUrlObj.port || pathOnly);
|
|
|
|
urlObj.extra.relation.minimumScheme = minimumScheme;
|
|
urlObj.extra.relation.minimumAuth = minimumAuth;
|
|
urlObj.extra.relation.minimumHost = minimumHost;
|
|
urlObj.extra.relation.minimumPort = minimumPort;
|
|
|
|
urlObj.extra.relation.maximumScheme =
|
|
!minimumScheme || (minimumScheme && !minimumAuth);
|
|
urlObj.extra.relation.maximumAuth =
|
|
!minimumScheme || (minimumScheme && !minimumHost);
|
|
urlObj.extra.relation.maximumHost =
|
|
!minimumScheme || (minimumScheme && !minimumPort);
|
|
}
|
|
|
|
function findRelation_pathOn(urlObj, siteUrlObj, options) {
|
|
var queryOnly = urlObj.extra.hrefInfo.minimumQueryOnly;
|
|
var hashOnly = urlObj.extra.hrefInfo.minimumHashOnly;
|
|
var empty = urlObj.extra.hrefInfo.empty; // not required, but self-documenting
|
|
|
|
// From upToPath()
|
|
var minimumPort = urlObj.extra.relation.minimumPort;
|
|
var minimumScheme = urlObj.extra.relation.minimumScheme;
|
|
|
|
// Matching port and path
|
|
var minimumPath =
|
|
minimumPort &&
|
|
urlObj.path.absolute.string === siteUrlObj.path.absolute.string;
|
|
|
|
// Matching resource or query/hash-only or empty
|
|
var matchingResource =
|
|
urlObj.resource === siteUrlObj.resource ||
|
|
(!urlObj.resource && siteUrlObj.extra.resourceIsIndex) ||
|
|
(options.removeDirectoryIndexes &&
|
|
urlObj.extra.resourceIsIndex &&
|
|
!siteUrlObj.resource);
|
|
var minimumResource =
|
|
minimumPath && (matchingResource || queryOnly || hashOnly || empty);
|
|
|
|
// Matching query or hash-only/empty
|
|
var query = options.removeEmptyQueries ? 'stripped' : 'full';
|
|
var urlQuery = urlObj.query.string[query];
|
|
var siteUrlQuery = siteUrlObj.query.string[query];
|
|
var minimumQuery =
|
|
(minimumResource && !!urlQuery && urlQuery === siteUrlQuery) ||
|
|
((hashOnly || empty) && !urlObj.extra.hrefInfo.separatorOnlyQuery);
|
|
|
|
var minimumHash = minimumQuery && urlObj.hash === siteUrlObj.hash;
|
|
|
|
urlObj.extra.relation.minimumPath = minimumPath;
|
|
urlObj.extra.relation.minimumResource = minimumResource;
|
|
urlObj.extra.relation.minimumQuery = minimumQuery;
|
|
urlObj.extra.relation.minimumHash = minimumHash;
|
|
|
|
urlObj.extra.relation.maximumPort =
|
|
!minimumScheme || (minimumScheme && !minimumPath);
|
|
urlObj.extra.relation.maximumPath =
|
|
!minimumScheme || (minimumScheme && !minimumResource);
|
|
urlObj.extra.relation.maximumResource =
|
|
!minimumScheme || (minimumScheme && !minimumQuery);
|
|
urlObj.extra.relation.maximumQuery =
|
|
!minimumScheme || (minimumScheme && !minimumHash);
|
|
urlObj.extra.relation.maximumHash =
|
|
!minimumScheme || (minimumScheme && !minimumHash); // there's nothing after hash, so it's the same as maximumQuery
|
|
|
|
// Matching path and/or resource with existing but non-matching site query
|
|
urlObj.extra.relation.overridesQuery =
|
|
minimumPath &&
|
|
urlObj.extra.relation.maximumResource &&
|
|
!minimumQuery &&
|
|
!!siteUrlQuery;
|
|
}
|
|
|
|
module.exports = {
|
|
pathOn: findRelation_pathOn,
|
|
upToPath: findRelation_upToPath,
|
|
};
|