LoginSignup
3
4

More than 3 years have passed since last update.

LaravelでMarkdownをhtmlに変換・改

Posted at

Laravel v6.10.0でparsedownからleague/commonmarkに変わったので再度。
https://github.com/thephpleague/commonmark

Illuminate\Mail\Markdown::parse()はLaravel内でのMail用なのでそのまま使うとhtmlがエスケープされずに危険。これを元に自分のプロジェクト用に作ればいい。

まずオートリンク用にleague/commonmark-ext-autolinkをインストール。その他の必要なパッケージは6.10以降ならLaravel側でインストールされている。

composer require league/commonmark-ext-autolink

app/Support/Markdown.phpを作る。

<?php

namespace App\Support;

use Illuminate\Support\HtmlString;
use League\CommonMark\CommonMarkConverter;
use League\CommonMark\Environment;
use League\CommonMark\Ext\Table\TableExtension;
use League\CommonMark\Ext\Autolink\AutolinkExtension;

class Markdown
{
    /**
     * Parse the given Markdown text into HTML.
     *
     * @param  string  $text
     *
     * @return HtmlString
     */
    public static function parse($text)
    {
        $environment = Environment::createCommonMarkEnvironment();

        $environment->addExtension(new TableExtension());
        $environment->addExtension(new AutolinkExtension());

        $converter = new CommonMarkConverter([
            'html_input'         => 'escape',
            'allow_unsafe_links' => false,
        ], $environment);

        return new HtmlString($converter->convertToHtml($text ?? ''));
    }
}

htmlを完全に消すなら'html_input' => 'strip',でもいい。

使う時は

use App\Support\Markdown;

$html = Markdown::parse($markdown);

HtmlStringなのでviewでは{{ $html }}でもそのまま表示される。入力されたhtmlはエスケープ済なので変換後のhtmlは安全な前提。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4