2021-03-13
Laravel
Laravel8.x
LaravelでMarkdownをhtmlに変換・3
4年前の記事です。
Laravelは古い情報は全く役に立たないので絶対に参考にしないでください。
コメントに新しい情報がないか確認してください。
たぶん3回目。
https://invokable.net/article/laravel-markdown-2
Laravel8.x、league/commonmarkv1.x時代の情報。
Str:markdown()
少し前にStr:markdown()が追加された。
https://github.com/laravel/framework/blob/e4ed3317c2730803925918e1cb1e1e739e20ba5f/src/Illuminate/Support/Str.php#L387
中身はこれなので通常の用途ならStr:markdown()で十分。
/**
* Converts GitHub flavored Markdown into HTML.
*
* @param string $string
* @param array $options
* @return string
*/
public static function markdown($string, array $options = [])
{
$converter = new GithubFlavoredMarkdownConverter($options);
return $converter->convertToHtml($string);
}
ただし使う時はhtml_inputなどを付けないと危険。
{!! Str::markdown($text, [
'html_input' => 'escape',
]) !!}
Str:markdown()以上のことが必要なら自作
app/Support/Markdown.php
<?php
namespace App\Support;
use Illuminate\Support\HtmlString;
use League\CommonMark\Environment;
use League\CommonMark\GithubFlavoredMarkdownConverter;
use League\CommonMark\Inline\Element\Link;
class Markdown
{
/**
* Parse the given Markdown text into HTML.
*
* @param string $text
* @param array $options
*
* @return HtmlString
*/
public static function parse(string $text, $options = []): HtmlString
{
$config = array_merge([
'html_input' => 'escape',
'allow_unsafe_links' => false,
'max_nesting_level' => 50,
], $options);
$converter = new GithubFlavoredMarkdownConverter($config);
return new HtmlString($converter->convertToHtml($text ?? ''));
}
}
Bladeで直接使うなら
{{ \App\Support\Markdown::parse($text) }}
Bladeコンポーネントならcomponents/markdown.blade.phpを作って
@props(['text' => '', 'options' => []])
{{ \App\Support\Markdown::parse($text, $options) }}
<x-markdown :text="$text"></x-markdown>で使う。
URLを埋め込み
invokable.net ではさらにURLを埋め込みでブログカードのように変換してるけどEmbedRendererはLaravelとこのサイト専用な作りなので一般化してパッケージに分離はしにくい。キューが必須では使える人が限られる。
$environment = Environment::createGFMEnvironment();
$environment->addInlineRenderer(Link::class, app(EmbedRenderer::class));
$converter = new GithubFlavoredMarkdownConverter($config, $environment);