diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index ebaa72db5f..8f89b17f80 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -75,10 +75,15 @@ class Processor */ private static function replaceEmojis($body, array $emojis) { - foreach ($emojis as $emoji) { - $replace = '[class=emoji mastodon][img=' . $emoji['href'] . ']' . $emoji['name'] . '[/img][/class]'; - $body = str_replace($emoji['name'], $replace, $body); - } + $body = strtr($body, + array_combine( + array_column($emojis, 'name'), + array_map(function ($emoji) { + return '[class=emoji mastodon][img=' . $emoji['href'] . ']' . $emoji['name'] . '[/img][/class]'; + }, $emojis) + ) + ); + return $body; } diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index 31a2dcb0b8..3c0f4862e6 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -1345,7 +1345,7 @@ class Receiver $object_data['longitude'] = JsonLD::fetchElement($object_data, 'longitude', '@value'); $object_data['attachments'] = self::processAttachments(JsonLD::fetchElementArray($object, 'as:attachment') ?? []); $object_data['tags'] = self::processTags(JsonLD::fetchElementArray($object, 'as:tag') ?? []); - $object_data['emojis'] = self::processEmojis(JsonLD::fetchElementArray($object, 'as:tag', 'toot:Emoji') ?? []); + $object_data['emojis'] = self::processEmojis(JsonLD::fetchElementArray($object, 'as:tag', null, '@type', 'toot:Emoji') ?? []); $object_data['generator'] = JsonLD::fetchElement($object, 'as:generator', 'as:name', '@type', 'as:Application'); $object_data['generator'] = JsonLD::fetchElement($object_data, 'generator', '@value'); $object_data['alternate-url'] = JsonLD::fetchElement($object, 'as:url', '@id'); diff --git a/src/Util/JsonLD.php b/src/Util/JsonLD.php index 2649e90737..c211ebc2a0 100644 --- a/src/Util/JsonLD.php +++ b/src/Util/JsonLD.php @@ -173,7 +173,7 @@ class JsonLD * * @return array fetched element */ - public static function fetchElementArray($array, $element, $key = null) + public static function fetchElementArray($array, $element, $key = null, $type = null, $type_value = null) { if (!isset($array[$element])) { return null; @@ -187,10 +187,14 @@ class JsonLD $elements = []; foreach ($array[$element] as $entry) { - if (!is_array($entry) || (is_null($key) && is_array($entry))) { - $elements[] = $entry; - } elseif (!is_null($key) && isset($entry[$key])) { - $elements[] = $entry[$key]; + if (!is_array($entry) || is_null($key)) { + $item = $entry; + } elseif (isset($entry[$key])) { + $item = $entry[$key]; + } + + if (isset($item) && (is_null($type) || is_null($type_value) || isset($item[$type]) && $item[$type] == $type_value)) { + $elements[] = $item; } } diff --git a/tests/src/Util/JsonLDTest.php b/tests/src/Util/JsonLDTest.php index 2c922d3844..126073ed9f 100644 --- a/tests/src/Util/JsonLDTest.php +++ b/tests/src/Util/JsonLDTest.php @@ -62,6 +62,7 @@ class JsonLDTest extends TestCase $data = JsonLD::fetchElementArray($object, 'field', '@id'); self::assertSame(['value3', 'value4'], $data); } + public function testFetchElementArrayFoundArrays() { $object = ['field' => [['subfield11' => 'value11', 'subfield12' => 'value12'], @@ -74,6 +75,17 @@ class JsonLDTest extends TestCase self::assertSame($expect, $data); } + public function testFetchElementArrayTypeValue() + { + $object = ['field' => [['subfield11' => 'value11', 'subfield12' => 'value12'], + ['subfield21' => 'value21', 'subfield22' => 'value22']]]; + + $expect = [['subfield11' => 'value11', 'subfield12' => 'value12']]; + + $data = JsonLD::fetchElementArray($object, 'field', null, 'subfield11', 'value11'); + self::assertSame($expect, $data); + } + public function testFetchElementNotFound() { $object = [];