LaravelでMarkdownをHTMLに変換する

LaravelでMarkdownをHTMLに変換する

こんにちは小野です。

Laravel9以降では、文字列ユーティリティのStrクラスにmarkdown()メソッドが追加されています。
最近になって初めて使ってみたのでご紹介します。

Str::markdown()

Markdown形式の文字列をHTMLに変換してくれるメソッドです。

Laravelに標準で含まれているleague/commonmarkライブラリをバックエンドに使っています。

基本的な使い方

use Illuminate\Support\Str;

$markdown = <<<MD
# 見出し

- アイテム1
- アイテム2

**太字**, *斜体*
MD;

$html = Str::markdown($markdown);

echo $html;

出力結果は以下のようなHTMLになります。

<h1>見出し</h1>
<ul>
  <li>アイテム1</li>
  <li>アイテム2</li>
</ul>
<p><strong>太字</strong>, <em>斜体</em>,</p>

Tailwind CSS のproseクラスと合わせると、簡単に見た目を整えられます。

<div class="prose">
    {!! $html !!}
</div>

オプション

league/commonmarkの設定オプションに対応します。

例:

[
    'html_input' => 'strip', // 'allow', 'escape', 'strip'
    'allow_unsafe_links' => false,
    'max_nesting_level' => 10,
    'renderer' => [
        'block_separator' => "\n",
        'inner_separator' => "\n",
        'soft_break' => "\n",
    ],
]

設定はサービスプロバイダやカスタムラッパーを通じて渡す形になります。

まとめ

実装自体は簡単で、他のStrクラスと併用できたり便利そうです。

ドキュメントにもありますが、デフォルトでは生のHTMLをそのまま出力するため、注意が必要です。

参考

https://laravel.com/docs/12.x/strings#method-str-markdown