问答

增加了内容转MD文本格式功能

Authored by

留学专家菊叔

开发日记:新增内容转Markdown文本格式功能

为了提升内容的便携性和可复用性,本次开发任务旨在为网站增加一项新功能:将已发布的文章内容转换为标准的Markdown文本格式。这使得内容可以轻松地导出到其他平台,或用于本地存档。该功能主要依赖Drupal社区的优秀模块 Markdownify 来实现。


核心模块:Markdownify

本次功能的核心是利用了 Markdownify 这个Drupal模块。该模块提供了一个强大的服务,可以将HTML文本精准地转换为Markdown格式。它底层使用了 `league/html-to-markdown` PHP库,确保了转换的质量和可靠性。

开发实施步骤

第一步:安装模块

通过Composer将模块及其依赖项添加到项目中。这是标准的Drupal模块安装流程。

composer require drupal/markdownify

第二步:创建自定义路由和控制器

为了给用户提供一个触发转换操作的接口,需要创建一个自定义的路由。例如,可以定义一个路径如 `/node/{node}/to-markdown`。该路由指向一个自定义的控制器方法,此方法将负责处理核心的转换逻辑。

第三步:实现转换逻辑

在控制器中,核心任务是获取节点对象,并将其需要转换的字段(通常是正文`body`字段)的HTML输出传递给Markdownify服务。

关键逻辑如下:

1. 加载节点对象:从路由参数中获取节点对象。
2. 渲染字段HTML:获取节点的正文字段,并将其渲染成最终的HTML字符串。直接获取字段的`value`是不够的,因为这会忽略掉文本格式化器(如嵌入的媒体、实体等)的处理。必须通过Drupal的渲染服务来生成完整的HTML输出。
3. 调用Markdownify服务:从Drupal的服务容器中获取 `markdownify.converter` 服务,并调用其 `convert()` 方法,将上一步生成的HTML作为参数传入。
4. 返回响应:将转换后的Markdown字符串包装在一个响应对象中返回。为了方便用户直接下载,可以将响应头设置为 `Content-Type: text/markdown` 并附上 `Content-Disposition` 以下载文件。

第四步:在界面上提供入口

为了让内容管理员能够方便地使用此功能,可以在节点操作区域增加一个链接或按钮。通过实现 `hook_entity_local_task_alter()` 或在 `*.links.action.yml` 文件中定义本地操作,可以在节点视图页面添加一个 "转为Markdown" 的按钮,链接到第二步创建的路由。


遇到的挑战与解决方案

处理嵌入的媒体(drupal-media)

挑战:文章内容中通过媒体库嵌入的图片或文件,在数据库中存储为 `

 

解决方案:解决方案在于第二步的实现。通过完整的字段渲染流程,Drupal的过滤器会首先将 `

 

处理复杂HTML

挑战:富文本编辑器(WYSIWYG)产生的复杂HTML,如带有内联样式或自定义class的标签,难以完美转换为简洁的Markdown。

解决方案:`Markdownify`模块可处理多数常见HTML标签。对于无法转换的复杂结构,它会保留原始HTML,这利用了Markdown兼容HTML的特性,足以满足多数应用场景。若需更纯粹的Markdown输出,则可在转换前清理HTML,但这会增加开发复杂性。


总结

通过结合`Markdownify`模块和少量自定义代码,可实现内容一键转换为Markdown。此功能不仅简化了内容导出流程,也增强了内容资产的长期价值和灵活性。整个过程展现了Drupal借助社区模块快速构建强大功能的可扩展性优势。

 

Test: 在本页的url后面添加.md 即可获得本页的md版本了。

       https://wangjueju.cn/zh-hans/blog/zengjialeneirongzhuanmdwenbengeshigongneng.md

Authored on