在 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
。
您有几种选择来解决这个问题:
- 您可以覆盖解析标题的
BlockProcessor
s,以便它们从 get-go. 创建您想要的元素
- 或者您可以保留现有的块解析器并创建一个 TreeProcessor,它遍历完整的 ElementTree object 并通过重新定义相关元素中的标签名称来更改元素。
选项 2 应该简单得多,事实上,一些现有扩展程序使用的方法。
完全披露者:我是 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
。
您有几种选择来解决这个问题:
- 您可以覆盖解析标题的
BlockProcessor
s,以便它们从 get-go. 创建您想要的元素
- 或者您可以保留现有的块解析器并创建一个 TreeProcessor,它遍历完整的 ElementTree object 并通过重新定义相关元素中的标签名称来更改元素。
选项 2 应该简单得多,事实上,一些现有扩展程序使用的方法。
完全披露者:我是 Python-Markdown 项目的首席开发人员。