我们希望使用自定义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>
标题是块级元素,因此不会被inlinePatterns.
解析在运行inlinePatterns
之前,Python-Markdown运行BlockParser,它将文档的所有块级元素转换为ElementTree对象。然后,每个块级元素一次通过inlinePatterns
,并解析跨度级元素。
例如,给定您的标题# This is a h1
,BlockParser已将其转换为H标记<h1>This is a h1</h1>
,而inlinePatterns仅查看该标记This is a h1
的文本内容。
你有几个选择来解决这个问题:
BlockProcessor
s,以便它们从一开始就创建您想要的元素。选项2应该更简单,实际上是一些现有扩展所使用的方法。
完全披露:我是Python-Markdown项目的首席开发人员。