Create event for html2bbcode hook

This commit is contained in:
Art4 2025-02-17 10:55:05 +00:00
parent a94bead5f6
commit 3d3e34865b
5 changed files with 55 additions and 4 deletions

View file

@ -282,11 +282,13 @@ class OEmbed
} }
} }
} elseif (!strpos($oembed->html, $oembed->embed_url)) { } 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 .= '<a href="' . $oembed->embed_url . '" rel="oembed">' . $oembed->title . '</a>';
} }
$ret .= '</div>'; $ret .= '</div>';
// FIXME: Why is $test unused?
$test = Proxy::proxifyHtml($ret, $uriid); $test = Proxy::proxifyHtml($ret, $uriid);
return str_replace("\n", "", $ret); return str_replace("\n", "", $ret);

View file

@ -10,10 +10,10 @@ namespace Friendica\Content\Text;
use DOMDocument; use DOMDocument;
use DOMXPath; use DOMXPath;
use Friendica\Protocol\HTTP\MediaType; use Friendica\Protocol\HTTP\MediaType;
use Friendica\Core\Hook;
use Friendica\Core\Renderer; use Friendica\Core\Renderer;
use Friendica\Core\Search; use Friendica\Core\Search;
use Friendica\DI; use Friendica\DI;
use Friendica\Event\ArrayFilterEvent;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Util\Strings; use Friendica\Util\Strings;
use Friendica\Util\XML; use Friendica\Util\XML;
@ -141,7 +141,9 @@ class HTML
DI::profiler()->startRecording('rendering'); DI::profiler()->startRecording('rendering');
$message = str_replace("\r", "", $message); $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( $message = str_replace(
[ [
"<li><p>", "<li><p>",
@ -314,7 +316,13 @@ class HTML
$message = preg_replace('=\r *\r=i', "\n", $message); $message = preg_replace('=\r *\r=i', "\n", $message);
$message = str_replace("\r", "\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); $message = strip_tags($message);

View file

@ -56,6 +56,7 @@ final class HookEventBridge
ArrayFilterEvent::PAGE_INFO => 'page_info_data', ArrayFilterEvent::PAGE_INFO => 'page_info_data',
ArrayFilterEvent::SMILEY_LIST => 'smilie', ArrayFilterEvent::SMILEY_LIST => 'smilie',
ArrayFilterEvent::BBCODE_TO_HTML_START => 'bbcode', ArrayFilterEvent::BBCODE_TO_HTML_START => 'bbcode',
ArrayFilterEvent::HTML_TO_BBCODE_END => 'html2bbcode',
ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'bb2diaspora', ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'bb2diaspora',
HtmlFilterEvent::HEAD => 'head', HtmlFilterEvent::HEAD => 'head',
HtmlFilterEvent::FOOTER => 'footer', HtmlFilterEvent::FOOTER => 'footer',
@ -92,6 +93,7 @@ final class HookEventBridge
ArrayFilterEvent::PAGE_INFO => 'onArrayFilterEvent', ArrayFilterEvent::PAGE_INFO => 'onArrayFilterEvent',
ArrayFilterEvent::SMILEY_LIST => 'onArrayFilterEvent', ArrayFilterEvent::SMILEY_LIST => 'onArrayFilterEvent',
ArrayFilterEvent::BBCODE_TO_HTML_START => 'onBbcodeToHtmlEvent', ArrayFilterEvent::BBCODE_TO_HTML_START => 'onBbcodeToHtmlEvent',
ArrayFilterEvent::HTML_TO_BBCODE_END => 'onHtmlToBbcodeEvent',
ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'onBbcodeToMarkdownEvent', ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'onBbcodeToMarkdownEvent',
HtmlFilterEvent::HEAD => 'onHtmlFilterEvent', HtmlFilterEvent::HEAD => 'onHtmlFilterEvent',
HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent', HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent',
@ -147,6 +149,20 @@ final class HookEventBridge
$event->setArray($data); $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 * Map the BBCODE_TO_MARKDOWN_END event to `bb2diaspora` hook
*/ */

View file

@ -50,6 +50,8 @@ final class ArrayFilterEvent extends Event
public const BBCODE_TO_HTML_START = 'friendica.data.bbcode_to_html_start'; 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'; public const BBCODE_TO_MARKDOWN_END = 'friendica.data.bbcode_to_markdown_end';
private array $array; private array $array;

View file

@ -45,6 +45,7 @@ class HookEventBridgeTest extends TestCase
ArrayFilterEvent::PAGE_INFO => 'onArrayFilterEvent', ArrayFilterEvent::PAGE_INFO => 'onArrayFilterEvent',
ArrayFilterEvent::SMILEY_LIST => 'onArrayFilterEvent', ArrayFilterEvent::SMILEY_LIST => 'onArrayFilterEvent',
ArrayFilterEvent::BBCODE_TO_HTML_START => 'onBbcodeToHtmlEvent', ArrayFilterEvent::BBCODE_TO_HTML_START => 'onBbcodeToHtmlEvent',
ArrayFilterEvent::HTML_TO_BBCODE_END => 'onHtmlToBbcodeEvent',
ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'onBbcodeToMarkdownEvent', ArrayFilterEvent::BBCODE_TO_MARKDOWN_END => 'onBbcodeToMarkdownEvent',
HtmlFilterEvent::HEAD => 'onHtmlFilterEvent', HtmlFilterEvent::HEAD => 'onHtmlFilterEvent',
HtmlFilterEvent::FOOTER => '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 public function testOnBbcodeToMarkdownEventCallsHookWithCorrectValue(): void
{ {
$event = new ArrayFilterEvent(ArrayFilterEvent::BBCODE_TO_MARKDOWN_END, ['bbcode2markdown' => '[b]original[/b]']); $event = new ArrayFilterEvent(ArrayFilterEvent::BBCODE_TO_MARKDOWN_END, ['bbcode2markdown' => '[b]original[/b]']);