From b33c598180806f19dfb7b8434c0eaf777691dc6d Mon Sep 17 00:00:00 2001 From: Praneeth Pondicherry Ravendernath Date: Wed, 15 Jun 2022 17:47:57 -0500 Subject: [PATCH 1/9] Added functionality to search multiple udi and dois --- src/Util/Search.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Util/Search.php b/src/Util/Search.php index c4aafdcbe1..7326b2fbd3 100644 --- a/src/Util/Search.php +++ b/src/Util/Search.php @@ -818,8 +818,11 @@ private function doesDoiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fie if (preg_match_all($doiRegEx, $queryTerm, $matches)) { trim(preg_replace($doiRegEx, '', $queryTerm)); $queryTerm = $matches[1][0]; - $fieldsBoolQuery->addShould($this->getDoiQuery($queryTerm)); - $fieldsBoolQuery->addShould($this->getPubDoiQuery($queryTerm)); + foreach ($matches[1] as $doi) { + $queryTerm = $queryTerm . ' ' . $doi; + $fieldsBoolQuery->addShould($this->getDoiQuery($doi)); + $fieldsBoolQuery->addShould($this->getPubDoiQuery($doi)); + } } return $queryTerm; } @@ -890,9 +893,12 @@ private function doesUdiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fie if (preg_match_all($udiRegEx, $queryTerm, $matches)) { trim(preg_replace($udiRegEx, '', $queryTerm)); $queryTerm = $matches[1][0]; - // Replacing the 11th position to ":" - $queryTerm = substr_replace($queryTerm, ':', 11, 1); - $fieldsBoolQuery->addShould($this->getUdiQuery($queryTerm)); + foreach ($matches[1] as $udi) { + $queryTerm = $queryTerm . ' ' . $udi; + // Replacing the 11th position to ":" + $udiQuery = substr_replace($udi, ':', 11, 1); + $fieldsBoolQuery->addShould($this->getUdiQuery($udiQuery)); + } } return $queryTerm; } From 5d440f1878cc29d79295e4cbaf887d769a77c4b8 Mon Sep 17 00:00:00 2001 From: Praneeth Pondicherry Ravendernath Date: Thu, 16 Jun 2022 09:11:36 -0500 Subject: [PATCH 2/9] Added multi udi, doi search in title and other fields work --- src/Util/Search.php | 50 ++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/src/Util/Search.php b/src/Util/Search.php index 7326b2fbd3..7a90d7af05 100644 --- a/src/Util/Search.php +++ b/src/Util/Search.php @@ -537,26 +537,28 @@ private function getFieldsQuery(string $queryTerm, string $specificField = null, $fieldsBoolQuery = new Query\BoolQuery(); if ($specificField) { - $specificFieldMatchQuery = new Query\Match(); + $specificFieldMatchQuery = new Query\MatchQuery(); $specificFieldMatchQuery->setFieldQuery($specificField, $queryTerm); $specificFieldMatchQuery->setFieldOperator($specificField, 'and'); $fieldsBoolQuery->addShould($specificFieldMatchQuery); } else { - $queryTerm = $this->doesDoiExistInQueryTerm($queryTerm, $fieldsBoolQuery); - $queryTerm = $this->doesUdiExistInQueryTerm($queryTerm, $fieldsBoolQuery); - $fieldsMultiMatchQuery = new Query\MultiMatch(); - $fieldsMultiMatchQuery->setQuery($queryTerm); - $fieldsMultiMatchQuery->setOperator('and'); - $fieldsMultiMatchQuery->setType('cross_fields'); - $fieldsMultiMatchQuery->setFields( - [ - self::ELASTIC_INDEX_MAPPING_TITLE . self::BOOST, - self::ELASTIC_INDEX_MAPPING_ABSTRACT, - self::ELASTIC_INDEX_MAPPING_THEME_KEYWORDS . self::BOOST, - self::ELASTIC_INDEX_MAPPING_AUTHORS . self::BOOST - ] - ); - $fieldsBoolQuery->addShould($fieldsMultiMatchQuery); + $this->doesDoiExistInQueryTerm($queryTerm, $fieldsBoolQuery); + $this->doesUdiExistInQueryTerm($queryTerm, $fieldsBoolQuery); + foreach (explode(',', $queryTerm) as $querySingleTerm) { + $fieldsMultiMatchQuery = new Query\MultiMatch(); + $fieldsMultiMatchQuery->setQuery($querySingleTerm); + $fieldsMultiMatchQuery->setOperator('and'); + $fieldsMultiMatchQuery->setType('cross_fields'); + $fieldsMultiMatchQuery->setFields( + [ + self::ELASTIC_INDEX_MAPPING_TITLE . self::BOOST, + self::ELASTIC_INDEX_MAPPING_ABSTRACT, + self::ELASTIC_INDEX_MAPPING_THEME_KEYWORDS . self::BOOST, + self::ELASTIC_INDEX_MAPPING_AUTHORS . self::BOOST + ] + ); + $fieldsBoolQuery->addShould($fieldsMultiMatchQuery); + } } return $fieldsBoolQuery; @@ -810,21 +812,17 @@ private function getCollectionEndDateQuery(array $collectionDates): Query\Range * @param string $queryTerm Query term that needs to be checked if DOI exists. * @param Query\BoolQuery $fieldsBoolQuery The fields elastic boolean query that DOI query is added to. * - * @return string + * @return void */ - private function doesDoiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): string + private function doesDoiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): void { $doiRegEx = '!\b(?:[Dd][Oo][Ii]\s*:\s*)?(10.\d{4,9}/[-._;()/:A-Z0-9a-z]+)\b!'; if (preg_match_all($doiRegEx, $queryTerm, $matches)) { - trim(preg_replace($doiRegEx, '', $queryTerm)); - $queryTerm = $matches[1][0]; foreach ($matches[1] as $doi) { - $queryTerm = $queryTerm . ' ' . $doi; $fieldsBoolQuery->addShould($this->getDoiQuery($doi)); $fieldsBoolQuery->addShould($this->getPubDoiQuery($doi)); } } - return $queryTerm; } /** @@ -885,22 +883,18 @@ private function getUdiQuery(string $queryTerm): Query\MatchPhrase * @param string $queryTerm Query term that needs to be checked if udi exists. * @param Query\BoolQuery $fieldsBoolQuery The fields elastic boolean query that udi query is added to. * - * @return string + * @return void */ - private function doesUdiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): string + private function doesUdiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): void { $udiRegEx = '/\b([A-Z\d]{2}\.x\d\d\d\.\d\d\d[:.]\d\d\d\d)\b/i'; if (preg_match_all($udiRegEx, $queryTerm, $matches)) { - trim(preg_replace($udiRegEx, '', $queryTerm)); - $queryTerm = $matches[1][0]; foreach ($matches[1] as $udi) { - $queryTerm = $queryTerm . ' ' . $udi; // Replacing the 11th position to ":" $udiQuery = substr_replace($udi, ':', 11, 1); $fieldsBoolQuery->addShould($this->getUdiQuery($udiQuery)); } } - return $queryTerm; } /** From 1338f2227b5987730f1ab3a4a610704d466d75a9 Mon Sep 17 00:00:00 2001 From: Praneeth Pondicherry Ravendernath Date: Thu, 16 Jun 2022 11:33:40 -0500 Subject: [PATCH 3/9] Added foreach back --- src/Util/Search.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Util/Search.php b/src/Util/Search.php index 8beb72a065..fef5c579cb 100644 --- a/src/Util/Search.php +++ b/src/Util/Search.php @@ -550,11 +550,13 @@ private function getFieldsQuery(string $queryTerm, string $specificField = null, $this->doesDoiExistInQueryTerm($queryTerm, $fieldsBoolQuery); $this->doesUdiExistInQueryTerm($queryTerm, $fieldsBoolQuery); - $simpleQuery = new Query\SimpleQueryString($queryTerm, $specificField); - $simpleQuery->setParam('flags', 'PHRASE|PREFIX|WHITESPACE'); - $simpleQuery->setDefaultOperator(Query\SimpleQueryString::OPERATOR_AND); + foreach (explode(',', $queryTerm) as $singleQueryTerm) { + $simpleQuery = new Query\SimpleQueryString($singleQueryTerm, $specificField); + $simpleQuery->setParam('flags', 'PHRASE|PREFIX|WHITESPACE'); + $simpleQuery->setDefaultOperator(Query\SimpleQueryString::OPERATOR_AND); - $fieldsBoolQuery->addShould($simpleQuery); + $fieldsBoolQuery->addShould($simpleQuery); + } return $fieldsBoolQuery; } From ff1761844c5781d0c86ed570060a6b8f6fa3531c Mon Sep 17 00:00:00 2001 From: Michael van den Eijnden Date: Mon, 20 Jun 2022 09:17:17 -0500 Subject: [PATCH 4/9] This is no longer needed or desired --- src/Util/Search.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Util/Search.php b/src/Util/Search.php index fef5c579cb..8beb72a065 100644 --- a/src/Util/Search.php +++ b/src/Util/Search.php @@ -550,13 +550,11 @@ private function getFieldsQuery(string $queryTerm, string $specificField = null, $this->doesDoiExistInQueryTerm($queryTerm, $fieldsBoolQuery); $this->doesUdiExistInQueryTerm($queryTerm, $fieldsBoolQuery); - foreach (explode(',', $queryTerm) as $singleQueryTerm) { - $simpleQuery = new Query\SimpleQueryString($singleQueryTerm, $specificField); - $simpleQuery->setParam('flags', 'PHRASE|PREFIX|WHITESPACE'); - $simpleQuery->setDefaultOperator(Query\SimpleQueryString::OPERATOR_AND); + $simpleQuery = new Query\SimpleQueryString($queryTerm, $specificField); + $simpleQuery->setParam('flags', 'PHRASE|PREFIX|WHITESPACE'); + $simpleQuery->setDefaultOperator(Query\SimpleQueryString::OPERATOR_AND); - $fieldsBoolQuery->addShould($simpleQuery); - } + $fieldsBoolQuery->addShould($simpleQuery); return $fieldsBoolQuery; } From 385e059347d77a93c012b232f68972c73aea31a3 Mon Sep 17 00:00:00 2001 From: Michael van den Eijnden Date: Mon, 20 Jun 2022 11:04:54 -0500 Subject: [PATCH 5/9] Using for each again. commas seem to work also --- src/Util/Search.php | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/Util/Search.php b/src/Util/Search.php index 8beb72a065..50286e6fba 100644 --- a/src/Util/Search.php +++ b/src/Util/Search.php @@ -547,8 +547,8 @@ private function getFieldsQuery(string $queryTerm, string $specificField = null, // Bool query to add all fields $fieldsBoolQuery = new Query\BoolQuery(); - $this->doesDoiExistInQueryTerm($queryTerm, $fieldsBoolQuery); - $this->doesUdiExistInQueryTerm($queryTerm, $fieldsBoolQuery); + $queryTerm = $this->doesDoiExistInQueryTerm($queryTerm, $fieldsBoolQuery); + $queryTerm = $this->doesUdiExistInQueryTerm($queryTerm, $fieldsBoolQuery); $simpleQuery = new Query\SimpleQueryString($queryTerm, $specificField); $simpleQuery->setParam('flags', 'PHRASE|PREFIX|WHITESPACE'); @@ -556,6 +556,8 @@ private function getFieldsQuery(string $queryTerm, string $specificField = null, $fieldsBoolQuery->addShould($simpleQuery); + dump($fieldsBoolQuery); + return $fieldsBoolQuery; } @@ -791,17 +793,18 @@ private function getCollectionEndDateQuery(array $collectionDates): Query\Range * @param string $queryTerm Query term that needs to be checked if DOI exists. * @param Query\BoolQuery $fieldsBoolQuery The fields elastic boolean query that DOI query is added to. * - * @return void + * @return string */ - private function doesDoiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): void + private function doesDoiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): string { $doiRegEx = '!\b(?:[Dd][Oo][Ii]\s*:\s*)?(10.\d{4,9}/[-._;()/:A-Z0-9a-z]+)\b!'; if (preg_match_all($doiRegEx, $queryTerm, $matches)) { - foreach ($matches[1] as $doi) { - $fieldsBoolQuery->addShould($this->getDoiQuery($doi)); - $fieldsBoolQuery->addShould($this->getPubDoiQuery($doi)); - } + trim(preg_replace($doiRegEx, '', $queryTerm)); + $queryTerm = $matches[1][0]; + $fieldsBoolQuery->addShould($this->getDoiQuery($queryTerm)); + $fieldsBoolQuery->addShould($this->getPubDoiQuery($queryTerm)); } + return $queryTerm; } /** @@ -862,18 +865,20 @@ private function getUdiQuery(string $queryTerm): Query\MatchPhrase * @param string $queryTerm Query term that needs to be checked if udi exists. * @param Query\BoolQuery $fieldsBoolQuery The fields elastic boolean query that udi query is added to. * - * @return void + * @return string */ - private function doesUdiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): void + private function doesUdiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): string { $udiRegEx = '/\b([A-Z\d]{2}\.x\d\d\d\.\d\d\d[:.]\d\d\d\d)\b/i'; if (preg_match_all($udiRegEx, $queryTerm, $matches)) { + trim(preg_replace($udiRegEx, '', $queryTerm)); foreach ($matches[1] as $udi) { // Replacing the 11th position to ":" - $udiQuery = substr_replace($udi, ':', 11, 1); - $fieldsBoolQuery->addShould($this->getUdiQuery($udiQuery)); + $udi = substr_replace($udi, ':', 11, 1); + $fieldsBoolQuery->addShould($this->getUdiQuery($udi)); } } + return $queryTerm; } /** From 8dff5ad4192b2eeff41376f41c742ef24e5163d9 Mon Sep 17 00:00:00 2001 From: Michael van den Eijnden Date: Mon, 20 Jun 2022 11:06:27 -0500 Subject: [PATCH 6/9] remove dump --- src/Util/Search.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Util/Search.php b/src/Util/Search.php index 50286e6fba..d9c60ad1f5 100644 --- a/src/Util/Search.php +++ b/src/Util/Search.php @@ -556,8 +556,6 @@ private function getFieldsQuery(string $queryTerm, string $specificField = null, $fieldsBoolQuery->addShould($simpleQuery); - dump($fieldsBoolQuery); - return $fieldsBoolQuery; } From 5d6c64d08179c047ceb5187e2d8da76a1b318b8e Mon Sep 17 00:00:00 2001 From: Praneeth Pondicherry Ravendernath Date: Tue, 21 Jun 2022 09:50:14 -0500 Subject: [PATCH 7/9] Fixed date range value on change --- assets/js/vue/components/search/SearchForm.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/assets/js/vue/components/search/SearchForm.vue b/assets/js/vue/components/search/SearchForm.vue index e19b40b4c1..e07b2527a2 100644 --- a/assets/js/vue/components/search/SearchForm.vue +++ b/assets/js/vue/components/search/SearchForm.vue @@ -150,6 +150,8 @@ export default { onStartDateChanged(event) { if (event.value instanceof Date) { this.form.collectionStartDate = event.value.toLocaleDateString(); + } else if (event.value) { + this.form.collectionStartDate = event.value; } else { this.form.collectionStartDate = ''; } @@ -157,6 +159,8 @@ export default { onEndDateChanged(event) { if (event.value instanceof Date) { this.form.collectionEndDate = event.value.toLocaleDateString(); + } else if (event.value) { + this.form.collectionEndDate = event.value; } else { this.form.collectionEndDate = ''; } From 349685480132dda4301d5a2d222b40daca20f2d0 Mon Sep 17 00:00:00 2001 From: Michael van den Eijnden Date: Tue, 21 Jun 2022 14:43:36 -0500 Subject: [PATCH 8/9] Put back DOI for each --- src/Util/Search.php | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/Util/Search.php b/src/Util/Search.php index d9c60ad1f5..392b6ea66f 100644 --- a/src/Util/Search.php +++ b/src/Util/Search.php @@ -547,8 +547,8 @@ private function getFieldsQuery(string $queryTerm, string $specificField = null, // Bool query to add all fields $fieldsBoolQuery = new Query\BoolQuery(); - $queryTerm = $this->doesDoiExistInQueryTerm($queryTerm, $fieldsBoolQuery); - $queryTerm = $this->doesUdiExistInQueryTerm($queryTerm, $fieldsBoolQuery); + $this->doesDoiExistInQueryTerm($queryTerm, $fieldsBoolQuery); + $this->doesUdiExistInQueryTerm($queryTerm, $fieldsBoolQuery); $simpleQuery = new Query\SimpleQueryString($queryTerm, $specificField); $simpleQuery->setParam('flags', 'PHRASE|PREFIX|WHITESPACE'); @@ -791,18 +791,17 @@ private function getCollectionEndDateQuery(array $collectionDates): Query\Range * @param string $queryTerm Query term that needs to be checked if DOI exists. * @param Query\BoolQuery $fieldsBoolQuery The fields elastic boolean query that DOI query is added to. * - * @return string + * @return void */ - private function doesDoiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): string + private function doesDoiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): void { $doiRegEx = '!\b(?:[Dd][Oo][Ii]\s*:\s*)?(10.\d{4,9}/[-._;()/:A-Z0-9a-z]+)\b!'; if (preg_match_all($doiRegEx, $queryTerm, $matches)) { - trim(preg_replace($doiRegEx, '', $queryTerm)); - $queryTerm = $matches[1][0]; - $fieldsBoolQuery->addShould($this->getDoiQuery($queryTerm)); - $fieldsBoolQuery->addShould($this->getPubDoiQuery($queryTerm)); + foreach ($matches[1] as $doi) { + $fieldsBoolQuery->addShould($this->getDoiQuery($doi)); + $fieldsBoolQuery->addShould($this->getPubDoiQuery($doi)); + } } - return $queryTerm; } /** @@ -863,9 +862,9 @@ private function getUdiQuery(string $queryTerm): Query\MatchPhrase * @param string $queryTerm Query term that needs to be checked if udi exists. * @param Query\BoolQuery $fieldsBoolQuery The fields elastic boolean query that udi query is added to. * - * @return string + * @return void */ - private function doesUdiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): string + private function doesUdiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fieldsBoolQuery): void { $udiRegEx = '/\b([A-Z\d]{2}\.x\d\d\d\.\d\d\d[:.]\d\d\d\d)\b/i'; if (preg_match_all($udiRegEx, $queryTerm, $matches)) { @@ -876,7 +875,6 @@ private function doesUdiExistInQueryTerm(string $queryTerm, Query\BoolQuery $fie $fieldsBoolQuery->addShould($this->getUdiQuery($udi)); } } - return $queryTerm; } /** From 491008ad5c22e4f902883aebc7eca7ebbc529f99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jun 2022 20:49:29 +0000 Subject: [PATCH 9/9] Bump guzzlehttp/guzzle from 6.5.7 to 6.5.8 Bumps [guzzlehttp/guzzle](https://github.com/guzzle/guzzle) from 6.5.7 to 6.5.8. - [Release notes](https://github.com/guzzle/guzzle/releases) - [Changelog](https://github.com/guzzle/guzzle/blob/6.5.8/CHANGELOG.md) - [Commits](https://github.com/guzzle/guzzle/compare/6.5.7...6.5.8) --- updated-dependencies: - dependency-name: guzzlehttp/guzzle dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- composer.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/composer.lock b/composer.lock index 5a69ab7e93..14d056d804 100644 --- a/composer.lock +++ b/composer.lock @@ -2534,24 +2534,24 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.7", + "version": "6.5.8", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "724562fa861e21a4071c652c8a159934e4f05592" + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/724562fa861e21a4071c652c8a159934e4f05592", - "reference": "724562fa861e21a4071c652c8a159934e4f05592", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", + "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", + "guzzlehttp/psr7": "^1.9", "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17.0" + "symfony/polyfill-intl-idn": "^1.17" }, "require-dev": { "ext-curl": "*", @@ -2629,7 +2629,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5.7" + "source": "https://github.com/guzzle/guzzle/tree/6.5.8" }, "funding": [ { @@ -2645,7 +2645,7 @@ "type": "tidelift" } ], - "time": "2022-06-09T21:36:50+00:00" + "time": "2022-06-20T22:16:07+00:00" }, { "name": "guzzlehttp/promises", @@ -2733,16 +2733,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.8.5", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "337e3ad8e5716c15f9657bd214d16cc5e69df268" + "reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/337e3ad8e5716c15f9657bd214d16cc5e69df268", - "reference": "337e3ad8e5716c15f9657bd214d16cc5e69df268", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/e98e3e6d4f86621a9b75f623996e6bbdeb4b9318", + "reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318", "shasum": "" }, "require": { @@ -2763,7 +2763,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "1.9-dev" } }, "autoload": { @@ -2823,7 +2823,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.5" + "source": "https://github.com/guzzle/psr7/tree/1.9.0" }, "funding": [ { @@ -2839,7 +2839,7 @@ "type": "tidelift" } ], - "time": "2022-03-20T21:51:18+00:00" + "time": "2022-06-20T21:43:03+00:00" }, { "name": "hylianshield/alphabet",