Markdown.php
TLDR
The Markdown
class in the Illuminate\Mail
namespace is responsible for rendering Markdown templates into HTML or text. It uses the ViewFactory
interface to generate the templates and the CssToInlineStyles
library to inline CSS styles. The class also provides methods for parsing Markdown text into HTML and managing the theme and component paths.
Methods
render
Renders a Markdown template into HTML. Takes the name of the view template, an array of data to pass to the view, and an optional CssToInlineStyles
object for inlining CSS styles. Returns an HtmlString
object containing the rendered HTML.
renderText
Renders a Markdown template into plain text. Takes the name of the view template and an array of data to pass to the view. Returns an HtmlString
object containing the rendered text.
parse
Parses the given Markdown text into HTML. Uses the CommonMarkCoreExtension
and TableExtension
extensions from the League\CommonMark
library. Returns an HtmlString
object containing the parsed HTML.
htmlComponentPaths
Returns an array of HTML component paths. These paths are used to locate HTML template files.
textComponentPaths
Returns an array of text component paths. These paths are used to locate text template files.
loadComponentsFrom
Registers new mail component paths. Takes an array of paths.
theme
Sets the default theme to be used when generating emails. Takes a string representing the theme name.
getTheme
Returns the current theme being used by the renderer.
Classes
None
<?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;
}
}