[TEMPLATES][Cards][Profile] Provide both actor uri and url, as well as full mention guidance
This commit is contained in:
parent
eb761609aa
commit
80afc0fa6c
@ -500,6 +500,11 @@ class FreeNetwork extends Component
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function mentionToName(string $nickname, string $uri): string
|
||||
{
|
||||
return '@' . $nickname . '@' . parse_url($uri, \PHP_URL_HOST);
|
||||
}
|
||||
|
||||
public function onPluginVersion(array &$versions): bool
|
||||
{
|
||||
$versions[] = [
|
||||
|
@ -55,13 +55,13 @@ use App\Util\TemporaryFile;
|
||||
use Component\Attachment\Entity\ActorToAttachment;
|
||||
use Component\Attachment\Entity\AttachmentToNote;
|
||||
use Component\Conversation\Conversation;
|
||||
use Component\FreeNetwork\FreeNetwork;
|
||||
use Component\Language\Entity\Language;
|
||||
use Component\Tag\Tag;
|
||||
use DateTime;
|
||||
use DateTimeInterface;
|
||||
use Exception;
|
||||
use InvalidArgumentException;
|
||||
use const PHP_URL_HOST;
|
||||
use Plugin\ActivityPub\ActivityPub;
|
||||
use Plugin\ActivityPub\Entity\ActivitypubObject;
|
||||
use Plugin\ActivityPub\Util\Model;
|
||||
@ -356,7 +356,7 @@ class Note extends Model
|
||||
$attr['tag'][] = [
|
||||
'type' => 'Mention',
|
||||
'href' => ($href = $mention->getUri()),
|
||||
'name' => '@' . $mention->getNickname() . '@' . parse_url($href, PHP_URL_HOST),
|
||||
'name' => FreeNetwork::mentionToName($mention->getNickname(), $href),
|
||||
];
|
||||
$attr['to'][] = $href;
|
||||
}
|
||||
|
@ -139,9 +139,6 @@ embed header {
|
||||
float: left;
|
||||
margin-left: 4px;
|
||||
}
|
||||
.note-author-url::before {
|
||||
content: '@';
|
||||
}
|
||||
.note-author-fullname {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
@ -465,26 +465,26 @@ class Actor extends Entity
|
||||
*/
|
||||
public function getUrl(int $type = Router::ABSOLUTE_URL): string
|
||||
{
|
||||
$url = null;
|
||||
if (Event::handle('StartGetActorUrl', [$this, $type, &$url]) === Event::next) {
|
||||
if ($this->getIsLocal()) {
|
||||
if ($this->getIsLocal()) {
|
||||
$url = null;
|
||||
if (Event::handle('StartGetActorUrl', [$this, $type, &$url]) === Event::next) {
|
||||
switch ($this->type) {
|
||||
case self::PERSON:
|
||||
case self::ORGANIZATION:
|
||||
case self::BUSINESS:
|
||||
case self::BOT:
|
||||
$url = Router::url('actor_view_nickname', ['nickname' => $this->getNickname()], $type);
|
||||
break;
|
||||
case self::GROUP:
|
||||
$url = Router::url('group_actor_view_nickname', ['nickname' => $this->getNickname()], $type);
|
||||
break;
|
||||
default:
|
||||
throw new BugFoundException('Actor type added but `Actor::getUrl` was not updated');
|
||||
case self::PERSON:
|
||||
case self::ORGANIZATION:
|
||||
case self::BUSINESS:
|
||||
case self::BOT:
|
||||
$url = Router::url('actor_view_nickname', ['nickname' => $this->getNickname()], $type);
|
||||
break;
|
||||
case self::GROUP:
|
||||
$url = Router::url('group_actor_view_nickname', ['nickname' => $this->getNickname()], $type);
|
||||
break;
|
||||
default:
|
||||
throw new BugFoundException('Actor type added but `Actor::getUrl` was not updated');
|
||||
}
|
||||
} else {
|
||||
return $this->getUri($type);
|
||||
Event::handle('EndGetActorUrl', [$this, $type, &$url]);
|
||||
}
|
||||
Event::handle('EndGetActorUrl', [$this, $type, &$url]);
|
||||
} else {
|
||||
return Router::url('actor_view_id', ['id' => $this->getId()], $type);
|
||||
}
|
||||
return $url;
|
||||
}
|
||||
|
@ -62,20 +62,21 @@ class Extension extends AbstractExtension
|
||||
return [
|
||||
/** Twig function to output the 'active' class if the current route matches the given route */
|
||||
new TwigFunction('active', [Runtime::class, 'isCurrentRouteActive']),
|
||||
new TwigFunction('is_route', [Runtime::class, 'isCurrentRoute']),
|
||||
new TwigFunction('get_note_actions', [Runtime::class, 'getNoteActions']),
|
||||
new TwigFunction('get_extra_note_actions', [Runtime::class, 'getExtraNoteActions']),
|
||||
new TwigFunction('show_stylesheets', [Runtime::class, 'getShowStylesheets']),
|
||||
new TwigFunction('handle_event', [Runtime::class, 'handleEvent']),
|
||||
new TwigFunction('config', [Runtime::class, 'getConfig']),
|
||||
new TwigFunction('dd', 'dd'),
|
||||
new TwigFunction('die', 'die'),
|
||||
new TwigFunction('get_extra_note_actions', [Runtime::class, 'getExtraNoteActions']),
|
||||
new TwigFunction('get_feeds', [Runtime::class, 'getFeeds']),
|
||||
new TwigFunction('get_note_actions', [Runtime::class, 'getNoteActions']),
|
||||
new TwigFunction('handle_event', [Runtime::class, 'handleEvent']),
|
||||
new TwigFunction('handle_override_stylesheet', [Runtime::class, 'handleOverrideStylesheet']),
|
||||
new TwigFunction('handle_override_template_import', [Runtime::class, 'handleOverrideTemplateImport']),
|
||||
new TwigFunction('icon', [Runtime::class, 'embedSvgIcon'], ['needs_environment' => true]),
|
||||
new TwigFunction('is_firefox', [Runtime::class, 'isFirefox']),
|
||||
new TwigFunction('handle_override_template_import', [Runtime::class, 'handleOverrideTemplateImport']),
|
||||
new TwigFunction('handle_override_stylesheet', [Runtime::class, 'handleOverrideStylesheet']),
|
||||
new TwigFunction('is_route', [Runtime::class, 'isCurrentRoute']),
|
||||
new TwigFunction('mention', [Runtime::class, 'mention']),
|
||||
new TwigFunction('open_details', [Runtime::class, 'openDetails']),
|
||||
new TwigFunction('get_feeds', [Runtime::class, 'getFeeds']),
|
||||
new TwigFunction('die', 'die'),
|
||||
new TwigFunction('dd', 'dd'),
|
||||
new TwigFunction('show_stylesheets', [Runtime::class, 'getShowStylesheets']),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -33,11 +33,13 @@ declare(strict_types = 1);
|
||||
namespace App\Twig;
|
||||
|
||||
use App\Core\Event;
|
||||
use App\Core\Router\Router;
|
||||
use App\Entity\Actor;
|
||||
use App\Entity\Feed;
|
||||
use App\Entity\Note;
|
||||
use App\Util\Common;
|
||||
use App\Util\Formatting;
|
||||
use Component\FreeNetwork\FreeNetwork;
|
||||
use Functional as F;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
@ -162,6 +164,15 @@ class Runtime implements RuntimeExtensionInterface, EventSubscriberInterface
|
||||
return Feed::getFeeds($actor);
|
||||
}
|
||||
|
||||
public function mention(Actor $actor): string
|
||||
{
|
||||
if ($actor->getIsLocal()) {
|
||||
return "@{$actor->getNickname()}";
|
||||
} else {
|
||||
return FreeNetwork::mentionToName($actor->getNickname(), $actor->getUri(type: Router::ABSOLUTE_URL));
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
||||
/**
|
||||
|
@ -1,7 +1,5 @@
|
||||
{% extends 'feed/feed.html.twig' %}
|
||||
|
||||
{% set nickname = nickname|escape %}
|
||||
|
||||
{% block title %}{% trans %}%nickname%'s profile{% endtrans %}{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
|
@ -76,6 +76,7 @@
|
||||
|
||||
{% block note_author %}
|
||||
{# Microformat's h-card properties indicates a face icon is a "u-logo" #}
|
||||
<a href="{{ actor_url }}">
|
||||
<header class="note-author-fullname" tabindex="0" title="{{ 'Begin a note by the user: ' | trans }} {{ nickname }}" >
|
||||
{% if fullname is not null %}
|
||||
{{ fullname }}
|
||||
@ -83,9 +84,10 @@
|
||||
{{ nickname }}
|
||||
{% endif %}
|
||||
</header>
|
||||
</a>
|
||||
|
||||
<small class="note-author-nickname">
|
||||
<a href="{{ actor_url }}" class="note-author-url u-url">{{ nickname }}</a>
|
||||
<a href="{{ actor_uri }}" class="note-author-url u-url">{{ mention }}</a>
|
||||
</small>
|
||||
{% endblock note_author %}
|
||||
|
||||
@ -114,7 +116,9 @@
|
||||
{% set actor = note.getActor() %}
|
||||
{% set nickname = actor.getNickname() %}
|
||||
{% set fullname = actor.getFullname() %}
|
||||
{% set actor_uri = actor.getUri() %}
|
||||
{% set actor_url = actor.getUrl() %}
|
||||
{% set mention = mention(actor) %}
|
||||
{% set note_language = note.getNoteLanguageShortDisplay() %}
|
||||
|
||||
<article class="h-entry hentry note" lang={{ note.getLanguageLocale() }}>
|
||||
@ -147,7 +151,9 @@
|
||||
{% set actor = note.getActor() %}
|
||||
{% set nickname = actor.getNickname() %}
|
||||
{% set fullname = actor.getFullname() %}
|
||||
{% set actor_uri = actor.getUri() %}
|
||||
{% set actor_url = actor.getUrl() %}
|
||||
{% set mention = mention(actor) %}
|
||||
|
||||
<article class="h-entry hentry note">
|
||||
{{ block('note_sidebar') }}
|
||||
|
@ -4,6 +4,9 @@
|
||||
{% set actor_tags = actor.getSelfTags() %}
|
||||
{% set actor_has_bio = actor.hasBio() %}
|
||||
{% set actor_uri = actor.getUri() %}
|
||||
{% set actor_url = actor.getUrl() %}
|
||||
{% set actor_is_local = actor.getIsLocal() %}
|
||||
{% set mention = mention(actor) %}
|
||||
|
||||
{% block profile_view %}
|
||||
<section id='profile-{{ actor.id }}' class='profile' title="{{ actor_nickname }}'s {{ 'profile information.' | trans }}">
|
||||
@ -11,30 +14,28 @@
|
||||
<div class="profile-info">
|
||||
<img src="{{ actor_avatar }}" class="profile-avatar" alt="{% trans %} %actor_nickname%'s avatar. {% endtrans %}" width="{{actor_avatar_dimensions['width']}}" height="{{actor_avatar_dimensions['height']}}">
|
||||
<strong class="profile-info-nickname" title="{{ actor_nickname }}{{ '\'s nickname.' | trans }}">{{ actor_nickname }}</strong>
|
||||
|
||||
<section class="profile-info-bio">
|
||||
{% if actor_has_bio %}
|
||||
<span>{{ actor.getBio() }}</span>
|
||||
{% else %}
|
||||
<span>{{ '(No bio)' | trans }}</span>
|
||||
{% endif %}
|
||||
</section>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
{% if not actor_is_local %}
|
||||
<section class="profile-info-remote">
|
||||
<span>{{ mention }}</span>
|
||||
</section>
|
||||
{% endif %}
|
||||
|
||||
<section class="profile-info-bio">
|
||||
<span>{{ actor.getBio() }}</span>
|
||||
</section>
|
||||
|
||||
<section class="profile-info-stats">
|
||||
<div><strong>{{ 'Subscribed' | trans }}</strong>{{ actor.getSubscribedCount() }}</div>
|
||||
<div><strong>{{ 'Subscribers' | trans }}</strong>{{ actor.getSubscribersCount() }}</div>
|
||||
</section>
|
||||
|
||||
<nav class="profile-info-tags">
|
||||
{% if actor_tags %}
|
||||
{% for tag in actor_tags %}
|
||||
{% include 'cards/tag/actor_tag.html.twig' with { 'tag': tag, 'actor': actor } %}
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{{ '(No tags)' | trans }}
|
||||
{% endif %}
|
||||
{% for tag in actor_tags %}
|
||||
{% include 'cards/tag/actor_tag.html.twig' with { 'tag': tag, 'actor': actor } %}
|
||||
{% endfor %}
|
||||
</nav>
|
||||
|
||||
{% for block in handle_event('AppendCardProfile', { 'actor': actor }) %}
|
||||
|
Loading…
Reference in New Issue
Block a user