Technology · 2023年10月28日

如何在filamentphp中显示markdown

今天在自己的一个使用filamentphp的项目中,在某个页面里添加一个按钮,点击该按钮后会跳转到另一个页面,显示之前写好的help文档,markdown格式的。

总体来说思路比较清晰,通过按钮的action操作,激活另一个页面的route,然后通过blade页面展示。

但在做的时候有几个难点:

  1. 怎样读取markdown文件?
  2. 读取后怎样正确解析格式?
  3. markdown文件里,链接的那些图片怎么做?

首先通过filament的命令创建一个新的page:

php artisan make:filament-page Help

然后在生成的resources/views/filament/pages/help.blade.php中,使用Illuminate\Mail\Markdown::parse()的方法来解析markdown格式

<x-filament::page”>
{{ Illuminate\Mail\Markdown::parse(file_get_contents(base_path(“doc/help.md”))) }}
</x-filament::page>

这样就可以在sidebar -> Help的页面中,读取help.md文件并解析成markdown格式了。

不过当你这么做了之后就会发现,并不是所有的格式都正确解析,比如**也就是strong的格式可以正确解析,但是h1,h2这种的格式却都不正确。

这是因为filamentphp使用了tailwind的css格式,而在tailwind.css中,特别地禁用了很多html默认的格式。参考:https://tailwindcss.com/docs/preflight#default-margins-are-removed

而想正确地使用markdown需要的格式,需要使用tailwindcss/typography的plugin。参考:https://tailwindcss.com/docs/typography-plugin

按照步骤安装和配置plugin后,上述代码更新为:

<x-filament::page class=”prose lg:prose-xl”>
{{ Illuminate\Mail\Markdown::parse(file_get_contents(base_path(“doc/help.md”))) }}
</x-filament::page>

此时你的markdown文件就可以正常解析了,当然也不是所有的,我发现emoji还是没有正确解析。

那文档中链接的图片怎么办?这里指的是project里的图片,不是外部图片。

我的方法是创建新的route,来获得图片。在routes/web.php中添加:

Route::get(‘image/{image_name}’, function () {
$image = imagecreatefrompng(base_path(‘doc/image/’) . request()->image_name);
return response()->stream(function () use ($image) {
imagepng($image);
imagedestroy($image);
}, 200, [‘Content-Type’ => ‘image/png’]);
})->middleware([‘auth’])->name(‘image’);

这里的imagecreatefrompng函数需要添加ext-gd,通过composer安装即可:

composer require ext-gd

我这里图片都放在了doc/image的目录下,但是在通过界面打开时,filamentphp默认的基础URL是/admin,所以在显示的时候要变换一下:

<x-filament::page class=”prose lg:prose-xl”>
{{ Illuminate\Mail\Markdown::parse(str_replace(‘image/’, ‘../image/’, file_get_contents(base_path(“doc/projects.md”)))) }}
</x-filament::page>

至此,图片也可以正常显示了。