我正在使用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]')
答案 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中找到更多信息。当这个问题得到解决时,你的代码将使用一个调整,将你放在哪个元素的尾部(如上所述)。在修复错误之前,我担心这不起作用。您将不得不求助于暂时不需要扩展(转义括号)的解决方案。