python - 在 Python Markdown 中用自定义替换 Markdown 标题标签
问题描述
我们想用自定义 HTML 标签替换h
由 markdown 引入的默认标签。#
为了将 Markdown 解析为 HTML,我们使用Python 库 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>
解决方案
标题是块级元素,因此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 ,以便它们从一开始就创建您想要的元素。 - 或者,您可以保留现有的块解析器并创建一个TreeProcessor,它逐步完成已完成的 ElementTree 对象并通过重新定义相关元素中的标签名称来更改元素。
选项 2 应该更简单,实际上是一些现有扩展使用的方法。
完全披露者:我是 Python-Markdown 项目的首席开发人员。
推荐阅读
- ios - Xcode 编译带有链接器错误的 react-native 应用程序
- java - 使用 Python 反序列化 Java org.apache.kafka.common.serialization 序列化对象
- r - 如何将 for 循环的结果打印为 0 而不是整数(0)
- python - 如何将 pandas 数据框导出到文件,以便可以使用 pandas dan pyspark 打开它?
- ios - 如何从 HERE MAP iOS 上的纬度和经度获取完整地址
- haskell - 由于使用“打印”而产生的模棱两可的类型变量“a0”
- postgresql - 如何解决错误:无法访问文件“pglogical”:没有这样的文件或目录
- google-cloud-dataflow - Go SDK 的数据流因“InvalidProtocolBufferException”而失败
- postgresql - 有没有办法在渡槽 ORM 中使用 Varchar 而不是文本?
- angular - 有条件地应用管道运算符