Merge pull request #14892 from annando/reshare-profile

Use alias for profile link in reshare
This commit is contained in:
Philipp 2025-05-18 16:07:22 +02:00 committed by GitHub
commit 8e0a3d00bb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 83 additions and 23 deletions

View file

@ -913,13 +913,18 @@ class BBCode
default: default:
$text = ($is_quote_share ? "\n" : ''); $text = ($is_quote_share ? "\n" : '');
$contact = Contact::getByURL($attributes['profile'], false, ['network']); $contact = Contact::getByURL($attributes['profile'], false, ['network', 'url', 'alias']);
$network = $contact['network'] ?? Protocol::PHANTOM; $network = $contact['network'] ?? Protocol::PHANTOM;
if (!empty($contact)) {
$profile = Contact::getProfileLink($contact);
} else {
$profile = $attributes['profile'];
}
$gsid = ContactSelector::getServerIdForProfile($attributes['profile']); $gsid = ContactSelector::getServerIdForProfile($attributes['profile']);
$tpl = Renderer::getMarkupTemplate('shared_content.tpl'); $tpl = Renderer::getMarkupTemplate('shared_content.tpl');
$text .= self::SHARED_ANCHOR . Renderer::replaceMacros($tpl, [ $text .= self::SHARED_ANCHOR . Renderer::replaceMacros($tpl, [
'$profile' => $attributes['profile'], '$profile' => $profile,
'$avatar' => $attributes['avatar'], '$avatar' => $attributes['avatar'],
'$author' => $attributes['author'], '$author' => $attributes['author'],
'$link' => $attributes['link'], '$link' => $attributes['link'],
@ -1984,12 +1989,25 @@ class BBCode
'<a href="$2" class="mention hashtag" rel="tag">$1<span>$3</span></a>', '<a href="$2" class="mention hashtag" rel="tag">$1<span>$3</span></a>',
$text $text
); );
} elseif (in_array($simple_html, [self::INTERNAL, self::EXTERNAL, self::TWITTER_API])) { } elseif (in_array($simple_html, [self::EXTERNAL, self::TWITTER_API])) {
$text = preg_replace( $text = preg_replace(
"/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism", "/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",
'<bdi>$1<a href="$2" class="userinfo mention" title="$3">$3</a></bdi>', '<bdi>$1<a href="$2" class="userinfo mention" title="$3">$3</a></bdi>',
$text $text
); );
} elseif ($simple_html == self::INTERNAL) {
if (preg_match_all("/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism", $text, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
$contact = Contact::getByURL($match[2], false, ['network', 'url', 'alias']);
if (!empty($contact)) {
$url = Contact::getProfileLink($contact);
} else {
$url = $match[2];
}
$text = str_replace($match[0], '<bdi>' . $match[1] . '<a href="' . $url . '" class="userinfo mention" title="' . $match[3] . '">' . $match[3] . '</a></bdi>', $text);
}
}
} elseif ($simple_html == self::MASTODON_API) { } elseif ($simple_html == self::MASTODON_API) {
$text = preg_replace( $text = preg_replace(
"/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism", "/([@!])\[url\=(.*?)\](.*?)\[\/url\]/ism",

View file

@ -506,14 +506,11 @@ class Processor
break; break;
case 'app.bsky.richtext.facet#mention': case 'app.bsky.richtext.facet#mention':
$contact = Contact::getByURL($feature->did, null, ['id']); $url = $feature->did;
if (!empty($contact['id'])) {
$url = $this->baseURL . '/contact/' . $contact['id'];
if (substr($linktext, 0, 1) == '@') { if (substr($linktext, 0, 1) == '@') {
$prefix .= '@'; $prefix .= '@';
$linktext = substr($linktext, 1); $linktext = substr($linktext, 1);
} }
}
break; break;
case 'app.bsky.richtext.facet#tag': case 'app.bsky.richtext.facet#tag':

View file

@ -88,6 +88,11 @@ return [
'uri' => 'https://friendica.local/profile/mutualcontact', 'uri' => 'https://friendica.local/profile/mutualcontact',
'guid' => '46', 'guid' => '46',
], ],
[
'id' => 49,
'uri' => 'https://domain.tld/profile/remotecontact',
'guid' => '49',
],
[ [
'id' => 100, 'id' => 100,
'uri' => 'https://friendica.local/posts/100', 'uri' => 'https://friendica.local/posts/100',
@ -214,6 +219,23 @@ return [
'network' => Protocol::DFRN, 'network' => Protocol::DFRN,
'location' => 'DFRN', 'location' => 'DFRN',
], ],
[
'id' => 49,
'uid' => 0,
'uri-id' => 43,
'name' => 'Remote user',
'nick' => 'remotecontact',
'self' => 0,
'nurl' => 'http://domain.tld/profile/remotecontact',
'url' => 'https://domain.tld/profile/remotecontact',
'alias' => 'https://domain.tld/~remotecontact',
'about' => 'User used in tests',
'pending' => 0,
'blocked' => 0,
'rel' => Contact::FOLLOWER,
'network' => Protocol::ACTIVITYPUB,
'location' => 'AP',
],
], ],
'apcontact' => [ 'apcontact' => [
[ [

View file

@ -615,4 +615,27 @@ Lucas: For the right price, yes.[/share]',
self::assertEquals($expected, $actual); self::assertEquals($expected, $actual);
} }
public function dataProfileLink(): array
{
return [
'mention' => [
'expected' => 'Test 1: <bdi>@<a href="https://domain.tld/~remotecontact" class="userinfo mention" title="Remote contact">Remote contact</a></bdi>',
'text' => 'Test 1: @[url=https://domain.tld/profile/remotecontact]Remote contact[/url]',
],
];
}
/**
* @dataProvider dataProfileLink
*
* @param string $expected Expected BBCode output
* @param string $text Input text
*/
public function testProfileLink(string $expected, string $text)
{
$actual = BBCode::convertForUriId(0, $text);
self::assertEquals($expected, $actual);
}
} }