mirror of https://github.com/pelias/api.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.9 KiB
74 lines
1.9 KiB
var _ = require('lodash'), |
|
schemas = require('./labelSchema'); |
|
|
|
module.exports = function( record ){ |
|
var schema = getSchema(record.country_a); |
|
|
|
// in virtually all cases, this will be the `name` field |
|
var labelParts = getInitialLabel(record); |
|
|
|
// iterate the schema |
|
for (var field in schema) { |
|
var valueFunction = schema[field]; |
|
labelParts.push(valueFunction(record)); |
|
} |
|
|
|
// retain only things that are truthy |
|
labelParts = _.compact(labelParts); |
|
|
|
// third, dedupe and join with a comma and return |
|
return dedupeNameAndFirstLabelElement(labelParts).join(', '); |
|
|
|
}; |
|
|
|
function dedupeNameAndFirstLabelElement(labelParts) { |
|
// only dedupe if a result has more than a name (the first label part) |
|
if (labelParts.length > 1) { |
|
// first, dedupe the name and 1st label array elements |
|
// this is used to ensure that the `name` and first admin hierarchy elements aren't repeated |
|
// eg - `["Lancaster", "Lancaster", "PA", "United States"]` -> `["Lancaster", "PA", "United States"]` |
|
var deduped = _.uniq([labelParts.shift(), labelParts.shift()]); |
|
|
|
// second, unshift the deduped parts back onto the labelParts |
|
labelParts.unshift.apply(labelParts, deduped); |
|
|
|
} |
|
|
|
return labelParts; |
|
|
|
} |
|
|
|
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; |
|
|
|
}
|
|
|