在 Python Markdown 中用自定义替换 Markdown 标题标签

Replace Markdown heading tags with custom in Python Markdown

我们想用自定义 HTML 标签替换由 Markdown 使用 # 引入的默认 h 标签。为了将 Markdown 解析为 HTML,我们使用 the Python Library 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>

标题是 block-level 元素,因此 inlinePatterns. 不解析 在 运行 之前 inlinePatterns,Python-Markdown 运行 BlockParser, which converts all of the block-level elements of the document into an ElementTree object。然后每个 block-level 元素一次一个地传递给 inlinePatterns 并解析 span-level 元素。

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

您有几种选择来解决这个问题:

  1. 您可以覆盖解析标题的 BlockProcessors,以便它们从 get-go.
  2. 创建您想要的元素
  3. 或者您可以保留现有的块解析器并创建一个 TreeProcessor,它遍历完整的 ElementTree object 并通过重新定义相关元素中的标签名称来更改元素。

选项 2 应该简单得多,事实上,一些现有扩展程序使用的方法。

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