Prevent mentions from mangling by markdown parser

Mentioning people whose handles include valid markdown would not survive
markdown to bbcode conversion wihout being mangled. An example that
brought this to my attention was a handle similar to this:

    _someuser_@testsite.example

The underscores would be interpreted as emphasis in markdown, and
converted to:

    [i]someuser[/i]@testsite.example

This patch should fix this, and hopefully any other issue with mentions
being mangled.
This commit is contained in:
Harald Eilertsen
2025-06-28 13:35:05 +02:00
parent e6c8c47721
commit cb491c53f7
2 changed files with 16 additions and 0 deletions

View File

@@ -64,6 +64,12 @@ function markdown_to_bb($s, $use_zrl = false, $options = []) {
// Escaping the hash tags // Escaping the hash tags
$s = preg_replace('/\#([^\s\#])/','#$1',$s); $s = preg_replace('/\#([^\s\#])/','#$1',$s);
// Protect mentions from being mangled by the markdown parser
$s = preg_replace_callback(
'|@\{([^}]+)\}|',
fn ($matches) => '@{' . base64_encode($matches[1]) . '}',
$s);
$s = MarkdownExtra::defaultTransform($s); $s = MarkdownExtra::defaultTransform($s);
@@ -76,6 +82,12 @@ function markdown_to_bb($s, $use_zrl = false, $options = []) {
$s = str_replace("\r","",$s); $s = str_replace("\r","",$s);
} }
// Restore mentions after markdown conversion
$s = preg_replace_callback(
'|@\{([^}]+)\}|',
fn ($matches) => '@{' . base64_decode($matches[1]) . '}',
$s);
$s = str_replace('#','#',$s); $s = str_replace('#','#',$s);
$s = html2bbcode($s); $s = html2bbcode($s);

View File

@@ -114,6 +114,10 @@ class MarkdownTest extends UnitTestCase {
'This is a link https://example.com/some/path more info.', 'This is a link https://example.com/some/path more info.',
'This is a link https://example.com/some/path more info.', 'This is a link https://example.com/some/path more info.',
], ],
'mention with underscores is untouched' => [
'@{_test_@somesite.example} @{test_2_@othersite.example}',
'@{_test_@somesite.example} @{test_2_@othersite.example}',
],
]; ];
} }