我们想用自定义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>
答案 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
的文本内容。
您可以通过以下几种方法解决此问题:
BlockProcessor
,以便它们从一开始就创建您想要的元素。选项2应该简单得多,实际上是一些现有扩展使用的方法。
完整披露者:我是Python-Markdown项目的首席开发人员。