我可以在Python Markdown中将标签列入白名单吗?

时间:2018-09-28 15:42:24

标签: python markdown

问题

我想指定在转换过程中要列入白名单的标签列表。例如,如果我只想转换<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清除不需要的标签,但如果可能的话,我不希望首先将其转换。

注意:

我指的是https://pypi.org/project/Markdown/

1 个答案:

答案 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项目的首席开发人员。