]> git.mxchange.org Git - friendica.git/commitdiff
Create events for bbcode hooks
authorArt4 <art4@wlabs.de>
Fri, 14 Feb 2025 15:03:29 +0000 (15:03 +0000)
committerArt4 <art4@wlabs.de>
Fri, 14 Feb 2025 15:03:29 +0000 (15:03 +0000)
src/Content/Text/BBCode.php
src/Core/Hooks/HookEventBridge.php
src/Event/ArrayFilterEvent.php
tests/Unit/Core/Hooks/HookEventBridgeTest.php
tests/Unit/Event/ArrayFilterEventTest.php

index 2102b43a320a39f85626d682407baeedd77bb394..d111437dffc71f16f75cf3a71ab7640c4c2688e4 100644 (file)
@@ -15,10 +15,10 @@ use Friendica\Content\Item;
 use Friendica\Content\OEmbed;
 use Friendica\Content\PageInfo;
 use Friendica\Content\Smilies;
-use Friendica\Core\Hook;
 use Friendica\Core\Protocol;
 use Friendica\Core\Renderer;
 use Friendica\DI;
+use Friendica\Event\ArrayFilterEvent;
 use Friendica\Model\Contact;
 use Friendica\Model\Event;
 use Friendica\Model\Post;
@@ -1297,7 +1297,15 @@ class BBCode
 
                DI::profiler()->startRecording('rendering');
 
-               Hook::callAll('bbcode', $text);
+               $eventDispatcher = DI::eventDispatcher();
+
+               $text_data = ['bbcode2html' => $text];
+
+               $text_data = $eventDispatcher->dispatch(
+                       new ArrayFilterEvent(ArrayFilterEvent::BBCODE_TO_HTML_START, $text_data),
+               )->getArray();
+
+               $text = $text_data['bbcode2html'] ?? $text;
 
                $ev = Event::fromBBCode($text);
 
@@ -2375,9 +2383,18 @@ class BBCode
                        );
                }
 
-               Hook::callAll('bb2diaspora', $text);
+               $eventDispatcher = DI::eventDispatcher();
+
+               $text_data = ['bbcode2markdown' => $text];
+
+               $text_data = $eventDispatcher->dispatch(
+                       new ArrayFilterEvent(ArrayFilterEvent::BBCODE_TO_MARKDOWN_END, $text_data),
+               )->getArray();
+
+               $text = $text_data['bbcode2markdown'] ?? $text;
 
                DI::profiler()->stopRecording();
+
                return $text;
        }
 
index ec79484f287bc1682b2dbe91264456fd6aaf6e51..6daa53a54da36c4e5b423944494c7e90464eb6c8 100644 (file)
@@ -55,6 +55,8 @@ final class HookEventBridge
                ArrayFilterEvent::OEMBED_FETCH_END   => 'oembed_fetch_url',
                ArrayFilterEvent::PAGE_INFO          => 'page_info_data',
                ArrayFilterEvent::SMILEY_LIST        => 'smilie',
+               ArrayFilterEvent::BBCODE_TO_HTML_START => 'bbcode',
+               ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'bb2diaspora',
                HtmlFilterEvent::HEAD                => 'head',
                HtmlFilterEvent::FOOTER              => 'footer',
                HtmlFilterEvent::PAGE_HEADER         => 'page_header',
@@ -89,6 +91,8 @@ final class HookEventBridge
                        ArrayFilterEvent::OEMBED_FETCH_END   => 'onOembedFetchEndEvent',
                        ArrayFilterEvent::PAGE_INFO          => 'onArrayFilterEvent',
                        ArrayFilterEvent::SMILEY_LIST        => 'onArrayFilterEvent',
+                       ArrayFilterEvent::BBCODE_TO_HTML_START => 'onBbcodeToHtmlEvent',
+                       ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'onBbcodeToMarkdownEvent',
                        HtmlFilterEvent::HEAD                => 'onHtmlFilterEvent',
                        HtmlFilterEvent::FOOTER              => 'onHtmlFilterEvent',
                        HtmlFilterEvent::PAGE_HEADER         => 'onHtmlFilterEvent',
@@ -129,6 +133,34 @@ final class HookEventBridge
                $event->setArray($data);
        }
 
