20220717
This commit is contained in:
189
vendor/illuminate/mail/Markdown.php
vendored
Normal file
189
vendor/illuminate/mail/Markdown.php
vendored
Normal file
@@ -0,0 +1,189 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Mail;
|
||||
|
||||
use Illuminate\Contracts\View\Factory as ViewFactory;
|
||||
use Illuminate\Support\HtmlString;
|
||||
use Illuminate\Support\Str;
|
||||
use League\CommonMark\Environment\Environment;
|
||||
use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension;
|
||||
use League\CommonMark\Extension\Table\TableExtension;
|
||||
use League\CommonMark\MarkdownConverter;
|
||||
use TijsVerkoyen\CssToInlineStyles\CssToInlineStyles;
|
||||
|
||||
class Markdown
|
||||
{
|
||||
/**
|
||||
* The view factory implementation.
|
||||
*
|
||||
* @var \Illuminate\Contracts\View\Factory
|
||||
*/
|
||||
protected $view;
|
||||
|
||||
/**
|
||||
* The current theme being used when generating emails.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $theme = 'default';
|
||||
|
||||
/**
|
||||
* The registered component paths.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $componentPaths = [];
|
||||
|
||||
/**
|
||||
* Create a new Markdown renderer instance.
|
||||
*
|
||||
* @param \Illuminate\Contracts\View\Factory $view
|
||||
* @param array $options
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(ViewFactory $view, array $options = [])
|
||||
{
|
||||
$this->view = $view;
|
||||
$this->theme = $options['theme'] ?? 'default';
|
||||
$this->loadComponentsFrom($options['paths'] ?? []);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the Markdown template into HTML.
|
||||
*
|
||||
* @param string $view
|
||||
* @param array $data
|
||||
* @param \TijsVerkoyen\CssToInlineStyles\CssToInlineStyles|null $inliner
|
||||
* @return \Illuminate\Support\HtmlString
|
||||
*/
|
||||
public function render($view, array $data = [], $inliner = null)
|
||||
{
|
||||
$this->view->flushFinderCache();
|
||||
|
||||
$contents = $this->view->replaceNamespace(
|
||||
'mail', $this->htmlComponentPaths()
|
||||
)->make($view, $data)->render();
|
||||
|
||||
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(
|
||||
$contents, $this->view->make($theme, $data)->render()
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the Markdown template into text.
|
||||
*
|
||||
* @param string $view
|
||||
* @param array $data
|
||||
* @return \Illuminate\Support\HtmlString
|
||||
*/
|
||||
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("/[\r\n]{2,}/", "\n\n", $contents), ENT_QUOTES, 'UTF-8')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the given Markdown text into HTML.
|
||||
*
|
||||
* @param string $text
|
||||
* @return \Illuminate\Support\HtmlString
|
||||
*/
|
||||
public static function parse($text)
|
||||
{
|
||||
$environment = new Environment([
|
||||
'allow_unsafe_links' => false,
|
||||
]);
|
||||
|
||||
$environment->addExtension(new CommonMarkCoreExtension);
|
||||
$environment->addExtension(new TableExtension);
|
||||
|
||||
$converter = new MarkdownConverter($environment);
|
||||
|
||||
return new HtmlString($converter->convert($text)->getContent());
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user