Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Mail/Styler.php
<?php

namespace XF\Mail;

use
XF\CssRenderer;

class
Styler
{
   
/**
     * @var CssRenderer
     */
   
protected $renderer;

   
/**
     * @var \Pelago\Emogrifier
     */
   
protected $inliner;

    protected
$cssCache = [];

    public function
__construct(CssRenderer $renderer, \Pelago\Emogrifier $inliner)
    {
       
$this->renderer = $renderer;
       
$this->inliner = $inliner;
    }

    public function
styleHtml($html, $includeDefaultCss = true, \XF\Language $language = null)
    {
        if (
$html)
        {
            if (
$includeDefaultCss)
            {
               
$this->inliner->setCss($this->getEmailCss($language));
            }
           
$this->inliner->setHtml($html);
           
$html = $this->inliner->emogrify();
        }

        return
trim($html);
    }

    protected function
getEmailCss(\XF\Language $language = null)
    {
       
$templater = $this->renderer->getTemplater();

        if (
$language)
        {
           
$restoreLanguage = $templater->getLanguage();
           
$templater->setLanguage($language);
        }
        else
        {
           
$restoreLanguage = null;
        }

       
$languageId = $this->renderer->getLanguageId();
        if (!isset(
$this->cssCache[$languageId]))
        {
           
$this->cssCache[$languageId] = $this->renderCoreCss();
        }

        if (
$restoreLanguage)
        {
           
$templater->setLanguage($restoreLanguage);
        }

        return
$this->cssCache[$languageId];
    }

    protected function
renderCoreCss()
    {
        return
$this->renderer->render('email:core.less', false);
    }

    public function
generateTextBody($html)
    {
        if (
preg_match('#<body[^>]*>(.*)</body>#siU', $html, $match))
        {
           
$html = trim($match[1]);
        }

       
$text = $html;
       
$text = preg_replace('#\s*<style[^>]*>.*</style>\s*#siU', '', $text);
       
$text = preg_replace('#\s*<script[^>]*>.*</script>\s*#siU', '', $text);
       
$text = preg_replace('#<img[^>]*alt="([^"]+)"[^>]*>#siU', '$1', $text);
       
$text = preg_replace_callback(
           
'#<span class="inlineSpoiler"[^>]*>(.*)</span>#siU',
            function (array
$matches)
            {
               
$spoilerText = $matches[1];

                return \
XF::phrase('(spoiler)') . ' ' . str_repeat('*', utf8_strlen($spoilerText));
            },
           
$text
       
);
       
$text = preg_replace_callback(
           
'#<a[^>]+href="([^"]+)"[^>]*>(.*)</a>#siU',
            function (array
$matches)
            {
               
$href = $matches[1];
               
$text = $matches[2];

                if (
substr($href, 0, 7) == 'mailto:')
                {
                   
$href = substr($href, 7);
                }

                if (
$href == $text)
                {
                    return
$text;
                }
                else
                {
                    return
"$text ($href)";
                }
            },
           
$text
       
);
       
$text = preg_replace('#<(h[12])[^>]*>(.*)</\\1>#siU', '****** $2 ******', $text);
       
$text = preg_replace('#<(h[34])[^>]*>(.*)</\\1>#siU', '**** $2 ****', $text);
       
$text = preg_replace('#<(h[56])[^>]*>(.*)</\\1>#siU', '** $2 **', $text);
       
$text = preg_replace('#<hr[^>]*>(</hr>)?#i', '---------------', $text);

       
$text = preg_replace('#\s*</td>\s*<td[^>]*>\s*#', ' - ', $text);
       
$text = preg_replace('#\s*</tr>\s*<tr[^>]*>\s*#', "\n", $text);

       
$text = strip_tags($text);
       
$text = html_entity_decode($text, ENT_QUOTES | ENT_HTML401, "utf-8");

       
$text = preg_replace('#\n\t+#', "\n", $text);
       
$text = preg_replace('#(\r?\n){3,}#', "\n\n", $text);

        return
trim($text);
    }
}