将文本附加到etree元素以进行html markdown

时间:2013-09-30 14:11:06

标签: python html markdown

我正在使用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]')

1 个答案:

答案 0 :(得分:0)

在我看来,实施的语法[test]是不是最好的选择,因为它已经在use,因为大多数实现(包括Python的,你正在试图改变的无证功能/扩展)。

此外,您尝试实现的输出已经可以直接降价(减去无用的跨度)。只需:\[[test]()\]。即:转义文字括号并在它们之间插入一个降价链接(如果这是您想要的,则使用空白URL)。请参阅Babelmark上的output

当然,我意识到你的例子可能只是一个更复杂的东西的简化实现,它是更大系统的一部分,需要一个非专业降价作者可以使用的简单语法。所以回答你问的实际问题:

我假设跨度是允许您将括号插入文本(顺便说一句聪明)。然而,闭合支架将是锚的尾部,而不是跨度。您希望它在结束锚标记之后,而不是在结束范围标记之后。

>>> 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()中包含括号是正确的移动,以避免他们误认为其他语法,但我不确定如何将span的尾部附加到示例中的文本。 < / p>

你之前尝试过插入inlinePattern吗?也许在任何支架相关模式之前?在“参考”模式('<reference')之前说。看看是否有帮助。

编辑:事实证明,在最近发现的Python-Markdown中存在一个错误,当inlinePattern返回一个复杂的Element时会发生奇怪的事情。特别是有孩子的元素,特别是涉及尾巴时。您可以在相关错误报告中的comment中找到更多信息。当这个问题得到解决时,你的代码将使用一个调整,将你放在哪个元素的尾部(如上所述)。在修复错误之前,我担心这不起作用。您将不得不求助于暂时不需要扩展(转义括号)的解决方案。