首页
/ Turndown项目中使用自定义规则保留HTML标签的方法

Turndown项目中使用自定义规则保留HTML标签的方法

2025-05-24 08:22:03作者:盛欣凯Ernestine

概述

在使用Turndown这个HTML转Markdown的库时,开发者有时会遇到需要保留特定HTML标签不被转义的情况。本文将详细介绍如何通过自定义规则来实现这一需求。

问题背景

在将HTML转换为Markdown的过程中,Turndown默认会将HTML标签转义为字符实体(如将<转换为&lt;)。但在某些场景下,我们可能希望在生成的Markdown中保留某些HTML标签的原始形式。

解决方案

Turndown提供了强大的自定义规则功能,允许开发者针对特定HTML元素创建专门的转换逻辑。以下是实现保留HTML标签的具体方法:

1. 创建自定义规则

通过addRule方法可以添加自定义转换规则。每个规则需要定义两个关键部分:

  • filter函数:用于匹配需要应用此规则的HTML元素
  • replacement函数:定义如何将匹配的元素转换为Markdown

2. 实现保留HTML标签

replacement函数中,可以直接返回包含HTML标签的字符串。Turndown不会对这些在规则中明确返回的HTML标签进行转义处理。

示例代码

以下是一个完整的示例,展示如何保留<Icon>标签:

const TurndownService = require('turndown');
const turndownService = new TurndownService();

turndownService.addRule('external-link', {
    filter: function (node) {
        const aclass = node.getAttribute("class");
        return node.nodeName === 'A' && aclass === 'LinkOut';
    },
    replacement: function (content, node) {
        let url = node.getAttribute("href");
        if (!url?.startsWith('http')) {
            return content;
        }
        return `[${content} <Icon icon="fa-external-link" size="sm" />](${url})`;
    },
});

const htmlStr = `<a href='https://www.google.com' class='LinkOut'>Go to Google</a>`;
console.log(turndownService.turndown(htmlStr));

执行上述代码将输出:

[Go to Google <Icon icon="fa-external-link" size="sm" />](https://www.google.com)

注意事项

  1. 标签匹配:确保filter函数能够准确匹配到目标元素,避免规则应用到不需要的元素上。

  2. URL验证:如示例所示,建议对链接进行验证(如检查是否以'http'开头),以确保只转换符合条件的链接。

  3. 自定义标签:Turndown不会对自定义标签(如<Icon>)进行特殊处理,因此可以直接在输出字符串中包含这些标签。

  4. Markdown兼容性:虽然可以在Markdown中嵌入HTML,但要注意目标渲染器是否支持这些HTML标签。

进阶用法

对于更复杂的需求,可以在replacement函数中实现更精细的控制:

  • 根据元素属性动态生成不同的HTML标签
  • 组合多个HTML标签
  • 添加条件逻辑来决定是否包含特定标签

总结

通过Turndown的自定义规则功能,开发者可以灵活控制HTML到Markdown的转换过程,包括保留特定的HTML标签。这种方法既保持了Markdown的简洁性,又能在需要时嵌入HTML以实现更丰富的展示效果。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
27
11
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
466
3.47 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
10
1
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
65
19
flutter_flutterflutter_flutter
暂无简介
Dart
715
172
giteagitea
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
23
0
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
203
82
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.27 K
695
rainbondrainbond
无需学习 Kubernetes 的容器平台,在 Kubernetes 上构建、部署、组装和管理应用,无需 K8s 专业知识,全流程图形化管理
Go
15
1
apintoapinto
基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
Go
22
1