|
|
|
var _ = require('lodash'),
|
|
|
|
schemas = require('./labelSchema');
|
|
|
|
|
|
|
|
module.exports = function( record ){
|
|
|
|
var schema = getSchema(record.country_a);
|
|
|
|
|
|
|
|
var labelParts = getInitialLabel(record);
|
|
|
|
|
|
|
|
for (var key in schema) {
|
|
|
|
var valueFunction = schema[key];
|
|
|
|
|
|
|
|
labelParts = valueFunction(record, labelParts);
|
|
|
|
}
|
|
|
|
|
|
|
|
// NOTE: while it may seem odd to call `uniq` on the list of label parts,
|
|
|
|
// the effect is quite subtle. Take, for instance, a result for "Lancaster, PA"
|
|
|
|
// the pseudo-object is:
|
|
|
|
// {
|
|
|
|
// 'name': 'Lancaster',
|
|
|
|
// 'locality': 'Lancaster',
|
|
|
|
// 'region_a': 'PA',
|
|
|
|
// 'country_a': 'USA'
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// the code up to this point generates the label:
|
|
|
|
// `Lancaster, Lancaster, PA, USA`
|
|
|
|
//
|
|
|
|
// then the `unique` call reduces this to:
|
|
|
|
// `Lancaster, PA, USA`
|
|
|
|
//
|
|
|
|
// this code doesn't have the same effect in the case of a venue or address
|
|
|
|
// where the `name` field would contain the address or name of a point-of-interest
|
|
|
|
//
|
|
|
|
// Also see https://github.com/pelias/api/issues/429 for other ways that this is bad
|
|
|
|
//
|
|
|
|
// de-dupe, join, trim
|
|
|
|
return _.uniq( labelParts ).join(', ').trim();
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
function getSchema(country_a) {
|
|
|
|
if (country_a && country_a.length && schemas[country_a]) {
|
|
|
|
return schemas[country_a];
|
|
|
|
}
|
|
|
|
|
|
|
|
return schemas.default;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// helper function that sets a default label for non-US/CA regions
|
|
|
|
// this is a very special case
|
|
|
|
function getInitialLabel(record) {
|
|
|
|
if (isRegion(record.layer) &&
|
|
|
|
isGeonamesOrWhosOnFirst(record.source) &&
|
|
|
|
isUSAOrCAN(record.country_a)) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
|
|
|
return [record.name];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function isRegion(layer) {
|
|
|
|
return 'region' === layer;
|
|
|
|
}
|
|
|
|
|
|
|
|
function isUSAOrCAN(country_a) {
|
|
|
|
return 'USA' === country_a || 'CAN' === country_a;
|
|
|
|
}
|
|
|
|
|
|
|
|
function isGeonamesOrWhosOnFirst(source) {
|
|
|
|
return 'geonames' === source || 'whosonfirst' === source;
|
|
|
|
|
|
|
|
}
|