From 631d2ea298f62788dd0a14c65f553e0d0ec8322c Mon Sep 17 00:00:00 2001 From: shibafu Date: Sat, 22 Feb 2020 14:39:25 +0900 Subject: [PATCH] =?UTF-8?q?=E3=82=BF=E3=82=B0=E3=82=92=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E5=89=8D=E3=81=AB=E6=AD=A3=E8=A6=8F=E5=8C=96=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/CardController.php | 2 +- app/Listeners/LinkCollector.php | 2 +- app/MetadataResolver/Metadata.php | 26 +++++++++++++++ tests/Unit/MetadataResolver/MetadataTest.php | 33 ++++++++++++++++++++ 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 tests/Unit/MetadataResolver/MetadataTest.php diff --git a/app/Http/Controllers/Api/CardController.php b/app/Http/Controllers/Api/CardController.php index a336830..aeaa37a 100644 --- a/app/Http/Controllers/Api/CardController.php +++ b/app/Http/Controllers/Api/CardController.php @@ -44,7 +44,7 @@ class CardController ]); $tagIds = []; - foreach ($resolved->tags as $tagName) { + foreach ($resolved->normalizedTags() as $tagName) { $tag = Tag::firstOrCreate(['name' => $tagName]); $tagIds[] = $tag->id; } diff --git a/app/Listeners/LinkCollector.php b/app/Listeners/LinkCollector.php index 1ca8682..867938f 100644 --- a/app/Listeners/LinkCollector.php +++ b/app/Listeners/LinkCollector.php @@ -56,7 +56,7 @@ class LinkCollector ]); $tagIds = []; - foreach ($resolved->tags as $tagName) { + foreach ($resolved->normalizedTags() as $tagName) { $tag = Tag::firstOrCreate(['name' => $tagName]); $tagIds[] = $tag->id; } diff --git a/app/MetadataResolver/Metadata.php b/app/MetadataResolver/Metadata.php index 62d16e8..c9b5e05 100644 --- a/app/MetadataResolver/Metadata.php +++ b/app/MetadataResolver/Metadata.php @@ -23,4 +23,30 @@ class Metadata * チェックインタグと同様に保存されるため、スペースや改行文字を含めてはいけません。 */ public $tags = []; + + /** + * 重複を排除し、正規化を行ったタグの集合を返します。 + * @return string[] + */ + public function normalizedTags(): array + { + $tags = []; + foreach ($this->tags as $tag) { + $tag = $this->sanitize($tag); + $tag = $this->trim($tag); + $tags[$tag] = true; + } + + return array_keys($tags); + } + + private function sanitize(string $value): string + { + return preg_replace('/\r?\n/u', ' ', $value); + } + + private function trim(string $value): string + { + return trim($value); + } } diff --git a/tests/Unit/MetadataResolver/MetadataTest.php b/tests/Unit/MetadataResolver/MetadataTest.php new file mode 100644 index 0000000..6d517ac --- /dev/null +++ b/tests/Unit/MetadataResolver/MetadataTest.php @@ -0,0 +1,33 @@ +tags = ['foo ', ' bar', ' foo bar ']; + + $this->assertEquals(['foo', 'bar', 'foo bar'], $metadata->normalizedTags()); + } + + public function testNormalizedTagsCanSanitize() + { + $metadata = new Metadata(); + $metadata->tags = ["foo \n", " \nbar", " foo\n bar "]; + + $this->assertEquals(['foo', 'bar', 'foo bar'], $metadata->normalizedTags()); + } + + public function testNormalizedTagsCanDeduplication() + { + $metadata = new Metadata(); + $metadata->tags = ['foo ', ' foo', ' bar']; + + $this->assertEquals(['foo', 'bar'], $metadata->normalizedTags()); + } +}