【问题标题】:Replace Markdown heading tags with custom in Python Markdown在 Python Markdown 中用自定义替换 Markdown 标题标签
【发布时间】:2023-03-21 23:58:01
【问题描述】:

我们想用自定义 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>

【问题讨论】:

  • 这是一个完全的旁白,你可能无法控制这一点,但使用真正的<h1>等标签客观上比使用<span class="h1">等标签要好得多。语义很重要。原因有很多,但可访问性可能是最大的原因。
  • @Chris 我们认为这是因为它更容易实现等等,但我们选择以另一种方式来实现,例如一个页面只有一个 H1 或者用户内容不会干扰我们自己的努力。

标签: python markdown python-markdown


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 2019-07-21
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2018-06-16
    相关资源
    最近更新 更多