将Markdown标题标签替换为Python Markdown中的自定义标签

时间:2019-03-24 08:00:59

标签: python markdown python-markdown

我们想用自定义HTML标记替换由h使用markdown引入的默认#标记。对于将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>

1 个答案:

答案 0 :(得分: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. 您可以覆盖解析标题的BlockProcessor,以便它们从一开始就创建您想要的元素。
  2. 或者您可以保留现有的块解析器,并创建一个TreeProcessor,它逐步完成了ElementTree对象,并通过在相关元素中重新定义标签名称来更改元素。

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

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