1

我正在使用 python markdown 来执行以下操作:

当有表单的表达式时[test],我想将其呈现为

<span>[<a>test</a>]</span>

为此,我正在对 markdown 的 inlinePatterns 应用扩展:

PATTERN = r'\[(test)\]'

class PerceptionPattern(Pattern):
    def handleMatch(self, m):
        span = etree.Element('span')
        anchor = etree.SubElement(span, "a")
        span.text = markdown.util.AtomicString("[")
        span.tail = markdown.util.AtomicString("]")

        anchor.text = m.group(2)
        return span

class TestExtension(markdown.extensions.Extension):
    """Adds cite extension to Markdown class"""

    def extendMarkdown(self, md, md_globals):
        """Modifies inline patterns"""
        md.inlinePatterns.add('test', PerceptionPattern(PATTERN), '<not_strong')

然而,这正在回归

<span>[]<a>test</a></span>

我不确定.tail是正确的属性,但我没有找到正确的语法。

我怎样才能做到这一点?


完整程序

from markdown.inlinepatterns import Pattern
from markdown.util import etree
from markdown import Markdown
import markdown

PATTERN = r'\[(test)\]'


class TestPattern(Pattern):
    def handleMatch(self, m):
        span = etree.Element('span')
        anchor = etree.SubElement(span, "a")
        span.text = markdown.util.AtomicString("[")
        span.tail = markdown.util.AtomicString("]")
        #anchor.tail = markdown.util.AtomicString("]")

        anchor.text = m.group(2)
        return span


class TestExtension(markdown.extensions.Extension):
    def extendMarkdown(self, md, md_globals):
        """Modifies inline patterns"""
        md.inlinePatterns.add('test_pattern', TestPattern(PATTERN), '<not_strong')

md = Markdown(extensions=[TestExtension()])

print md.convert(u'[test]')
4

1 回答 1

0

在我看来,实现语法[test]并不是最好的选择,因为它已经被用作大多数实现的未记录特性(包括你试图改变/扩展的 python)。

此外,您尝试实现的输出已经可以通过直接降价实现(减去其他无用的跨度)。只是做:\[[test]()\]。那就是:转义文字括号并在它们之间插入一个降价链接(如果你想要的话,可以使用一个空白网址)。请参阅Babelmark 上的输出。

当然,我意识到您的示例可能只是一个更复杂的东西的简化实现,它是更大系统的一部分,并且需要非专家 Markdown 作者可以使用的简单语法。因此,要回答您提出的实际问题:

我假设跨度是允许您将括号作为文本插入(顺便说一句很聪明)。但是,右括号将是锚的尾部,而不是跨度。您希望它出现在结束锚标记之后,而不是结束跨度标记之后。

>>> from markdown.util import etree
>>> span = etree.Element('span')
>>> anchor = etree.SubElement(span, 'a')
>>> span.text = '['
>>> anchor.tail = ']'
>>> anchor.text = 'test'
>>> etree.tostring(span)
'<span>[<a>test</a>]</span>'

你的代码应该输出这个:<span>[<a>test</a></span>]。请注意,右括号是此处跨度上的尾部,而不是锚点上的尾部。

当然,您似乎没有得到上述任何一种输出。降价似乎在某种程度上把事情搞砸了。将括号括起来AtomicString()是正确的做法,以避免它们被误认为是其他语法,但我不确定跨度的尾部是如何附加到示例中的文本的。

您是否尝试过更早地插入您的 inlinePattern?也许在任何与括号相关的模式之前?在“参考”模式 ( '<reference') 之前说。看看是否有帮助。

编辑:事实证明,最近在 Python-Markdown 中发现了一个错误,当 inlinePattern 返回一个复杂的元素时,它会做一些奇怪的事情;具体来说,一个带有子元素的元素,尤其是当涉及到尾巴时。您可以在相关错误报告中的此评论中找到更多信息。解决该问题后,您的代码将与您将右括号放入的元素尾部进行一次调整(如上所述)。在修复该错误之前,恐怕这将行不通。您暂时必须求助于不需要扩展(转义括号)的解决方案。

于 2013-11-14T03:43:02.307 回答