in modules/entities/group_manager.js [120:204]
function matchesRule(rule) {
if (rule.any) {
return rule.any.some(matchesRule);
} else if (rule.all) {
return rule.all.every(matchesRule);
} else if (rule.none) {
return !rule.none.some(matchesRule);
} else if (rule.notAll) {
return !rule.notAll.every(matchesRule);
}
if (rule.geometry) {
if (Array.isArray(rule.geometry)) {
if (rule.geometry.indexOf(geometry) === -1) return false;
} else {
if (rule.geometry !== geometry) return false;
}
}
var ruleKey;
if (rule.allTags) {
for (ruleKey in rule.allTags) {
if (!matchesTagComponent(ruleKey, rule.allTags)) return false;
}
}
if (rule.anyTags) {
var didMatch = false;
for (ruleKey in rule.anyTags) {
if (matchesTagComponent(ruleKey, rule.anyTags)) {
didMatch = true;
break;
}
}
if (!didMatch) return false;
}
if (rule.notAnyTags) {
for (ruleKey in rule.notAnyTags) {
if (matchesTagComponent(ruleKey, rule.notAnyTags)) return false;
}
}
if (rule.allowOtherTags === false) {
var ruleTags = ruleTagsFor(rule);
for (var key in tags) {
if (!ruleTags[key]) return false;
if (typeof ruleTags[key] === 'object') {
if (!ruleTags[key][tags[key]]) return false;
}
}
}
var otherGroupID, matchesOther;
if (rule.allGroups) {
for (otherGroupID in rule.allGroups) {
// avoid simple infinte recursion
if (otherGroupID === group.id) continue;
// skip erroneous group IDs
if (!allGroups[otherGroupID]) continue;
matchesOther = allGroups[otherGroupID].matchesTags(tags, geometry);
if ((rule.allGroups[otherGroupID] && !matchesOther) ||
(!rule.allGroups[otherGroupID] && matchesOther)) return false;
}
}
if (rule.anyGroups) {
var didMatchGroup = false;
for (otherGroupID in rule.anyGroups) {
// avoid simple infinte recursion
if (otherGroupID === group.id) continue;
// skip erroneous group IDs
if (!allGroups[otherGroupID]) continue;
matchesOther = allGroups[otherGroupID].matchesTags(tags, geometry);
if ((rule.anyGroups[otherGroupID] && matchesOther) ||
(!rule.anyGroups[otherGroupID] && !matchesOther)) {
didMatchGroup = true;
break;
}
}
if (!didMatchGroup) return false;
}
return true;
}