mako0104
@mako0104

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

spatie/laravel-markdownの拡張設定

解決したいこと

Laravel8でマークダウンを扱い、HTML変換してページを表示する機能を作っています。

spatie/laravel-markdownというのを利用して拡張設定をして、以下のマークダウン->HTML変換の設定を追加したいです。

  • テーブルの変換
  • テーブルの変換時にクラスを付与

参考にした
https://commonmark.thephpleague.com/2.3/extensions/tables/

参考記事には拡張はできるし、サンプルのコードは書いているのですが、ファイル名の記載がなく、どこに書くのという状況です。

ちなみに、config/markdown.phpの中に

    'extensions' => [
        League\CommonMark\Extension\Table\TableExtension::class
    ],

とすることで、テーブルの変換はできましたが、

  • ドキュメントとは違う書き方
  • もう少し細かい設定ができるようにしたい
    と考えています。

知見のある方がいらっしゃいましたらご教授いただきたく質問させていただきました!!

よろしくお願いいたします!!

0

3Answer

細かい設定をするだけなら config/markdown.php の commonmark_options にオプションを指定するとよさそうです。このオプションは https://commonmark.thephpleague.com/2.3/extensions/tables/ にある $config と同等だと思います。

config/markdown.php
  'commonmark_options' => [
    'table' => [
        'wrap' => [
            'enabled' => false,
            'tag' => 'div',
            'attributes' => [],
        ],
    ],
  ],

さらに思い通りに振る舞いを変えたいなら、 spatie/laravel-markdown の MarkdownRenderer を継承して独自のレンダラークラスを作ることになります。

レンダラークラスの configureCommonMarkEnvironment() メソッドには $environment 引数が渡されます。サンプルコードから $environment を操作する部分をメソッド内に移植してください。

app/MyCustomRenderer.php
namespace App;

use League\CommonMark\ConfigurableEnvironmentInterface;
use League\CommonMark\Extension\Table\TableExtension;
use Spatie\LaravelMarkdown\MarkdownRenderer;

class MyCustomRenderer extends MarkdownRenderer
{
    public function configureCommonMarkEnvironment(ConfigurableEnvironmentInterface $environment) : void
    {
        parent::configureCommonMarkEnvironment($environment);
        
        // このへんに拡張を追加する設定などを書く
        $environment->addExtension(new TableExtension());
    }
}

このレンダラーを使う設定は config/markdown.php に追加します。

config/markdown.php
'renderer_class' => App\MyCustomRenderer::class,
1Like

@uasiさん
ありがとうございます!!

そして試してみたのですが、うまく行かなかったです。。。

config/markdown.php
...
'renderer_class' => App\Markdown\MyCustomRenderer::class,
...

↓とくにこれが間違っている可能性がある?

app/Markdown/MyCustomRenderer.php
<?php

namespace App\Markdown;

use League\CommonMark\MarkdownConverter;
// ↓これがvendorに入っていなかったです。
// use League\CommonMark\ConfigurableEnvironmentInterface; 
use Spatie\LaravelMarkdown\MarkdownRenderer;
use League\CommonMark\Environment\Environment;
use League\CommonMark\Extension\Table\TableExtension;
use League\CommonMark\Environment\EnvironmentBuilderInterface;
use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension;

class MyCustomRenderer extends MarkdownRenderer
{
    // 引数の$environmentの型がConfigurableEnvironmentInterfaceではない?
    // ドキュメントが違うのか、MarkdownRendereのconrigureCommonMarkEnvironmentの引数を確認すると
    // EnvironmentBuilderInterfaceとなっていたので、そのように修正していたしました。
    public function configureCommonMarkEnvironment(EnvironmentBuilderInterface $environment): void
    {
        parent::configureCommonMarkEnvironment($environment);

        // customize the `$environment` here.
        // $environment->addExtension(new TableExtension());
        $config = [
          'table' => [
              'wrap' => [
                  'enabled' => false,
                  'tag' => 'div',
                  'attributes' => [],
              ],
          ],
        ];
        // Configure the Environment with all the CommonMark parsers/renderers
        $environment = new Environment($config);
        $environment->addExtension(new CommonMarkCoreExtension());

        // Add this extension
        // ここでTableExtensionを追加してるから変換されると思いきや・・・できませんでした。
        $environment->addExtension(new TableExtension()); 

        // Instantiate the converter engine and start converting some Markdown!
        // $converter = new MarkdownConverter($environment);
        // echo $converter->convert('
        //   th | th(center) | th(right)
        //   ---|:----------:|----------:
        //   td | td         | td
        // ');
    }
}

image.png
HTML変換されず、そのまま文字列として表示されてしまいます。

一応、表示を確認する際に、

php artisan config:clear
php artisan cache:clear
php artisan view:clear

を実行してからリロードいたしました。

なにか間違いがあるとは思うのですが、ご教授いただきたいです!!
よろしくお願いいたします!!!

0Like

まず use League\CommonMark\ConfigurableEnvironmentInterface; がないのは参考にしたドキュメントが古かったようです。 EnvironmentBuilderInterface にする修正で合っています。次に、

app/Markdown/MyCustomRenderer.php
$environment = new Environment($config);

これは新しい Environment オブジェクトを $environment にセットしていますが、そうではなく引数の
$environment に入っているオブジェクトをそのまま使ってください。

$environment の config には config/markdown.php の 'commonmark_options' => [ここ], に書いたものがセットされます。テーブル関係のオプションはそこに書いてください。(最初の回答では 'markdown_options' と書きましたが、名前を間違えていました。すみません。回答は修正済みです。)

app/Markdown/MyCustomRenderer.php
$environment->addExtension(new CommonMarkCoreExtension());

CommonMarkExtensionparent::configureCommonMarkEnvironment($environment); を呼んだ時点で入るので追加しなくて大丈夫です。他に入っている拡張は以下を見てください:

app/Markdown/MyCustomRenderer.php
$environment->addExtension(new TableExtension()); 

これはこのままで OK です。

0Like

Your answer might help someone💌