在Python Markdown中将Markdown标题标记替换为custom

2024-04-25 23:13:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我们想用一个定制的HTML标记替换默认的h标记,它是由markdown使用#引入的。为了将Markdown解析为HTML,我们使用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>


Tags: from标记import元素ishtmlextensionsthis
1条回答
网友
1楼 · 发布于 2024-04-25 23:13:28

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

例如,给定标题# This is a h1,块解析器已经将其转换为H标记<h1>This is a h1</h1>,而inlinePatterns只看到该标记This is a h1的文本内容。在

您有几种解决方法:

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

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

完全披露者:我是Python降价项目的主要开发人员。在

相关问题 更多 >

    热门问题