organizrnginxsonarrradarrplexdashboardcouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallemby
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
3.7 KiB
160 lines
3.7 KiB
<?php
|
|
|
|
namespace Illuminate\Mail;
|
|
|
|
use Parsedown;
|
|
use Illuminate\Support\HtmlString;
|
|
use Illuminate\Contracts\View\Factory as ViewFactory;
|
|
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();
|
|
|
|
return new HtmlString(($inliner ?: new CssToInlineStyles)->convert(
|
|
$contents, $this->view->make('mail::themes.'.$this->theme)->render()
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Render the Markdown template into HTML.
|
|
*
|
|
* @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->markdownComponentPaths()
|
|
)->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)
|
|
{
|
|
$parsedown = new Parsedown;
|
|
|
|
return new HtmlString($parsedown->text($text));
|
|
}
|
|
|
|
/**
|
|
* Get the HTML component paths.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function htmlComponentPaths()
|
|
{
|
|
return array_map(function ($path) {
|
|
return $path.'/html';
|
|
}, $this->componentPaths());
|
|
}
|
|
|
|
/**
|
|
* Get the Markdown component paths.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function markdownComponentPaths()
|
|
{
|
|
return array_map(function ($path) {
|
|
return $path.'/markdown';
|
|
}, $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;
|
|
}
|
|
}
|
|
|