www.gusucode.com > Flarum开源的PHP国外手机版论坛 0.1 Beta2 源码程序 > Flarum_v0.1.beta2/extensions/mentions/src/Listeners/AddUserMentionsFormatter.php

    <?php 
/*
 * This file is part of Flarum.
 *
 * (c) Toby Zerner <toby.zerner@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Flarum\Mentions\Listeners;

use Flarum\Events\FormatterConfigurator;
use Flarum\Events\FormatterRenderer;
use Flarum\Events\FormatterParser;
use Flarum\Core\Users\UserRepository;

class AddUserMentionsFormatter
{
    protected $users;

    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    public function subscribe($events)
    {
        $events->listen(FormatterConfigurator::class, [$this, 'configure']);
        $events->listen(FormatterParser::class, [$this, 'parse']);
        $events->listen(FormatterRenderer::class, [$this, 'render']);
    }

    public function configure(FormatterConfigurator $event)
    {
        $configurator = $event->configurator;

        $tagName = 'USERMENTION';

        $tag = $configurator->tags->add($tagName);
        $tag->attributes->add('username');
        $tag->attributes->add('id')->filterChain->append('#uint');
        $tag->attributes['id']->required = false;

        $tag->template = '<a href="{$PROFILE_URL}{@username}" class="UserMention">@<xsl:value-of select="@username"/></a>';
        $tag->filterChain->prepend([static::class, 'addId'])
            ->addParameterByName('userRepository')
            ->setJS('function() { return true; }');

        $configurator->Preg->match('/\B@(?<username>[a-z0-9_-]+)(?!#)/i', $tagName);
    }

    public function parse(FormatterParser $event)
    {
        $event->parser->registeredVars['userRepository'] = $this->users;
    }

    public function render(FormatterRenderer $event)
    {
        // TODO: use URL generator
        $event->renderer->setParameter('PROFILE_URL', '/u/');
    }

    public static function addId($tag, UserRepository $users)
    {
        if ($id = $users->getIdForUsername($tag->getAttribute('username'))) {
            $tag->setAttribute('id', $id);

            return true;
        }
    }
}