Invokable > 戻る
2021-03-13
Laravel Laravel8.x

LaravelでMarkdownをhtmlに変換・3

たぶん3回目。

Laravel8.x、league/commonmarkv1.x時代の情報。

  1. Str:markdown()
  2. Str:markdown()以上のことが必要なら自作
  3. URLを埋め込み

Str:markdown()

少し前にStr:markdown()が追加された。

中身はこれなので通常の用途なら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);
投稿者 Invokable
5件のコメントを読むにはログインしてください。
登録 ログイン