From dcfba67422f25249a35f0afac5ad077e3d755e0b Mon Sep 17 00:00:00 2001 From: Joshua Ramon Enslin Date: Thu, 30 Nov 2023 22:29:25 +0100 Subject: [PATCH] Allow different sub-vocabs of NDP-IKMK for places --- src/enums/MDNodaRepository.php | 34 ++++++++++++++++++++++++++++++++-- tests/MDNodaRepositoryTest.php | 7 +++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/enums/MDNodaRepository.php b/src/enums/MDNodaRepository.php index 10f09db..61ee902 100644 --- a/src/enums/MDNodaRepository.php +++ b/src/enums/MDNodaRepository.php @@ -205,7 +205,7 @@ enum MDNodaRepository implements MDValueEnumInterface, JsonSerializable { self::moebeltypologie => 'https://term.museum-digital.de/moebel/tag/', self::ndb_adb => 'https://www.deutsche-biographie.de/pnd', self::ndl => 'https://id.ndl.go.jp/auth/ndlna/', - self::ndp_ikmk => 'https://ikmk.smb.museum/ndp/land/', + self::ndp_ikmk => 'https://ikmk.smb.museum/ndp/', self::ndp_ikmk_persons => 'https://ikmk.smb.museum/ndp/person/', self::nomisma => 'http://nomisma.org/id/', self::npg => 'https://www.npg.org.uk/collections/search/person/', @@ -473,6 +473,36 @@ enum MDNodaRepository implements MDValueEnumInterface, JsonSerializable { } + /** + * Validates an NDP-IKMK ID. The IKMK vocabularies for places are actually quite + * numerous, identifying places, countries, regions separately. + * + * @param string $id ID to validate. + * + * @return string|false + */ + private static function validateNdpIkmkForPlaces(string $id):string|false { + + $id = str_replace("https://ikmk.smb.museum/ndp/", "", trim($id, '/')); + + $parts = explode('/', $id); + if (count($parts) !== 2) { + return false; + } + + if (!in_array($parts[0], ['ort', 'land', 'region'], true)) { + return false; + } + + // There is an issue with this regex + if (self::_is_numeric($parts[1]) === false) { + return false; + } + + return $parts[0] . '/' . $parts[1]; + + } + /** * Validates a PIM ID, returning a string or false. * @@ -661,7 +691,7 @@ enum MDNodaRepository implements MDValueEnumInterface, JsonSerializable { 'http://id.ndl.go.jp/auth/ndlna/', 'https://id.ndl.go.jp/auth/ndlna/', ]), - self::ndp_ikmk => self::validateNumericId($id, ['https://ikmk.smb.museum/ndp/land/']), + self::ndp_ikmk => self::validateNdpIkmkForPlaces($id), self::ndp_ikmk_persons => self::validateNumericId($id, ['https://ikmk.smb.museum/ndp/person/']), self::nomisma => str_replace('http://nomisma.org/id/', '', $id), self::npg => self::validateNpgId($id), diff --git a/tests/MDNodaRepositoryTest.php b/tests/MDNodaRepositoryTest.php index b06932f..40bd1a2 100644 --- a/tests/MDNodaRepositoryTest.php +++ b/tests/MDNodaRepositoryTest.php @@ -69,5 +69,12 @@ final class MDNodaRepositoryTest extends TestCase { self::assertEquals("2869150688328112660005", MDNodaRepository::viaf->validateId("2869150688328112660005")); self::assertEquals(false, MDNodaRepository::viaf->validateId("2869150688328112;;660005")); + # NDP-IKMK (Places) + self::assertEquals("ort/2847", MDNodaRepository::ndp_ikmk->validateId("https://ikmk.smb.museum/ndp/ort/2847")); + self::assertEquals("land/123", MDNodaRepository::ndp_ikmk->validateId("https://ikmk.smb.museum/ndp/land/123")); + self::assertEquals("region/123", MDNodaRepository::ndp_ikmk->validateId("https://ikmk.smb.museum/ndp/region/123")); + self::assertEquals("land/123", MDNodaRepository::ndp_ikmk->validateId("land/123")); + self::assertEquals(false, MDNodaRepository::ndp_ikmk->validateId("123123")); + } }