From 32e7a1a91365084a46532568743b05a3d1afe002 Mon Sep 17 00:00:00 2001 From: Sameh Khamis Date: Tue, 10 Nov 2026 13:16:42 -0800 Subject: [PATCH] fix(shipwrecks): skip every wrecksite.eu row, even when the name comes after the 80-character cut or only in the link The exclusion tested the provenance after it was cut to 80 characters, so a long source list ending in wrecksite.eu kept the row, and a row whose only trace was a wrecksite.eu page link was kept too. Both raw values are now checked before anything is cut. --- src/layers/shipwrecks/records.js | 12 ++++++++++-- src/layers/shipwrecks/records.test.mjs | 12 ++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/layers/shipwrecks/records.js b/src/layers/shipwrecks/records.js index 7a7072205..c1d17e77b 100644 --- a/src/layers/shipwrecks/records.js +++ b/src/layers/shipwrecks/records.js @@ -108,9 +108,15 @@ function httpUrl(value) { } } +/** Whether a provenance or link value points at wrecksite.eu, in any form. */ +function fromWrecksite(value) { + return typeof value === 'string' && /wrecksite/i.test(value); +} + /** * Normalize EMODnet's shipwreck GeoJSON. Records the portal took from - * wrecksite.eu are skipped: that site's data is not openly licensed. + * wrecksite.eu, named in the provenance or linked as the record's page, are + * skipped: that site's data is not openly licensed. * @param {object} payload WFS GeoJSON FeatureCollection. * @returns {object[]} Shipwreck records. */ @@ -126,8 +132,10 @@ export function normalizeEmodnetFeatures(payload) { const lon = Number(coords[0]); const lat = Number(coords[1]); if (!validPoint(lat, lon)) continue; + // Checked on the raw values: the shown origin is cut to 80 characters, + // and a long provenance list can name wrecksite.eu after the cut. + if (fromWrecksite(p.source_inf) || fromWrecksite(p.website1)) continue; const origin = clean(p.source_inf, 80); - if (origin && /wrecksite/i.test(origin)) continue; const key = clean(String(feature.id ?? p.source_id ?? ''), 80); if (!key) continue; const id = `emodnet:${key}`; diff --git a/src/layers/shipwrecks/records.test.mjs b/src/layers/shipwrecks/records.test.mjs index a61154a5a..e65863331 100644 --- a/src/layers/shipwrecks/records.test.mjs +++ b/src/layers/shipwrecks/records.test.mjs @@ -47,6 +47,18 @@ test('EMODnet wrecks keep ship facts and drop text that names people', () => { feature('w.4', { name: 'Null island' }, [0, 0]), ], }); + const ids = normalizeEmodnetFeatures({ + features: [ + feature('w.3', { name: 'Copied', source_inf: 'www.wrecksite.eu' }), + feature('w.5', { + source_inf: `${'SHOM; '.repeat(20)}wrecksite.eu`, + }), + feature('w.6', { website1: 'https://www.wrecksite.eu/wreck.aspx?1' }), + feature('w.7', { website1: 'wrecksite.eu/wreck/1' }), + feature('w.8', { name: 'Kept', source_inf: 'SHOM' }), + ], + }).map((record) => record.id); + assert.deepEqual(ids, ['emodnet:w.8'], 'wrecksite.eu rows are all skipped'); assert.equal(wreck.id, 'emodnet:w.1'); assert.equal(wreck.year, 1987); assert.equal(wreck.vesselType, 'Pusher or tug');