在Drupal中使用League\Commonmark扩展渲染Markdown遇渲染器缺失错误
问题:League\Commonmark 2.3.8 在Drupal中添加扩展后渲染报错
在Drupal中使用带扩展的League\Commonmark 2.3.8渲染Markdown时,添加扩展后出现以下错误:
Unable to find corresponding renderer for node type
League\Commonmark\Node\Block\Document
自定义FilterMarkdown类代码如下:
class FilterMarkdown extends FilterBase { /** * @var array 私有配置数组 * * 配置参考:CommonMark官方文档 */ private array $config = [ // 仅管理员有权限使用Markdown,因此允许HTML输入 'html_input' => 'allow', 'allow_unsafe_links' => false, ]; /** * {@inheritdoc} */ public function process($text, $langcode): FilterProcessResult { $converter = new MarkdownConverter($this->createEnvironment()); $converted_text = $converter->convert($text); return new FilterProcessResult("$converted_text"); } /** * 创建包含所需扩展的环境 */ private function createEnvironment(): Environment { $environment = new Environment($this->config); $environment->addExtension(new ExternalLinkExtension()); $environment->addExtension(new HeadingPermalinkExtension()); $environment->addExtension(new StrikethroughExtension()); $environment->addExtension(new TableExtension()); return $environment; } }
排查后确认:问题出在手动创建Environment的环节——即使移除所有扩展、使用空配置初始化Environment,仍会触发报错;但改用CommonMarkConverter直接初始化则能正常渲染。由于网站已迁移至Drupal 10,无法使用不兼容的Drupal markdown模块,现寻求解决办法。
改用CommonMarkConverter的可正常运行代码如下:
public function process($text, $langcode): FilterProcessResult { $converter = new CommonMarkConverter($this->config); $converted_text = $converter->convert($text); return new FilterProcessResult("$converted_text"); }
解决方案
问题根源:手动创建Environment时,未添加核心的CommonMark扩展CommonMarkCoreExtension。CommonMarkConverter内部会自动加载该核心扩展,它包含了文档(Document)、段落等基础节点的渲染器;而手动初始化Environment只添加第三方扩展时,会缺失基础渲染器,导致出现找不到Document节点渲染器的错误。
修改createEnvironment方法,先添加核心扩展即可解决:
private function createEnvironment(): Environment { $environment = new Environment($this->config); // 先加载核心CommonMark扩展 $environment->addExtension(new \League\Commonmark\Extension\CommonMark\CommonMarkCoreExtension()); // 再添加自定义第三方扩展 $environment->addExtension(new ExternalLinkExtension()); $environment->addExtension(new HeadingPermalinkExtension()); $environment->addExtension(new StrikethroughExtension()); $environment->addExtension(new TableExtension()); return $environment; }
同时,需在类顶部引入核心扩展的命名空间:
use League\Commonmark\Extension\CommonMark\CommonMarkCoreExtension;
修改后,使用MarkdownConverter结合自定义环境即可正常渲染Markdown并加载所需扩展。
内容的提问来源于stack exchange,提问作者Patrick Kenny
相关产品推荐
相关产品推荐

