我想指定在转换过程中要列入白名单的标签列表。例如,如果我只想转换<p>
,<ol>
,<li>
和其他一些标签,而忽略所有其他标签,则给定这样的值:
### Header
This is a paragraph.
# Code snippet
def spam():
pass
1. One
2. Two
3. Three
我希望将其完全转换为:
### Header
<p>This is a paragraph.</p>
# Code snippet
def spam():
pass
<ol>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ol>
我意识到我可以使用Bleach清除不需要的标签,但如果可能的话,我不希望首先将其转换。
答案 0 :(得分:2)
否,您不能将“白名单”标签,但是可以使用Extension API来更改解析器的各个部分。但是,您可能根本不想要那个。
例如,如果您不想解析标头和代码块,则可以删除这些处理器:
from markdown.extensions import Extension
class MyExtension(Extension):
def extendMarkdown(self, md):
md.parser.blockprocessors.deregister('hashheader')
md.parser.blockprocessors.deregister('setextheader')
md.parser.blockprocessors.deregister('code')
但是,由于解析器将回退到将文本包装在<p>
标记中,因此无法提供所需的结果。实际上,这是Markdown语法固有的。任何未被识别为其他内容的内容都视为段落。
因此,您的输入可能会导致以下输出:
<p>### Header</p>
<p>This is a paragraph.</p>
<p> # Code snippet
def spam():
pass</p>
<ol>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ol>
更复杂的是HTML对“无关紧要的空白”的处理。特别是,除非直接指示不这样做(例如在代码块中),否则在浏览器中呈现HTML时,所有空格都被压缩为一个空格。因此,包含未解析的代码块的段落将非常不可读:
#代码段 def spam(): 通过
如果这不是您想要的,那么您可能需要用自己的自定义处理器替换现有处理器,这些处理器可以识别代码块和标头,但返回默认HTML以外的内容以避免将它们包装在{{1 }}标签。但是,这实际上将涉及替换大多数解析器。
此外,纯文本不被任何标签包裹,都将被压缩为一个段落。例如,此输入:
<p>
将这样呈现:
#标头1#代码段def spam():通过##标头2
可能不是您想要的。将文本包装在# Header 1
# code snippet
def spam():
pass
## Header 2
标签中实际上是一个更理想的结果,因为至少会呈现为:
#标头1
#代码段 def spam(): 通过
##标头2
顺便说一句,这就是Markdown解析器不提供“白名单”选项的原因。结果永远不会是那些想要该选项的人所期望的。
完全公开:我是Python-Markdown项目的首席开发人员。