【问题标题】:Appending text to etree element for html markdown将文本附加到 etree 元素以进行 html 降价
【发布时间】:2013-09-30 14:11:05
【问题描述】:

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

【问题讨论】:

  • 你能提供一个完整的程序来演示这个问题吗?见SSCCE.ORG
  • @Robᵩ,添加了完整的示例,感谢您的链接。

标签: python html markdown


【解决方案1】:

在我看来,实现语法 [test] 并不是最佳选择,因为它已经在 use 中作为大多数实现(包括您试图更改/扩展的 python 的)的未记录功能。

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

当然,我意识到您的示例可能只是一个更复杂的东西的简化实现,它是更大系统的一部分,并且需要非专家 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>'

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多