Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Repository/Smilie.php
<?php

namespace XF\Repository;

use
XF\Mvc\Entity\Finder;
use
XF\Mvc\Entity\Repository;
use
XF\Util\Arr;

use function
is_array;

class
Smilie extends Repository
{
   
/**
     * @return Finder
     */
   
public function findSmiliesForList($displayInEditorOnly = false)
    {
       
$finder = $this->finder('XF:Smilie')
            ->
order('display_order');

        if (
$displayInEditorOnly)
        {
           
$finder->where('display_in_editor', 1);
        }

        return
$finder;
    }

    public function
getSmilieListData($displayInEditorOnly = false)
    {
       
$smilies = $this->findSmiliesForList($displayInEditorOnly)
            ->
fetch();

       
$smilieCategories = $this->getSmilieCategoryRepo()
            ->
findSmilieCategoriesForList(true);

        return [
           
'smilieCategories' => $smilieCategories,
           
'totalSmilies' => $smilies->count(),
           
'smilies' => $smilies->groupBy('smilie_category_id')
        ];
    }

    public function
findSmiliesByText($matchText)
    {
       
$smilies = $this->finder('XF:Smilie')->fetch();
        return
$this->getTextMatchesFromSmilies($smilies, $matchText);
    }

    public function
findSmiliesByTextFromSmilies($matchText, $smilies)
    {
        return
$this->getTextMatchesFromSmilies($smilies, $matchText);
    }

    protected function
getTextMatchesFromSmilies($smilies, $matchText)
    {
        if (!
is_array($matchText))
        {
           
$matchText = Arr::stringToArray($matchText, '/\r?\n/');
        }

        if (!
$matchText)
        {
            return [];
        }

       
$matches = [];

        foreach (
$smilies AS $smilie)
        {
           
$smilieText = Arr::stringToArray($smilie['smilie_text'], '/\r?\n/');

           
$textMatch = array_intersect($matchText, $smilieText);
            foreach (
$textMatch AS $text)
            {
               
$matches[$text] = $smilie;
            }
        }

        return
$matches;
    }

    public function
getAbstractedImportedXmlFilePath($fileName = null)
    {
        return
'internal-data://imported_xml/' . ($fileName !== null ? $this->validateImportedXmlFileName($fileName) : '');
    }

    protected
$importedSmiliesXmlRegex = '/^(smilies\.)?(.+)(\.xml)$/si';

    public function
validateImportedXmlFileName($fileName = null)
    {
        if (
$fileName === null)
        {
            return
null;
        }

        return
preg_replace($this->importedSmiliesXmlRegex, 'smilies.$2.xml', $fileName);
    }

    public function
getSmilieImportXMLFiles()
    {
       
$files = [];

        foreach (
$this->app()->fs()->listContents($this->getAbstractedImportedXmlFilePath()) AS $file)
        {
            if (
$file['type'] == 'file' && preg_match($this->importedSmiliesXmlRegex, $file['basename']))
            {
               
$files[$file['basename']] = $file['basename'] . ' - ' . $this->app()->language()->dateTime($file['timestamp']);
            }
        }

        return
$files;
    }

    public function
getSmilieCacheData()
    {
       
$smilies = $this->finder('XF:Smilie')
            ->
order(['display_order', 'title'])
            ->
fetch();

       
$cache = [];

        foreach (
$smilies AS $smilieId => $smilie)
        {
           
$smilie = $smilie->toArray();

           
$cache[$smilieId] = $smilie;
           
$cache[$smilieId]['smilieText'] = Arr::stringToArray($smilie['smilie_text'], '/\r?\n/');

            if (!
$smilie['sprite_mode'] || !$smilie['sprite_params'])
            {
                unset(
$cache[$smilieId]['sprite_params']);
            }

            unset(
$cache[$smilieId]['sprite_mode'], $cache[$smilieId]['smilie_text']);
        }

        return
$cache;
    }

    public function
rebuildSmilieCache()
    {
       
$cache = $this->getSmilieCacheData();
        \
XF::registry()->set('smilies', $cache);
        return
$cache;
    }

    public function
getSmilieSpriteCacheData()
    {
       
$smilies = $this->finder('XF:Smilie')
            ->
order(['display_order', 'title'])
            ->
fetch();

       
$cache = [];

        foreach (
$smilies AS $smilieId => $smilie)
        {
            if (
$smilie->sprite_mode && !empty($smilie->sprite_params))
            {
               
$cache[$smilieId] = ['sprite_css' => sprintf('width: %1$dpx; height: %2$dpx; background: url(\'%3$s\') no-repeat %4$dpx %5$dpx;',
                    (int)
$smilie->sprite_params['w'],
                    (int)
$smilie->sprite_params['h'],
                   
htmlspecialchars($smilie->image_url),
                    (int)
$smilie->sprite_params['x'],
                    (int)
$smilie->sprite_params['y']
                )];

                if (!empty(
$smilie->sprite_params['bs']))
                {
                   
$cache[$smilieId]['sprite_css'] .= ' background-size: ' . htmlspecialchars($smilie->sprite_params['bs']);
                }
            }
        }

        return
$cache;
    }

    public function
rebuildSmilieSpriteCache()
    {
       
$cache = $this->getSmilieSpriteCacheData();
        \
XF::registry()->set('smilieSprites', $cache);
       
$this->repository('XF:Style')->updateAllStylesLastModifiedDateLater();
        return
$cache;
    }

   
/**
     * @return SmilieCategory
     */
   
protected function getSmilieCategoryRepo()
    {
        return
$this->repository('XF:SmilieCategory');
    }
}