Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Mail/Markdown.php
Строк: 389
<?php

namespace IlluminateMail;

use 
IlluminateContractsViewFactory as ViewFactory;
use 
IlluminateSupportEncodedHtmlString;
use 
IlluminateSupportHtmlString;
use 
IlluminateSupportStr;
use 
LeagueCommonMarkEnvironmentEnvironment;
use 
LeagueCommonMarkExtensionCommonMarkCommonMarkCoreExtension;
use 
LeagueCommonMarkExtensionTableTableExtension;
use 
LeagueCommonMarkMarkdownConverter;
use 
TijsVerkoyenCssToInlineStylesCssToInlineStyles;

class 
Markdown
{
    
/**
     * The view factory implementation.
     *
     * @var IlluminateContractsViewFactory
     */
    
protected $view;

    
/**
     * The current theme being used when generating emails.
     *
     * @var string
     */
    
protected $theme 'default';

    
/**
     * The registered component paths.
     *
     * @var array
     */
    
protected $componentPaths = [];

    
/**
     * Indicates if secure encoding should be enabled.
     *
     * @var bool
     */
    
protected static $withSecuredEncoding false;

    
/**
     * The registered CommonMark extensions.
     *
     * @var array<int, class-string<LeagueCommonMarkExtensionExtensionInterface>>
     */
    
protected static $extensions = [];

    
/**
     * Create a new Markdown renderer instance.
     *
     * @param  IlluminateContractsViewFactory  $view
     * @param  array  $options
     */
    
public function __construct(ViewFactory $view, array $options = [])
    {
        
$this->view $view;
        
$this->theme $options['theme'] ?? 'default';
        
$this->loadComponentsFrom($options['paths'] ?? []);

        static::
$extensions $options['extensions'] ?? [];
    }

    
/**
     * Render the Markdown template into HTML.
     *
     * @param  string  $view
     * @param  array  $data
     * @param  TijsVerkoyenCssToInlineStylesCssToInlineStyles|null  $inliner
     * @return IlluminateSupportHtmlString
     */
    
public function render($view, array $data = [], $inliner null)
    {
        
$this->view->flushFinderCache();

        
$bladeCompiler $this->view
            
->getEngineResolver()
            ->
resolve('blade')
            ->
getCompiler();

        
$contents $bladeCompiler->usingEchoFormat(
            
'new IlluminateSupportEncodedHtmlString(%s)',
            function () use (
$view$data) {
                if (static::
$withSecuredEncoding === true) {
                    
EncodedHtmlString::encodeUsing(function ($value) {
                        
$replacements = [
                            
'[' => '[',
                            
'<' => '&lt;',
                            
'>' => '&gt;',
                        ];

                        return 
str_replace(array_keys($replacements), array_values($replacements), $value);
                    });
                }

                try {
                    
$contents $this->view->replaceNamespace(
                        
'mail'$this->htmlComponentPaths()
                    )->
make($view$data)->render();
                } finally {
                    
EncodedHtmlString::flushState();
                }

                return 
$contents;
            }
        );

        if (
$this->view->exists($customTheme Str::start($this->theme'mail.'))) {
            
$theme $customTheme;
        } else {
            
$theme str_contains($this->theme'::')
                ? 
$this->theme
                
'mail::themes.'.$this->theme;
        }

        return new 
HtmlString(($inliner ?: new CssToInlineStyles)->convert(
            
str_replace('[''['$contents), $this->view->make($theme$data)->render()
        ));
    }

    
/**
     * Render the Markdown template into text.
     *
     * @param  string  $view
     * @param  array  $data
     * @return IlluminateSupportHtmlString
     */
    
public function renderText($view, array $data = [])
    {
        
$this->view->flushFinderCache();

        
$contents $this->view->replaceNamespace(
            
'mail'$this->textComponentPaths()
        )->
make($view$data)->render();

        return new 
HtmlString(
            
html_entity_decode(preg_replace("/[rn]{2,}/""nn"$contents), ENT_QUOTES'UTF-8')
        );
    }

    
/**
     * Parse the given Markdown text into HTML.
     *
     * @param  string  $text
     * @param  bool  $encoded
     * @return IlluminateSupportHtmlString
     */
    
public static function parse($textbool $encoded false)
    {
        if (
$encoded === false) {
            return new 
HtmlString(static::converter()->convert($text)->getContent());
        }

        if (static::
$withSecuredEncoding === true || $encoded === true) {
            
EncodedHtmlString::encodeUsing(function ($value) {
                
$replacements = [
                    
'[' => '[',
                    
'<' => '<',
                ];

                
$html str_replace(array_keys($replacements), array_values($replacements), $value);

                return static::
converter([
                    
'html_input' => 'escape',
                ])->
convert($html)->getContent();
            });
        }

        
$html '';

        try {
            
$html = static::converter()->convert($text)->getContent();
        } finally {
            
EncodedHtmlString::flushState();
        }

        return new 
HtmlString($html);
    }

    
/**
     * Get a Markdown converter instance.
     *
     * @internal
     *
     * @param  array<string, mixed>  $config
     * @return LeagueCommonMarkMarkdownConverter
     */
    
public static function converter(array $config = [])
    {
        
$environment = new Environment(array_merge([
            
'allow_unsafe_links' => false,
        ], 
$config));

        
$environment->addExtension(new CommonMarkCoreExtension);
        
$environment->addExtension(new TableExtension);

        foreach (static::
$extensions as $extensionClass) {
            
$environment->addExtension(new $extensionClass);
        }

        return new 
MarkdownConverter($environment);
    }

    
/**
     * Get the HTML component paths.
     *
     * @return array
     */
    
public function htmlComponentPaths()
    {
        return 
array_map(function ($path) {
            return 
$path.'/html';
        }, 
$this->componentPaths());
    }

    
/**
     * Get the text component paths.
     *
     * @return array
     */
    
public function textComponentPaths()
    {
        return 
array_map(function ($path) {
            return 
$path.'/text';
        }, 
$this->componentPaths());
    }

    
/**
     * Get the component paths.
     *
     * @return array
     */
    
protected function componentPaths()
    {
        return 
array_unique(array_merge($this->componentPaths, [
            
__DIR__.'/resources/views',
        ]));
    }

    
/**
     * Register new mail component paths.
     *
     * @param  array  $paths
     * @return void
     */
    
public function loadComponentsFrom(array $paths = [])
    {
        
$this->componentPaths $paths;
    }

    
/**
     * Set the default theme to be used.
     *
     * @param  string  $theme
     * @return $this
     */
    
public function theme($theme)
    {
        
$this->theme $theme;

        return 
$this;
    }

    
/**
     * Get the theme currently being used by the renderer.
     *
     * @return string
     */
    
public function getTheme()
    {
        return 
$this->theme;
    }

    
/**
     * Enable secured encoding when parsing Markdown.
     *
     * @return void
     */
    
public static function withSecuredEncoding()
    {
        static::
$withSecuredEncoding true;
    }

    
/**
     * Disable secured encoding when parsing Markdown.
     *
     * @return void
     */
    
public static function withoutSecuredEncoding()
    {
        static::
$withSecuredEncoding false;
    }

    
/**
     * Flush the class's global state.
     *
     * @return void
     */
    
public static function flushState()
    {
        static::
$withSecuredEncoding false;
        static::
$extensions = [];
    }
}
Онлайн: 0
Реклама