diff --git a/src/Content/OEmbed.php b/src/Content/OEmbed.php index 9383363012..a42b837882 100644 --- a/src/Content/OEmbed.php +++ b/src/Content/OEmbed.php @@ -282,11 +282,13 @@ class OEmbed } } } elseif (!strpos($oembed->html, $oembed->embed_url)) { - // add <a> for html2bbcode conversion + // add <a> for html to bbcode conversion $ret .= '<a href="' . $oembed->embed_url . '" rel="oembed">' . $oembed->title . '</a>'; } $ret .= '</div>'; + + // FIXME: Why is $test unused? $test = Proxy::proxifyHtml($ret, $uriid); return str_replace("\n", "", $ret); diff --git a/src/Content/Text/HTML.php b/src/Content/Text/HTML.php index ba992e4a8f..dcec024cf0 100644 --- a/src/Content/Text/HTML.php +++ b/src/Content/Text/HTML.php @@ -10,10 +10,10 @@ namespace Friendica\Content\Text; use DOMDocument; use DOMXPath; use Friendica\Protocol\HTTP\MediaType; -use Friendica\Core\Hook; use Friendica\Core\Renderer; use Friendica\Core\Search; use Friendica\DI; +use Friendica\Event\ArrayFilterEvent; use Friendica\Model\Contact; use Friendica\Util\Strings; use Friendica\Util\XML; @@ -141,7 +141,9 @@ class HTML DI::profiler()->startRecording('rendering'); $message = str_replace("\r", "", $message); - $message = Strings::performWithEscapedBlocks($message, '#<pre><code.*</code></pre>#iUs', function ($message) { + $eventDispatcher = DI::eventDispatcher(); + + $message = Strings::performWithEscapedBlocks($message, '#<pre><code.*</code></pre>#iUs', function ($message) use($eventDispatcher) { $message = str_replace( [ "<li><p>", @@ -314,7 +316,13 @@ class HTML $message = preg_replace('=\r *\r=i', "\n", $message); $message = str_replace("\r", "\n", $message); - Hook::callAll('html2bbcode', $message); + $message_data = ['html2bbcode' => $message]; + + $message_data = $eventDispatcher->dispatch( + new ArrayFilterEvent(ArrayFilterEvent::HTML_TO_BBCODE_END, $message_data), + )->getArray(); + + $message = $message_data['html2bbcode'] ?? $message; $message = strip_tags($message); diff --git a/src/Core/Hooks/HookEventBridge.php b/src/Core/Hooks/HookEventBridge.php index 9b3265130e..bc0615f368 100644 --- a/src/Core/Hooks/HookEventBridge.php +++ b/src/Core/Hooks/HookEventBridge.php @@ -56,6 +56,7 @@ final class HookEventBridge ArrayFilterEvent::PAGE_INFO => 'page_info_data', ArrayFilterEvent::SMILEY_LIST => 'smilie', ArrayFilterEvent::BBCODE_TO_HTML_START => 'bbcode', + ArrayFilterEvent::HTML_TO_BBCODE_END => 'html2bbcode', ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'bb2diaspora', HtmlFilterEvent::HEAD => 'head', HtmlFilterEvent::FOOTER => 'footer', @@ -92,6 +93,7 @@ final class HookEventBridge ArrayFilterEvent::PAGE_INFO => 'onArrayFilterEvent', ArrayFilterEvent::SMILEY_LIST => 'onArrayFilterEvent', ArrayFilterEvent::BBCODE_TO_HTML_START => 'onBbcodeToHtmlEvent', + ArrayFilterEvent::HTML_TO_BBCODE_END => 'onHtmlToBbcodeEvent', ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'onBbcodeToMarkdownEvent', HtmlFilterEvent::HEAD => 'onHtmlFilterEvent', HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent', @@ -147,6 +149,20 @@ final class HookEventBridge $event->setArray($data); } + /** + * Map the HTML_TO_BBCODE_END event to `html2bbcode` hook + */ + public static function onHtmlToBbcodeEvent(ArrayFilterEvent $event): void + { + $data = $event->getArray(); + + $html2bbcode = (string) $data['html2bbcode'] ?? ''; + + $data['html2bbcode'] = static::callHook($event->getName(), $html2bbcode); + + $event->setArray($data); + } + /** * Map the BBCODE_TO_MARKDOWN_END event to `bb2diaspora` hook */ diff --git a/src/Event/ArrayFilterEvent.php b/src/Event/ArrayFilterEvent.php index 2541940802..94cc07e874 100644 --- a/src/Event/ArrayFilterEvent.php +++ b/src/Event/ArrayFilterEvent.php @@ -50,6 +50,8 @@ final class ArrayFilterEvent extends Event public const BBCODE_TO_HTML_START = 'friendica.data.bbcode_to_html_start'; + public const HTML_TO_BBCODE_END = 'friendica.data.html_to_bbcode_end'; + public const BBCODE_TO_MARKDOWN_END = 'friendica.data.bbcode_to_markdown_end'; private array $array; diff --git a/tests/Unit/Core/Hooks/HookEventBridgeTest.php b/tests/Unit/Core/Hooks/HookEventBridgeTest.php index 9e76cebcf2..e7d7aba55e 100644 --- a/tests/Unit/Core/Hooks/HookEventBridgeTest.php +++ b/tests/Unit/Core/Hooks/HookEventBridgeTest.php @@ -45,6 +45,7 @@ class HookEventBridgeTest extends TestCase ArrayFilterEvent::PAGE_INFO => 'onArrayFilterEvent', ArrayFilterEvent::SMILEY_LIST => 'onArrayFilterEvent', ArrayFilterEvent::BBCODE_TO_HTML_START => 'onBbcodeToHtmlEvent', + ArrayFilterEvent::HTML_TO_BBCODE_END => 'onHtmlToBbcodeEvent', ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'onBbcodeToMarkdownEvent', HtmlFilterEvent::HEAD => 'onHtmlFilterEvent', HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent', @@ -205,6 +206,28 @@ class HookEventBridgeTest extends TestCase ); } + public function testOnHtmlToBbcodeEventCallsHookWithCorrectValue(): void + { + $event = new ArrayFilterEvent(ArrayFilterEvent::HTML_TO_BBCODE_END, ['html2bbcode' => '<b>original</b>']); + + $reflectionProperty = new \ReflectionProperty(HookEventBridge::class, 'mockedCallHook'); + $reflectionProperty->setAccessible(true); + + $reflectionProperty->setValue(null, function (string $name, string $data): string { + $this->assertSame('html2bbcode', $name); + $this->assertSame('<b>original</b>', $data); + + return '[b]changed[/b]'; + }); + + HookEventBridge::onHtmlToBbcodeEvent($event); + + $this->assertSame( + ['html2bbcode' => '[b]changed[/b]'], + $event->getArray(), + ); + } + public function testOnBbcodeToMarkdownEventCallsHookWithCorrectValue(): void { $event = new ArrayFilterEvent(ArrayFilterEvent::BBCODE_TO_MARKDOWN_END, ['bbcode2markdown' => '[b]original[/b]']);