首页 > 解决方案 > 在 Python Markdown 中用自定义替换 Markdown 标题标签

问题描述

我们想用自定义 HTML 标签替换h由 markdown 引入的默认标签。#为了将 Markdown 解析为 HTML,我们使用Python 库 Markdown

我们试图注册一个使用 H1 正则表达式的扩展。此扩展使用正则表达式(#) (.*)来检测 H1 元素。

import markdown
from markdown.extensions import Extension
from markdown.inlinepatterns import SimpleTagPattern

class CustomHeadings(Extension):
    def extendMarkdown(self, md, md_globals):
        H1_RE = r'(#) (.*)'

        h1_tag = SimpleTagPattern(H1_RE, 'span class="h1"')
        md.inlinePatterns['h1'] = h1_tag

md_extensions = [CustomHeadings()]

# [...]

def ds_custom_markdown_parse(value):
    return markdown.markdown(value, extensions=md_extensions)

我们希望将h{1-6}元素作为span class="h{1-6}". 但是 Markdown 解析器仍然将字符串匹配# This is a h1<h1>This is a h1</h1>. 我们期望输出为<span class="h1">This is a h1</span>

标签: pythonmarkdownpython-markdown

解决方案


标题是块级元素,因此inlinePatterns.在运行之前不被解析inlinePatterns,Python-Markdown 运行BlockParser,它将文档的所有块级元素转换为ElementTree对象。然后,每个块级元素一次通过inlinePatterns一个,并解析跨度级元素。

例如,给定您的标题# This is a h1,BlockParser 已经将其转换为 H 标记<h1>This is a h1</h1>,而 inlinePatterns 只能看到该标记的文本内容This is a h1

您有几个选项可以解决这个问题:

  1. 您可以覆盖BlockProcessor解析标题的 s ,以便它们从一开始就创建您想要的元素。
  2. 或者,您可以保留现有的块解析器并创建一个TreeProcessor,它逐步完成已完成的 ElementTree 对象并通过重新定义相关元素中的标签名称来更改元素。

选项 2 应该更简单,实际上是一些现有扩展使用的方法。

完全披露者:我是 Python-Markdown 项目的首席开发人员。


推荐阅读