保誠-保戶業務員媒合平台
HelenHuang
2022-06-09 9bdb95c9e34cef640534e5e5a1e2225a80442000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
"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
};