From 091b60d2e4f38d5d2c248d83f38549ee3a08819b Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Tue, 18 Feb 2025 15:37:15 +0100 Subject: [PATCH] feat(post): update zero_prefixed_house_numbers script --- post/zero_prefixed_house_numbers.js | 33 ++++- test/post/zero_prefixed_house_numbers.js | 154 ++++++++++++++++++++++- 2 files changed, 183 insertions(+), 4 deletions(-) diff --git a/post/zero_prefixed_house_numbers.js b/post/zero_prefixed_house_numbers.js index 5542c46..7796bd7 100644 --- a/post/zero_prefixed_house_numbers.js +++ b/post/zero_prefixed_house_numbers.js @@ -22,7 +22,38 @@ function housenumber(doc) { if ( houseno.length < 2 || !houseno.startsWith('0') ) { return; } // trim leading zeros - doc.setAddress('number', houseno.replace(/^0+/, '')); + const replacement = houseno.replace(/^0+/, '') || '0'; + + // update housenumber + doc.setAddress('number', replacement); + + // update address 'name' fields + names(doc, houseno, replacement); +} + +function names(doc, houseno, replacement) { + if( doc.getLayer() !== 'address' ){ return; } + + // ensure street is set + let street = doc.getAddress('street'); + if( !_.isString(street) || _.isEmpty(street) ){ return; } + + // load name data. ie: an object keyed by language codes, each value is an array of names + if (!_.isPlainObject(doc.name)) { return; } + + // $houseno must be surrounded by whitespace or start/end of text + const regexp = new RegExp('\\b' + _.escapeRegExp(houseno) + '\\b'); + + // iterate over all languages + _.each(doc.name, (names, lang) => { + if (_.isEmpty(names)) { return; } + + // replace house number in name fields + const replaced = _.castArray(names).map(name => name.replace(regexp, replacement)); + + // update lang + doc.name[lang] = _.size(replaced) === 1 ? _.first(replaced) : replaced; + }); } module.exports = housenumber; diff --git a/test/post/zero_prefixed_house_numbers.js b/test/post/zero_prefixed_house_numbers.js index 35007b3..4a0ac36 100644 --- a/test/post/zero_prefixed_house_numbers.js +++ b/test/post/zero_prefixed_house_numbers.js @@ -5,7 +5,7 @@ module.exports.tests = {}; module.exports.tests.noop = function(test) { test('noop: house number not set', function(t) { - const doc = new Document('mysource', 'mylayer', 'myid'); + const doc = new Document('mysource', 'address', 'myid'); housenumber(doc); @@ -16,7 +16,7 @@ module.exports.tests.noop = function(test) { }); test('noop: house no leading zero', function(t) { - const doc = new Document('mysource', 'mylayer', 'myid'); + const doc = new Document('mysource', 'address', 'myid'); doc.setAddress('number', '10'); housenumber(doc); @@ -28,7 +28,7 @@ module.exports.tests.noop = function(test) { }); test('noop: house no is literally zero', function(t) { - const doc = new Document('mysource', 'mylayer', 'myid'); + const doc = new Document('mysource', 'address', 'myid'); doc.setAddress('number', '0'); housenumber(doc); @@ -76,6 +76,154 @@ module.exports.tests.strip_prefix = function(test) { t.end(); }); + + test('strip: house number with multiple zeros', function(t) { + const doc = new Document('mysource', 'mylayer', 'myid'); + doc.setAddress('number', '00000'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '0', 'prefix removed'); + + t.end(); + }); +}; + +module.exports.tests.update_names = function(test) { + test('name: scalar', function(t) { + const doc = new Document('mysource', 'address', 'myid'); + doc.setAddress('number', '010'); + doc.setAddress('street', 'Main Street'); + doc.setName('default', '010 Main Street'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '10', 'prefix removed'); + t.equal(doc.getAddress('street'), 'Main Street', 'no-op'); + t.equal(doc.getName('default'), '10 Main Street', 'prefix removed'); + + t.end(); + }); + + test('name: array', function(t) { + const doc = new Document('mysource', 'address', 'myid'); + doc.setAddress('number', '010'); + doc.setAddress('street', 'Main Street'); + doc.setName('default', '010 Main Street'); + doc.setNameAlias('default', '010 Main Street'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '10', 'prefix removed'); + t.equal(doc.getAddress('street'), 'Main Street', 'no-op'); + t.equal(doc.getName('default'), '10 Main Street', 'prefix removed'); + t.deepEqual(doc.getNameAliases('default'), ['10 Main Street'], 'prefix removed'); + + t.end(); + }); + + test('name: scalar - invert', function(t) { + const doc = new Document('mysource', 'address', 'myid'); + doc.setAddress('number', '010'); + doc.setAddress('street', 'Hauptstraße'); + doc.setName('default', 'Hauptstraße 010'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '10', 'prefix removed'); + t.equal(doc.getAddress('street'), 'Hauptstraße', 'no-op'); + t.equal(doc.getName('default'), 'Hauptstraße 10', 'prefix removed'); + + t.end(); + }); + + test('name: array - invert', function(t) { + const doc = new Document('mysource', 'address', 'myid'); + doc.setAddress('number', '010'); + doc.setAddress('street', 'Hauptstraße'); + doc.setName('default', 'Hauptstraße 010'); + doc.setNameAlias('default', 'Hauptstraße 010'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '10', 'prefix removed'); + t.equal(doc.getAddress('street'), 'Hauptstraße', 'no-op'); + t.equal(doc.getName('default'), 'Hauptstraße 10', 'prefix removed'); + t.deepEqual(doc.getNameAliases('default'), ['Hauptstraße 10'], 'prefix removed'); + + t.end(); + }); + + test('name: scalar - infix ignored', function(t) { + const doc = new Document('mysource', 'address', 'myid'); + doc.setAddress('number', '010'); + doc.setAddress('street', '0100 Street'); + doc.setName('default', '010 0100 Street'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '10', 'prefix removed'); + t.equal(doc.getAddress('street'), '0100 Street', 'no-op'); + t.equal(doc.getName('default'), '10 0100 Street', 'prefix removed'); + + t.end(); + }); + + test('name: scalar - unit maintained', function(t) { + const doc = new Document('mysource', 'address', 'myid'); + doc.setAddress('number', '010'); + doc.setAddress('unit', '1A'); + doc.setAddress('street', 'Main Street'); + doc.setName('default', '1A 010 Main Street'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '10', 'prefix removed'); + t.equal(doc.getAddress('unit'), '1A', 'no-op'); + t.equal(doc.getAddress('street'), 'Main Street', 'no-op'); + t.equal(doc.getName('default'), '1A 10 Main Street', 'prefix removed'); + + t.end(); + }); + + test('name: scalar - ordinal ignored', function(t) { + const doc = new Document('mysource', 'address', 'myid'); + doc.setAddress('number', '010'); + doc.setAddress('street', '10th Street'); + doc.setName('default', '010 10th Street'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '10', 'prefix removed'); + t.equal(doc.getAddress('street'), '10th Street', 'no-op'); + t.equal(doc.getName('default'), '10 10th Street', 'prefix removed'); + + t.end(); + }); + + test('name: scalar - only first match replaced', function(t) { + const doc = new Document('mysource', 'address', 'myid'); + doc.setAddress('number', '010'); + doc.setAddress('street', '010 Street'); + doc.setName('default', '010 010 Street'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '10', 'prefix removed'); + t.equal(doc.getAddress('street'), '010 Street', 'no-op'); + t.equal(doc.getName('default'), '10 010 Street', 'prefix removed'); + + t.end(); + }); }; module.exports.all = function (tape, common) {