+       /**
+        * Map the BBCODE_TO_HTML_START event to `bbcode` hook
+        */
+       public static function onBbcodeToHtmlEvent(ArrayFilterEvent $event): void
+       {
+               $data = $event->getArray();
+
+               $bbcode2html = (string) $data['bbcode2html'] ?? '';
+
+               $data['bbcode2html'] = static::callHook($event->getName(), $bbcode2html);
+
+               $event->setArray($data);
+       }
+
+       /**
+        * Map the BBCODE_TO_MARKDOWN_END event to `bb2diaspora` hook
+        */
+       public static function onBbcodeToMarkdownEvent(ArrayFilterEvent $event): void
+       {
+               $data = $event->getArray();
+
+               $bbcode2markdown = (string) $data['bbcode2markdown'] ?? '';
+
+               $data['bbcode2markdown'] = static::callHook($event->getName(), $bbcode2markdown);
+
+               $event->setArray($data);
+       }
+
        public static function onArrayFilterEvent(ArrayFilterEvent $event): void
        {
                $event->setArray(
index d5f9b4e96d5c2db9ddb9f14cd5a219747185f56a..2541940802692b4a15a11a23c9ca8ffb0e8d64ae 100644 (file)
@@ -48,6 +48,10 @@ final class ArrayFilterEvent extends Event
 
        public const SMILEY_LIST = 'friendica.data.smiley_list';
 
+       public const BBCODE_TO_HTML_START = 'friendica.data.bbcode_to_html_start';
+
+       public const BBCODE_TO_MARKDOWN_END = 'friendica.data.bbcode_to_markdown_end';
+
        private array $array;
 
        public function __construct(string $name, array $array)
index 58c9e2985302e30a9067d1487d7bf281870215c6..11f178451bf9c438574e42e4d47f188df0d7041b 100644 (file)
@@ -44,6 +44,8 @@ class HookEventBridgeTest extends TestCase
                        ArrayFilterEvent::OEMBED_FETCH_END   => 'onOembedFetchEndEvent',
                        ArrayFilterEvent::PAGE_INFO          => 'onArrayFilterEvent',
                        ArrayFilterEvent::SMILEY_LIST        => 'onArrayFilterEvent',
+                       ArrayFilterEvent::BBCODE_TO_HTML_START => 'onBbcodeToHtmlEvent',
+                       ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'onBbcodeToMarkdownEvent',
                        HtmlFilterEvent::HEAD                => 'onHtmlFilterEvent',
                        HtmlFilterEvent::FOOTER              => 'onHtmlFilterEvent',
                        HtmlFilterEvent::PAGE_HEADER         => 'onHtmlFilterEvent',
@@ -181,6 +183,50 @@ class HookEventBridgeTest extends TestCase
                );
        }
 
+       public function testOnBbcodeToHtmlEventCallsHookWithCorrectValue(): void
+       {
+               $event = new ArrayFilterEvent(ArrayFilterEvent::BBCODE_TO_HTML_START, ['bbcode2html' => '[b]original[/b]']);
+
+               $reflectionProperty = new \ReflectionProperty(HookEventBridge::class, 'mockedCallHook');
+               $reflectionProperty->setAccessible(true);
+
+               $reflectionProperty->setValue(null, function (string $name, string $data): string {
+                       $this->assertSame('bbcode', $name);
+                       $this->assertSame('[b]original[/b]', $data);
+
+                       return '<b>changed</b>';
+               });
+
+               HookEventBridge::onBbcodeToHtmlEvent($event);
+
+               $this->assertSame(
+                       ['bbcode2html' => '<b>changed</b>'],
+                       $event->getArray(),
+               );
+       }
+
+       public function testOnBbcodeToMarkdownEventCallsHookWithCorrectValue(): void
+       {
+               $event = new ArrayFilterEvent(ArrayFilterEvent::BBCODE_TO_MARKDOWN_END, ['bbcode2markdown' => '[b]original[/b]']);
+
+               $reflectionProperty = new \ReflectionProperty(HookEventBridge::class, 'mockedCallHook');
+               $reflectionProperty->setAccessible(true);
+
+               $reflectionProperty->setValue(null, function (string $name, string $data): string {
+                       $this->assertSame('bb2diaspora', $name);
+                       $this->assertSame('[b]original[/b]', $data);
+
+                       return '**changed**';
+               });
+
+               HookEventBridge::onBbcodeToMarkdownEvent($event);
+
+               $this->assertSame(
+                       ['bbcode2markdown' => '**changed**'],
+                       $event->getArray(),
+               );
+       }
+
        public static function getArrayFilterEventData(): array
        {
                return [
index 2fa8f786631e5c2fbed8a8a35ba2bae1e3929092..643f309a8b53429b941cd4a02d0c547f055c3973 100644 (file)
@@ -41,6 +41,8 @@ class ArrayFilterEventTest extends TestCase
                        [ArrayFilterEvent::OEMBED_FETCH_END, 'friendica.data.oembed_fetch_end'],
                        [ArrayFilterEvent::PAGE_INFO, 'friendica.data.page_info'],
                        [ArrayFilterEvent::SMILEY_LIST, 'friendica.data.smiley_list'],
+                       [ArrayFilterEvent::BBCODE_TO_HTML_START, 'friendica.data.bbcode_to_html_start'],
+                       [ArrayFilterEvent::BBCODE_TO_MARKDOWN_END, 'friendica.data.bbcode_to_markdown_end'],
                ];
        }