使用Python Markdown中的自定义替换Markdown标题标记

问题描述 投票:1回答:1

我们希望使用自定义HTML标记替换由markdown使用h引入的默认#标记。对于HTML解析Markdown,我们使用the Python Library Markdown

我们已尝试注册使用H1正则表达式的扩展。此扩展使用regexp (#) (.*)来检测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>

python markdown python-markdown
1个回答
2
投票

标题是块级元素,因此不会被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. 您可以覆盖解析标题的BlockProcessors,以便它们从一开始就创建您想要的元素。
  2. 或者你可以保留现有的块解析器并创建一个TreeProcessor,它遍历完成的ElementTree对象,并通过重新定义相关元素中的标记名称来改变元素。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.